selenium-webdriver 2.48.2 → 2.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/CHANGES.md +57 -0
  2. package/NOTICE +1 -1
  3. package/README.md +56 -6
  4. package/builder.js +375 -358
  5. package/chrome.js +549 -586
  6. package/edge.js +378 -0
  7. package/error.js +597 -5
  8. package/example/google_search_generator.js +2 -4
  9. package/example/logging.js +6 -2
  10. package/executors.js +11 -27
  11. package/firefox/binary.js +79 -87
  12. package/firefox/extension.js +10 -18
  13. package/firefox/index.js +173 -173
  14. package/firefox/profile.js +220 -240
  15. package/http/index.js +396 -79
  16. package/http/util.js +35 -35
  17. package/ie.js +288 -309
  18. package/index.js +34 -125
  19. package/io/exec.js +58 -39
  20. package/io/index.js +54 -48
  21. package/lib/actions.js +594 -0
  22. package/lib/by.js +276 -0
  23. package/lib/capabilities.js +404 -0
  24. package/lib/{webdriver/command.js → command.js} +88 -72
  25. package/lib/{webdriver/button.js → devmode.js} +13 -8
  26. package/lib/events.js +210 -0
  27. package/lib/firefox/amd64/libnoblur64.so +0 -0
  28. package/lib/firefox/i386/libnoblur.so +0 -0
  29. package/lib/firefox/webdriver.json +5 -1
  30. package/lib/firefox/webdriver.xpi +0 -0
  31. package/lib/{webdriver/key.js → input.js} +82 -2
  32. package/lib/logging.js +668 -0
  33. package/lib/{webdriver/promise.js → promise.js} +688 -644
  34. package/lib/session.js +79 -0
  35. package/lib/{webdriver/serializable.js → symbols.js} +11 -16
  36. package/lib/test/build.js +4 -4
  37. package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
  38. package/lib/test/data/click_tests/overlapping_elements.html +15 -4
  39. package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
  40. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
  41. package/lib/test/data/readOnlyPage.html +1 -1
  42. package/lib/test/data/selectPage.html +18 -2
  43. package/lib/test/fileserver.js +3 -4
  44. package/lib/test/index.js +7 -3
  45. package/lib/test/resources.js +1 -1
  46. package/lib/until.js +428 -0
  47. package/lib/webdriver.js +2351 -0
  48. package/net/portprober.js +15 -11
  49. package/opera.js +295 -314
  50. package/package.json +6 -5
  51. package/phantomjs.js +135 -140
  52. package/proxy.js +6 -4
  53. package/remote/index.js +229 -221
  54. package/safari.js +319 -310
  55. package/test/chrome/options_test.js +11 -9
  56. package/test/element_finding_test.js +51 -13
  57. package/test/error_test.js +163 -0
  58. package/test/execute_script_test.js +1 -1
  59. package/test/http/http_test.js +317 -55
  60. package/test/http/util_test.js +25 -23
  61. package/test/io_test.js +6 -1
  62. package/test/lib/by_test.js +127 -0
  63. package/test/lib/capabilities_test.js +84 -0
  64. package/test/lib/events_test.js +177 -0
  65. package/test/lib/logging_test.js +272 -0
  66. package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
  67. package/test/lib/promise_error_test.js +808 -0
  68. package/test/lib/promise_flow_test.js +2282 -0
  69. package/test/lib/promise_generator_test.js +308 -0
  70. package/test/lib/promise_test.js +996 -0
  71. package/test/lib/testutil.js +90 -0
  72. package/test/lib/until_test.js +436 -0
  73. package/test/lib/webdriver_test.js +2207 -0
  74. package/test/page_loading_test.js +7 -9
  75. package/test/stale_element_test.js +2 -2
  76. package/test/testing/assert_test.js +374 -0
  77. package/test/testing/index_test.js +9 -11
  78. package/testing/assert.js +334 -17
  79. package/testing/index.js +10 -0
  80. package/_base.js +0 -200
  81. package/docs/Changes.html +0 -356
  82. package/docs/class_bot_Error.html +0 -15
  83. package/docs/class_webdriver_ActionSequence.html +0 -115
  84. package/docs/class_webdriver_Alert.html +0 -24
  85. package/docs/class_webdriver_AlertPromise.html +0 -92
  86. package/docs/class_webdriver_Capabilities.html +0 -60
  87. package/docs/class_webdriver_Command.html +0 -15
  88. package/docs/class_webdriver_EventEmitter.html +0 -35
  89. package/docs/class_webdriver_FileDetector.html +0 -21
  90. package/docs/class_webdriver_Locator.html +0 -12
  91. package/docs/class_webdriver_Serializable.html +0 -9
  92. package/docs/class_webdriver_Session.html +0 -13
  93. package/docs/class_webdriver_TouchSequence.html +0 -49
  94. package/docs/class_webdriver_UnhandledAlertError.html +0 -18
  95. package/docs/class_webdriver_WebDriver.html +0 -313
  96. package/docs/class_webdriver_WebDriver_Logs.html +0 -15
  97. package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
  98. package/docs/class_webdriver_WebDriver_Options.html +0 -41
  99. package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
  100. package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
  101. package/docs/class_webdriver_WebDriver_Window.html +0 -27
  102. package/docs/class_webdriver_WebElement.html +0 -223
  103. package/docs/class_webdriver_WebElementPromise.html +0 -274
  104. package/docs/class_webdriver_http_Executor.html +0 -22
  105. package/docs/class_webdriver_http_Request.html +0 -12
  106. package/docs/class_webdriver_http_Response.html +0 -13
  107. package/docs/class_webdriver_logging_Entry.html +0 -15
  108. package/docs/class_webdriver_logging_Level.html +0 -55
  109. package/docs/class_webdriver_logging_LogRecord.html +0 -45
  110. package/docs/class_webdriver_logging_Logger.html +0 -119
  111. package/docs/class_webdriver_logging_Preferences.html +0 -8
  112. package/docs/class_webdriver_promise_CancellationError.html +0 -17
  113. package/docs/class_webdriver_promise_ControlFlow.html +0 -153
  114. package/docs/class_webdriver_promise_Deferred.html +0 -84
  115. package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
  116. package/docs/class_webdriver_promise_Promise.html +0 -75
  117. package/docs/class_webdriver_stacktrace_Frame.html +0 -20
  118. package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
  119. package/docs/class_webdriver_testing_Assertion.html +0 -99
  120. package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
  121. package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
  122. package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
  123. package/docs/class_webdriver_until_Condition.html +0 -7
  124. package/docs/dossier.css +0 -1
  125. package/docs/dossier.js +0 -86
  126. package/docs/enum_bot_ErrorCode.html +0 -3
  127. package/docs/enum_bot_Error_State.html +0 -2
  128. package/docs/enum_webdriver_Browser.html +0 -2
  129. package/docs/enum_webdriver_Button.html +0 -2
  130. package/docs/enum_webdriver_Capability.html +0 -33
  131. package/docs/enum_webdriver_CommandName.html +0 -3
  132. package/docs/enum_webdriver_Key.html +0 -12
  133. package/docs/enum_webdriver_logging_Type.html +0 -6
  134. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
  135. package/docs/index.html +0 -125
  136. package/docs/interface_webdriver_CommandExecutor.html +0 -9
  137. package/docs/interface_webdriver_http_Client.html +0 -10
  138. package/docs/interface_webdriver_promise_Thenable.html +0 -77
  139. package/docs/module_selenium-webdriver.html +0 -23
  140. package/docs/module_selenium-webdriver__base.html +0 -23
  141. package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
  142. package/docs/module_selenium-webdriver_builder.html +0 -2
  143. package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
  144. package/docs/module_selenium-webdriver_chrome.html +0 -90
  145. package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
  146. package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
  147. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
  148. package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
  149. package/docs/module_selenium-webdriver_class_Builder.html +0 -138
  150. package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
  151. package/docs/module_selenium-webdriver_class_Command.html +0 -15
  152. package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
  153. package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
  154. package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
  155. package/docs/module_selenium-webdriver_class_Session.html +0 -13
  156. package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
  157. package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
  158. package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
  159. package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
  160. package/docs/module_selenium-webdriver_enum_Button.html +0 -2
  161. package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
  162. package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
  163. package/docs/module_selenium-webdriver_enum_Key.html +0 -12
  164. package/docs/module_selenium-webdriver_error.html +0 -4
  165. package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
  166. package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
  167. package/docs/module_selenium-webdriver_executors.html +0 -10
  168. package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
  169. package/docs/module_selenium-webdriver_firefox.html +0 -68
  170. package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
  171. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
  172. package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
  173. package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
  174. package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
  175. package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
  176. package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
  177. package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
  178. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
  179. package/docs/module_selenium-webdriver_http.html +0 -9
  180. package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
  181. package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
  182. package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
  183. package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
  184. package/docs/module_selenium-webdriver_http_util.html +0 -17
  185. package/docs/module_selenium-webdriver_ie.html +0 -11
  186. package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
  187. package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
  188. package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
  189. package/docs/module_selenium-webdriver_io.html +0 -37
  190. package/docs/module_selenium-webdriver_io_exec.html +0 -6
  191. package/docs/module_selenium-webdriver_namespace_By.html +0 -56
  192. package/docs/module_selenium-webdriver_namespace_error.html +0 -4
  193. package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
  194. package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
  195. package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
  196. package/docs/module_selenium-webdriver_namespace_until.html +0 -82
  197. package/docs/module_selenium-webdriver_net.html +0 -7
  198. package/docs/module_selenium-webdriver_net_portprober.html +0 -12
  199. package/docs/module_selenium-webdriver_opera.html +0 -62
  200. package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
  201. package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
  202. package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
  203. package/docs/module_selenium-webdriver_phantomjs.html +0 -2
  204. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
  205. package/docs/module_selenium-webdriver_proxy.html +0 -28
  206. package/docs/module_selenium-webdriver_remote.html +0 -8
  207. package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
  208. package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
  209. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
  210. package/docs/module_selenium-webdriver_safari.html +0 -9
  211. package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
  212. package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
  213. package/docs/module_selenium-webdriver_testing.html +0 -74
  214. package/docs/module_selenium-webdriver_testing_assert.html +0 -9
  215. package/docs/namespace_bot.html +0 -4
  216. package/docs/namespace_bot_json.html +0 -20
  217. package/docs/namespace_bot_response.html +0 -18
  218. package/docs/namespace_bot_userAgent.html +0 -33
  219. package/docs/namespace_webdriver.html +0 -30
  220. package/docs/namespace_webdriver_By.html +0 -56
  221. package/docs/namespace_webdriver_http.html +0 -6
  222. package/docs/namespace_webdriver_logging.html +0 -70
  223. package/docs/namespace_webdriver_promise.html +0 -688
  224. package/docs/namespace_webdriver_stacktrace.html +0 -17
  225. package/docs/namespace_webdriver_testing.html +0 -7
  226. package/docs/namespace_webdriver_testing_assert.html +0 -9
  227. package/docs/namespace_webdriver_testing_asserts.html +0 -18
  228. package/docs/namespace_webdriver_until.html +0 -82
  229. package/docs/source/_base.js.src.html +0 -1
  230. package/docs/source/builder.js.src.html +0 -1
  231. package/docs/source/chrome.js.src.html +0 -1
  232. package/docs/source/error.js.src.html +0 -1
  233. package/docs/source/executors.js.src.html +0 -1
  234. package/docs/source/firefox/binary.js.src.html +0 -1
  235. package/docs/source/firefox/extension.js.src.html +0 -1
  236. package/docs/source/firefox/index.js.src.html +0 -1
  237. package/docs/source/firefox/profile.js.src.html +0 -1
  238. package/docs/source/http/index.js.src.html +0 -1
  239. package/docs/source/http/util.js.src.html +0 -1
  240. package/docs/source/ie.js.src.html +0 -1
  241. package/docs/source/index.js.src.html +0 -1
  242. package/docs/source/io/exec.js.src.html +0 -1
  243. package/docs/source/io/index.js.src.html +0 -1
  244. package/docs/source/lib/atoms/error.js.src.html +0 -1
  245. package/docs/source/lib/atoms/json.js.src.html +0 -1
  246. package/docs/source/lib/atoms/response.js.src.html +0 -1
  247. package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
  248. package/docs/source/lib/goog/array/array.js.src.html +0 -1
  249. package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
  250. package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
  251. package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
  252. package/docs/source/lib/goog/async/run.js.src.html +0 -1
  253. package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
  254. package/docs/source/lib/goog/base.js.src.html +0 -1
  255. package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
  256. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
  257. package/docs/source/lib/goog/debug/error.js.src.html +0 -1
  258. package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
  259. package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
  260. package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
  261. package/docs/source/lib/goog/deps.js.src.html +0 -1
  262. package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
  263. package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
  264. package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
  265. package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
  266. package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
  267. package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
  268. package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
  269. package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
  270. package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
  271. package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
  272. package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
  273. package/docs/source/lib/goog/events/event.js.src.html +0 -1
  274. package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
  275. package/docs/source/lib/goog/events/events.js.src.html +0 -1
  276. package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
  277. package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
  278. package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
  279. package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
  280. package/docs/source/lib/goog/events/listener.js.src.html +0 -1
  281. package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
  282. package/docs/source/lib/goog/fs/url.js.src.html +0 -1
  283. package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
  284. package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
  285. package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
  286. package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
  287. package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
  288. package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
  289. package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
  290. package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
  291. package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
  292. package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
  293. package/docs/source/lib/goog/json/json.js.src.html +0 -1
  294. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
  295. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
  296. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
  297. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
  298. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
  299. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
  300. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
  301. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
  302. package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
  303. package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
  304. package/docs/source/lib/goog/log/log.js.src.html +0 -1
  305. package/docs/source/lib/goog/math/box.js.src.html +0 -1
  306. package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
  307. package/docs/source/lib/goog/math/math.js.src.html +0 -1
  308. package/docs/source/lib/goog/math/rect.js.src.html +0 -1
  309. package/docs/source/lib/goog/math/size.js.src.html +0 -1
  310. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
  311. package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
  312. package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
  313. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
  314. package/docs/source/lib/goog/object/object.js.src.html +0 -1
  315. package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
  316. package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
  317. package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
  318. package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
  319. package/docs/source/lib/goog/string/const.js.src.html +0 -1
  320. package/docs/source/lib/goog/string/string.js.src.html +0 -1
  321. package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
  322. package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
  323. package/docs/source/lib/goog/structs/map.js.src.html +0 -1
  324. package/docs/source/lib/goog/structs/set.js.src.html +0 -1
  325. package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
  326. package/docs/source/lib/goog/style/style.js.src.html +0 -1
  327. package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
  328. package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
  329. package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
  330. package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
  331. package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
  332. package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
  333. package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
  334. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
  335. package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
  336. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
  337. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
  338. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
  339. package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
  340. package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
  341. package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
  342. package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
  343. package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
  344. package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
  345. package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
  346. package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
  347. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
  348. package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
  349. package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
  350. package/docs/source/lib/webdriver/button.js.src.html +0 -1
  351. package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
  352. package/docs/source/lib/webdriver/command.js.src.html +0 -1
  353. package/docs/source/lib/webdriver/events.js.src.html +0 -1
  354. package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
  355. package/docs/source/lib/webdriver/key.js.src.html +0 -1
  356. package/docs/source/lib/webdriver/locators.js.src.html +0 -1
  357. package/docs/source/lib/webdriver/logging.js.src.html +0 -1
  358. package/docs/source/lib/webdriver/promise.js.src.html +0 -1
  359. package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
  360. package/docs/source/lib/webdriver/session.js.src.html +0 -1
  361. package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
  362. package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
  363. package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
  364. package/docs/source/lib/webdriver/until.js.src.html +0 -1
  365. package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
  366. package/docs/source/net/index.js.src.html +0 -1
  367. package/docs/source/net/portprober.js.src.html +0 -1
  368. package/docs/source/opera.js.src.html +0 -1
  369. package/docs/source/phantomjs.js.src.html +0 -1
  370. package/docs/source/proxy.js.src.html +0 -1
  371. package/docs/source/remote/index.js.src.html +0 -1
  372. package/docs/source/safari.js.src.html +0 -1
  373. package/docs/source/testing/assert.js.src.html +0 -1
  374. package/docs/source/testing/index.js.src.html +0 -1
  375. package/docs/types.js +0 -1
  376. package/lib/atoms/error.js +0 -202
  377. package/lib/atoms/json.js +0 -80
  378. package/lib/atoms/response.js +0 -110
  379. package/lib/atoms/userAgent.js +0 -257
  380. package/lib/goog/LICENSE +0 -176
  381. package/lib/goog/array/array.js +0 -1654
  382. package/lib/goog/asserts/asserts.js +0 -365
  383. package/lib/goog/async/freelist.js +0 -88
  384. package/lib/goog/async/nexttick.js +0 -241
  385. package/lib/goog/async/run.js +0 -133
  386. package/lib/goog/async/workqueue.js +0 -139
  387. package/lib/goog/base.js +0 -2548
  388. package/lib/goog/debug/debug.js +0 -653
  389. package/lib/goog/debug/entrypointregistry.js +0 -158
  390. package/lib/goog/debug/error.js +0 -63
  391. package/lib/goog/debug/logbuffer.js +0 -148
  392. package/lib/goog/debug/logger.js +0 -873
  393. package/lib/goog/debug/logrecord.js +0 -242
  394. package/lib/goog/deps.js +0 -151
  395. package/lib/goog/disposable/disposable.js +0 -307
  396. package/lib/goog/disposable/idisposable.js +0 -45
  397. package/lib/goog/dom/browserfeature.js +0 -72
  398. package/lib/goog/dom/dom.js +0 -2991
  399. package/lib/goog/dom/nodetype.js +0 -48
  400. package/lib/goog/dom/safe.js +0 -347
  401. package/lib/goog/dom/tagname.js +0 -160
  402. package/lib/goog/dom/tags.js +0 -41
  403. package/lib/goog/dom/vendor.js +0 -96
  404. package/lib/goog/events/browserevent.js +0 -400
  405. package/lib/goog/events/browserfeature.js +0 -85
  406. package/lib/goog/events/event.js +0 -143
  407. package/lib/goog/events/eventid.js +0 -47
  408. package/lib/goog/events/events.js +0 -984
  409. package/lib/goog/events/eventtarget.js +0 -394
  410. package/lib/goog/events/eventtype.js +0 -237
  411. package/lib/goog/events/keycodes.js +0 -427
  412. package/lib/goog/events/listenable.js +0 -335
  413. package/lib/goog/events/listener.js +0 -131
  414. package/lib/goog/events/listenermap.js +0 -308
  415. package/lib/goog/fs/url.js +0 -109
  416. package/lib/goog/functions/functions.js +0 -442
  417. package/lib/goog/html/safehtml.js +0 -757
  418. package/lib/goog/html/safescript.js +0 -234
  419. package/lib/goog/html/safestyle.js +0 -442
  420. package/lib/goog/html/safestylesheet.js +0 -276
  421. package/lib/goog/html/safeurl.js +0 -398
  422. package/lib/goog/html/trustedresourceurl.js +0 -224
  423. package/lib/goog/html/uncheckedconversions.js +0 -232
  424. package/lib/goog/i18n/bidi.js +0 -908
  425. package/lib/goog/iter/iter.js +0 -1302
  426. package/lib/goog/json/json.js +0 -363
  427. package/lib/goog/labs/testing/assertthat.js +0 -58
  428. package/lib/goog/labs/testing/logicmatcher.js +0 -212
  429. package/lib/goog/labs/testing/matcher.js +0 -80
  430. package/lib/goog/labs/testing/numbermatcher.js +0 -346
  431. package/lib/goog/labs/testing/objectmatcher.js +0 -317
  432. package/lib/goog/labs/testing/stringmatcher.js +0 -415
  433. package/lib/goog/labs/useragent/browser.js +0 -341
  434. package/lib/goog/labs/useragent/engine.js +0 -160
  435. package/lib/goog/labs/useragent/platform.js +0 -160
  436. package/lib/goog/labs/useragent/util.js +0 -148
  437. package/lib/goog/log/log.js +0 -197
  438. package/lib/goog/math/box.js +0 -398
  439. package/lib/goog/math/coordinate.js +0 -268
  440. package/lib/goog/math/math.js +0 -451
  441. package/lib/goog/math/rect.js +0 -476
  442. package/lib/goog/math/size.js +0 -227
  443. package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
  444. package/lib/goog/net/xhrlike.js +0 -124
  445. package/lib/goog/net/xmlhttp.js +0 -246
  446. package/lib/goog/net/xmlhttpfactory.js +0 -67
  447. package/lib/goog/object/object.js +0 -686
  448. package/lib/goog/promise/promise.js +0 -1350
  449. package/lib/goog/promise/resolver.js +0 -48
  450. package/lib/goog/promise/thenable.js +0 -126
  451. package/lib/goog/reflect/reflect.js +0 -77
  452. package/lib/goog/string/const.js +0 -182
  453. package/lib/goog/string/string.js +0 -1599
  454. package/lib/goog/string/typedstring.js +0 -48
  455. package/lib/goog/structs/collection.js +0 -56
  456. package/lib/goog/structs/map.js +0 -457
  457. package/lib/goog/structs/set.js +0 -279
  458. package/lib/goog/structs/structs.js +0 -354
  459. package/lib/goog/style/style.js +0 -2037
  460. package/lib/goog/testing/asserts.js +0 -1278
  461. package/lib/goog/testing/events/events.js +0 -767
  462. package/lib/goog/testing/functionmock.js +0 -175
  463. package/lib/goog/testing/jsunit.js +0 -162
  464. package/lib/goog/testing/loosemock.js +0 -242
  465. package/lib/goog/testing/mock.js +0 -645
  466. package/lib/goog/testing/mockclock.js +0 -606
  467. package/lib/goog/testing/mockcontrol.js +0 -220
  468. package/lib/goog/testing/mockinterface.js +0 -45
  469. package/lib/goog/testing/mockmatchers.js +0 -400
  470. package/lib/goog/testing/objectpropertystring.js +0 -68
  471. package/lib/goog/testing/propertyreplacer.js +0 -262
  472. package/lib/goog/testing/recordfunction.js +0 -215
  473. package/lib/goog/testing/stacktrace.js +0 -594
  474. package/lib/goog/testing/strictmock.js +0 -130
  475. package/lib/goog/testing/testcase.js +0 -1629
  476. package/lib/goog/testing/testrunner.js +0 -440
  477. package/lib/goog/uri/uri.js +0 -1524
  478. package/lib/goog/uri/utils.js +0 -1064
  479. package/lib/goog/useragent/product.js +0 -183
  480. package/lib/goog/useragent/product_isversion.js +0 -144
  481. package/lib/goog/useragent/useragent.js +0 -572
  482. package/lib/webdriver/actionsequence.js +0 -356
  483. package/lib/webdriver/builder.js +0 -207
  484. package/lib/webdriver/capabilities.js +0 -412
  485. package/lib/webdriver/events.js +0 -179
  486. package/lib/webdriver/firefoxdomexecutor.js +0 -175
  487. package/lib/webdriver/http/corsclient.js +0 -133
  488. package/lib/webdriver/http/http.js +0 -525
  489. package/lib/webdriver/http/xhrclient.js +0 -67
  490. package/lib/webdriver/locators.js +0 -257
  491. package/lib/webdriver/logging.js +0 -347
  492. package/lib/webdriver/session.js +0 -74
  493. package/lib/webdriver/stacktrace.js +0 -619
  494. package/lib/webdriver/test/builder_test.js +0 -53
  495. package/lib/webdriver/test/capabilities_test.js +0 -72
  496. package/lib/webdriver/test/events_test.js +0 -203
  497. package/lib/webdriver/test/http/corsclient_test.js +0 -151
  498. package/lib/webdriver/test/http/http_test.js +0 -428
  499. package/lib/webdriver/test/http/xhrclient_test.js +0 -196
  500. package/lib/webdriver/test/locators_test.js +0 -59
  501. package/lib/webdriver/test/logging_test.js +0 -85
  502. package/lib/webdriver/test/promise_error_test.js +0 -892
  503. package/lib/webdriver/test/promise_flow_test.js +0 -2365
  504. package/lib/webdriver/test/promise_generator_test.js +0 -323
  505. package/lib/webdriver/test/promise_test.js +0 -2012
  506. package/lib/webdriver/test/stacktrace_test.js +0 -480
  507. package/lib/webdriver/test/test_bootstrap.js +0 -67
  508. package/lib/webdriver/test/testing/asserts_test.js +0 -117
  509. package/lib/webdriver/test/testing/client_test.js +0 -88
  510. package/lib/webdriver/test/testing/testcase_test.js +0 -229
  511. package/lib/webdriver/test/testutil.js +0 -209
  512. package/lib/webdriver/test/testutil_test.js +0 -104
  513. package/lib/webdriver/test/until_test.js +0 -411
  514. package/lib/webdriver/test/webdriver_generator_test.js +0 -92
  515. package/lib/webdriver/test/webdriver_test.js +0 -2369
  516. package/lib/webdriver/testing/asserts.js +0 -487
  517. package/lib/webdriver/testing/client.js +0 -179
  518. package/lib/webdriver/testing/jsunit.js +0 -363
  519. package/lib/webdriver/testing/testcase.js +0 -168
  520. package/lib/webdriver/testing/window.js +0 -244
  521. package/lib/webdriver/touchsequence.js +0 -248
  522. package/lib/webdriver/until.js +0 -412
  523. package/lib/webdriver/webdriver.js +0 -2511
  524. package/test/_base_test.js +0 -129
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>safestyle.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/html/safestyle.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2014 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview The SafeStyle type and its builders.<tr><td><a id="l17"></a><a href="#l17">17</a><td> *<tr><td><a id="l18"></a><a href="#l18">18</a><td> * TODO(xtof): Link to document stating type contract.<tr><td><a id="l19"></a><a href="#l19">19</a><td> */<tr><td><a id="l20"></a><a href="#l20">20</a><td><tr><td><a id="l21"></a><a href="#l21">21</a><td>goog.provide(&#39;goog.html.SafeStyle&#39;);<tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td>goog.require(&#39;goog.array&#39;);<tr><td><a id="l24"></a><a href="#l24">24</a><td>goog.require(&#39;goog.asserts&#39;);<tr><td><a id="l25"></a><a href="#l25">25</a><td>goog.require(&#39;goog.string&#39;);<tr><td><a id="l26"></a><a href="#l26">26</a><td>goog.require(&#39;goog.string.Const&#39;);<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.require(&#39;goog.string.TypedString&#39;);<tr><td><a id="l28"></a><a href="#l28">28</a><td><tr><td><a id="l29"></a><a href="#l29">29</a><td><tr><td><a id="l30"></a><a href="#l30">30</a><td><tr><td><a id="l31"></a><a href="#l31">31</a><td>/**<tr><td><a id="l32"></a><a href="#l32">32</a><td> * A string-like object which represents a sequence of CSS declarations<tr><td><a id="l33"></a><a href="#l33">33</a><td> * ({@code propertyName1: propertyvalue1; propertyName2: propertyValue2; ...})<tr><td><a id="l34"></a><a href="#l34">34</a><td> * and that carries the security type contract that its value, as a string,<tr><td><a id="l35"></a><a href="#l35">35</a><td> * will not cause untrusted script execution (XSS) when evaluated as CSS in a<tr><td><a id="l36"></a><a href="#l36">36</a><td> * browser.<tr><td><a id="l37"></a><a href="#l37">37</a><td> *<tr><td><a id="l38"></a><a href="#l38">38</a><td> * Instances of this type must be created via the factory methods<tr><td><a id="l39"></a><a href="#l39">39</a><td> * ({@code goog.html.SafeStyle.create} or<tr><td><a id="l40"></a><a href="#l40">40</a><td> * {@code goog.html.SafeStyle.fromConstant}) and not by invoking its<tr><td><a id="l41"></a><a href="#l41">41</a><td> * constructor. The constructor intentionally takes no parameters and the type<tr><td><a id="l42"></a><a href="#l42">42</a><td> * is immutable; hence only a default instance corresponding to the empty string<tr><td><a id="l43"></a><a href="#l43">43</a><td> * can be obtained via constructor invocation.<tr><td><a id="l44"></a><a href="#l44">44</a><td> *<tr><td><a id="l45"></a><a href="#l45">45</a><td> * A SafeStyle&#39;s string representation ({@link #getTypedStringValue()}) can<tr><td><a id="l46"></a><a href="#l46">46</a><td> * safely:<tr><td><a id="l47"></a><a href="#l47">47</a><td> * &lt;ul&gt;<tr><td><a id="l48"></a><a href="#l48">48</a><td> * &lt;li&gt;Be interpolated as the entire content of a *quoted* HTML style<tr><td><a id="l49"></a><a href="#l49">49</a><td> * attribute, or before already existing properties. The SafeStyle string<tr><td><a id="l50"></a><a href="#l50">50</a><td> * *must be HTML-attribute-escaped* (where &quot; and &#39; are escaped) before<tr><td><a id="l51"></a><a href="#l51">51</a><td> * interpolation.<tr><td><a id="l52"></a><a href="#l52">52</a><td> * &lt;li&gt;Be interpolated as the entire content of a {}-wrapped block within a<tr><td><a id="l53"></a><a href="#l53">53</a><td> * stylesheet, or before already existing properties. The SafeStyle string<tr><td><a id="l54"></a><a href="#l54">54</a><td> * should not be escaped before interpolation. SafeStyle&#39;s contract also<tr><td><a id="l55"></a><a href="#l55">55</a><td> * guarantees that the string will not be able to introduce new properties<tr><td><a id="l56"></a><a href="#l56">56</a><td> * or elide existing ones.<tr><td><a id="l57"></a><a href="#l57">57</a><td> * &lt;li&gt;Be assigned to the style property of a DOM node. The SafeStyle string<tr><td><a id="l58"></a><a href="#l58">58</a><td> * should not be escaped before being assigned to the property.<tr><td><a id="l59"></a><a href="#l59">59</a><td> * &lt;/ul&gt;<tr><td><a id="l60"></a><a href="#l60">60</a><td> *<tr><td><a id="l61"></a><a href="#l61">61</a><td> * A SafeStyle may never contain literal angle brackets. Otherwise, it could<tr><td><a id="l62"></a><a href="#l62">62</a><td> * be unsafe to place a SafeStyle into a &amp;lt;style&amp;gt; tag (where it can&#39;t<tr><td><a id="l63"></a><a href="#l63">63</a><td> * be HTML escaped). For example, if the SafeStyle containing<tr><td><a id="l64"></a><a href="#l64">64</a><td> * &quot;{@code font: &#39;foo &amp;lt;style/&amp;gt;&amp;lt;script&amp;gt;evil&amp;lt;/script&amp;gt;&#39;}&quot; were<tr><td><a id="l65"></a><a href="#l65">65</a><td> * interpolated within a &amp;lt;style&amp;gt; tag, this would then break out of the<tr><td><a id="l66"></a><a href="#l66">66</a><td> * style context into HTML.<tr><td><a id="l67"></a><a href="#l67">67</a><td> *<tr><td><a id="l68"></a><a href="#l68">68</a><td> * A SafeStyle may contain literal single or double quotes, and as such the<tr><td><a id="l69"></a><a href="#l69">69</a><td> * entire style string must be escaped when used in a style attribute (if<tr><td><a id="l70"></a><a href="#l70">70</a><td> * this were not the case, the string could contain a matching quote that<tr><td><a id="l71"></a><a href="#l71">71</a><td> * would escape from the style attribute).<tr><td><a id="l72"></a><a href="#l72">72</a><td> *<tr><td><a id="l73"></a><a href="#l73">73</a><td> * Values of this type must be composable, i.e. for any two values<tr><td><a id="l74"></a><a href="#l74">74</a><td> * {@code style1} and {@code style2} of this type,<tr><td><a id="l75"></a><a href="#l75">75</a><td> * {@code goog.html.SafeStyle.unwrap(style1) +<tr><td><a id="l76"></a><a href="#l76">76</a><td> * goog.html.SafeStyle.unwrap(style2)} must itself be a value that satisfies<tr><td><a id="l77"></a><a href="#l77">77</a><td> * the SafeStyle type constraint. This requirement implies that for any value<tr><td><a id="l78"></a><a href="#l78">78</a><td> * {@code style} of this type, {@code goog.html.SafeStyle.unwrap(style)} must<tr><td><a id="l79"></a><a href="#l79">79</a><td> * not end in a &quot;property value&quot; or &quot;property name&quot; context. For example,<tr><td><a id="l80"></a><a href="#l80">80</a><td> * a value of {@code background:url(&quot;} or {@code font-} would not satisfy the<tr><td><a id="l81"></a><a href="#l81">81</a><td> * SafeStyle contract. This is because concatenating such strings with a<tr><td><a id="l82"></a><a href="#l82">82</a><td> * second value that itself does not contain unsafe CSS can result in an<tr><td><a id="l83"></a><a href="#l83">83</a><td> * overall string that does. For example, if {@code javascript:evil())&quot;} is<tr><td><a id="l84"></a><a href="#l84">84</a><td> * appended to {@code background:url(&quot;}, the resulting string may result in<tr><td><a id="l85"></a><a href="#l85">85</a><td> * the execution of a malicious script.<tr><td><a id="l86"></a><a href="#l86">86</a><td> *<tr><td><a id="l87"></a><a href="#l87">87</a><td> * TODO(user): Consider whether we should implement UTF-8 interchange<tr><td><a id="l88"></a><a href="#l88">88</a><td> * validity checks and blacklisting of newlines (including Unicode ones) and<tr><td><a id="l89"></a><a href="#l89">89</a><td> * other whitespace characters (\t, \f). Document here if so and also update<tr><td><a id="l90"></a><a href="#l90">90</a><td> * SafeStyle.fromConstant().<tr><td><a id="l91"></a><a href="#l91">91</a><td> *<tr><td><a id="l92"></a><a href="#l92">92</a><td> * The following example values comply with this type&#39;s contract:<tr><td><a id="l93"></a><a href="#l93">93</a><td> * &lt;ul&gt;<tr><td><a id="l94"></a><a href="#l94">94</a><td> * &lt;li&gt;&lt;pre&gt;width: 1em;&lt;/pre&gt;<tr><td><a id="l95"></a><a href="#l95">95</a><td> * &lt;li&gt;&lt;pre&gt;height:1em;&lt;/pre&gt;<tr><td><a id="l96"></a><a href="#l96">96</a><td> * &lt;li&gt;&lt;pre&gt;width: 1em;height: 1em;&lt;/pre&gt;<tr><td><a id="l97"></a><a href="#l97">97</a><td> * &lt;li&gt;&lt;pre&gt;background:url(&#39;http://url&#39;);&lt;/pre&gt;<tr><td><a id="l98"></a><a href="#l98">98</a><td> * &lt;/ul&gt;<tr><td><a id="l99"></a><a href="#l99">99</a><td> * In addition, the empty string is safe for use in a CSS attribute.<tr><td><a id="l100"></a><a href="#l100">100</a><td> *<tr><td><a id="l101"></a><a href="#l101">101</a><td> * The following example values do NOT comply with this type&#39;s contract:<tr><td><a id="l102"></a><a href="#l102">102</a><td> * &lt;ul&gt;<tr><td><a id="l103"></a><a href="#l103">103</a><td> * &lt;li&gt;&lt;pre&gt;background: red&lt;/pre&gt; (missing a trailing semi-colon)<tr><td><a id="l104"></a><a href="#l104">104</a><td> * &lt;li&gt;&lt;pre&gt;background:&lt;/pre&gt; (missing a value and a trailing semi-colon)<tr><td><a id="l105"></a><a href="#l105">105</a><td> * &lt;li&gt;&lt;pre&gt;1em&lt;/pre&gt; (missing an attribute name, which provides context for<tr><td><a id="l106"></a><a href="#l106">106</a><td> * the value)<tr><td><a id="l107"></a><a href="#l107">107</a><td> * &lt;/ul&gt;<tr><td><a id="l108"></a><a href="#l108">108</a><td> *<tr><td><a id="l109"></a><a href="#l109">109</a><td> * @see goog.html.SafeStyle#create<tr><td><a id="l110"></a><a href="#l110">110</a><td> * @see goog.html.SafeStyle#fromConstant<tr><td><a id="l111"></a><a href="#l111">111</a><td> * @see http://www.w3.org/TR/css3-syntax/<tr><td><a id="l112"></a><a href="#l112">112</a><td> * @constructor<tr><td><a id="l113"></a><a href="#l113">113</a><td> * @final<tr><td><a id="l114"></a><a href="#l114">114</a><td> * @struct<tr><td><a id="l115"></a><a href="#l115">115</a><td> * @implements {goog.string.TypedString}<tr><td><a id="l116"></a><a href="#l116">116</a><td> */<tr><td><a id="l117"></a><a href="#l117">117</a><td>goog.html.SafeStyle = function() {<tr><td><a id="l118"></a><a href="#l118">118</a><td> /**<tr><td><a id="l119"></a><a href="#l119">119</a><td> * The contained value of this SafeStyle. The field has a purposely<tr><td><a id="l120"></a><a href="#l120">120</a><td> * ugly name to make (non-compiled) code that attempts to directly access this<tr><td><a id="l121"></a><a href="#l121">121</a><td> * field stand out.<tr><td><a id="l122"></a><a href="#l122">122</a><td> * @private {string}<tr><td><a id="l123"></a><a href="#l123">123</a><td> */<tr><td><a id="l124"></a><a href="#l124">124</a><td> this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = &#39;&#39;;<tr><td><a id="l125"></a><a href="#l125">125</a><td><tr><td><a id="l126"></a><a href="#l126">126</a><td> /**<tr><td><a id="l127"></a><a href="#l127">127</a><td> * A type marker used to implement additional run-time type checking.<tr><td><a id="l128"></a><a href="#l128">128</a><td> * @see goog.html.SafeStyle#unwrap<tr><td><a id="l129"></a><a href="#l129">129</a><td> * @const<tr><td><a id="l130"></a><a href="#l130">130</a><td> * @private<tr><td><a id="l131"></a><a href="#l131">131</a><td> */<tr><td><a id="l132"></a><a href="#l132">132</a><td> this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =<tr><td><a id="l133"></a><a href="#l133">133</a><td> goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;<tr><td><a id="l134"></a><a href="#l134">134</a><td>};<tr><td><a id="l135"></a><a href="#l135">135</a><td><tr><td><a id="l136"></a><a href="#l136">136</a><td><tr><td><a id="l137"></a><a href="#l137">137</a><td>/**<tr><td><a id="l138"></a><a href="#l138">138</a><td> * @override<tr><td><a id="l139"></a><a href="#l139">139</a><td> * @const<tr><td><a id="l140"></a><a href="#l140">140</a><td> */<tr><td><a id="l141"></a><a href="#l141">141</a><td>goog.html.SafeStyle.prototype.implementsGoogStringTypedString = true;<tr><td><a id="l142"></a><a href="#l142">142</a><td><tr><td><a id="l143"></a><a href="#l143">143</a><td><tr><td><a id="l144"></a><a href="#l144">144</a><td>/**<tr><td><a id="l145"></a><a href="#l145">145</a><td> * Type marker for the SafeStyle type, used to implement additional<tr><td><a id="l146"></a><a href="#l146">146</a><td> * run-time type checking.<tr><td><a id="l147"></a><a href="#l147">147</a><td> * @const {!Object}<tr><td><a id="l148"></a><a href="#l148">148</a><td> * @private<tr><td><a id="l149"></a><a href="#l149">149</a><td> */<tr><td><a id="l150"></a><a href="#l150">150</a><td>goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};<tr><td><a id="l151"></a><a href="#l151">151</a><td><tr><td><a id="l152"></a><a href="#l152">152</a><td><tr><td><a id="l153"></a><a href="#l153">153</a><td>/**<tr><td><a id="l154"></a><a href="#l154">154</a><td> * Creates a SafeStyle object from a compile-time constant string.<tr><td><a id="l155"></a><a href="#l155">155</a><td> *<tr><td><a id="l156"></a><a href="#l156">156</a><td> * {@code style} should be in the format<tr><td><a id="l157"></a><a href="#l157">157</a><td> * {@code name: value; [name: value; ...]} and must not have any &lt; or &gt;<tr><td><a id="l158"></a><a href="#l158">158</a><td> * characters in it. This is so that SafeStyle&#39;s contract is preserved,<tr><td><a id="l159"></a><a href="#l159">159</a><td> * allowing the SafeStyle to correctly be interpreted as a sequence of CSS<tr><td><a id="l160"></a><a href="#l160">160</a><td> * declarations and without affecting the syntactic structure of any<tr><td><a id="l161"></a><a href="#l161">161</a><td> * surrounding CSS and HTML.<tr><td><a id="l162"></a><a href="#l162">162</a><td> *<tr><td><a id="l163"></a><a href="#l163">163</a><td> * This method performs basic sanity checks on the format of {@code style}<tr><td><a id="l164"></a><a href="#l164">164</a><td> * but does not constrain the format of {@code name} and {@code value}, except<tr><td><a id="l165"></a><a href="#l165">165</a><td> * for disallowing tag characters.<tr><td><a id="l166"></a><a href="#l166">166</a><td> *<tr><td><a id="l167"></a><a href="#l167">167</a><td> * @param {!goog.string.Const} style A compile-time-constant string from which<tr><td><a id="l168"></a><a href="#l168">168</a><td> * to create a SafeStyle.<tr><td><a id="l169"></a><a href="#l169">169</a><td> * @return {!goog.html.SafeStyle} A SafeStyle object initialized to<tr><td><a id="l170"></a><a href="#l170">170</a><td> * {@code style}.<tr><td><a id="l171"></a><a href="#l171">171</a><td> */<tr><td><a id="l172"></a><a href="#l172">172</a><td>goog.html.SafeStyle.fromConstant = function(style) {<tr><td><a id="l173"></a><a href="#l173">173</a><td> var styleString = goog.string.Const.unwrap(style);<tr><td><a id="l174"></a><a href="#l174">174</a><td> if (styleString.length === 0) {<tr><td><a id="l175"></a><a href="#l175">175</a><td> return goog.html.SafeStyle.EMPTY;<tr><td><a id="l176"></a><a href="#l176">176</a><td> }<tr><td><a id="l177"></a><a href="#l177">177</a><td> goog.html.SafeStyle.checkStyle_(styleString);<tr><td><a id="l178"></a><a href="#l178">178</a><td> goog.asserts.assert(goog.string.endsWith(styleString, &#39;;&#39;),<tr><td><a id="l179"></a><a href="#l179">179</a><td> &#39;Last character of style string is not \&#39;;\&#39;: &#39; + styleString);<tr><td><a id="l180"></a><a href="#l180">180</a><td> goog.asserts.assert(goog.string.contains(styleString, &#39;:&#39;),<tr><td><a id="l181"></a><a href="#l181">181</a><td> &#39;Style string must contain at least one \&#39;:\&#39;, to &#39; +<tr><td><a id="l182"></a><a href="#l182">182</a><td> &#39;specify a &quot;name: value&quot; pair: &#39; + styleString);<tr><td><a id="l183"></a><a href="#l183">183</a><td> return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(<tr><td><a id="l184"></a><a href="#l184">184</a><td> styleString);<tr><td><a id="l185"></a><a href="#l185">185</a><td>};<tr><td><a id="l186"></a><a href="#l186">186</a><td><tr><td><a id="l187"></a><a href="#l187">187</a><td><tr><td><a id="l188"></a><a href="#l188">188</a><td>/**<tr><td><a id="l189"></a><a href="#l189">189</a><td> * Checks if the style definition is valid.<tr><td><a id="l190"></a><a href="#l190">190</a><td> * @param {string} style<tr><td><a id="l191"></a><a href="#l191">191</a><td> * @private<tr><td><a id="l192"></a><a href="#l192">192</a><td> */<tr><td><a id="l193"></a><a href="#l193">193</a><td>goog.html.SafeStyle.checkStyle_ = function(style) {<tr><td><a id="l194"></a><a href="#l194">194</a><td> goog.asserts.assert(!/[&lt;&gt;]/.test(style),<tr><td><a id="l195"></a><a href="#l195">195</a><td> &#39;Forbidden characters in style string: &#39; + style);<tr><td><a id="l196"></a><a href="#l196">196</a><td>};<tr><td><a id="l197"></a><a href="#l197">197</a><td><tr><td><a id="l198"></a><a href="#l198">198</a><td><tr><td><a id="l199"></a><a href="#l199">199</a><td>/**<tr><td><a id="l200"></a><a href="#l200">200</a><td> * Returns this SafeStyle&#39;s value as a string.<tr><td><a id="l201"></a><a href="#l201">201</a><td> *<tr><td><a id="l202"></a><a href="#l202">202</a><td> * IMPORTANT: In code where it is security relevant that an object&#39;s type is<tr><td><a id="l203"></a><a href="#l203">203</a><td> * indeed {@code SafeStyle}, use {@code goog.html.SafeStyle.unwrap} instead of<tr><td><a id="l204"></a><a href="#l204">204</a><td> * this method. If in doubt, assume that it&#39;s security relevant. In particular,<tr><td><a id="l205"></a><a href="#l205">205</a><td> * note that goog.html functions which return a goog.html type do not guarantee<tr><td><a id="l206"></a><a href="#l206">206</a><td> * the returned instance is of the right type. For example:<tr><td><a id="l207"></a><a href="#l207">207</a><td> *<tr><td><a id="l208"></a><a href="#l208">208</a><td> * &lt;pre&gt;<tr><td><a id="l209"></a><a href="#l209">209</a><td> * var fakeSafeHtml = new String(&#39;fake&#39;);<tr><td><a id="l210"></a><a href="#l210">210</a><td> * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;<tr><td><a id="l211"></a><a href="#l211">211</a><td> * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);<tr><td><a id="l212"></a><a href="#l212">212</a><td> * // newSafeHtml is just an alias for fakeSafeHtml, it&#39;s passed through by<tr><td><a id="l213"></a><a href="#l213">213</a><td> * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml<tr><td><a id="l214"></a><a href="#l214">214</a><td> * // instanceof goog.html.SafeHtml.<tr><td><a id="l215"></a><a href="#l215">215</a><td> * &lt;/pre&gt;<tr><td><a id="l216"></a><a href="#l216">216</a><td> *<tr><td><a id="l217"></a><a href="#l217">217</a><td> * @see goog.html.SafeStyle#unwrap<tr><td><a id="l218"></a><a href="#l218">218</a><td> * @override<tr><td><a id="l219"></a><a href="#l219">219</a><td> */<tr><td><a id="l220"></a><a href="#l220">220</a><td>goog.html.SafeStyle.prototype.getTypedStringValue = function() {<tr><td><a id="l221"></a><a href="#l221">221</a><td> return this.privateDoNotAccessOrElseSafeStyleWrappedValue_;<tr><td><a id="l222"></a><a href="#l222">222</a><td>};<tr><td><a id="l223"></a><a href="#l223">223</a><td><tr><td><a id="l224"></a><a href="#l224">224</a><td><tr><td><a id="l225"></a><a href="#l225">225</a><td>if (goog.DEBUG) {<tr><td><a id="l226"></a><a href="#l226">226</a><td> /**<tr><td><a id="l227"></a><a href="#l227">227</a><td> * Returns a debug string-representation of this value.<tr><td><a id="l228"></a><a href="#l228">228</a><td> *<tr><td><a id="l229"></a><a href="#l229">229</a><td> * To obtain the actual string value wrapped in a SafeStyle, use<tr><td><a id="l230"></a><a href="#l230">230</a><td> * {@code goog.html.SafeStyle.unwrap}.<tr><td><a id="l231"></a><a href="#l231">231</a><td> *<tr><td><a id="l232"></a><a href="#l232">232</a><td> * @see goog.html.SafeStyle#unwrap<tr><td><a id="l233"></a><a href="#l233">233</a><td> * @override<tr><td><a id="l234"></a><a href="#l234">234</a><td> */<tr><td><a id="l235"></a><a href="#l235">235</a><td> goog.html.SafeStyle.prototype.toString = function() {<tr><td><a id="l236"></a><a href="#l236">236</a><td> return &#39;SafeStyle{&#39; +<tr><td><a id="l237"></a><a href="#l237">237</a><td> this.privateDoNotAccessOrElseSafeStyleWrappedValue_ + &#39;}&#39;;<tr><td><a id="l238"></a><a href="#l238">238</a><td> };<tr><td><a id="l239"></a><a href="#l239">239</a><td>}<tr><td><a id="l240"></a><a href="#l240">240</a><td><tr><td><a id="l241"></a><a href="#l241">241</a><td><tr><td><a id="l242"></a><a href="#l242">242</a><td>/**<tr><td><a id="l243"></a><a href="#l243">243</a><td> * Performs a runtime check that the provided object is indeed a<tr><td><a id="l244"></a><a href="#l244">244</a><td> * SafeStyle object, and returns its value.<tr><td><a id="l245"></a><a href="#l245">245</a><td> *<tr><td><a id="l246"></a><a href="#l246">246</a><td> * @param {!goog.html.SafeStyle} safeStyle The object to extract from.<tr><td><a id="l247"></a><a href="#l247">247</a><td> * @return {string} The safeStyle object&#39;s contained string, unless<tr><td><a id="l248"></a><a href="#l248">248</a><td> * the run-time type check fails. In that case, {@code unwrap} returns an<tr><td><a id="l249"></a><a href="#l249">249</a><td> * innocuous string, or, if assertions are enabled, throws<tr><td><a id="l250"></a><a href="#l250">250</a><td> * {@code goog.asserts.AssertionError}.<tr><td><a id="l251"></a><a href="#l251">251</a><td> */<tr><td><a id="l252"></a><a href="#l252">252</a><td>goog.html.SafeStyle.unwrap = function(safeStyle) {<tr><td><a id="l253"></a><a href="#l253">253</a><td> // Perform additional Run-time type-checking to ensure that<tr><td><a id="l254"></a><a href="#l254">254</a><td> // safeStyle is indeed an instance of the expected type. This<tr><td><a id="l255"></a><a href="#l255">255</a><td> // provides some additional protection against security bugs due to<tr><td><a id="l256"></a><a href="#l256">256</a><td> // application code that disables type checks.<tr><td><a id="l257"></a><a href="#l257">257</a><td> // Specifically, the following checks are performed:<tr><td><a id="l258"></a><a href="#l258">258</a><td> // 1. The object is an instance of the expected type.<tr><td><a id="l259"></a><a href="#l259">259</a><td> // 2. The object is not an instance of a subclass.<tr><td><a id="l260"></a><a href="#l260">260</a><td> // 3. The object carries a type marker for the expected type. &quot;Faking&quot; an<tr><td><a id="l261"></a><a href="#l261">261</a><td> // object requires a reference to the type marker, which has names intended<tr><td><a id="l262"></a><a href="#l262">262</a><td> // to stand out in code reviews.<tr><td><a id="l263"></a><a href="#l263">263</a><td> if (safeStyle instanceof goog.html.SafeStyle &amp;&amp;<tr><td><a id="l264"></a><a href="#l264">264</a><td> safeStyle.constructor === goog.html.SafeStyle &amp;&amp;<tr><td><a id="l265"></a><a href="#l265">265</a><td> safeStyle.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===<tr><td><a id="l266"></a><a href="#l266">266</a><td> goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {<tr><td><a id="l267"></a><a href="#l267">267</a><td> return safeStyle.privateDoNotAccessOrElseSafeStyleWrappedValue_;<tr><td><a id="l268"></a><a href="#l268">268</a><td> } else {<tr><td><a id="l269"></a><a href="#l269">269</a><td> goog.asserts.fail(<tr><td><a id="l270"></a><a href="#l270">270</a><td> &#39;expected object of type SafeStyle, got \&#39;&#39; + safeStyle + &#39;\&#39;&#39;);<tr><td><a id="l271"></a><a href="#l271">271</a><td> return &#39;type_error:SafeStyle&#39;;<tr><td><a id="l272"></a><a href="#l272">272</a><td> }<tr><td><a id="l273"></a><a href="#l273">273</a><td>};<tr><td><a id="l274"></a><a href="#l274">274</a><td><tr><td><a id="l275"></a><a href="#l275">275</a><td><tr><td><a id="l276"></a><a href="#l276">276</a><td>/**<tr><td><a id="l277"></a><a href="#l277">277</a><td> * Package-internal utility method to create SafeStyle instances.<tr><td><a id="l278"></a><a href="#l278">278</a><td> *<tr><td><a id="l279"></a><a href="#l279">279</a><td> * @param {string} style The string to initialize the SafeStyle object with.<tr><td><a id="l280"></a><a href="#l280">280</a><td> * @return {!goog.html.SafeStyle} The initialized SafeStyle object.<tr><td><a id="l281"></a><a href="#l281">281</a><td> * @package<tr><td><a id="l282"></a><a href="#l282">282</a><td> */<tr><td><a id="l283"></a><a href="#l283">283</a><td>goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse =<tr><td><a id="l284"></a><a href="#l284">284</a><td> function(style) {<tr><td><a id="l285"></a><a href="#l285">285</a><td> return new goog.html.SafeStyle().initSecurityPrivateDoNotAccessOrElse_(style);<tr><td><a id="l286"></a><a href="#l286">286</a><td>};<tr><td><a id="l287"></a><a href="#l287">287</a><td><tr><td><a id="l288"></a><a href="#l288">288</a><td><tr><td><a id="l289"></a><a href="#l289">289</a><td>/**<tr><td><a id="l290"></a><a href="#l290">290</a><td> * Called from createSafeStyleSecurityPrivateDoNotAccessOrElse(). This<tr><td><a id="l291"></a><a href="#l291">291</a><td> * method exists only so that the compiler can dead code eliminate static<tr><td><a id="l292"></a><a href="#l292">292</a><td> * fields (like EMPTY) when they&#39;re not accessed.<tr><td><a id="l293"></a><a href="#l293">293</a><td> * @param {string} style<tr><td><a id="l294"></a><a href="#l294">294</a><td> * @return {!goog.html.SafeStyle}<tr><td><a id="l295"></a><a href="#l295">295</a><td> * @private<tr><td><a id="l296"></a><a href="#l296">296</a><td> */<tr><td><a id="l297"></a><a href="#l297">297</a><td>goog.html.SafeStyle.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(<tr><td><a id="l298"></a><a href="#l298">298</a><td> style) {<tr><td><a id="l299"></a><a href="#l299">299</a><td> this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = style;<tr><td><a id="l300"></a><a href="#l300">300</a><td> return this;<tr><td><a id="l301"></a><a href="#l301">301</a><td>};<tr><td><a id="l302"></a><a href="#l302">302</a><td><tr><td><a id="l303"></a><a href="#l303">303</a><td><tr><td><a id="l304"></a><a href="#l304">304</a><td>/**<tr><td><a id="l305"></a><a href="#l305">305</a><td> * A SafeStyle instance corresponding to the empty string.<tr><td><a id="l306"></a><a href="#l306">306</a><td> * @const {!goog.html.SafeStyle}<tr><td><a id="l307"></a><a href="#l307">307</a><td> */<tr><td><a id="l308"></a><a href="#l308">308</a><td>goog.html.SafeStyle.EMPTY =<tr><td><a id="l309"></a><a href="#l309">309</a><td> goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(&#39;&#39;);<tr><td><a id="l310"></a><a href="#l310">310</a><td><tr><td><a id="l311"></a><a href="#l311">311</a><td><tr><td><a id="l312"></a><a href="#l312">312</a><td>/**<tr><td><a id="l313"></a><a href="#l313">313</a><td> * The innocuous string generated by goog.html.SafeUrl.create when passed<tr><td><a id="l314"></a><a href="#l314">314</a><td> * an unsafe value.<tr><td><a id="l315"></a><a href="#l315">315</a><td> * @const {string}<tr><td><a id="l316"></a><a href="#l316">316</a><td> */<tr><td><a id="l317"></a><a href="#l317">317</a><td>goog.html.SafeStyle.INNOCUOUS_STRING = &#39;zClosurez&#39;;<tr><td><a id="l318"></a><a href="#l318">318</a><td><tr><td><a id="l319"></a><a href="#l319">319</a><td><tr><td><a id="l320"></a><a href="#l320">320</a><td>/**<tr><td><a id="l321"></a><a href="#l321">321</a><td> * Mapping of property names to their values.<tr><td><a id="l322"></a><a href="#l322">322</a><td> * @typedef {!Object&lt;string, goog.string.Const|string&gt;}<tr><td><a id="l323"></a><a href="#l323">323</a><td> */<tr><td><a id="l324"></a><a href="#l324">324</a><td>goog.html.SafeStyle.PropertyMap;<tr><td><a id="l325"></a><a href="#l325">325</a><td><tr><td><a id="l326"></a><a href="#l326">326</a><td><tr><td><a id="l327"></a><a href="#l327">327</a><td>/**<tr><td><a id="l328"></a><a href="#l328">328</a><td> * Creates a new SafeStyle object from the properties specified in the map.<tr><td><a id="l329"></a><a href="#l329">329</a><td> * @param {goog.html.SafeStyle.PropertyMap} map Mapping of property names to<tr><td><a id="l330"></a><a href="#l330">330</a><td> * their values, for example {&#39;margin&#39;: &#39;1px&#39;}. Names must consist of<tr><td><a id="l331"></a><a href="#l331">331</a><td> * [-_a-zA-Z0-9]. Values might be strings consisting of<tr><td><a id="l332"></a><a href="#l332">332</a><td> * [-,.&#39;&quot;%_!# a-zA-Z0-9], where &quot; and &#39; must be properly balanced.<tr><td><a id="l333"></a><a href="#l333">333</a><td> * Other values must be wrapped in goog.string.Const. Null value causes<tr><td><a id="l334"></a><a href="#l334">334</a><td> * skipping the property.<tr><td><a id="l335"></a><a href="#l335">335</a><td> * @return {!goog.html.SafeStyle}<tr><td><a id="l336"></a><a href="#l336">336</a><td> * @throws {Error} If invalid name is provided.<tr><td><a id="l337"></a><a href="#l337">337</a><td> * @throws {goog.asserts.AssertionError} If invalid value is provided. With<tr><td><a id="l338"></a><a href="#l338">338</a><td> * disabled assertions, invalid value is replaced by<tr><td><a id="l339"></a><a href="#l339">339</a><td> * goog.html.SafeStyle.INNOCUOUS_STRING.<tr><td><a id="l340"></a><a href="#l340">340</a><td> */<tr><td><a id="l341"></a><a href="#l341">341</a><td>goog.html.SafeStyle.create = function(map) {<tr><td><a id="l342"></a><a href="#l342">342</a><td> var style = &#39;&#39;;<tr><td><a id="l343"></a><a href="#l343">343</a><td> for (var name in map) {<tr><td><a id="l344"></a><a href="#l344">344</a><td> if (!/^[-_a-zA-Z0-9]+$/.test(name)) {<tr><td><a id="l345"></a><a href="#l345">345</a><td> throw Error(&#39;Name allows only [-_a-zA-Z0-9], got: &#39; + name);<tr><td><a id="l346"></a><a href="#l346">346</a><td> }<tr><td><a id="l347"></a><a href="#l347">347</a><td> var value = map[name];<tr><td><a id="l348"></a><a href="#l348">348</a><td> if (value == null) {<tr><td><a id="l349"></a><a href="#l349">349</a><td> continue;<tr><td><a id="l350"></a><a href="#l350">350</a><td> }<tr><td><a id="l351"></a><a href="#l351">351</a><td> if (value instanceof goog.string.Const) {<tr><td><a id="l352"></a><a href="#l352">352</a><td> value = goog.string.Const.unwrap(value);<tr><td><a id="l353"></a><a href="#l353">353</a><td> // These characters can be used to change context and we don&#39;t want that<tr><td><a id="l354"></a><a href="#l354">354</a><td> // even with const values.<tr><td><a id="l355"></a><a href="#l355">355</a><td> goog.asserts.assert(!/[{;}]/.test(value), &#39;Value does not allow [{;}].&#39;);<tr><td><a id="l356"></a><a href="#l356">356</a><td> } else if (!goog.html.SafeStyle.VALUE_RE_.test(value)) {<tr><td><a id="l357"></a><a href="#l357">357</a><td> goog.asserts.fail(<tr><td><a id="l358"></a><a href="#l358">358</a><td> &#39;String value allows only [-,.&quot;\&#39;%_!# a-zA-Z0-9], got: &#39; + value);<tr><td><a id="l359"></a><a href="#l359">359</a><td> value = goog.html.SafeStyle.INNOCUOUS_STRING;<tr><td><a id="l360"></a><a href="#l360">360</a><td> } else if (!goog.html.SafeStyle.hasBalancedQuotes_(value)) {<tr><td><a id="l361"></a><a href="#l361">361</a><td> goog.asserts.fail(&#39;String value requires balanced quotes, got: &#39; + value);<tr><td><a id="l362"></a><a href="#l362">362</a><td> value = goog.html.SafeStyle.INNOCUOUS_STRING;<tr><td><a id="l363"></a><a href="#l363">363</a><td> }<tr><td><a id="l364"></a><a href="#l364">364</a><td> style += name + &#39;:&#39; + value + &#39;;&#39;;<tr><td><a id="l365"></a><a href="#l365">365</a><td> }<tr><td><a id="l366"></a><a href="#l366">366</a><td> if (!style) {<tr><td><a id="l367"></a><a href="#l367">367</a><td> return goog.html.SafeStyle.EMPTY;<tr><td><a id="l368"></a><a href="#l368">368</a><td> }<tr><td><a id="l369"></a><a href="#l369">369</a><td> goog.html.SafeStyle.checkStyle_(style);<tr><td><a id="l370"></a><a href="#l370">370</a><td> return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(<tr><td><a id="l371"></a><a href="#l371">371</a><td> style);<tr><td><a id="l372"></a><a href="#l372">372</a><td>};<tr><td><a id="l373"></a><a href="#l373">373</a><td><tr><td><a id="l374"></a><a href="#l374">374</a><td><tr><td><a id="l375"></a><a href="#l375">375</a><td>/**<tr><td><a id="l376"></a><a href="#l376">376</a><td> * Checks that quotes (&quot; and &#39;) are properly balanced inside a string. Assumes<tr><td><a id="l377"></a><a href="#l377">377</a><td> * that neither escape (\) nor any other character that could result in<tr><td><a id="l378"></a><a href="#l378">378</a><td> * breaking out of a string parsing context are allowed;<tr><td><a id="l379"></a><a href="#l379">379</a><td> * see http://www.w3.org/TR/css3-syntax/#string-token-diagram.<tr><td><a id="l380"></a><a href="#l380">380</a><td> * @param {string} value Untrusted CSS property value.<tr><td><a id="l381"></a><a href="#l381">381</a><td> * @return {boolean} True if property value is safe with respect to quote<tr><td><a id="l382"></a><a href="#l382">382</a><td> * balancedness.<tr><td><a id="l383"></a><a href="#l383">383</a><td> * @private<tr><td><a id="l384"></a><a href="#l384">384</a><td> */<tr><td><a id="l385"></a><a href="#l385">385</a><td>goog.html.SafeStyle.hasBalancedQuotes_ = function(value) {<tr><td><a id="l386"></a><a href="#l386">386</a><td> var outsideSingle = true;<tr><td><a id="l387"></a><a href="#l387">387</a><td> var outsideDouble = true;<tr><td><a id="l388"></a><a href="#l388">388</a><td> for (var i = 0; i &lt; value.length; i++) {<tr><td><a id="l389"></a><a href="#l389">389</a><td> var c = value.charAt(i);<tr><td><a id="l390"></a><a href="#l390">390</a><td> if (c == &quot;&#39;&quot; &amp;&amp; outsideDouble) {<tr><td><a id="l391"></a><a href="#l391">391</a><td> outsideSingle = !outsideSingle;<tr><td><a id="l392"></a><a href="#l392">392</a><td> } else if (c == &#39;&quot;&#39; &amp;&amp; outsideSingle) {<tr><td><a id="l393"></a><a href="#l393">393</a><td> outsideDouble = !outsideDouble;<tr><td><a id="l394"></a><a href="#l394">394</a><td> }<tr><td><a id="l395"></a><a href="#l395">395</a><td> }<tr><td><a id="l396"></a><a href="#l396">396</a><td> return outsideSingle &amp;&amp; outsideDouble;<tr><td><a id="l397"></a><a href="#l397">397</a><td>};<tr><td><a id="l398"></a><a href="#l398">398</a><td><tr><td><a id="l399"></a><a href="#l399">399</a><td><tr><td><a id="l400"></a><a href="#l400">400</a><td>// Keep in sync with the error string in create().<tr><td><a id="l401"></a><a href="#l401">401</a><td>/**<tr><td><a id="l402"></a><a href="#l402">402</a><td> * Regular expression for safe values.<tr><td><a id="l403"></a><a href="#l403">403</a><td> *<tr><td><a id="l404"></a><a href="#l404">404</a><td> * Quotes (&quot; and &#39;) are allowed, but a check must be done elsewhere to ensure<tr><td><a id="l405"></a><a href="#l405">405</a><td> * they&#39;re balanced.<tr><td><a id="l406"></a><a href="#l406">406</a><td> *<tr><td><a id="l407"></a><a href="#l407">407</a><td> * &#39;,&#39; allows multiple values to be assigned to the same property<tr><td><a id="l408"></a><a href="#l408">408</a><td> * (e.g. background-attachment or font-family) and hence could allow<tr><td><a id="l409"></a><a href="#l409">409</a><td> * multiple values to get injected, but that should pose no risk of XSS.<tr><td><a id="l410"></a><a href="#l410">410</a><td> * @const {!RegExp}<tr><td><a id="l411"></a><a href="#l411">411</a><td> * @private<tr><td><a id="l412"></a><a href="#l412">412</a><td> */<tr><td><a id="l413"></a><a href="#l413">413</a><td>goog.html.SafeStyle.VALUE_RE_ = /^[-,.&quot;&#39;%_!# a-zA-Z0-9]+$/;<tr><td><a id="l414"></a><a href="#l414">414</a><td><tr><td><a id="l415"></a><a href="#l415">415</a><td><tr><td><a id="l416"></a><a href="#l416">416</a><td>/**<tr><td><a id="l417"></a><a href="#l417">417</a><td> * Creates a new SafeStyle object by concatenating the values.<tr><td><a id="l418"></a><a href="#l418">418</a><td> * @param {...(!goog.html.SafeStyle|!Array&lt;!goog.html.SafeStyle&gt;)} var_args<tr><td><a id="l419"></a><a href="#l419">419</a><td> * SafeStyles to concatenate.<tr><td><a id="l420"></a><a href="#l420">420</a><td> * @return {!goog.html.SafeStyle}<tr><td><a id="l421"></a><a href="#l421">421</a><td> */<tr><td><a id="l422"></a><a href="#l422">422</a><td>goog.html.SafeStyle.concat = function(var_args) {<tr><td><a id="l423"></a><a href="#l423">423</a><td> var style = &#39;&#39;;<tr><td><a id="l424"></a><a href="#l424">424</a><td><tr><td><a id="l425"></a><a href="#l425">425</a><td> /**<tr><td><a id="l426"></a><a href="#l426">426</a><td> * @param {!goog.html.SafeStyle|!Array&lt;!goog.html.SafeStyle&gt;} argument<tr><td><a id="l427"></a><a href="#l427">427</a><td> */<tr><td><a id="l428"></a><a href="#l428">428</a><td> var addArgument = function(argument) {<tr><td><a id="l429"></a><a href="#l429">429</a><td> if (goog.isArray(argument)) {<tr><td><a id="l430"></a><a href="#l430">430</a><td> goog.array.forEach(argument, addArgument);<tr><td><a id="l431"></a><a href="#l431">431</a><td> } else {<tr><td><a id="l432"></a><a href="#l432">432</a><td> style += goog.html.SafeStyle.unwrap(argument);<tr><td><a id="l433"></a><a href="#l433">433</a><td> }<tr><td><a id="l434"></a><a href="#l434">434</a><td> };<tr><td><a id="l435"></a><a href="#l435">435</a><td><tr><td><a id="l436"></a><a href="#l436">436</a><td> goog.array.forEach(arguments, addArgument);<tr><td><a id="l437"></a><a href="#l437">437</a><td> if (!style) {<tr><td><a id="l438"></a><a href="#l438">438</a><td> return goog.html.SafeStyle.EMPTY;<tr><td><a id="l439"></a><a href="#l439">439</a><td> }<tr><td><a id="l440"></a><a href="#l440">440</a><td> return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(<tr><td><a id="l441"></a><a href="#l441">441</a><td> style);<tr><td><a id="l442"></a><a href="#l442">442</a><td>};</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>safestylesheet.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/html/safestylesheet.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2014 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview The SafeStyleSheet type and its builders.<tr><td><a id="l17"></a><a href="#l17">17</a><td> *<tr><td><a id="l18"></a><a href="#l18">18</a><td> * TODO(xtof): Link to document stating type contract.<tr><td><a id="l19"></a><a href="#l19">19</a><td> */<tr><td><a id="l20"></a><a href="#l20">20</a><td><tr><td><a id="l21"></a><a href="#l21">21</a><td>goog.provide(&#39;goog.html.SafeStyleSheet&#39;);<tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td>goog.require(&#39;goog.array&#39;);<tr><td><a id="l24"></a><a href="#l24">24</a><td>goog.require(&#39;goog.asserts&#39;);<tr><td><a id="l25"></a><a href="#l25">25</a><td>goog.require(&#39;goog.string&#39;);<tr><td><a id="l26"></a><a href="#l26">26</a><td>goog.require(&#39;goog.string.Const&#39;);<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.require(&#39;goog.string.TypedString&#39;);<tr><td><a id="l28"></a><a href="#l28">28</a><td><tr><td><a id="l29"></a><a href="#l29">29</a><td><tr><td><a id="l30"></a><a href="#l30">30</a><td><tr><td><a id="l31"></a><a href="#l31">31</a><td>/**<tr><td><a id="l32"></a><a href="#l32">32</a><td> * A string-like object which represents a CSS style sheet and that carries the<tr><td><a id="l33"></a><a href="#l33">33</a><td> * security type contract that its value, as a string, will not cause untrusted<tr><td><a id="l34"></a><a href="#l34">34</a><td> * script execution (XSS) when evaluated as CSS in a browser.<tr><td><a id="l35"></a><a href="#l35">35</a><td> *<tr><td><a id="l36"></a><a href="#l36">36</a><td> * Instances of this type must be created via the factory method<tr><td><a id="l37"></a><a href="#l37">37</a><td> * {@code goog.html.SafeStyleSheet.fromConstant} and not by invoking its<tr><td><a id="l38"></a><a href="#l38">38</a><td> * constructor. The constructor intentionally takes no parameters and the type<tr><td><a id="l39"></a><a href="#l39">39</a><td> * is immutable; hence only a default instance corresponding to the empty string<tr><td><a id="l40"></a><a href="#l40">40</a><td> * can be obtained via constructor invocation.<tr><td><a id="l41"></a><a href="#l41">41</a><td> *<tr><td><a id="l42"></a><a href="#l42">42</a><td> * A SafeStyleSheet&#39;s string representation can safely be interpolated as the<tr><td><a id="l43"></a><a href="#l43">43</a><td> * content of a style element within HTML. The SafeStyleSheet string should<tr><td><a id="l44"></a><a href="#l44">44</a><td> * not be escaped before interpolation.<tr><td><a id="l45"></a><a href="#l45">45</a><td> *<tr><td><a id="l46"></a><a href="#l46">46</a><td> * Values of this type must be composable, i.e. for any two values<tr><td><a id="l47"></a><a href="#l47">47</a><td> * {@code styleSheet1} and {@code styleSheet2} of this type,<tr><td><a id="l48"></a><a href="#l48">48</a><td> * {@code goog.html.SafeStyleSheet.unwrap(styleSheet1) +<tr><td><a id="l49"></a><a href="#l49">49</a><td> * goog.html.SafeStyleSheet.unwrap(styleSheet2)} must itself be a value that<tr><td><a id="l50"></a><a href="#l50">50</a><td> * satisfies the SafeStyleSheet type constraint. This requirement implies that<tr><td><a id="l51"></a><a href="#l51">51</a><td> * for any value {@code styleSheet} of this type,<tr><td><a id="l52"></a><a href="#l52">52</a><td> * {@code goog.html.SafeStyleSheet.unwrap(styleSheet1)} must end in<tr><td><a id="l53"></a><a href="#l53">53</a><td> * &quot;beginning of rule&quot; context.<tr><td><a id="l54"></a><a href="#l54">54</a><td><tr><td><a id="l55"></a><a href="#l55">55</a><td> * A SafeStyleSheet can be constructed via security-reviewed unchecked<tr><td><a id="l56"></a><a href="#l56">56</a><td> * conversions. In this case producers of SafeStyleSheet must ensure themselves<tr><td><a id="l57"></a><a href="#l57">57</a><td> * that the SafeStyleSheet does not contain unsafe script. Note in particular<tr><td><a id="l58"></a><a href="#l58">58</a><td> * that {@code &amp;lt;} is dangerous, even when inside CSS strings, and so should<tr><td><a id="l59"></a><a href="#l59">59</a><td> * always be forbidden or CSS-escaped in user controlled input. For example, if<tr><td><a id="l60"></a><a href="#l60">60</a><td> * {@code &amp;lt;/style&amp;gt;&amp;lt;script&amp;gt;evil&amp;lt;/script&amp;gt;&quot;} were interpolated<tr><td><a id="l61"></a><a href="#l61">61</a><td> * inside a CSS string, it would break out of the context of the original<tr><td><a id="l62"></a><a href="#l62">62</a><td> * style element and {@code evil} would execute. Also note that within an HTML<tr><td><a id="l63"></a><a href="#l63">63</a><td> * style (raw text) element, HTML character references, such as<tr><td><a id="l64"></a><a href="#l64">64</a><td> * {@code &amp;amp;lt;}, are not allowed. See<tr><td><a id="l65"></a><a href="#l65">65</a><td> * http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements<tr><td><a id="l66"></a><a href="#l66">66</a><td> * (similar considerations apply to the style element).<tr><td><a id="l67"></a><a href="#l67">67</a><td> *<tr><td><a id="l68"></a><a href="#l68">68</a><td> * @see goog.html.SafeStyleSheet#fromConstant<tr><td><a id="l69"></a><a href="#l69">69</a><td> * @constructor<tr><td><a id="l70"></a><a href="#l70">70</a><td> * @final<tr><td><a id="l71"></a><a href="#l71">71</a><td> * @struct<tr><td><a id="l72"></a><a href="#l72">72</a><td> * @implements {goog.string.TypedString}<tr><td><a id="l73"></a><a href="#l73">73</a><td> */<tr><td><a id="l74"></a><a href="#l74">74</a><td>goog.html.SafeStyleSheet = function() {<tr><td><a id="l75"></a><a href="#l75">75</a><td> /**<tr><td><a id="l76"></a><a href="#l76">76</a><td> * The contained value of this SafeStyleSheet. The field has a purposely<tr><td><a id="l77"></a><a href="#l77">77</a><td> * ugly name to make (non-compiled) code that attempts to directly access this<tr><td><a id="l78"></a><a href="#l78">78</a><td> * field stand out.<tr><td><a id="l79"></a><a href="#l79">79</a><td> * @private {string}<tr><td><a id="l80"></a><a href="#l80">80</a><td> */<tr><td><a id="l81"></a><a href="#l81">81</a><td> this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = &#39;&#39;;<tr><td><a id="l82"></a><a href="#l82">82</a><td><tr><td><a id="l83"></a><a href="#l83">83</a><td> /**<tr><td><a id="l84"></a><a href="#l84">84</a><td> * A type marker used to implement additional run-time type checking.<tr><td><a id="l85"></a><a href="#l85">85</a><td> * @see goog.html.SafeStyleSheet#unwrap<tr><td><a id="l86"></a><a href="#l86">86</a><td> * @const<tr><td><a id="l87"></a><a href="#l87">87</a><td> * @private<tr><td><a id="l88"></a><a href="#l88">88</a><td> */<tr><td><a id="l89"></a><a href="#l89">89</a><td> this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =<tr><td><a id="l90"></a><a href="#l90">90</a><td> goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;<tr><td><a id="l91"></a><a href="#l91">91</a><td>};<tr><td><a id="l92"></a><a href="#l92">92</a><td><tr><td><a id="l93"></a><a href="#l93">93</a><td><tr><td><a id="l94"></a><a href="#l94">94</a><td>/**<tr><td><a id="l95"></a><a href="#l95">95</a><td> * @override<tr><td><a id="l96"></a><a href="#l96">96</a><td> * @const<tr><td><a id="l97"></a><a href="#l97">97</a><td> */<tr><td><a id="l98"></a><a href="#l98">98</a><td>goog.html.SafeStyleSheet.prototype.implementsGoogStringTypedString = true;<tr><td><a id="l99"></a><a href="#l99">99</a><td><tr><td><a id="l100"></a><a href="#l100">100</a><td><tr><td><a id="l101"></a><a href="#l101">101</a><td>/**<tr><td><a id="l102"></a><a href="#l102">102</a><td> * Type marker for the SafeStyleSheet type, used to implement additional<tr><td><a id="l103"></a><a href="#l103">103</a><td> * run-time type checking.<tr><td><a id="l104"></a><a href="#l104">104</a><td> * @const {!Object}<tr><td><a id="l105"></a><a href="#l105">105</a><td> * @private<tr><td><a id="l106"></a><a href="#l106">106</a><td> */<tr><td><a id="l107"></a><a href="#l107">107</a><td>goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};<tr><td><a id="l108"></a><a href="#l108">108</a><td><tr><td><a id="l109"></a><a href="#l109">109</a><td><tr><td><a id="l110"></a><a href="#l110">110</a><td>/**<tr><td><a id="l111"></a><a href="#l111">111</a><td> * Creates a new SafeStyleSheet object by concatenating values.<tr><td><a id="l112"></a><a href="#l112">112</a><td> * @param {...(!goog.html.SafeStyleSheet|!Array&lt;!goog.html.SafeStyleSheet&gt;)}<tr><td><a id="l113"></a><a href="#l113">113</a><td> * var_args Values to concatenate.<tr><td><a id="l114"></a><a href="#l114">114</a><td> * @return {!goog.html.SafeStyleSheet}<tr><td><a id="l115"></a><a href="#l115">115</a><td> */<tr><td><a id="l116"></a><a href="#l116">116</a><td>goog.html.SafeStyleSheet.concat = function(var_args) {<tr><td><a id="l117"></a><a href="#l117">117</a><td> var result = &#39;&#39;;<tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td> /**<tr><td><a id="l120"></a><a href="#l120">120</a><td> * @param {!goog.html.SafeStyleSheet|!Array&lt;!goog.html.SafeStyleSheet&gt;}<tr><td><a id="l121"></a><a href="#l121">121</a><td> * argument<tr><td><a id="l122"></a><a href="#l122">122</a><td> */<tr><td><a id="l123"></a><a href="#l123">123</a><td> var addArgument = function(argument) {<tr><td><a id="l124"></a><a href="#l124">124</a><td> if (goog.isArray(argument)) {<tr><td><a id="l125"></a><a href="#l125">125</a><td> goog.array.forEach(argument, addArgument);<tr><td><a id="l126"></a><a href="#l126">126</a><td> } else {<tr><td><a id="l127"></a><a href="#l127">127</a><td> result += goog.html.SafeStyleSheet.unwrap(argument);<tr><td><a id="l128"></a><a href="#l128">128</a><td> }<tr><td><a id="l129"></a><a href="#l129">129</a><td> };<tr><td><a id="l130"></a><a href="#l130">130</a><td><tr><td><a id="l131"></a><a href="#l131">131</a><td> goog.array.forEach(arguments, addArgument);<tr><td><a id="l132"></a><a href="#l132">132</a><td> return goog.html.SafeStyleSheet<tr><td><a id="l133"></a><a href="#l133">133</a><td> .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(result);<tr><td><a id="l134"></a><a href="#l134">134</a><td>};<tr><td><a id="l135"></a><a href="#l135">135</a><td><tr><td><a id="l136"></a><a href="#l136">136</a><td><tr><td><a id="l137"></a><a href="#l137">137</a><td>/**<tr><td><a id="l138"></a><a href="#l138">138</a><td> * Creates a SafeStyleSheet object from a compile-time constant string.<tr><td><a id="l139"></a><a href="#l139">139</a><td> *<tr><td><a id="l140"></a><a href="#l140">140</a><td> * {@code styleSheet} must not have any &amp;lt; characters in it, so that<tr><td><a id="l141"></a><a href="#l141">141</a><td> * the syntactic structure of the surrounding HTML is not affected.<tr><td><a id="l142"></a><a href="#l142">142</a><td> *<tr><td><a id="l143"></a><a href="#l143">143</a><td> * @param {!goog.string.Const} styleSheet A compile-time-constant string from<tr><td><a id="l144"></a><a href="#l144">144</a><td> * which to create a SafeStyleSheet.<tr><td><a id="l145"></a><a href="#l145">145</a><td> * @return {!goog.html.SafeStyleSheet} A SafeStyleSheet object initialized to<tr><td><a id="l146"></a><a href="#l146">146</a><td> * {@code styleSheet}.<tr><td><a id="l147"></a><a href="#l147">147</a><td> */<tr><td><a id="l148"></a><a href="#l148">148</a><td>goog.html.SafeStyleSheet.fromConstant = function(styleSheet) {<tr><td><a id="l149"></a><a href="#l149">149</a><td> var styleSheetString = goog.string.Const.unwrap(styleSheet);<tr><td><a id="l150"></a><a href="#l150">150</a><td> if (styleSheetString.length === 0) {<tr><td><a id="l151"></a><a href="#l151">151</a><td> return goog.html.SafeStyleSheet.EMPTY;<tr><td><a id="l152"></a><a href="#l152">152</a><td> }<tr><td><a id="l153"></a><a href="#l153">153</a><td> // &gt; is a valid character in CSS selectors and there&#39;s no strict need to<tr><td><a id="l154"></a><a href="#l154">154</a><td> // block it if we already block &lt;.<tr><td><a id="l155"></a><a href="#l155">155</a><td> goog.asserts.assert(!goog.string.contains(styleSheetString, &#39;&lt;&#39;),<tr><td><a id="l156"></a><a href="#l156">156</a><td> &quot;Forbidden &#39;&lt;&#39; character in style sheet string: &quot; + styleSheetString);<tr><td><a id="l157"></a><a href="#l157">157</a><td> return goog.html.SafeStyleSheet.<tr><td><a id="l158"></a><a href="#l158">158</a><td> createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheetString);<tr><td><a id="l159"></a><a href="#l159">159</a><td>};<tr><td><a id="l160"></a><a href="#l160">160</a><td><tr><td><a id="l161"></a><a href="#l161">161</a><td><tr><td><a id="l162"></a><a href="#l162">162</a><td>/**<tr><td><a id="l163"></a><a href="#l163">163</a><td> * Returns this SafeStyleSheet&#39;s value as a string.<tr><td><a id="l164"></a><a href="#l164">164</a><td> *<tr><td><a id="l165"></a><a href="#l165">165</a><td> * IMPORTANT: In code where it is security relevant that an object&#39;s type is<tr><td><a id="l166"></a><a href="#l166">166</a><td> * indeed {@code SafeStyleSheet}, use {@code goog.html.SafeStyleSheet.unwrap}<tr><td><a id="l167"></a><a href="#l167">167</a><td> * instead of this method. If in doubt, assume that it&#39;s security relevant. In<tr><td><a id="l168"></a><a href="#l168">168</a><td> * particular, note that goog.html functions which return a goog.html type do<tr><td><a id="l169"></a><a href="#l169">169</a><td> * not guarantee the returned instance is of the right type. For example:<tr><td><a id="l170"></a><a href="#l170">170</a><td> *<tr><td><a id="l171"></a><a href="#l171">171</a><td> * &lt;pre&gt;<tr><td><a id="l172"></a><a href="#l172">172</a><td> * var fakeSafeHtml = new String(&#39;fake&#39;);<tr><td><a id="l173"></a><a href="#l173">173</a><td> * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;<tr><td><a id="l174"></a><a href="#l174">174</a><td> * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);<tr><td><a id="l175"></a><a href="#l175">175</a><td> * // newSafeHtml is just an alias for fakeSafeHtml, it&#39;s passed through by<tr><td><a id="l176"></a><a href="#l176">176</a><td> * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml<tr><td><a id="l177"></a><a href="#l177">177</a><td> * // instanceof goog.html.SafeHtml.<tr><td><a id="l178"></a><a href="#l178">178</a><td> * &lt;/pre&gt;<tr><td><a id="l179"></a><a href="#l179">179</a><td> *<tr><td><a id="l180"></a><a href="#l180">180</a><td> * @see goog.html.SafeStyleSheet#unwrap<tr><td><a id="l181"></a><a href="#l181">181</a><td> * @override<tr><td><a id="l182"></a><a href="#l182">182</a><td> */<tr><td><a id="l183"></a><a href="#l183">183</a><td>goog.html.SafeStyleSheet.prototype.getTypedStringValue = function() {<tr><td><a id="l184"></a><a href="#l184">184</a><td> return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;<tr><td><a id="l185"></a><a href="#l185">185</a><td>};<tr><td><a id="l186"></a><a href="#l186">186</a><td><tr><td><a id="l187"></a><a href="#l187">187</a><td><tr><td><a id="l188"></a><a href="#l188">188</a><td>if (goog.DEBUG) {<tr><td><a id="l189"></a><a href="#l189">189</a><td> /**<tr><td><a id="l190"></a><a href="#l190">190</a><td> * Returns a debug string-representation of this value.<tr><td><a id="l191"></a><a href="#l191">191</a><td> *<tr><td><a id="l192"></a><a href="#l192">192</a><td> * To obtain the actual string value wrapped in a SafeStyleSheet, use<tr><td><a id="l193"></a><a href="#l193">193</a><td> * {@code goog.html.SafeStyleSheet.unwrap}.<tr><td><a id="l194"></a><a href="#l194">194</a><td> *<tr><td><a id="l195"></a><a href="#l195">195</a><td> * @see goog.html.SafeStyleSheet#unwrap<tr><td><a id="l196"></a><a href="#l196">196</a><td> * @override<tr><td><a id="l197"></a><a href="#l197">197</a><td> */<tr><td><a id="l198"></a><a href="#l198">198</a><td> goog.html.SafeStyleSheet.prototype.toString = function() {<tr><td><a id="l199"></a><a href="#l199">199</a><td> return &#39;SafeStyleSheet{&#39; +<tr><td><a id="l200"></a><a href="#l200">200</a><td> this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ + &#39;}&#39;;<tr><td><a id="l201"></a><a href="#l201">201</a><td> };<tr><td><a id="l202"></a><a href="#l202">202</a><td>}<tr><td><a id="l203"></a><a href="#l203">203</a><td><tr><td><a id="l204"></a><a href="#l204">204</a><td><tr><td><a id="l205"></a><a href="#l205">205</a><td>/**<tr><td><a id="l206"></a><a href="#l206">206</a><td> * Performs a runtime check that the provided object is indeed a<tr><td><a id="l207"></a><a href="#l207">207</a><td> * SafeStyleSheet object, and returns its value.<tr><td><a id="l208"></a><a href="#l208">208</a><td> *<tr><td><a id="l209"></a><a href="#l209">209</a><td> * @param {!goog.html.SafeStyleSheet} safeStyleSheet The object to extract from.<tr><td><a id="l210"></a><a href="#l210">210</a><td> * @return {string} The safeStyleSheet object&#39;s contained string, unless<tr><td><a id="l211"></a><a href="#l211">211</a><td> * the run-time type check fails. In that case, {@code unwrap} returns an<tr><td><a id="l212"></a><a href="#l212">212</a><td> * innocuous string, or, if assertions are enabled, throws<tr><td><a id="l213"></a><a href="#l213">213</a><td> * {@code goog.asserts.AssertionError}.<tr><td><a id="l214"></a><a href="#l214">214</a><td> */<tr><td><a id="l215"></a><a href="#l215">215</a><td>goog.html.SafeStyleSheet.unwrap = function(safeStyleSheet) {<tr><td><a id="l216"></a><a href="#l216">216</a><td> // Perform additional Run-time type-checking to ensure that<tr><td><a id="l217"></a><a href="#l217">217</a><td> // safeStyleSheet is indeed an instance of the expected type. This<tr><td><a id="l218"></a><a href="#l218">218</a><td> // provides some additional protection against security bugs due to<tr><td><a id="l219"></a><a href="#l219">219</a><td> // application code that disables type checks.<tr><td><a id="l220"></a><a href="#l220">220</a><td> // Specifically, the following checks are performed:<tr><td><a id="l221"></a><a href="#l221">221</a><td> // 1. The object is an instance of the expected type.<tr><td><a id="l222"></a><a href="#l222">222</a><td> // 2. The object is not an instance of a subclass.<tr><td><a id="l223"></a><a href="#l223">223</a><td> // 3. The object carries a type marker for the expected type. &quot;Faking&quot; an<tr><td><a id="l224"></a><a href="#l224">224</a><td> // object requires a reference to the type marker, which has names intended<tr><td><a id="l225"></a><a href="#l225">225</a><td> // to stand out in code reviews.<tr><td><a id="l226"></a><a href="#l226">226</a><td> if (safeStyleSheet instanceof goog.html.SafeStyleSheet &amp;&amp;<tr><td><a id="l227"></a><a href="#l227">227</a><td> safeStyleSheet.constructor === goog.html.SafeStyleSheet &amp;&amp;<tr><td><a id="l228"></a><a href="#l228">228</a><td> safeStyleSheet.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===<tr><td><a id="l229"></a><a href="#l229">229</a><td> goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {<tr><td><a id="l230"></a><a href="#l230">230</a><td> return safeStyleSheet.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;<tr><td><a id="l231"></a><a href="#l231">231</a><td> } else {<tr><td><a id="l232"></a><a href="#l232">232</a><td> goog.asserts.fail(<tr><td><a id="l233"></a><a href="#l233">233</a><td> &quot;expected object of type SafeStyleSheet, got &#39;&quot; + safeStyleSheet +<tr><td><a id="l234"></a><a href="#l234">234</a><td> &quot;&#39;&quot;);<tr><td><a id="l235"></a><a href="#l235">235</a><td> return &#39;type_error:SafeStyleSheet&#39;;<tr><td><a id="l236"></a><a href="#l236">236</a><td> }<tr><td><a id="l237"></a><a href="#l237">237</a><td>};<tr><td><a id="l238"></a><a href="#l238">238</a><td><tr><td><a id="l239"></a><a href="#l239">239</a><td><tr><td><a id="l240"></a><a href="#l240">240</a><td>/**<tr><td><a id="l241"></a><a href="#l241">241</a><td> * Package-internal utility method to create SafeStyleSheet instances.<tr><td><a id="l242"></a><a href="#l242">242</a><td> *<tr><td><a id="l243"></a><a href="#l243">243</a><td> * @param {string} styleSheet The string to initialize the SafeStyleSheet<tr><td><a id="l244"></a><a href="#l244">244</a><td> * object with.<tr><td><a id="l245"></a><a href="#l245">245</a><td> * @return {!goog.html.SafeStyleSheet} The initialized SafeStyleSheet object.<tr><td><a id="l246"></a><a href="#l246">246</a><td> * @package<tr><td><a id="l247"></a><a href="#l247">247</a><td> */<tr><td><a id="l248"></a><a href="#l248">248</a><td>goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse =<tr><td><a id="l249"></a><a href="#l249">249</a><td> function(styleSheet) {<tr><td><a id="l250"></a><a href="#l250">250</a><td> return new goog.html.SafeStyleSheet().initSecurityPrivateDoNotAccessOrElse_(<tr><td><a id="l251"></a><a href="#l251">251</a><td> styleSheet);<tr><td><a id="l252"></a><a href="#l252">252</a><td>};<tr><td><a id="l253"></a><a href="#l253">253</a><td><tr><td><a id="l254"></a><a href="#l254">254</a><td><tr><td><a id="l255"></a><a href="#l255">255</a><td>/**<tr><td><a id="l256"></a><a href="#l256">256</a><td> * Called from createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(). This<tr><td><a id="l257"></a><a href="#l257">257</a><td> * method exists only so that the compiler can dead code eliminate static<tr><td><a id="l258"></a><a href="#l258">258</a><td> * fields (like EMPTY) when they&#39;re not accessed.<tr><td><a id="l259"></a><a href="#l259">259</a><td> * @param {string} styleSheet<tr><td><a id="l260"></a><a href="#l260">260</a><td> * @return {!goog.html.SafeStyleSheet}<tr><td><a id="l261"></a><a href="#l261">261</a><td> * @private<tr><td><a id="l262"></a><a href="#l262">262</a><td> */<tr><td><a id="l263"></a><a href="#l263">263</a><td>goog.html.SafeStyleSheet.prototype.initSecurityPrivateDoNotAccessOrElse_ =<tr><td><a id="l264"></a><a href="#l264">264</a><td> function(styleSheet) {<tr><td><a id="l265"></a><a href="#l265">265</a><td> this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = styleSheet;<tr><td><a id="l266"></a><a href="#l266">266</a><td> return this;<tr><td><a id="l267"></a><a href="#l267">267</a><td>};<tr><td><a id="l268"></a><a href="#l268">268</a><td><tr><td><a id="l269"></a><a href="#l269">269</a><td><tr><td><a id="l270"></a><a href="#l270">270</a><td>/**<tr><td><a id="l271"></a><a href="#l271">271</a><td> * A SafeStyleSheet instance corresponding to the empty string.<tr><td><a id="l272"></a><a href="#l272">272</a><td> * @const {!goog.html.SafeStyleSheet}<tr><td><a id="l273"></a><a href="#l273">273</a><td> */<tr><td><a id="l274"></a><a href="#l274">274</a><td>goog.html.SafeStyleSheet.EMPTY =<tr><td><a id="l275"></a><a href="#l275">275</a><td> goog.html.SafeStyleSheet.<tr><td><a id="l276"></a><a href="#l276">276</a><td> createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(&#39;&#39;);</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>safeurl.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/html/safeurl.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2013 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview The SafeUrl type and its builders.<tr><td><a id="l17"></a><a href="#l17">17</a><td> *<tr><td><a id="l18"></a><a href="#l18">18</a><td> * TODO(xtof): Link to document stating type contract.<tr><td><a id="l19"></a><a href="#l19">19</a><td> */<tr><td><a id="l20"></a><a href="#l20">20</a><td><tr><td><a id="l21"></a><a href="#l21">21</a><td>goog.provide(&#39;goog.html.SafeUrl&#39;);<tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td>goog.require(&#39;goog.asserts&#39;);<tr><td><a id="l24"></a><a href="#l24">24</a><td>goog.require(&#39;goog.fs.url&#39;);<tr><td><a id="l25"></a><a href="#l25">25</a><td>goog.require(&#39;goog.i18n.bidi.Dir&#39;);<tr><td><a id="l26"></a><a href="#l26">26</a><td>goog.require(&#39;goog.i18n.bidi.DirectionalString&#39;);<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.require(&#39;goog.string.Const&#39;);<tr><td><a id="l28"></a><a href="#l28">28</a><td>goog.require(&#39;goog.string.TypedString&#39;);<tr><td><a id="l29"></a><a href="#l29">29</a><td><tr><td><a id="l30"></a><a href="#l30">30</a><td><tr><td><a id="l31"></a><a href="#l31">31</a><td><tr><td><a id="l32"></a><a href="#l32">32</a><td>/**<tr><td><a id="l33"></a><a href="#l33">33</a><td> * A string that is safe to use in URL context in DOM APIs and HTML documents.<tr><td><a id="l34"></a><a href="#l34">34</a><td> *<tr><td><a id="l35"></a><a href="#l35">35</a><td> * A SafeUrl is a string-like object that carries the security type contract<tr><td><a id="l36"></a><a href="#l36">36</a><td> * that its value as a string will not cause untrusted script execution<tr><td><a id="l37"></a><a href="#l37">37</a><td> * when evaluated as a hyperlink URL in a browser.<tr><td><a id="l38"></a><a href="#l38">38</a><td> *<tr><td><a id="l39"></a><a href="#l39">39</a><td> * Values of this type are guaranteed to be safe to use in URL/hyperlink<tr><td><a id="l40"></a><a href="#l40">40</a><td> * contexts, such as, assignment to URL-valued DOM properties, or<tr><td><a id="l41"></a><a href="#l41">41</a><td> * interpolation into a HTML template in URL context (e.g., inside a href<tr><td><a id="l42"></a><a href="#l42">42</a><td> * attribute), in the sense that the use will not result in a<tr><td><a id="l43"></a><a href="#l43">43</a><td> * Cross-Site-Scripting vulnerability.<tr><td><a id="l44"></a><a href="#l44">44</a><td> *<tr><td><a id="l45"></a><a href="#l45">45</a><td> * Note that, as documented in {@code goog.html.SafeUrl.unwrap}, this type&#39;s<tr><td><a id="l46"></a><a href="#l46">46</a><td> * contract does not guarantee that instances are safe to interpolate into HTML<tr><td><a id="l47"></a><a href="#l47">47</a><td> * without appropriate escaping.<tr><td><a id="l48"></a><a href="#l48">48</a><td> *<tr><td><a id="l49"></a><a href="#l49">49</a><td> * Note also that this type&#39;s contract does not imply any guarantees regarding<tr><td><a id="l50"></a><a href="#l50">50</a><td> * the resource the URL refers to. In particular, SafeUrls are &lt;b&gt;not&lt;/b&gt;<tr><td><a id="l51"></a><a href="#l51">51</a><td> * safe to use in a context where the referred-to resource is interpreted as<tr><td><a id="l52"></a><a href="#l52">52</a><td> * trusted code, e.g., as the src of a script tag.<tr><td><a id="l53"></a><a href="#l53">53</a><td> *<tr><td><a id="l54"></a><a href="#l54">54</a><td> * Instances of this type must be created via the factory methods<tr><td><a id="l55"></a><a href="#l55">55</a><td> * ({@code goog.html.SafeUrl.fromConstant}, {@code goog.html.SafeUrl.sanitize}),<tr><td><a id="l56"></a><a href="#l56">56</a><td> * etc and not by invoking its constructor. The constructor intentionally<tr><td><a id="l57"></a><a href="#l57">57</a><td> * takes no parameters and the type is immutable; hence only a default instance<tr><td><a id="l58"></a><a href="#l58">58</a><td> * corresponding to the empty string can be obtained via constructor invocation.<tr><td><a id="l59"></a><a href="#l59">59</a><td> *<tr><td><a id="l60"></a><a href="#l60">60</a><td> * @see goog.html.SafeUrl#fromConstant<tr><td><a id="l61"></a><a href="#l61">61</a><td> * @see goog.html.SafeUrl#from<tr><td><a id="l62"></a><a href="#l62">62</a><td> * @see goog.html.SafeUrl#sanitize<tr><td><a id="l63"></a><a href="#l63">63</a><td> * @constructor<tr><td><a id="l64"></a><a href="#l64">64</a><td> * @final<tr><td><a id="l65"></a><a href="#l65">65</a><td> * @struct<tr><td><a id="l66"></a><a href="#l66">66</a><td> * @implements {goog.i18n.bidi.DirectionalString}<tr><td><a id="l67"></a><a href="#l67">67</a><td> * @implements {goog.string.TypedString}<tr><td><a id="l68"></a><a href="#l68">68</a><td> */<tr><td><a id="l69"></a><a href="#l69">69</a><td>goog.html.SafeUrl = function() {<tr><td><a id="l70"></a><a href="#l70">70</a><td> /**<tr><td><a id="l71"></a><a href="#l71">71</a><td> * The contained value of this SafeUrl. The field has a purposely ugly<tr><td><a id="l72"></a><a href="#l72">72</a><td> * name to make (non-compiled) code that attempts to directly access this<tr><td><a id="l73"></a><a href="#l73">73</a><td> * field stand out.<tr><td><a id="l74"></a><a href="#l74">74</a><td> * @private {string}<tr><td><a id="l75"></a><a href="#l75">75</a><td> */<tr><td><a id="l76"></a><a href="#l76">76</a><td> this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = &#39;&#39;;<tr><td><a id="l77"></a><a href="#l77">77</a><td><tr><td><a id="l78"></a><a href="#l78">78</a><td> /**<tr><td><a id="l79"></a><a href="#l79">79</a><td> * A type marker used to implement additional run-time type checking.<tr><td><a id="l80"></a><a href="#l80">80</a><td> * @see goog.html.SafeUrl#unwrap<tr><td><a id="l81"></a><a href="#l81">81</a><td> * @const<tr><td><a id="l82"></a><a href="#l82">82</a><td> * @private<tr><td><a id="l83"></a><a href="#l83">83</a><td> */<tr><td><a id="l84"></a><a href="#l84">84</a><td> this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =<tr><td><a id="l85"></a><a href="#l85">85</a><td> goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;<tr><td><a id="l86"></a><a href="#l86">86</a><td>};<tr><td><a id="l87"></a><a href="#l87">87</a><td><tr><td><a id="l88"></a><a href="#l88">88</a><td><tr><td><a id="l89"></a><a href="#l89">89</a><td>/**<tr><td><a id="l90"></a><a href="#l90">90</a><td> * The innocuous string generated by goog.html.SafeUrl.sanitize when passed<tr><td><a id="l91"></a><a href="#l91">91</a><td> * an unsafe URL.<tr><td><a id="l92"></a><a href="#l92">92</a><td> *<tr><td><a id="l93"></a><a href="#l93">93</a><td> * about:invalid is registered in<tr><td><a id="l94"></a><a href="#l94">94</a><td> * http://www.w3.org/TR/css3-values/#about-invalid.<tr><td><a id="l95"></a><a href="#l95">95</a><td> * http://tools.ietf.org/html/rfc6694#section-2.2.1 permits about URLs to<tr><td><a id="l96"></a><a href="#l96">96</a><td> * contain a fragment, which is not to be considered when determining if an<tr><td><a id="l97"></a><a href="#l97">97</a><td> * about URL is well-known.<tr><td><a id="l98"></a><a href="#l98">98</a><td> *<tr><td><a id="l99"></a><a href="#l99">99</a><td> * Using about:invalid seems preferable to using a fixed data URL, since<tr><td><a id="l100"></a><a href="#l100">100</a><td> * browsers might choose to not report CSP violations on it, as legitimate<tr><td><a id="l101"></a><a href="#l101">101</a><td> * CSS function calls to attr() can result in this URL being produced. It is<tr><td><a id="l102"></a><a href="#l102">102</a><td> * also a standard URL which matches exactly the semantics we need:<tr><td><a id="l103"></a><a href="#l103">103</a><td> * &quot;The about:invalid URI references a non-existent document with a generic<tr><td><a id="l104"></a><a href="#l104">104</a><td> * error condition. It can be used when a URI is necessary, but the default<tr><td><a id="l105"></a><a href="#l105">105</a><td> * value shouldn&#39;t be resolveable as any type of document&quot;.<tr><td><a id="l106"></a><a href="#l106">106</a><td> *<tr><td><a id="l107"></a><a href="#l107">107</a><td> * @const {string}<tr><td><a id="l108"></a><a href="#l108">108</a><td> */<tr><td><a id="l109"></a><a href="#l109">109</a><td>goog.html.SafeUrl.INNOCUOUS_STRING = &#39;about:invalid#zClosurez&#39;;<tr><td><a id="l110"></a><a href="#l110">110</a><td><tr><td><a id="l111"></a><a href="#l111">111</a><td><tr><td><a id="l112"></a><a href="#l112">112</a><td>/**<tr><td><a id="l113"></a><a href="#l113">113</a><td> * @override<tr><td><a id="l114"></a><a href="#l114">114</a><td> * @const<tr><td><a id="l115"></a><a href="#l115">115</a><td> */<tr><td><a id="l116"></a><a href="#l116">116</a><td>goog.html.SafeUrl.prototype.implementsGoogStringTypedString = true;<tr><td><a id="l117"></a><a href="#l117">117</a><td><tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td>/**<tr><td><a id="l120"></a><a href="#l120">120</a><td> * Returns this SafeUrl&#39;s value a string.<tr><td><a id="l121"></a><a href="#l121">121</a><td> *<tr><td><a id="l122"></a><a href="#l122">122</a><td> * IMPORTANT: In code where it is security relevant that an object&#39;s type is<tr><td><a id="l123"></a><a href="#l123">123</a><td> * indeed {@code SafeUrl}, use {@code goog.html.SafeUrl.unwrap} instead of this<tr><td><a id="l124"></a><a href="#l124">124</a><td> * method. If in doubt, assume that it&#39;s security relevant. In particular, note<tr><td><a id="l125"></a><a href="#l125">125</a><td> * that goog.html functions which return a goog.html type do not guarantee that<tr><td><a id="l126"></a><a href="#l126">126</a><td> * the returned instance is of the right type. For example:<tr><td><a id="l127"></a><a href="#l127">127</a><td> *<tr><td><a id="l128"></a><a href="#l128">128</a><td> * &lt;pre&gt;<tr><td><a id="l129"></a><a href="#l129">129</a><td> * var fakeSafeHtml = new String(&#39;fake&#39;);<tr><td><a id="l130"></a><a href="#l130">130</a><td> * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;<tr><td><a id="l131"></a><a href="#l131">131</a><td> * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);<tr><td><a id="l132"></a><a href="#l132">132</a><td> * // newSafeHtml is just an alias for fakeSafeHtml, it&#39;s passed through by<tr><td><a id="l133"></a><a href="#l133">133</a><td> * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml instanceof<tr><td><a id="l134"></a><a href="#l134">134</a><td> * // goog.html.SafeHtml.<tr><td><a id="l135"></a><a href="#l135">135</a><td> * &lt;/pre&gt;<tr><td><a id="l136"></a><a href="#l136">136</a><td> *<tr><td><a id="l137"></a><a href="#l137">137</a><td> * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the<tr><td><a id="l138"></a><a href="#l138">138</a><td> * behavior of browsers when interpreting URLs. Values of SafeUrl objects MUST<tr><td><a id="l139"></a><a href="#l139">139</a><td> * be appropriately escaped before embedding in a HTML document. Note that the<tr><td><a id="l140"></a><a href="#l140">140</a><td> * required escaping is context-sensitive (e.g. a different escaping is<tr><td><a id="l141"></a><a href="#l141">141</a><td> * required for embedding a URL in a style property within a style<tr><td><a id="l142"></a><a href="#l142">142</a><td> * attribute, as opposed to embedding in a href attribute).<tr><td><a id="l143"></a><a href="#l143">143</a><td> *<tr><td><a id="l144"></a><a href="#l144">144</a><td> * @see goog.html.SafeUrl#unwrap<tr><td><a id="l145"></a><a href="#l145">145</a><td> * @override<tr><td><a id="l146"></a><a href="#l146">146</a><td> */<tr><td><a id="l147"></a><a href="#l147">147</a><td>goog.html.SafeUrl.prototype.getTypedStringValue = function() {<tr><td><a id="l148"></a><a href="#l148">148</a><td> return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_;<tr><td><a id="l149"></a><a href="#l149">149</a><td>};<tr><td><a id="l150"></a><a href="#l150">150</a><td><tr><td><a id="l151"></a><a href="#l151">151</a><td><tr><td><a id="l152"></a><a href="#l152">152</a><td>/**<tr><td><a id="l153"></a><a href="#l153">153</a><td> * @override<tr><td><a id="l154"></a><a href="#l154">154</a><td> * @const<tr><td><a id="l155"></a><a href="#l155">155</a><td> */<tr><td><a id="l156"></a><a href="#l156">156</a><td>goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString = true;<tr><td><a id="l157"></a><a href="#l157">157</a><td><tr><td><a id="l158"></a><a href="#l158">158</a><td><tr><td><a id="l159"></a><a href="#l159">159</a><td>/**<tr><td><a id="l160"></a><a href="#l160">160</a><td> * Returns this URLs directionality, which is always {@code LTR}.<tr><td><a id="l161"></a><a href="#l161">161</a><td> * @override<tr><td><a id="l162"></a><a href="#l162">162</a><td> */<tr><td><a id="l163"></a><a href="#l163">163</a><td>goog.html.SafeUrl.prototype.getDirection = function() {<tr><td><a id="l164"></a><a href="#l164">164</a><td> return goog.i18n.bidi.Dir.LTR;<tr><td><a id="l165"></a><a href="#l165">165</a><td>};<tr><td><a id="l166"></a><a href="#l166">166</a><td><tr><td><a id="l167"></a><a href="#l167">167</a><td><tr><td><a id="l168"></a><a href="#l168">168</a><td>if (goog.DEBUG) {<tr><td><a id="l169"></a><a href="#l169">169</a><td> /**<tr><td><a id="l170"></a><a href="#l170">170</a><td> * Returns a debug string-representation of this value.<tr><td><a id="l171"></a><a href="#l171">171</a><td> *<tr><td><a id="l172"></a><a href="#l172">172</a><td> * To obtain the actual string value wrapped in a SafeUrl, use<tr><td><a id="l173"></a><a href="#l173">173</a><td> * {@code goog.html.SafeUrl.unwrap}.<tr><td><a id="l174"></a><a href="#l174">174</a><td> *<tr><td><a id="l175"></a><a href="#l175">175</a><td> * @see goog.html.SafeUrl#unwrap<tr><td><a id="l176"></a><a href="#l176">176</a><td> * @override<tr><td><a id="l177"></a><a href="#l177">177</a><td> */<tr><td><a id="l178"></a><a href="#l178">178</a><td> goog.html.SafeUrl.prototype.toString = function() {<tr><td><a id="l179"></a><a href="#l179">179</a><td> return &#39;SafeUrl{&#39; + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ +<tr><td><a id="l180"></a><a href="#l180">180</a><td> &#39;}&#39;;<tr><td><a id="l181"></a><a href="#l181">181</a><td> };<tr><td><a id="l182"></a><a href="#l182">182</a><td>}<tr><td><a id="l183"></a><a href="#l183">183</a><td><tr><td><a id="l184"></a><a href="#l184">184</a><td><tr><td><a id="l185"></a><a href="#l185">185</a><td>/**<tr><td><a id="l186"></a><a href="#l186">186</a><td> * Performs a runtime check that the provided object is indeed a SafeUrl<tr><td><a id="l187"></a><a href="#l187">187</a><td> * object, and returns its value.<tr><td><a id="l188"></a><a href="#l188">188</a><td> *<tr><td><a id="l189"></a><a href="#l189">189</a><td> * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the<tr><td><a id="l190"></a><a href="#l190">190</a><td> * behavior of browsers when interpreting URLs. Values of SafeUrl objects MUST<tr><td><a id="l191"></a><a href="#l191">191</a><td> * be appropriately escaped before embedding in a HTML document. Note that the<tr><td><a id="l192"></a><a href="#l192">192</a><td> * required escaping is context-sensitive (e.g. a different escaping is<tr><td><a id="l193"></a><a href="#l193">193</a><td> * required for embedding a URL in a style property within a style<tr><td><a id="l194"></a><a href="#l194">194</a><td> * attribute, as opposed to embedding in a href attribute).<tr><td><a id="l195"></a><a href="#l195">195</a><td> *<tr><td><a id="l196"></a><a href="#l196">196</a><td> * @param {!goog.html.SafeUrl} safeUrl The object to extract from.<tr><td><a id="l197"></a><a href="#l197">197</a><td> * @return {string} The SafeUrl object&#39;s contained string, unless the run-time<tr><td><a id="l198"></a><a href="#l198">198</a><td> * type check fails. In that case, {@code unwrap} returns an innocuous<tr><td><a id="l199"></a><a href="#l199">199</a><td> * string, or, if assertions are enabled, throws<tr><td><a id="l200"></a><a href="#l200">200</a><td> * {@code goog.asserts.AssertionError}.<tr><td><a id="l201"></a><a href="#l201">201</a><td> */<tr><td><a id="l202"></a><a href="#l202">202</a><td>goog.html.SafeUrl.unwrap = function(safeUrl) {<tr><td><a id="l203"></a><a href="#l203">203</a><td> // Perform additional Run-time type-checking to ensure that safeUrl is indeed<tr><td><a id="l204"></a><a href="#l204">204</a><td> // an instance of the expected type. This provides some additional protection<tr><td><a id="l205"></a><a href="#l205">205</a><td> // against security bugs due to application code that disables type checks.<tr><td><a id="l206"></a><a href="#l206">206</a><td> // Specifically, the following checks are performed:<tr><td><a id="l207"></a><a href="#l207">207</a><td> // 1. The object is an instance of the expected type.<tr><td><a id="l208"></a><a href="#l208">208</a><td> // 2. The object is not an instance of a subclass.<tr><td><a id="l209"></a><a href="#l209">209</a><td> // 3. The object carries a type marker for the expected type. &quot;Faking&quot; an<tr><td><a id="l210"></a><a href="#l210">210</a><td> // object requires a reference to the type marker, which has names intended<tr><td><a id="l211"></a><a href="#l211">211</a><td> // to stand out in code reviews.<tr><td><a id="l212"></a><a href="#l212">212</a><td> if (safeUrl instanceof goog.html.SafeUrl &amp;&amp;<tr><td><a id="l213"></a><a href="#l213">213</a><td> safeUrl.constructor === goog.html.SafeUrl &amp;&amp;<tr><td><a id="l214"></a><a href="#l214">214</a><td> safeUrl.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===<tr><td><a id="l215"></a><a href="#l215">215</a><td> goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {<tr><td><a id="l216"></a><a href="#l216">216</a><td> return safeUrl.privateDoNotAccessOrElseSafeHtmlWrappedValue_;<tr><td><a id="l217"></a><a href="#l217">217</a><td> } else {<tr><td><a id="l218"></a><a href="#l218">218</a><td> goog.asserts.fail(&#39;expected object of type SafeUrl, got \&#39;&#39; +<tr><td><a id="l219"></a><a href="#l219">219</a><td> safeUrl + &#39;\&#39;&#39;);<tr><td><a id="l220"></a><a href="#l220">220</a><td> return &#39;type_error:SafeUrl&#39;;<tr><td><a id="l221"></a><a href="#l221">221</a><td><tr><td><a id="l222"></a><a href="#l222">222</a><td> }<tr><td><a id="l223"></a><a href="#l223">223</a><td>};<tr><td><a id="l224"></a><a href="#l224">224</a><td><tr><td><a id="l225"></a><a href="#l225">225</a><td><tr><td><a id="l226"></a><a href="#l226">226</a><td>/**<tr><td><a id="l227"></a><a href="#l227">227</a><td> * Creates a SafeUrl object from a compile-time constant string.<tr><td><a id="l228"></a><a href="#l228">228</a><td> *<tr><td><a id="l229"></a><a href="#l229">229</a><td> * Compile-time constant strings are inherently program-controlled and hence<tr><td><a id="l230"></a><a href="#l230">230</a><td> * trusted.<tr><td><a id="l231"></a><a href="#l231">231</a><td> *<tr><td><a id="l232"></a><a href="#l232">232</a><td> * @param {!goog.string.Const} url A compile-time-constant string from which to<tr><td><a id="l233"></a><a href="#l233">233</a><td> * create a SafeUrl.<tr><td><a id="l234"></a><a href="#l234">234</a><td> * @return {!goog.html.SafeUrl} A SafeUrl object initialized to {@code url}.<tr><td><a id="l235"></a><a href="#l235">235</a><td> */<tr><td><a id="l236"></a><a href="#l236">236</a><td>goog.html.SafeUrl.fromConstant = function(url) {<tr><td><a id="l237"></a><a href="#l237">237</a><td> return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(<tr><td><a id="l238"></a><a href="#l238">238</a><td> goog.string.Const.unwrap(url));<tr><td><a id="l239"></a><a href="#l239">239</a><td>};<tr><td><a id="l240"></a><a href="#l240">240</a><td><tr><td><a id="l241"></a><a href="#l241">241</a><td><tr><td><a id="l242"></a><a href="#l242">242</a><td>/**<tr><td><a id="l243"></a><a href="#l243">243</a><td> * A pattern that matches Blob or data types that can have SafeUrls created<tr><td><a id="l244"></a><a href="#l244">244</a><td> * from URL.createObjectURL(blob) or via a data: URI. Only matches image and<tr><td><a id="l245"></a><a href="#l245">245</a><td> * video types, currently.<tr><td><a id="l246"></a><a href="#l246">246</a><td> * @const<tr><td><a id="l247"></a><a href="#l247">247</a><td> * @private<tr><td><a id="l248"></a><a href="#l248">248</a><td> */<tr><td><a id="l249"></a><a href="#l249">249</a><td>goog.html.SAFE_MIME_TYPE_PATTERN_ =<tr><td><a id="l250"></a><a href="#l250">250</a><td> /^(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm))$/i;<tr><td><a id="l251"></a><a href="#l251">251</a><td><tr><td><a id="l252"></a><a href="#l252">252</a><td><tr><td><a id="l253"></a><a href="#l253">253</a><td>/**<tr><td><a id="l254"></a><a href="#l254">254</a><td> * Creates a SafeUrl wrapping a blob URL for the given {@code blob}.<tr><td><a id="l255"></a><a href="#l255">255</a><td> *<tr><td><a id="l256"></a><a href="#l256">256</a><td> * The blob URL is created with {@code URL.createObjectURL}. If the MIME type<tr><td><a id="l257"></a><a href="#l257">257</a><td> * for {@code blob} is not of a known safe image or video MIME type, then the<tr><td><a id="l258"></a><a href="#l258">258</a><td> * SafeUrl will wrap {@link #INNOCUOUS_STRING}.<tr><td><a id="l259"></a><a href="#l259">259</a><td> *<tr><td><a id="l260"></a><a href="#l260">260</a><td> * @see http://www.w3.org/TR/FileAPI/#url<tr><td><a id="l261"></a><a href="#l261">261</a><td> * @param {!Blob} blob<tr><td><a id="l262"></a><a href="#l262">262</a><td> * @return {!goog.html.SafeUrl} The blob URL, or an innocuous string wrapped<tr><td><a id="l263"></a><a href="#l263">263</a><td> * as a SafeUrl.<tr><td><a id="l264"></a><a href="#l264">264</a><td> */<tr><td><a id="l265"></a><a href="#l265">265</a><td>goog.html.SafeUrl.fromBlob = function(blob) {<tr><td><a id="l266"></a><a href="#l266">266</a><td> var url = goog.html.SAFE_MIME_TYPE_PATTERN_.test(blob.type) ?<tr><td><a id="l267"></a><a href="#l267">267</a><td> goog.fs.url.createObjectUrl(blob) : goog.html.SafeUrl.INNOCUOUS_STRING;<tr><td><a id="l268"></a><a href="#l268">268</a><td> return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);<tr><td><a id="l269"></a><a href="#l269">269</a><td>};<tr><td><a id="l270"></a><a href="#l270">270</a><td><tr><td><a id="l271"></a><a href="#l271">271</a><td><tr><td><a id="l272"></a><a href="#l272">272</a><td>/**<tr><td><a id="l273"></a><a href="#l273">273</a><td> * Matches a base-64 data URL, with the first match group being the MIME type.<tr><td><a id="l274"></a><a href="#l274">274</a><td> * @const<tr><td><a id="l275"></a><a href="#l275">275</a><td> * @private<tr><td><a id="l276"></a><a href="#l276">276</a><td> */<tr><td><a id="l277"></a><a href="#l277">277</a><td>goog.html.DATA_URL_PATTERN_ = /^data:([^;,]*);base64,[a-z0-9+\/]+=*$/i;<tr><td><a id="l278"></a><a href="#l278">278</a><td><tr><td><a id="l279"></a><a href="#l279">279</a><td><tr><td><a id="l280"></a><a href="#l280">280</a><td>/**<tr><td><a id="l281"></a><a href="#l281">281</a><td> * Creates a SafeUrl wrapping a data: URL, after validating it matches a<tr><td><a id="l282"></a><a href="#l282">282</a><td> * known-safe image or video MIME type.<tr><td><a id="l283"></a><a href="#l283">283</a><td> *<tr><td><a id="l284"></a><a href="#l284">284</a><td> * @param {string} dataUrl A valid base64 data URL with one of the whitelisted<tr><td><a id="l285"></a><a href="#l285">285</a><td> * image or video MIME types.<tr><td><a id="l286"></a><a href="#l286">286</a><td> * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}<tr><td><a id="l287"></a><a href="#l287">287</a><td> * wrapped as a SafeUrl if it does not pass.<tr><td><a id="l288"></a><a href="#l288">288</a><td> */<tr><td><a id="l289"></a><a href="#l289">289</a><td>goog.html.SafeUrl.fromDataUrl = function(dataUrl) {<tr><td><a id="l290"></a><a href="#l290">290</a><td> // There&#39;s a slight risk here that a browser sniffs the content type if it<tr><td><a id="l291"></a><a href="#l291">291</a><td> // doesn&#39;t know the MIME type and executes HTML within the data: URL. For this<tr><td><a id="l292"></a><a href="#l292">292</a><td> // to cause XSS it would also have to execute the HTML in the same origin<tr><td><a id="l293"></a><a href="#l293">293</a><td> // of the page with the link. It seems unlikely that both of these will<tr><td><a id="l294"></a><a href="#l294">294</a><td> // happen, particularly in not really old IEs.<tr><td><a id="l295"></a><a href="#l295">295</a><td> var match = dataUrl.match(goog.html.DATA_URL_PATTERN_);<tr><td><a id="l296"></a><a href="#l296">296</a><td> var valid = match &amp;&amp; goog.html.SAFE_MIME_TYPE_PATTERN_.test(match[1]);<tr><td><a id="l297"></a><a href="#l297">297</a><td> return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(<tr><td><a id="l298"></a><a href="#l298">298</a><td> valid ? dataUrl : goog.html.SafeUrl.INNOCUOUS_STRING);<tr><td><a id="l299"></a><a href="#l299">299</a><td>};<tr><td><a id="l300"></a><a href="#l300">300</a><td><tr><td><a id="l301"></a><a href="#l301">301</a><td><tr><td><a id="l302"></a><a href="#l302">302</a><td>/**<tr><td><a id="l303"></a><a href="#l303">303</a><td> * A pattern that recognizes a commonly useful subset of URLs that satisfy<tr><td><a id="l304"></a><a href="#l304">304</a><td> * the SafeUrl contract.<tr><td><a id="l305"></a><a href="#l305">305</a><td> *<tr><td><a id="l306"></a><a href="#l306">306</a><td> * This regular expression matches a subset of URLs that will not cause script<tr><td><a id="l307"></a><a href="#l307">307</a><td> * execution if used in URL context within a HTML document. Specifically, this<tr><td><a id="l308"></a><a href="#l308">308</a><td> * regular expression matches if (comment from here on and regex copied from<tr><td><a id="l309"></a><a href="#l309">309</a><td> * Soy&#39;s EscapingConventions):<tr><td><a id="l310"></a><a href="#l310">310</a><td> * (1) Either a protocol in a whitelist (http, https, mailto or ftp).<tr><td><a id="l311"></a><a href="#l311">311</a><td> * (2) or no protocol. A protocol must be followed by a colon. The below<tr><td><a id="l312"></a><a href="#l312">312</a><td> * allows that by allowing colons only after one of the characters [/?#].<tr><td><a id="l313"></a><a href="#l313">313</a><td> * A colon after a hash (#) must be in the fragment.<tr><td><a id="l314"></a><a href="#l314">314</a><td> * Otherwise, a colon after a (?) must be in a query.<tr><td><a id="l315"></a><a href="#l315">315</a><td> * Otherwise, a colon after a single solidus (/) must be in a path.<tr><td><a id="l316"></a><a href="#l316">316</a><td> * Otherwise, a colon after a double solidus (//) must be in the authority<tr><td><a id="l317"></a><a href="#l317">317</a><td> * (before port).<tr><td><a id="l318"></a><a href="#l318">318</a><td> *<tr><td><a id="l319"></a><a href="#l319">319</a><td> * The pattern disallows &amp;, used in HTML entity declarations before<tr><td><a id="l320"></a><a href="#l320">320</a><td> * one of the characters in [/?#]. This disallows HTML entities used in the<tr><td><a id="l321"></a><a href="#l321">321</a><td> * protocol name, which should never happen, e.g. &quot;h&amp;#116;tp&quot; for &quot;http&quot;.<tr><td><a id="l322"></a><a href="#l322">322</a><td> * It also disallows HTML entities in the first path part of a relative path,<tr><td><a id="l323"></a><a href="#l323">323</a><td> * e.g. &quot;foo&amp;lt;bar/baz&quot;. Our existing escaping functions should not produce<tr><td><a id="l324"></a><a href="#l324">324</a><td> * that. More importantly, it disallows masking of a colon,<tr><td><a id="l325"></a><a href="#l325">325</a><td> * e.g. &quot;javascript&amp;#58;...&quot;.<tr><td><a id="l326"></a><a href="#l326">326</a><td> *<tr><td><a id="l327"></a><a href="#l327">327</a><td> * @private<tr><td><a id="l328"></a><a href="#l328">328</a><td> * @const {!RegExp}<tr><td><a id="l329"></a><a href="#l329">329</a><td> */<tr><td><a id="l330"></a><a href="#l330">330</a><td>goog.html.SAFE_URL_PATTERN_ =<tr><td><a id="l331"></a><a href="#l331">331</a><td> /^(?:(?:https?|mailto|ftp):|[^&amp;:/?#]*(?:[/?#]|$))/i;<tr><td><a id="l332"></a><a href="#l332">332</a><td><tr><td><a id="l333"></a><a href="#l333">333</a><td><tr><td><a id="l334"></a><a href="#l334">334</a><td>/**<tr><td><a id="l335"></a><a href="#l335">335</a><td> * Creates a SafeUrl object from {@code url}. If {@code url} is a<tr><td><a id="l336"></a><a href="#l336">336</a><td> * goog.html.SafeUrl then it is simply returned. Otherwise the input string is<tr><td><a id="l337"></a><a href="#l337">337</a><td> * validated to match a pattern of commonly used safe URLs. The string is<tr><td><a id="l338"></a><a href="#l338">338</a><td> * converted to UTF-8 and non-whitelisted characters are percent-encoded. The<tr><td><a id="l339"></a><a href="#l339">339</a><td> * string wrapped by the created SafeUrl will thus contain only ASCII printable<tr><td><a id="l340"></a><a href="#l340">340</a><td> * characters.<tr><td><a id="l341"></a><a href="#l341">341</a><td> *<tr><td><a id="l342"></a><a href="#l342">342</a><td> * {@code url} may be a URL with the http, https, mailto or ftp scheme,<tr><td><a id="l343"></a><a href="#l343">343</a><td> * or a relative URL (i.e., a URL without a scheme; specifically, a<tr><td><a id="l344"></a><a href="#l344">344</a><td> * scheme-relative, absolute-path-relative, or path-relative URL).<tr><td><a id="l345"></a><a href="#l345">345</a><td> *<tr><td><a id="l346"></a><a href="#l346">346</a><td> * {@code url} is converted to UTF-8 and non-whitelisted characters are<tr><td><a id="l347"></a><a href="#l347">347</a><td> * percent-encoded. Whitelisted characters are &#39;%&#39; and, from RFC 3986,<tr><td><a id="l348"></a><a href="#l348">348</a><td> * unreserved characters and reserved characters, with the exception of &#39;\&#39;&#39;,<tr><td><a id="l349"></a><a href="#l349">349</a><td> * &#39;(&#39; and &#39;)&#39;. This ensures the the SafeUrl contains only ASCII-printable<tr><td><a id="l350"></a><a href="#l350">350</a><td> * characters and reduces the chance of security bugs were it to be<tr><td><a id="l351"></a><a href="#l351">351</a><td> * interpolated into a specific context without the necessary escaping.<tr><td><a id="l352"></a><a href="#l352">352</a><td> *<tr><td><a id="l353"></a><a href="#l353">353</a><td> * If {@code url} fails validation or does not UTF-16 decode correctly<tr><td><a id="l354"></a><a href="#l354">354</a><td> * (JavaScript strings are UTF-16 encoded), this function returns a SafeUrl<tr><td><a id="l355"></a><a href="#l355">355</a><td> * object containing an innocuous string, goog.html.SafeUrl.INNOCUOUS_STRING.<tr><td><a id="l356"></a><a href="#l356">356</a><td> *<tr><td><a id="l357"></a><a href="#l357">357</a><td> * @see http://url.spec.whatwg.org/#concept-relative-url<tr><td><a id="l358"></a><a href="#l358">358</a><td> * @param {string|!goog.string.TypedString} url The URL to validate.<tr><td><a id="l359"></a><a href="#l359">359</a><td> * @return {!goog.html.SafeUrl} The validated URL, wrapped as a SafeUrl.<tr><td><a id="l360"></a><a href="#l360">360</a><td> */<tr><td><a id="l361"></a><a href="#l361">361</a><td>goog.html.SafeUrl.sanitize = function(url) {<tr><td><a id="l362"></a><a href="#l362">362</a><td> if (url instanceof goog.html.SafeUrl) {<tr><td><a id="l363"></a><a href="#l363">363</a><td> return url;<tr><td><a id="l364"></a><a href="#l364">364</a><td> }<tr><td><a id="l365"></a><a href="#l365">365</a><td> else if (url.implementsGoogStringTypedString) {<tr><td><a id="l366"></a><a href="#l366">366</a><td> url = url.getTypedStringValue();<tr><td><a id="l367"></a><a href="#l367">367</a><td> } else {<tr><td><a id="l368"></a><a href="#l368">368</a><td> url = String(url);<tr><td><a id="l369"></a><a href="#l369">369</a><td> }<tr><td><a id="l370"></a><a href="#l370">370</a><td> if (!goog.html.SAFE_URL_PATTERN_.test(url)) {<tr><td><a id="l371"></a><a href="#l371">371</a><td> url = goog.html.SafeUrl.INNOCUOUS_STRING;<tr><td><a id="l372"></a><a href="#l372">372</a><td> }<tr><td><a id="l373"></a><a href="#l373">373</a><td> return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);<tr><td><a id="l374"></a><a href="#l374">374</a><td>};<tr><td><a id="l375"></a><a href="#l375">375</a><td><tr><td><a id="l376"></a><a href="#l376">376</a><td><tr><td><a id="l377"></a><a href="#l377">377</a><td>/**<tr><td><a id="l378"></a><a href="#l378">378</a><td> * Type marker for the SafeUrl type, used to implement additional run-time<tr><td><a id="l379"></a><a href="#l379">379</a><td> * type checking.<tr><td><a id="l380"></a><a href="#l380">380</a><td> * @const {!Object}<tr><td><a id="l381"></a><a href="#l381">381</a><td> * @private<tr><td><a id="l382"></a><a href="#l382">382</a><td> */<tr><td><a id="l383"></a><a href="#l383">383</a><td>goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};<tr><td><a id="l384"></a><a href="#l384">384</a><td><tr><td><a id="l385"></a><a href="#l385">385</a><td><tr><td><a id="l386"></a><a href="#l386">386</a><td>/**<tr><td><a id="l387"></a><a href="#l387">387</a><td> * Package-internal utility method to create SafeUrl instances.<tr><td><a id="l388"></a><a href="#l388">388</a><td> *<tr><td><a id="l389"></a><a href="#l389">389</a><td> * @param {string} url The string to initialize the SafeUrl object with.<tr><td><a id="l390"></a><a href="#l390">390</a><td> * @return {!goog.html.SafeUrl} The initialized SafeUrl object.<tr><td><a id="l391"></a><a href="#l391">391</a><td> * @package<tr><td><a id="l392"></a><a href="#l392">392</a><td> */<tr><td><a id="l393"></a><a href="#l393">393</a><td>goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse = function(<tr><td><a id="l394"></a><a href="#l394">394</a><td> url) {<tr><td><a id="l395"></a><a href="#l395">395</a><td> var safeUrl = new goog.html.SafeUrl();<tr><td><a id="l396"></a><a href="#l396">396</a><td> safeUrl.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = url;<tr><td><a id="l397"></a><a href="#l397">397</a><td> return safeUrl;<tr><td><a id="l398"></a><a href="#l398">398</a><td>};</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>trustedresourceurl.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/html/trustedresourceurl.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2013 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview The TrustedResourceUrl type and its builders.<tr><td><a id="l17"></a><a href="#l17">17</a><td> *<tr><td><a id="l18"></a><a href="#l18">18</a><td> * TODO(xtof): Link to document stating type contract.<tr><td><a id="l19"></a><a href="#l19">19</a><td> */<tr><td><a id="l20"></a><a href="#l20">20</a><td><tr><td><a id="l21"></a><a href="#l21">21</a><td>goog.provide(&#39;goog.html.TrustedResourceUrl&#39;);<tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td>goog.require(&#39;goog.asserts&#39;);<tr><td><a id="l24"></a><a href="#l24">24</a><td>goog.require(&#39;goog.i18n.bidi.Dir&#39;);<tr><td><a id="l25"></a><a href="#l25">25</a><td>goog.require(&#39;goog.i18n.bidi.DirectionalString&#39;);<tr><td><a id="l26"></a><a href="#l26">26</a><td>goog.require(&#39;goog.string.Const&#39;);<tr><td><a id="l27"></a><a href="#l27">27</a><td>goog.require(&#39;goog.string.TypedString&#39;);<tr><td><a id="l28"></a><a href="#l28">28</a><td><tr><td><a id="l29"></a><a href="#l29">29</a><td><tr><td><a id="l30"></a><a href="#l30">30</a><td><tr><td><a id="l31"></a><a href="#l31">31</a><td>/**<tr><td><a id="l32"></a><a href="#l32">32</a><td> * A URL which is under application control and from which script, CSS, and<tr><td><a id="l33"></a><a href="#l33">33</a><td> * other resources that represent executable code, can be fetched.<tr><td><a id="l34"></a><a href="#l34">34</a><td> *<tr><td><a id="l35"></a><a href="#l35">35</a><td> * Given that the URL can only be constructed from strings under application<tr><td><a id="l36"></a><a href="#l36">36</a><td> * control and is used to load resources, bugs resulting in a malformed URL<tr><td><a id="l37"></a><a href="#l37">37</a><td> * should not have a security impact and are likely to be easily detectable<tr><td><a id="l38"></a><a href="#l38">38</a><td> * during testing. Given the wide number of non-RFC compliant URLs in use,<tr><td><a id="l39"></a><a href="#l39">39</a><td> * stricter validation could prevent some applications from being able to use<tr><td><a id="l40"></a><a href="#l40">40</a><td> * this type.<tr><td><a id="l41"></a><a href="#l41">41</a><td> *<tr><td><a id="l42"></a><a href="#l42">42</a><td> * Instances of this type must be created via the factory method,<tr><td><a id="l43"></a><a href="#l43">43</a><td> * ({@code goog.html.TrustedResourceUrl.fromConstant}), and not by invoking its<tr><td><a id="l44"></a><a href="#l44">44</a><td> * constructor. The constructor intentionally takes no parameters and the type<tr><td><a id="l45"></a><a href="#l45">45</a><td> * is immutable; hence only a default instance corresponding to the empty<tr><td><a id="l46"></a><a href="#l46">46</a><td> * string can be obtained via constructor invocation.<tr><td><a id="l47"></a><a href="#l47">47</a><td> *<tr><td><a id="l48"></a><a href="#l48">48</a><td> * @see goog.html.TrustedResourceUrl#fromConstant<tr><td><a id="l49"></a><a href="#l49">49</a><td> * @constructor<tr><td><a id="l50"></a><a href="#l50">50</a><td> * @final<tr><td><a id="l51"></a><a href="#l51">51</a><td> * @struct<tr><td><a id="l52"></a><a href="#l52">52</a><td> * @implements {goog.i18n.bidi.DirectionalString}<tr><td><a id="l53"></a><a href="#l53">53</a><td> * @implements {goog.string.TypedString}<tr><td><a id="l54"></a><a href="#l54">54</a><td> */<tr><td><a id="l55"></a><a href="#l55">55</a><td>goog.html.TrustedResourceUrl = function() {<tr><td><a id="l56"></a><a href="#l56">56</a><td> /**<tr><td><a id="l57"></a><a href="#l57">57</a><td> * The contained value of this TrustedResourceUrl. The field has a purposely<tr><td><a id="l58"></a><a href="#l58">58</a><td> * ugly name to make (non-compiled) code that attempts to directly access this<tr><td><a id="l59"></a><a href="#l59">59</a><td> * field stand out.<tr><td><a id="l60"></a><a href="#l60">60</a><td> * @private {string}<tr><td><a id="l61"></a><a href="#l61">61</a><td> */<tr><td><a id="l62"></a><a href="#l62">62</a><td> this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ = &#39;&#39;;<tr><td><a id="l63"></a><a href="#l63">63</a><td><tr><td><a id="l64"></a><a href="#l64">64</a><td> /**<tr><td><a id="l65"></a><a href="#l65">65</a><td> * A type marker used to implement additional run-time type checking.<tr><td><a id="l66"></a><a href="#l66">66</a><td> * @see goog.html.TrustedResourceUrl#unwrap<tr><td><a id="l67"></a><a href="#l67">67</a><td> * @const<tr><td><a id="l68"></a><a href="#l68">68</a><td> * @private<tr><td><a id="l69"></a><a href="#l69">69</a><td> */<tr><td><a id="l70"></a><a href="#l70">70</a><td> this.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =<tr><td><a id="l71"></a><a href="#l71">71</a><td> goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;<tr><td><a id="l72"></a><a href="#l72">72</a><td>};<tr><td><a id="l73"></a><a href="#l73">73</a><td><tr><td><a id="l74"></a><a href="#l74">74</a><td><tr><td><a id="l75"></a><a href="#l75">75</a><td>/**<tr><td><a id="l76"></a><a href="#l76">76</a><td> * @override<tr><td><a id="l77"></a><a href="#l77">77</a><td> * @const<tr><td><a id="l78"></a><a href="#l78">78</a><td> */<tr><td><a id="l79"></a><a href="#l79">79</a><td>goog.html.TrustedResourceUrl.prototype.implementsGoogStringTypedString = true;<tr><td><a id="l80"></a><a href="#l80">80</a><td><tr><td><a id="l81"></a><a href="#l81">81</a><td><tr><td><a id="l82"></a><a href="#l82">82</a><td>/**<tr><td><a id="l83"></a><a href="#l83">83</a><td> * Returns this TrustedResourceUrl&#39;s value as a string.<tr><td><a id="l84"></a><a href="#l84">84</a><td> *<tr><td><a id="l85"></a><a href="#l85">85</a><td> * IMPORTANT: In code where it is security relevant that an object&#39;s type is<tr><td><a id="l86"></a><a href="#l86">86</a><td> * indeed {@code TrustedResourceUrl}, use<tr><td><a id="l87"></a><a href="#l87">87</a><td> * {@code goog.html.TrustedResourceUrl.unwrap} instead of this method. If in<tr><td><a id="l88"></a><a href="#l88">88</a><td> * doubt, assume that it&#39;s security relevant. In particular, note that<tr><td><a id="l89"></a><a href="#l89">89</a><td> * goog.html functions which return a goog.html type do not guarantee that<tr><td><a id="l90"></a><a href="#l90">90</a><td> * the returned instance is of the right type. For example:<tr><td><a id="l91"></a><a href="#l91">91</a><td> *<tr><td><a id="l92"></a><a href="#l92">92</a><td> * &lt;pre&gt;<tr><td><a id="l93"></a><a href="#l93">93</a><td> * var fakeSafeHtml = new String(&#39;fake&#39;);<tr><td><a id="l94"></a><a href="#l94">94</a><td> * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;<tr><td><a id="l95"></a><a href="#l95">95</a><td> * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);<tr><td><a id="l96"></a><a href="#l96">96</a><td> * // newSafeHtml is just an alias for fakeSafeHtml, it&#39;s passed through by<tr><td><a id="l97"></a><a href="#l97">97</a><td> * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml instanceof<tr><td><a id="l98"></a><a href="#l98">98</a><td> * // goog.html.SafeHtml.<tr><td><a id="l99"></a><a href="#l99">99</a><td> * &lt;/pre&gt;<tr><td><a id="l100"></a><a href="#l100">100</a><td> *<tr><td><a id="l101"></a><a href="#l101">101</a><td> * @see goog.html.TrustedResourceUrl#unwrap<tr><td><a id="l102"></a><a href="#l102">102</a><td> * @override<tr><td><a id="l103"></a><a href="#l103">103</a><td> */<tr><td><a id="l104"></a><a href="#l104">104</a><td>goog.html.TrustedResourceUrl.prototype.getTypedStringValue = function() {<tr><td><a id="l105"></a><a href="#l105">105</a><td> return this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;<tr><td><a id="l106"></a><a href="#l106">106</a><td>};<tr><td><a id="l107"></a><a href="#l107">107</a><td><tr><td><a id="l108"></a><a href="#l108">108</a><td><tr><td><a id="l109"></a><a href="#l109">109</a><td>/**<tr><td><a id="l110"></a><a href="#l110">110</a><td> * @override<tr><td><a id="l111"></a><a href="#l111">111</a><td> * @const<tr><td><a id="l112"></a><a href="#l112">112</a><td> */<tr><td><a id="l113"></a><a href="#l113">113</a><td>goog.html.TrustedResourceUrl.prototype.implementsGoogI18nBidiDirectionalString =<tr><td><a id="l114"></a><a href="#l114">114</a><td> true;<tr><td><a id="l115"></a><a href="#l115">115</a><td><tr><td><a id="l116"></a><a href="#l116">116</a><td><tr><td><a id="l117"></a><a href="#l117">117</a><td>/**<tr><td><a id="l118"></a><a href="#l118">118</a><td> * Returns this URLs directionality, which is always {@code LTR}.<tr><td><a id="l119"></a><a href="#l119">119</a><td> * @override<tr><td><a id="l120"></a><a href="#l120">120</a><td> */<tr><td><a id="l121"></a><a href="#l121">121</a><td>goog.html.TrustedResourceUrl.prototype.getDirection = function() {<tr><td><a id="l122"></a><a href="#l122">122</a><td> return goog.i18n.bidi.Dir.LTR;<tr><td><a id="l123"></a><a href="#l123">123</a><td>};<tr><td><a id="l124"></a><a href="#l124">124</a><td><tr><td><a id="l125"></a><a href="#l125">125</a><td><tr><td><a id="l126"></a><a href="#l126">126</a><td>if (goog.DEBUG) {<tr><td><a id="l127"></a><a href="#l127">127</a><td> /**<tr><td><a id="l128"></a><a href="#l128">128</a><td> * Returns a debug string-representation of this value.<tr><td><a id="l129"></a><a href="#l129">129</a><td> *<tr><td><a id="l130"></a><a href="#l130">130</a><td> * To obtain the actual string value wrapped in a TrustedResourceUrl, use<tr><td><a id="l131"></a><a href="#l131">131</a><td> * {@code goog.html.TrustedResourceUrl.unwrap}.<tr><td><a id="l132"></a><a href="#l132">132</a><td> *<tr><td><a id="l133"></a><a href="#l133">133</a><td> * @see goog.html.TrustedResourceUrl#unwrap<tr><td><a id="l134"></a><a href="#l134">134</a><td> * @override<tr><td><a id="l135"></a><a href="#l135">135</a><td> */<tr><td><a id="l136"></a><a href="#l136">136</a><td> goog.html.TrustedResourceUrl.prototype.toString = function() {<tr><td><a id="l137"></a><a href="#l137">137</a><td> return &#39;TrustedResourceUrl{&#39; +<tr><td><a id="l138"></a><a href="#l138">138</a><td> this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ + &#39;}&#39;;<tr><td><a id="l139"></a><a href="#l139">139</a><td> };<tr><td><a id="l140"></a><a href="#l140">140</a><td>}<tr><td><a id="l141"></a><a href="#l141">141</a><td><tr><td><a id="l142"></a><a href="#l142">142</a><td><tr><td><a id="l143"></a><a href="#l143">143</a><td>/**<tr><td><a id="l144"></a><a href="#l144">144</a><td> * Performs a runtime check that the provided object is indeed a<tr><td><a id="l145"></a><a href="#l145">145</a><td> * TrustedResourceUrl object, and returns its value.<tr><td><a id="l146"></a><a href="#l146">146</a><td> *<tr><td><a id="l147"></a><a href="#l147">147</a><td> * @param {!goog.html.TrustedResourceUrl} trustedResourceUrl The object to<tr><td><a id="l148"></a><a href="#l148">148</a><td> * extract from.<tr><td><a id="l149"></a><a href="#l149">149</a><td> * @return {string} The trustedResourceUrl object&#39;s contained string, unless<tr><td><a id="l150"></a><a href="#l150">150</a><td> * the run-time type check fails. In that case, {@code unwrap} returns an<tr><td><a id="l151"></a><a href="#l151">151</a><td> * innocuous string, or, if assertions are enabled, throws<tr><td><a id="l152"></a><a href="#l152">152</a><td> * {@code goog.asserts.AssertionError}.<tr><td><a id="l153"></a><a href="#l153">153</a><td> */<tr><td><a id="l154"></a><a href="#l154">154</a><td>goog.html.TrustedResourceUrl.unwrap = function(trustedResourceUrl) {<tr><td><a id="l155"></a><a href="#l155">155</a><td> // Perform additional Run-time type-checking to ensure that<tr><td><a id="l156"></a><a href="#l156">156</a><td> // trustedResourceUrl is indeed an instance of the expected type. This<tr><td><a id="l157"></a><a href="#l157">157</a><td> // provides some additional protection against security bugs due to<tr><td><a id="l158"></a><a href="#l158">158</a><td> // application code that disables type checks.<tr><td><a id="l159"></a><a href="#l159">159</a><td> // Specifically, the following checks are performed:<tr><td><a id="l160"></a><a href="#l160">160</a><td> // 1. The object is an instance of the expected type.<tr><td><a id="l161"></a><a href="#l161">161</a><td> // 2. The object is not an instance of a subclass.<tr><td><a id="l162"></a><a href="#l162">162</a><td> // 3. The object carries a type marker for the expected type. &quot;Faking&quot; an<tr><td><a id="l163"></a><a href="#l163">163</a><td> // object requires a reference to the type marker, which has names intended<tr><td><a id="l164"></a><a href="#l164">164</a><td> // to stand out in code reviews.<tr><td><a id="l165"></a><a href="#l165">165</a><td> if (trustedResourceUrl instanceof goog.html.TrustedResourceUrl &amp;&amp;<tr><td><a id="l166"></a><a href="#l166">166</a><td> trustedResourceUrl.constructor === goog.html.TrustedResourceUrl &amp;&amp;<tr><td><a id="l167"></a><a href="#l167">167</a><td> trustedResourceUrl<tr><td><a id="l168"></a><a href="#l168">168</a><td> .TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===<tr><td><a id="l169"></a><a href="#l169">169</a><td> goog.html.TrustedResourceUrl<tr><td><a id="l170"></a><a href="#l170">170</a><td> .TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {<tr><td><a id="l171"></a><a href="#l171">171</a><td> return trustedResourceUrl<tr><td><a id="l172"></a><a href="#l172">172</a><td> .privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;<tr><td><a id="l173"></a><a href="#l173">173</a><td> } else {<tr><td><a id="l174"></a><a href="#l174">174</a><td> goog.asserts.fail(&#39;expected object of type TrustedResourceUrl, got \&#39;&#39; +<tr><td><a id="l175"></a><a href="#l175">175</a><td> trustedResourceUrl + &#39;\&#39;&#39;);<tr><td><a id="l176"></a><a href="#l176">176</a><td> return &#39;type_error:TrustedResourceUrl&#39;;<tr><td><a id="l177"></a><a href="#l177">177</a><td><tr><td><a id="l178"></a><a href="#l178">178</a><td> }<tr><td><a id="l179"></a><a href="#l179">179</a><td>};<tr><td><a id="l180"></a><a href="#l180">180</a><td><tr><td><a id="l181"></a><a href="#l181">181</a><td><tr><td><a id="l182"></a><a href="#l182">182</a><td>/**<tr><td><a id="l183"></a><a href="#l183">183</a><td> * Creates a TrustedResourceUrl object from a compile-time constant string.<tr><td><a id="l184"></a><a href="#l184">184</a><td> *<tr><td><a id="l185"></a><a href="#l185">185</a><td> * Compile-time constant strings are inherently program-controlled and hence<tr><td><a id="l186"></a><a href="#l186">186</a><td> * trusted.<tr><td><a id="l187"></a><a href="#l187">187</a><td> *<tr><td><a id="l188"></a><a href="#l188">188</a><td> * @param {!goog.string.Const} url A compile-time-constant string from which to<tr><td><a id="l189"></a><a href="#l189">189</a><td> * create a TrustedResourceUrl.<tr><td><a id="l190"></a><a href="#l190">190</a><td> * @return {!goog.html.TrustedResourceUrl} A TrustedResourceUrl object<tr><td><a id="l191"></a><a href="#l191">191</a><td> * initialized to {@code url}.<tr><td><a id="l192"></a><a href="#l192">192</a><td> */<tr><td><a id="l193"></a><a href="#l193">193</a><td>goog.html.TrustedResourceUrl.fromConstant = function(url) {<tr><td><a id="l194"></a><a href="#l194">194</a><td> return goog.html.TrustedResourceUrl<tr><td><a id="l195"></a><a href="#l195">195</a><td> .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(<tr><td><a id="l196"></a><a href="#l196">196</a><td> goog.string.Const.unwrap(url));<tr><td><a id="l197"></a><a href="#l197">197</a><td>};<tr><td><a id="l198"></a><a href="#l198">198</a><td><tr><td><a id="l199"></a><a href="#l199">199</a><td><tr><td><a id="l200"></a><a href="#l200">200</a><td>/**<tr><td><a id="l201"></a><a href="#l201">201</a><td> * Type marker for the TrustedResourceUrl type, used to implement additional<tr><td><a id="l202"></a><a href="#l202">202</a><td> * run-time type checking.<tr><td><a id="l203"></a><a href="#l203">203</a><td> * @const {!Object}<tr><td><a id="l204"></a><a href="#l204">204</a><td> * @private<tr><td><a id="l205"></a><a href="#l205">205</a><td> */<tr><td><a id="l206"></a><a href="#l206">206</a><td>goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};<tr><td><a id="l207"></a><a href="#l207">207</a><td><tr><td><a id="l208"></a><a href="#l208">208</a><td><tr><td><a id="l209"></a><a href="#l209">209</a><td>/**<tr><td><a id="l210"></a><a href="#l210">210</a><td> * Package-internal utility method to create TrustedResourceUrl instances.<tr><td><a id="l211"></a><a href="#l211">211</a><td> *<tr><td><a id="l212"></a><a href="#l212">212</a><td> * @param {string} url The string to initialize the TrustedResourceUrl object<tr><td><a id="l213"></a><a href="#l213">213</a><td> * with.<tr><td><a id="l214"></a><a href="#l214">214</a><td> * @return {!goog.html.TrustedResourceUrl} The initialized TrustedResourceUrl<tr><td><a id="l215"></a><a href="#l215">215</a><td> * object.<tr><td><a id="l216"></a><a href="#l216">216</a><td> * @package<tr><td><a id="l217"></a><a href="#l217">217</a><td> */<tr><td><a id="l218"></a><a href="#l218">218</a><td>goog.html.TrustedResourceUrl.<tr><td><a id="l219"></a><a href="#l219">219</a><td> createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse = function(url) {<tr><td><a id="l220"></a><a href="#l220">220</a><td> var trustedResourceUrl = new goog.html.TrustedResourceUrl();<tr><td><a id="l221"></a><a href="#l221">221</a><td> trustedResourceUrl.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ =<tr><td><a id="l222"></a><a href="#l222">222</a><td> url;<tr><td><a id="l223"></a><a href="#l223">223</a><td> return trustedResourceUrl;<tr><td><a id="l224"></a><a href="#l224">224</a><td>};</table></div></article><nav><h3><a href="../../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>