selenium-webdriver 2.48.2 → 2.53.3
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.
- package/CHANGES.md +116 -0
- package/NOTICE +1 -1
- package/README.md +59 -9
- package/builder.js +375 -358
- package/chrome.js +549 -586
- package/edge.js +378 -0
- package/error.js +9 -6
- package/example/google_search.js +1 -1
- package/example/google_search_generator.js +2 -4
- package/example/logging.js +6 -2
- package/example/sample.js +21 -0
- package/executors.js +11 -27
- package/firefox/binary.js +149 -98
- package/firefox/extension.js +15 -19
- package/firefox/index.js +256 -163
- package/firefox/profile.js +223 -243
- package/http/index.js +487 -81
- package/http/util.js +40 -36
- package/ie.js +288 -309
- package/index.js +34 -125
- package/io/exec.js +58 -39
- package/io/index.js +72 -60
- package/lib/README +4 -0
- package/lib/actions.js +596 -0
- package/lib/by.js +277 -0
- package/lib/capabilities.js +450 -0
- package/lib/{webdriver/command.js → command.js} +91 -72
- package/lib/{webdriver/button.js → devmode.js} +13 -8
- package/lib/error.js +690 -0
- package/lib/events.js +212 -0
- package/lib/firefox/amd64/libnoblur64.so +0 -0
- package/lib/firefox/i386/libnoblur.so +0 -0
- package/lib/firefox/webdriver.json +5 -1
- package/lib/firefox/webdriver.xpi +0 -0
- package/lib/{webdriver/key.js → input.js} +84 -2
- package/lib/logging.js +670 -0
- package/lib/{webdriver/promise.js → promise.js} +817 -644
- package/lib/safari/client.js +266 -214
- package/lib/session.js +80 -0
- package/lib/{webdriver/serializable.js → symbols.js} +16 -19
- package/lib/test/build.js +4 -4
- package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
- package/lib/test/data/click_tests/overlapping_elements.html +15 -4
- package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
- package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
- package/lib/test/data/hidden_partially.html +45 -0
- package/lib/test/data/readOnlyPage.html +1 -1
- package/lib/test/data/selectPage.html +18 -2
- package/lib/test/fileserver.js +3 -4
- package/lib/test/index.js +7 -3
- package/lib/test/resources.js +1 -1
- package/lib/until.js +376 -0
- package/lib/webdriver.js +2440 -0
- package/net/index.js +4 -0
- package/net/portprober.js +16 -12
- package/opera.js +295 -314
- package/package.json +6 -5
- package/phantomjs.js +144 -147
- package/proxy.js +10 -6
- package/remote/index.js +289 -238
- package/safari.js +326 -311
- package/test/chrome/options_test.js +11 -9
- package/test/element_finding_test.js +51 -13
- package/test/execute_script_test.js +17 -3
- package/test/firefox/firefox_test.js +0 -32
- package/test/http/http_test.js +671 -61
- package/test/http/util_test.js +25 -23
- package/test/io_test.js +67 -1
- package/test/lib/by_test.js +139 -0
- package/test/lib/capabilities_test.js +111 -0
- package/test/lib/error_test.js +325 -0
- package/test/lib/events_test.js +177 -0
- package/test/lib/logging_test.js +272 -0
- package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
- package/test/lib/promise_error_test.js +808 -0
- package/test/lib/promise_flow_test.js +2282 -0
- package/test/lib/promise_generator_test.js +308 -0
- package/test/lib/promise_test.js +996 -0
- package/test/lib/testutil.js +90 -0
- package/test/lib/until_test.js +400 -0
- package/test/lib/webdriver_test.js +2157 -0
- package/test/page_loading_test.js +7 -9
- package/test/remote_test.js +50 -3
- package/test/session_test.js +53 -0
- package/test/stale_element_test.js +2 -2
- package/test/testing/assert_test.js +374 -0
- package/test/testing/index_test.js +9 -11
- package/testing/assert.js +334 -17
- package/testing/index.js +12 -2
- package/_base.js +0 -200
- package/docs/Changes.html +0 -356
- package/docs/class_bot_Error.html +0 -15
- package/docs/class_webdriver_ActionSequence.html +0 -115
- package/docs/class_webdriver_Alert.html +0 -24
- package/docs/class_webdriver_AlertPromise.html +0 -92
- package/docs/class_webdriver_Capabilities.html +0 -60
- package/docs/class_webdriver_Command.html +0 -15
- package/docs/class_webdriver_EventEmitter.html +0 -35
- package/docs/class_webdriver_FileDetector.html +0 -21
- package/docs/class_webdriver_Locator.html +0 -12
- package/docs/class_webdriver_Serializable.html +0 -9
- package/docs/class_webdriver_Session.html +0 -13
- package/docs/class_webdriver_TouchSequence.html +0 -49
- package/docs/class_webdriver_UnhandledAlertError.html +0 -18
- package/docs/class_webdriver_WebDriver.html +0 -313
- package/docs/class_webdriver_WebDriver_Logs.html +0 -15
- package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
- package/docs/class_webdriver_WebDriver_Options.html +0 -41
- package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
- package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
- package/docs/class_webdriver_WebDriver_Window.html +0 -27
- package/docs/class_webdriver_WebElement.html +0 -223
- package/docs/class_webdriver_WebElementPromise.html +0 -274
- package/docs/class_webdriver_http_Executor.html +0 -22
- package/docs/class_webdriver_http_Request.html +0 -12
- package/docs/class_webdriver_http_Response.html +0 -13
- package/docs/class_webdriver_logging_Entry.html +0 -15
- package/docs/class_webdriver_logging_Level.html +0 -55
- package/docs/class_webdriver_logging_LogRecord.html +0 -45
- package/docs/class_webdriver_logging_Logger.html +0 -119
- package/docs/class_webdriver_logging_Preferences.html +0 -8
- package/docs/class_webdriver_promise_CancellationError.html +0 -17
- package/docs/class_webdriver_promise_ControlFlow.html +0 -153
- package/docs/class_webdriver_promise_Deferred.html +0 -84
- package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
- package/docs/class_webdriver_promise_Promise.html +0 -75
- package/docs/class_webdriver_stacktrace_Frame.html +0 -20
- package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
- package/docs/class_webdriver_testing_Assertion.html +0 -99
- package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
- package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
- package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
- package/docs/class_webdriver_until_Condition.html +0 -7
- package/docs/dossier.css +0 -1
- package/docs/dossier.js +0 -86
- package/docs/enum_bot_ErrorCode.html +0 -3
- package/docs/enum_bot_Error_State.html +0 -2
- package/docs/enum_webdriver_Browser.html +0 -2
- package/docs/enum_webdriver_Button.html +0 -2
- package/docs/enum_webdriver_Capability.html +0 -33
- package/docs/enum_webdriver_CommandName.html +0 -3
- package/docs/enum_webdriver_Key.html +0 -12
- package/docs/enum_webdriver_logging_Type.html +0 -6
- package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
- package/docs/index.html +0 -125
- package/docs/interface_webdriver_CommandExecutor.html +0 -9
- package/docs/interface_webdriver_http_Client.html +0 -10
- package/docs/interface_webdriver_promise_Thenable.html +0 -77
- package/docs/module_selenium-webdriver.html +0 -23
- package/docs/module_selenium-webdriver__base.html +0 -23
- package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
- package/docs/module_selenium-webdriver_builder.html +0 -2
- package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
- package/docs/module_selenium-webdriver_chrome.html +0 -90
- package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
- package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
- package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
- package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
- package/docs/module_selenium-webdriver_class_Builder.html +0 -138
- package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
- package/docs/module_selenium-webdriver_class_Command.html +0 -15
- package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
- package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
- package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
- package/docs/module_selenium-webdriver_class_Session.html +0 -13
- package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
- package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
- package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
- package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
- package/docs/module_selenium-webdriver_enum_Button.html +0 -2
- package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
- package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
- package/docs/module_selenium-webdriver_enum_Key.html +0 -12
- package/docs/module_selenium-webdriver_error.html +0 -4
- package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
- package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
- package/docs/module_selenium-webdriver_executors.html +0 -10
- package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
- package/docs/module_selenium-webdriver_firefox.html +0 -68
- package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
- package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
- package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
- package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
- package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
- package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
- package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
- package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
- package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
- package/docs/module_selenium-webdriver_http.html +0 -9
- package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
- package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
- package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
- package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
- package/docs/module_selenium-webdriver_http_util.html +0 -17
- package/docs/module_selenium-webdriver_ie.html +0 -11
- package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
- package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
- package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
- package/docs/module_selenium-webdriver_io.html +0 -37
- package/docs/module_selenium-webdriver_io_exec.html +0 -6
- package/docs/module_selenium-webdriver_namespace_By.html +0 -56
- package/docs/module_selenium-webdriver_namespace_error.html +0 -4
- package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
- package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
- package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
- package/docs/module_selenium-webdriver_namespace_until.html +0 -82
- package/docs/module_selenium-webdriver_net.html +0 -7
- package/docs/module_selenium-webdriver_net_portprober.html +0 -12
- package/docs/module_selenium-webdriver_opera.html +0 -62
- package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
- package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
- package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
- package/docs/module_selenium-webdriver_phantomjs.html +0 -2
- package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
- package/docs/module_selenium-webdriver_proxy.html +0 -28
- package/docs/module_selenium-webdriver_remote.html +0 -8
- package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
- package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
- package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
- package/docs/module_selenium-webdriver_safari.html +0 -9
- package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
- package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
- package/docs/module_selenium-webdriver_testing.html +0 -74
- package/docs/module_selenium-webdriver_testing_assert.html +0 -9
- package/docs/namespace_bot.html +0 -4
- package/docs/namespace_bot_json.html +0 -20
- package/docs/namespace_bot_response.html +0 -18
- package/docs/namespace_bot_userAgent.html +0 -33
- package/docs/namespace_webdriver.html +0 -30
- package/docs/namespace_webdriver_By.html +0 -56
- package/docs/namespace_webdriver_http.html +0 -6
- package/docs/namespace_webdriver_logging.html +0 -70
- package/docs/namespace_webdriver_promise.html +0 -688
- package/docs/namespace_webdriver_stacktrace.html +0 -17
- package/docs/namespace_webdriver_testing.html +0 -7
- package/docs/namespace_webdriver_testing_assert.html +0 -9
- package/docs/namespace_webdriver_testing_asserts.html +0 -18
- package/docs/namespace_webdriver_until.html +0 -82
- package/docs/source/_base.js.src.html +0 -1
- package/docs/source/builder.js.src.html +0 -1
- package/docs/source/chrome.js.src.html +0 -1
- package/docs/source/error.js.src.html +0 -1
- package/docs/source/executors.js.src.html +0 -1
- package/docs/source/firefox/binary.js.src.html +0 -1
- package/docs/source/firefox/extension.js.src.html +0 -1
- package/docs/source/firefox/index.js.src.html +0 -1
- package/docs/source/firefox/profile.js.src.html +0 -1
- package/docs/source/http/index.js.src.html +0 -1
- package/docs/source/http/util.js.src.html +0 -1
- package/docs/source/ie.js.src.html +0 -1
- package/docs/source/index.js.src.html +0 -1
- package/docs/source/io/exec.js.src.html +0 -1
- package/docs/source/io/index.js.src.html +0 -1
- package/docs/source/lib/atoms/error.js.src.html +0 -1
- package/docs/source/lib/atoms/json.js.src.html +0 -1
- package/docs/source/lib/atoms/response.js.src.html +0 -1
- package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
- package/docs/source/lib/goog/array/array.js.src.html +0 -1
- package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
- package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
- package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
- package/docs/source/lib/goog/async/run.js.src.html +0 -1
- package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
- package/docs/source/lib/goog/base.js.src.html +0 -1
- package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
- package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
- package/docs/source/lib/goog/debug/error.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
- package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
- package/docs/source/lib/goog/deps.js.src.html +0 -1
- package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
- package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
- package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
- package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
- package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
- package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
- package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
- package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
- package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
- package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
- package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
- package/docs/source/lib/goog/events/event.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
- package/docs/source/lib/goog/events/events.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
- package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
- package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
- package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
- package/docs/source/lib/goog/events/listener.js.src.html +0 -1
- package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
- package/docs/source/lib/goog/fs/url.js.src.html +0 -1
- package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
- package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
- package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
- package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
- package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
- package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
- package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
- package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
- package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
- package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
- package/docs/source/lib/goog/json/json.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
- package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
- package/docs/source/lib/goog/log/log.js.src.html +0 -1
- package/docs/source/lib/goog/math/box.js.src.html +0 -1
- package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
- package/docs/source/lib/goog/math/math.js.src.html +0 -1
- package/docs/source/lib/goog/math/rect.js.src.html +0 -1
- package/docs/source/lib/goog/math/size.js.src.html +0 -1
- package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
- package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
- package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
- package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
- package/docs/source/lib/goog/object/object.js.src.html +0 -1
- package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
- package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
- package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
- package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
- package/docs/source/lib/goog/string/const.js.src.html +0 -1
- package/docs/source/lib/goog/string/string.js.src.html +0 -1
- package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
- package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
- package/docs/source/lib/goog/structs/map.js.src.html +0 -1
- package/docs/source/lib/goog/structs/set.js.src.html +0 -1
- package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
- package/docs/source/lib/goog/style/style.js.src.html +0 -1
- package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
- package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
- package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
- package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
- package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
- package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
- package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
- package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
- package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
- package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
- package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
- package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
- package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
- package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
- package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
- package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
- package/docs/source/lib/webdriver/button.js.src.html +0 -1
- package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
- package/docs/source/lib/webdriver/command.js.src.html +0 -1
- package/docs/source/lib/webdriver/events.js.src.html +0 -1
- package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
- package/docs/source/lib/webdriver/key.js.src.html +0 -1
- package/docs/source/lib/webdriver/locators.js.src.html +0 -1
- package/docs/source/lib/webdriver/logging.js.src.html +0 -1
- package/docs/source/lib/webdriver/promise.js.src.html +0 -1
- package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
- package/docs/source/lib/webdriver/session.js.src.html +0 -1
- package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
- package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
- package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
- package/docs/source/lib/webdriver/until.js.src.html +0 -1
- package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
- package/docs/source/net/index.js.src.html +0 -1
- package/docs/source/net/portprober.js.src.html +0 -1
- package/docs/source/opera.js.src.html +0 -1
- package/docs/source/phantomjs.js.src.html +0 -1
- package/docs/source/proxy.js.src.html +0 -1
- package/docs/source/remote/index.js.src.html +0 -1
- package/docs/source/safari.js.src.html +0 -1
- package/docs/source/testing/assert.js.src.html +0 -1
- package/docs/source/testing/index.js.src.html +0 -1
- package/docs/types.js +0 -1
- package/lib/atoms/error.js +0 -202
- package/lib/atoms/json.js +0 -80
- package/lib/atoms/response.js +0 -110
- package/lib/atoms/userAgent.js +0 -257
- package/lib/goog/LICENSE +0 -176
- package/lib/goog/array/array.js +0 -1654
- package/lib/goog/asserts/asserts.js +0 -365
- package/lib/goog/async/freelist.js +0 -88
- package/lib/goog/async/nexttick.js +0 -241
- package/lib/goog/async/run.js +0 -133
- package/lib/goog/async/workqueue.js +0 -139
- package/lib/goog/base.js +0 -2548
- package/lib/goog/debug/debug.js +0 -653
- package/lib/goog/debug/entrypointregistry.js +0 -158
- package/lib/goog/debug/error.js +0 -63
- package/lib/goog/debug/logbuffer.js +0 -148
- package/lib/goog/debug/logger.js +0 -873
- package/lib/goog/debug/logrecord.js +0 -242
- package/lib/goog/deps.js +0 -151
- package/lib/goog/disposable/disposable.js +0 -307
- package/lib/goog/disposable/idisposable.js +0 -45
- package/lib/goog/dom/browserfeature.js +0 -72
- package/lib/goog/dom/dom.js +0 -2991
- package/lib/goog/dom/nodetype.js +0 -48
- package/lib/goog/dom/safe.js +0 -347
- package/lib/goog/dom/tagname.js +0 -160
- package/lib/goog/dom/tags.js +0 -41
- package/lib/goog/dom/vendor.js +0 -96
- package/lib/goog/events/browserevent.js +0 -400
- package/lib/goog/events/browserfeature.js +0 -85
- package/lib/goog/events/event.js +0 -143
- package/lib/goog/events/eventid.js +0 -47
- package/lib/goog/events/events.js +0 -984
- package/lib/goog/events/eventtarget.js +0 -394
- package/lib/goog/events/eventtype.js +0 -237
- package/lib/goog/events/keycodes.js +0 -427
- package/lib/goog/events/listenable.js +0 -335
- package/lib/goog/events/listener.js +0 -131
- package/lib/goog/events/listenermap.js +0 -308
- package/lib/goog/fs/url.js +0 -109
- package/lib/goog/functions/functions.js +0 -442
- package/lib/goog/html/safehtml.js +0 -757
- package/lib/goog/html/safescript.js +0 -234
- package/lib/goog/html/safestyle.js +0 -442
- package/lib/goog/html/safestylesheet.js +0 -276
- package/lib/goog/html/safeurl.js +0 -398
- package/lib/goog/html/trustedresourceurl.js +0 -224
- package/lib/goog/html/uncheckedconversions.js +0 -232
- package/lib/goog/i18n/bidi.js +0 -908
- package/lib/goog/iter/iter.js +0 -1302
- package/lib/goog/json/json.js +0 -363
- package/lib/goog/labs/testing/assertthat.js +0 -58
- package/lib/goog/labs/testing/logicmatcher.js +0 -212
- package/lib/goog/labs/testing/matcher.js +0 -80
- package/lib/goog/labs/testing/numbermatcher.js +0 -346
- package/lib/goog/labs/testing/objectmatcher.js +0 -317
- package/lib/goog/labs/testing/stringmatcher.js +0 -415
- package/lib/goog/labs/useragent/browser.js +0 -341
- package/lib/goog/labs/useragent/engine.js +0 -160
- package/lib/goog/labs/useragent/platform.js +0 -160
- package/lib/goog/labs/useragent/util.js +0 -148
- package/lib/goog/log/log.js +0 -197
- package/lib/goog/math/box.js +0 -398
- package/lib/goog/math/coordinate.js +0 -268
- package/lib/goog/math/math.js +0 -451
- package/lib/goog/math/rect.js +0 -476
- package/lib/goog/math/size.js +0 -227
- package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
- package/lib/goog/net/xhrlike.js +0 -124
- package/lib/goog/net/xmlhttp.js +0 -246
- package/lib/goog/net/xmlhttpfactory.js +0 -67
- package/lib/goog/object/object.js +0 -686
- package/lib/goog/promise/promise.js +0 -1350
- package/lib/goog/promise/resolver.js +0 -48
- package/lib/goog/promise/thenable.js +0 -126
- package/lib/goog/reflect/reflect.js +0 -77
- package/lib/goog/string/const.js +0 -182
- package/lib/goog/string/string.js +0 -1599
- package/lib/goog/string/typedstring.js +0 -48
- package/lib/goog/structs/collection.js +0 -56
- package/lib/goog/structs/map.js +0 -457
- package/lib/goog/structs/set.js +0 -279
- package/lib/goog/structs/structs.js +0 -354
- package/lib/goog/style/style.js +0 -2037
- package/lib/goog/testing/asserts.js +0 -1278
- package/lib/goog/testing/events/events.js +0 -767
- package/lib/goog/testing/functionmock.js +0 -175
- package/lib/goog/testing/jsunit.js +0 -162
- package/lib/goog/testing/loosemock.js +0 -242
- package/lib/goog/testing/mock.js +0 -645
- package/lib/goog/testing/mockclock.js +0 -606
- package/lib/goog/testing/mockcontrol.js +0 -220
- package/lib/goog/testing/mockinterface.js +0 -45
- package/lib/goog/testing/mockmatchers.js +0 -400
- package/lib/goog/testing/objectpropertystring.js +0 -68
- package/lib/goog/testing/propertyreplacer.js +0 -262
- package/lib/goog/testing/recordfunction.js +0 -215
- package/lib/goog/testing/stacktrace.js +0 -594
- package/lib/goog/testing/strictmock.js +0 -130
- package/lib/goog/testing/testcase.js +0 -1629
- package/lib/goog/testing/testrunner.js +0 -440
- package/lib/goog/uri/uri.js +0 -1524
- package/lib/goog/uri/utils.js +0 -1064
- package/lib/goog/useragent/product.js +0 -183
- package/lib/goog/useragent/product_isversion.js +0 -144
- package/lib/goog/useragent/useragent.js +0 -572
- package/lib/webdriver/actionsequence.js +0 -356
- package/lib/webdriver/builder.js +0 -207
- package/lib/webdriver/capabilities.js +0 -412
- package/lib/webdriver/events.js +0 -179
- package/lib/webdriver/firefoxdomexecutor.js +0 -175
- package/lib/webdriver/http/corsclient.js +0 -133
- package/lib/webdriver/http/http.js +0 -525
- package/lib/webdriver/http/xhrclient.js +0 -67
- package/lib/webdriver/locators.js +0 -257
- package/lib/webdriver/logging.js +0 -347
- package/lib/webdriver/session.js +0 -74
- package/lib/webdriver/stacktrace.js +0 -619
- package/lib/webdriver/test/builder_test.js +0 -53
- package/lib/webdriver/test/capabilities_test.js +0 -72
- package/lib/webdriver/test/events_test.js +0 -203
- package/lib/webdriver/test/http/corsclient_test.js +0 -151
- package/lib/webdriver/test/http/http_test.js +0 -428
- package/lib/webdriver/test/http/xhrclient_test.js +0 -196
- package/lib/webdriver/test/locators_test.js +0 -59
- package/lib/webdriver/test/logging_test.js +0 -85
- package/lib/webdriver/test/promise_error_test.js +0 -892
- package/lib/webdriver/test/promise_flow_test.js +0 -2365
- package/lib/webdriver/test/promise_generator_test.js +0 -323
- package/lib/webdriver/test/promise_test.js +0 -2012
- package/lib/webdriver/test/stacktrace_test.js +0 -480
- package/lib/webdriver/test/test_bootstrap.js +0 -67
- package/lib/webdriver/test/testing/asserts_test.js +0 -117
- package/lib/webdriver/test/testing/client_test.js +0 -88
- package/lib/webdriver/test/testing/testcase_test.js +0 -229
- package/lib/webdriver/test/testutil.js +0 -209
- package/lib/webdriver/test/testutil_test.js +0 -104
- package/lib/webdriver/test/until_test.js +0 -411
- package/lib/webdriver/test/webdriver_generator_test.js +0 -92
- package/lib/webdriver/test/webdriver_test.js +0 -2369
- package/lib/webdriver/testing/asserts.js +0 -487
- package/lib/webdriver/testing/client.js +0 -179
- package/lib/webdriver/testing/jsunit.js +0 -363
- package/lib/webdriver/testing/testcase.js +0 -168
- package/lib/webdriver/testing/window.js +0 -244
- package/lib/webdriver/touchsequence.js +0 -248
- package/lib/webdriver/until.js +0 -412
- package/lib/webdriver/webdriver.js +0 -2511
- package/test/_base_test.js +0 -129
|
@@ -1,757 +0,0 @@
|
|
|
1
|
-
// Copyright 2013 The Closure Library Authors. All Rights Reserved.
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
//
|
|
7
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
//
|
|
9
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
// See the License for the specific language governing permissions and
|
|
13
|
-
// limitations under the License.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* @fileoverview The SafeHtml type and its builders.
|
|
18
|
-
*
|
|
19
|
-
* TODO(xtof): Link to document stating type contract.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
goog.provide('goog.html.SafeHtml');
|
|
23
|
-
|
|
24
|
-
goog.require('goog.array');
|
|
25
|
-
goog.require('goog.asserts');
|
|
26
|
-
goog.require('goog.dom.TagName');
|
|
27
|
-
goog.require('goog.dom.tags');
|
|
28
|
-
goog.require('goog.html.SafeStyle');
|
|
29
|
-
goog.require('goog.html.SafeStyleSheet');
|
|
30
|
-
goog.require('goog.html.SafeUrl');
|
|
31
|
-
goog.require('goog.html.TrustedResourceUrl');
|
|
32
|
-
goog.require('goog.i18n.bidi.Dir');
|
|
33
|
-
goog.require('goog.i18n.bidi.DirectionalString');
|
|
34
|
-
goog.require('goog.object');
|
|
35
|
-
goog.require('goog.string');
|
|
36
|
-
goog.require('goog.string.Const');
|
|
37
|
-
goog.require('goog.string.TypedString');
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* A string that is safe to use in HTML context in DOM APIs and HTML documents.
|
|
43
|
-
*
|
|
44
|
-
* A SafeHtml is a string-like object that carries the security type contract
|
|
45
|
-
* that its value as a string will not cause untrusted script execution when
|
|
46
|
-
* evaluated as HTML in a browser.
|
|
47
|
-
*
|
|
48
|
-
* Values of this type are guaranteed to be safe to use in HTML contexts,
|
|
49
|
-
* such as, assignment to the innerHTML DOM property, or interpolation into
|
|
50
|
-
* a HTML template in HTML PC_DATA context, in the sense that the use will not
|
|
51
|
-
* result in a Cross-Site-Scripting vulnerability.
|
|
52
|
-
*
|
|
53
|
-
* Instances of this type must be created via the factory methods
|
|
54
|
-
* ({@code goog.html.SafeHtml.create}, {@code goog.html.SafeHtml.htmlEscape}),
|
|
55
|
-
* etc and not by invoking its constructor. The constructor intentionally
|
|
56
|
-
* takes no parameters and the type is immutable; hence only a default instance
|
|
57
|
-
* corresponding to the empty string can be obtained via constructor invocation.
|
|
58
|
-
*
|
|
59
|
-
* @see goog.html.SafeHtml#create
|
|
60
|
-
* @see goog.html.SafeHtml#htmlEscape
|
|
61
|
-
* @constructor
|
|
62
|
-
* @final
|
|
63
|
-
* @struct
|
|
64
|
-
* @implements {goog.i18n.bidi.DirectionalString}
|
|
65
|
-
* @implements {goog.string.TypedString}
|
|
66
|
-
*/
|
|
67
|
-
goog.html.SafeHtml = function() {
|
|
68
|
-
/**
|
|
69
|
-
* The contained value of this SafeHtml. The field has a purposely ugly
|
|
70
|
-
* name to make (non-compiled) code that attempts to directly access this
|
|
71
|
-
* field stand out.
|
|
72
|
-
* @private {string}
|
|
73
|
-
*/
|
|
74
|
-
this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = '';
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* A type marker used to implement additional run-time type checking.
|
|
78
|
-
* @see goog.html.SafeHtml#unwrap
|
|
79
|
-
* @const
|
|
80
|
-
* @private
|
|
81
|
-
*/
|
|
82
|
-
this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =
|
|
83
|
-
goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* This SafeHtml's directionality, or null if unknown.
|
|
87
|
-
* @private {?goog.i18n.bidi.Dir}
|
|
88
|
-
*/
|
|
89
|
-
this.dir_ = null;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* @override
|
|
95
|
-
* @const
|
|
96
|
-
*/
|
|
97
|
-
goog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString = true;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
/** @override */
|
|
101
|
-
goog.html.SafeHtml.prototype.getDirection = function() {
|
|
102
|
-
return this.dir_;
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* @override
|
|
108
|
-
* @const
|
|
109
|
-
*/
|
|
110
|
-
goog.html.SafeHtml.prototype.implementsGoogStringTypedString = true;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Returns this SafeHtml's value a string.
|
|
115
|
-
*
|
|
116
|
-
* IMPORTANT: In code where it is security relevant that an object's type is
|
|
117
|
-
* indeed {@code SafeHtml}, use {@code goog.html.SafeHtml.unwrap} instead of
|
|
118
|
-
* this method. If in doubt, assume that it's security relevant. In particular,
|
|
119
|
-
* note that goog.html functions which return a goog.html type do not guarantee
|
|
120
|
-
* that the returned instance is of the right type. For example:
|
|
121
|
-
*
|
|
122
|
-
* <pre>
|
|
123
|
-
* var fakeSafeHtml = new String('fake');
|
|
124
|
-
* fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;
|
|
125
|
-
* var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);
|
|
126
|
-
* // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by
|
|
127
|
-
* // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml
|
|
128
|
-
* // instanceof goog.html.SafeHtml.
|
|
129
|
-
* </pre>
|
|
130
|
-
*
|
|
131
|
-
* @see goog.html.SafeHtml#unwrap
|
|
132
|
-
* @override
|
|
133
|
-
*/
|
|
134
|
-
goog.html.SafeHtml.prototype.getTypedStringValue = function() {
|
|
135
|
-
return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
if (goog.DEBUG) {
|
|
140
|
-
/**
|
|
141
|
-
* Returns a debug string-representation of this value.
|
|
142
|
-
*
|
|
143
|
-
* To obtain the actual string value wrapped in a SafeHtml, use
|
|
144
|
-
* {@code goog.html.SafeHtml.unwrap}.
|
|
145
|
-
*
|
|
146
|
-
* @see goog.html.SafeHtml#unwrap
|
|
147
|
-
* @override
|
|
148
|
-
*/
|
|
149
|
-
goog.html.SafeHtml.prototype.toString = function() {
|
|
150
|
-
return 'SafeHtml{' + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ +
|
|
151
|
-
'}';
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Performs a runtime check that the provided object is indeed a SafeHtml
|
|
158
|
-
* object, and returns its value.
|
|
159
|
-
* @param {!goog.html.SafeHtml} safeHtml The object to extract from.
|
|
160
|
-
* @return {string} The SafeHtml object's contained string, unless the run-time
|
|
161
|
-
* type check fails. In that case, {@code unwrap} returns an innocuous
|
|
162
|
-
* string, or, if assertions are enabled, throws
|
|
163
|
-
* {@code goog.asserts.AssertionError}.
|
|
164
|
-
*/
|
|
165
|
-
goog.html.SafeHtml.unwrap = function(safeHtml) {
|
|
166
|
-
// Perform additional run-time type-checking to ensure that safeHtml is indeed
|
|
167
|
-
// an instance of the expected type. This provides some additional protection
|
|
168
|
-
// against security bugs due to application code that disables type checks.
|
|
169
|
-
// Specifically, the following checks are performed:
|
|
170
|
-
// 1. The object is an instance of the expected type.
|
|
171
|
-
// 2. The object is not an instance of a subclass.
|
|
172
|
-
// 3. The object carries a type marker for the expected type. "Faking" an
|
|
173
|
-
// object requires a reference to the type marker, which has names intended
|
|
174
|
-
// to stand out in code reviews.
|
|
175
|
-
if (safeHtml instanceof goog.html.SafeHtml &&
|
|
176
|
-
safeHtml.constructor === goog.html.SafeHtml &&
|
|
177
|
-
safeHtml.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===
|
|
178
|
-
goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {
|
|
179
|
-
return safeHtml.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
|
|
180
|
-
} else {
|
|
181
|
-
goog.asserts.fail('expected object of type SafeHtml, got \'' +
|
|
182
|
-
safeHtml + '\'');
|
|
183
|
-
return 'type_error:SafeHtml';
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Shorthand for union of types that can sensibly be converted to strings
|
|
190
|
-
* or might already be SafeHtml (as SafeHtml is a goog.string.TypedString).
|
|
191
|
-
* @private
|
|
192
|
-
* @typedef {string|number|boolean|!goog.string.TypedString|
|
|
193
|
-
* !goog.i18n.bidi.DirectionalString}
|
|
194
|
-
*/
|
|
195
|
-
goog.html.SafeHtml.TextOrHtml_;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Returns HTML-escaped text as a SafeHtml object.
|
|
200
|
-
*
|
|
201
|
-
* If text is of a type that implements
|
|
202
|
-
* {@code goog.i18n.bidi.DirectionalString}, the directionality of the new
|
|
203
|
-
* {@code SafeHtml} object is set to {@code text}'s directionality, if known.
|
|
204
|
-
* Otherwise, the directionality of the resulting SafeHtml is unknown (i.e.,
|
|
205
|
-
* {@code null}).
|
|
206
|
-
*
|
|
207
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
|
|
208
|
-
* the parameter is of type SafeHtml it is returned directly (no escaping
|
|
209
|
-
* is done).
|
|
210
|
-
* @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
|
|
211
|
-
*/
|
|
212
|
-
goog.html.SafeHtml.htmlEscape = function(textOrHtml) {
|
|
213
|
-
if (textOrHtml instanceof goog.html.SafeHtml) {
|
|
214
|
-
return textOrHtml;
|
|
215
|
-
}
|
|
216
|
-
var dir = null;
|
|
217
|
-
if (textOrHtml.implementsGoogI18nBidiDirectionalString) {
|
|
218
|
-
dir = textOrHtml.getDirection();
|
|
219
|
-
}
|
|
220
|
-
var textAsString;
|
|
221
|
-
if (textOrHtml.implementsGoogStringTypedString) {
|
|
222
|
-
textAsString = textOrHtml.getTypedStringValue();
|
|
223
|
-
} else {
|
|
224
|
-
textAsString = String(textOrHtml);
|
|
225
|
-
}
|
|
226
|
-
return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
227
|
-
goog.string.htmlEscape(textAsString), dir);
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Returns HTML-escaped text as a SafeHtml object, with newlines changed to
|
|
233
|
-
* <br>.
|
|
234
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
|
|
235
|
-
* the parameter is of type SafeHtml it is returned directly (no escaping
|
|
236
|
-
* is done).
|
|
237
|
-
* @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
|
|
238
|
-
*/
|
|
239
|
-
goog.html.SafeHtml.htmlEscapePreservingNewlines = function(textOrHtml) {
|
|
240
|
-
if (textOrHtml instanceof goog.html.SafeHtml) {
|
|
241
|
-
return textOrHtml;
|
|
242
|
-
}
|
|
243
|
-
var html = goog.html.SafeHtml.htmlEscape(textOrHtml);
|
|
244
|
-
return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
245
|
-
goog.string.newLineToBr(goog.html.SafeHtml.unwrap(html)),
|
|
246
|
-
html.getDirection());
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Returns HTML-escaped text as a SafeHtml object, with newlines changed to
|
|
252
|
-
* <br> and escaping whitespace to preserve spatial formatting. Character
|
|
253
|
-
* entity #160 is used to make it safer for XML.
|
|
254
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If
|
|
255
|
-
* the parameter is of type SafeHtml it is returned directly (no escaping
|
|
256
|
-
* is done).
|
|
257
|
-
* @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.
|
|
258
|
-
*/
|
|
259
|
-
goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces = function(
|
|
260
|
-
textOrHtml) {
|
|
261
|
-
if (textOrHtml instanceof goog.html.SafeHtml) {
|
|
262
|
-
return textOrHtml;
|
|
263
|
-
}
|
|
264
|
-
var html = goog.html.SafeHtml.htmlEscape(textOrHtml);
|
|
265
|
-
return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
266
|
-
goog.string.whitespaceEscape(goog.html.SafeHtml.unwrap(html)),
|
|
267
|
-
html.getDirection());
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Coerces an arbitrary object into a SafeHtml object.
|
|
273
|
-
*
|
|
274
|
-
* If {@code textOrHtml} is already of type {@code goog.html.SafeHtml}, the same
|
|
275
|
-
* object is returned. Otherwise, {@code textOrHtml} is coerced to string, and
|
|
276
|
-
* HTML-escaped. If {@code textOrHtml} is of a type that implements
|
|
277
|
-
* {@code goog.i18n.bidi.DirectionalString}, its directionality, if known, is
|
|
278
|
-
* preserved.
|
|
279
|
-
*
|
|
280
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text or SafeHtml to
|
|
281
|
-
* coerce.
|
|
282
|
-
* @return {!goog.html.SafeHtml} The resulting SafeHtml object.
|
|
283
|
-
* @deprecated Use goog.html.SafeHtml.htmlEscape.
|
|
284
|
-
*/
|
|
285
|
-
goog.html.SafeHtml.from = goog.html.SafeHtml.htmlEscape;
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* @const
|
|
290
|
-
* @private
|
|
291
|
-
*/
|
|
292
|
-
goog.html.SafeHtml.VALID_NAMES_IN_TAG_ = /^[a-zA-Z0-9-]+$/;
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Set of attributes containing URL as defined at
|
|
297
|
-
* http://www.w3.org/TR/html5/index.html#attributes-1.
|
|
298
|
-
* @private @const {!Object<string,boolean>}
|
|
299
|
-
*/
|
|
300
|
-
goog.html.SafeHtml.URL_ATTRIBUTES_ = goog.object.createSet('action', 'cite',
|
|
301
|
-
'data', 'formaction', 'href', 'manifest', 'poster', 'src');
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Tags which are unsupported via create(). They might be supported via a
|
|
306
|
-
* tag-specific create method. These are tags which might require a
|
|
307
|
-
* TrustedResourceUrl in one of their attributes or a restricted type for
|
|
308
|
-
* their content.
|
|
309
|
-
* @private @const {!Object<string,boolean>}
|
|
310
|
-
*/
|
|
311
|
-
goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_ = goog.object.createSet(
|
|
312
|
-
goog.dom.TagName.EMBED, goog.dom.TagName.IFRAME, goog.dom.TagName.LINK,
|
|
313
|
-
goog.dom.TagName.OBJECT, goog.dom.TagName.SCRIPT, goog.dom.TagName.STYLE,
|
|
314
|
-
goog.dom.TagName.TEMPLATE);
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
/**
|
|
318
|
-
* @typedef {string|number|goog.string.TypedString|
|
|
319
|
-
* goog.html.SafeStyle.PropertyMap}
|
|
320
|
-
* @private
|
|
321
|
-
*/
|
|
322
|
-
goog.html.SafeHtml.AttributeValue_;
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Creates a SafeHtml content consisting of a tag with optional attributes and
|
|
327
|
-
* optional content.
|
|
328
|
-
*
|
|
329
|
-
* For convenience tag names and attribute names are accepted as regular
|
|
330
|
-
* strings, instead of goog.string.Const. Nevertheless, you should not pass
|
|
331
|
-
* user-controlled values to these parameters. Note that these parameters are
|
|
332
|
-
* syntactically validated at runtime, and invalid values will result in
|
|
333
|
-
* an exception.
|
|
334
|
-
*
|
|
335
|
-
* Example usage:
|
|
336
|
-
*
|
|
337
|
-
* goog.html.SafeHtml.create('br');
|
|
338
|
-
* goog.html.SafeHtml.create('div', {'class': 'a'});
|
|
339
|
-
* goog.html.SafeHtml.create('p', {}, 'a');
|
|
340
|
-
* goog.html.SafeHtml.create('p', {}, goog.html.SafeHtml.create('br'));
|
|
341
|
-
*
|
|
342
|
-
* goog.html.SafeHtml.create('span', {
|
|
343
|
-
* 'style': {'margin': '0'}
|
|
344
|
-
* });
|
|
345
|
-
*
|
|
346
|
-
* To guarantee SafeHtml's type contract is upheld there are restrictions on
|
|
347
|
-
* attribute values and tag names.
|
|
348
|
-
*
|
|
349
|
-
* - For attributes which contain script code (on*), a goog.string.Const is
|
|
350
|
-
* required.
|
|
351
|
-
* - For attributes which contain style (style), a goog.html.SafeStyle or a
|
|
352
|
-
* goog.html.SafeStyle.PropertyMap is required.
|
|
353
|
-
* - For attributes which are interpreted as URLs (e.g. src, href) a
|
|
354
|
-
* goog.html.SafeUrl, goog.string.Const or string is required. If a string
|
|
355
|
-
* is passed, it will be sanitized with SafeUrl.sanitize().
|
|
356
|
-
* - For tags which can load code, more specific goog.html.SafeHtml.create*()
|
|
357
|
-
* functions must be used. Tags which can load code and are not supported by
|
|
358
|
-
* this function are embed, iframe, link, object, script, style, and template.
|
|
359
|
-
*
|
|
360
|
-
* @param {string} tagName The name of the tag. Only tag names consisting of
|
|
361
|
-
* [a-zA-Z0-9-] are allowed. Tag names documented above are disallowed.
|
|
362
|
-
* @param {!Object<string, goog.html.SafeHtml.AttributeValue_>=}
|
|
363
|
-
* opt_attributes Mapping from attribute names to their values. Only
|
|
364
|
-
* attribute names consisting of [a-zA-Z0-9-] are allowed. Value of null or
|
|
365
|
-
* undefined causes the attribute to be omitted.
|
|
366
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_|
|
|
367
|
-
* !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
|
|
368
|
-
* HTML-escape and put inside the tag. This must be empty for void tags
|
|
369
|
-
* like <br>. Array elements are concatenated.
|
|
370
|
-
* @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
|
|
371
|
-
* @throws {Error} If invalid tag name, attribute name, or attribute value is
|
|
372
|
-
* provided.
|
|
373
|
-
* @throws {goog.asserts.AssertionError} If content for void tag is provided.
|
|
374
|
-
*/
|
|
375
|
-
goog.html.SafeHtml.create = function(tagName, opt_attributes, opt_content) {
|
|
376
|
-
if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(tagName)) {
|
|
377
|
-
throw Error('Invalid tag name <' + tagName + '>.');
|
|
378
|
-
}
|
|
379
|
-
if (tagName.toUpperCase() in goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_) {
|
|
380
|
-
throw Error('Tag name <' + tagName + '> is not allowed for SafeHtml.');
|
|
381
|
-
}
|
|
382
|
-
return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
|
|
383
|
-
tagName, opt_attributes, opt_content);
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Creates a SafeHtml representing an iframe tag.
|
|
389
|
-
*
|
|
390
|
-
* By default the sandbox attribute is set to an empty value, which is the most
|
|
391
|
-
* secure option, as it confers the iframe the least privileges. If this
|
|
392
|
-
* is too restrictive then granting individual privileges is the preferable
|
|
393
|
-
* option. Unsetting the attribute entirely is the least secure option and
|
|
394
|
-
* should never be done unless it's stricly necessary.
|
|
395
|
-
*
|
|
396
|
-
* @param {goog.html.TrustedResourceUrl=} opt_src The value of the src
|
|
397
|
-
* attribute. If null or undefined src will not be set.
|
|
398
|
-
* @param {goog.html.SafeHtml=} opt_srcdoc The value of the srcdoc attribute.
|
|
399
|
-
* If null or undefined srcdoc will not be set.
|
|
400
|
-
* @param {!Object<string, goog.html.SafeHtml.AttributeValue_>=}
|
|
401
|
-
* opt_attributes Mapping from attribute names to their values. Only
|
|
402
|
-
* attribute names consisting of [a-zA-Z0-9-] are allowed. Value of null or
|
|
403
|
-
* undefined causes the attribute to be omitted.
|
|
404
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_|
|
|
405
|
-
* !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to
|
|
406
|
-
* HTML-escape and put inside the tag. Array elements are concatenated.
|
|
407
|
-
* @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
|
|
408
|
-
* @throws {Error} If invalid tag name, attribute name, or attribute value is
|
|
409
|
-
* provided. If opt_attributes contains the src or srcdoc attributes.
|
|
410
|
-
*/
|
|
411
|
-
goog.html.SafeHtml.createIframe = function(
|
|
412
|
-
opt_src, opt_srcdoc, opt_attributes, opt_content) {
|
|
413
|
-
var fixedAttributes = {};
|
|
414
|
-
fixedAttributes['src'] = opt_src || null;
|
|
415
|
-
fixedAttributes['srcdoc'] = opt_srcdoc || null;
|
|
416
|
-
var defaultAttributes = {'sandbox': ''};
|
|
417
|
-
var attributes = goog.html.SafeHtml.combineAttributes(
|
|
418
|
-
fixedAttributes, defaultAttributes, opt_attributes);
|
|
419
|
-
return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
|
|
420
|
-
'iframe', attributes, opt_content);
|
|
421
|
-
};
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Creates a SafeHtml representing a style tag. The type attribute is set
|
|
426
|
-
* to "text/css".
|
|
427
|
-
* @param {!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>}
|
|
428
|
-
* styleSheet Content to put inside the tag. Array elements are
|
|
429
|
-
* concatenated.
|
|
430
|
-
* @param {!Object<string, goog.html.SafeHtml.AttributeValue_>=}
|
|
431
|
-
* opt_attributes Mapping from attribute names to their values. Only
|
|
432
|
-
* attribute names consisting of [a-zA-Z0-9-] are allowed. Value of null or
|
|
433
|
-
* undefined causes the attribute to be omitted.
|
|
434
|
-
* @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
|
|
435
|
-
* @throws {Error} If invalid attribute name or attribute value is provided. If
|
|
436
|
-
* opt_attributes contains the type attribute.
|
|
437
|
-
*/
|
|
438
|
-
goog.html.SafeHtml.createStyle = function(styleSheet, opt_attributes) {
|
|
439
|
-
var fixedAttributes = {'type': 'text/css'};
|
|
440
|
-
var defaultAttributes = {};
|
|
441
|
-
var attributes = goog.html.SafeHtml.combineAttributes(
|
|
442
|
-
fixedAttributes, defaultAttributes, opt_attributes);
|
|
443
|
-
|
|
444
|
-
var content = '';
|
|
445
|
-
styleSheet = goog.array.concat(styleSheet);
|
|
446
|
-
for (var i = 0; i < styleSheet.length; i++) {
|
|
447
|
-
content += goog.html.SafeStyleSheet.unwrap(styleSheet[i]);
|
|
448
|
-
}
|
|
449
|
-
// Convert to SafeHtml so that it's not HTML-escaped.
|
|
450
|
-
var htmlContent = goog.html.SafeHtml
|
|
451
|
-
.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
452
|
-
content, goog.i18n.bidi.Dir.NEUTRAL);
|
|
453
|
-
return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(
|
|
454
|
-
'style', attributes, htmlContent);
|
|
455
|
-
};
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
/**
|
|
459
|
-
* @param {string} tagName The tag name.
|
|
460
|
-
* @param {string} name The attribute name.
|
|
461
|
-
* @param {!goog.html.SafeHtml.AttributeValue_} value The attribute value.
|
|
462
|
-
* @return {string} A "name=value" string.
|
|
463
|
-
* @throws {Error} If attribute value is unsafe for the given tag and attribute.
|
|
464
|
-
* @private
|
|
465
|
-
*/
|
|
466
|
-
goog.html.SafeHtml.getAttrNameAndValue_ = function(tagName, name, value) {
|
|
467
|
-
// If it's goog.string.Const, allow any valid attribute name.
|
|
468
|
-
if (value instanceof goog.string.Const) {
|
|
469
|
-
value = goog.string.Const.unwrap(value);
|
|
470
|
-
} else if (name.toLowerCase() == 'style') {
|
|
471
|
-
value = goog.html.SafeHtml.getStyleValue_(value);
|
|
472
|
-
} else if (/^on/i.test(name)) {
|
|
473
|
-
// TODO(jakubvrana): Disallow more attributes with a special meaning.
|
|
474
|
-
throw Error('Attribute "' + name +
|
|
475
|
-
'" requires goog.string.Const value, "' + value + '" given.');
|
|
476
|
-
// URL attributes handled differently accroding to tag.
|
|
477
|
-
} else if (name.toLowerCase() in goog.html.SafeHtml.URL_ATTRIBUTES_) {
|
|
478
|
-
if (value instanceof goog.html.TrustedResourceUrl) {
|
|
479
|
-
value = goog.html.TrustedResourceUrl.unwrap(value);
|
|
480
|
-
} else if (value instanceof goog.html.SafeUrl) {
|
|
481
|
-
value = goog.html.SafeUrl.unwrap(value);
|
|
482
|
-
} else if (goog.isString(value)) {
|
|
483
|
-
value = goog.html.SafeUrl.sanitize(value).getTypedStringValue();
|
|
484
|
-
} else {
|
|
485
|
-
throw Error('Attribute "' + name + '" on tag "' + tagName +
|
|
486
|
-
'" requires goog.html.SafeUrl, goog.string.Const, or string,' +
|
|
487
|
-
' value "' + value + '" given.');
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
// Accept SafeUrl, TrustedResourceUrl, etc. for attributes which only require
|
|
492
|
-
// HTML-escaping.
|
|
493
|
-
if (value.implementsGoogStringTypedString) {
|
|
494
|
-
// Ok to call getTypedStringValue() since there's no reliance on the type
|
|
495
|
-
// contract for security here.
|
|
496
|
-
value = value.getTypedStringValue();
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
goog.asserts.assert(goog.isString(value) || goog.isNumber(value),
|
|
500
|
-
'String or number value expected, got ' +
|
|
501
|
-
(typeof value) + ' with value: ' + value);
|
|
502
|
-
return name + '="' + goog.string.htmlEscape(String(value)) + '"';
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
/**
|
|
507
|
-
* Gets value allowed in "style" attribute.
|
|
508
|
-
* @param {goog.html.SafeHtml.AttributeValue_} value It could be SafeStyle or a
|
|
509
|
-
* map which will be passed to goog.html.SafeStyle.create.
|
|
510
|
-
* @return {string} Unwrapped value.
|
|
511
|
-
* @throws {Error} If string value is given.
|
|
512
|
-
* @private
|
|
513
|
-
*/
|
|
514
|
-
goog.html.SafeHtml.getStyleValue_ = function(value) {
|
|
515
|
-
if (!goog.isObject(value)) {
|
|
516
|
-
throw Error('The "style" attribute requires goog.html.SafeStyle or map ' +
|
|
517
|
-
'of style properties, ' + (typeof value) + ' given: ' + value);
|
|
518
|
-
}
|
|
519
|
-
if (!(value instanceof goog.html.SafeStyle)) {
|
|
520
|
-
// Process the property bag into a style object.
|
|
521
|
-
value = goog.html.SafeStyle.create(value);
|
|
522
|
-
}
|
|
523
|
-
return goog.html.SafeStyle.unwrap(value);
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
/**
|
|
528
|
-
* Creates a SafeHtml content with known directionality consisting of a tag with
|
|
529
|
-
* optional attributes and optional content.
|
|
530
|
-
* @param {!goog.i18n.bidi.Dir} dir Directionality.
|
|
531
|
-
* @param {string} tagName
|
|
532
|
-
* @param {!Object<string, goog.html.SafeHtml.AttributeValue_>=} opt_attributes
|
|
533
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_|
|
|
534
|
-
* !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content
|
|
535
|
-
* @return {!goog.html.SafeHtml} The SafeHtml content with the tag.
|
|
536
|
-
*/
|
|
537
|
-
goog.html.SafeHtml.createWithDir = function(dir, tagName, opt_attributes,
|
|
538
|
-
opt_content) {
|
|
539
|
-
var html = goog.html.SafeHtml.create(tagName, opt_attributes, opt_content);
|
|
540
|
-
html.dir_ = dir;
|
|
541
|
-
return html;
|
|
542
|
-
};
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
/**
|
|
546
|
-
* Creates a new SafeHtml object by concatenating values.
|
|
547
|
-
* @param {...(!goog.html.SafeHtml.TextOrHtml_|
|
|
548
|
-
* !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Values to concatenate.
|
|
549
|
-
* @return {!goog.html.SafeHtml}
|
|
550
|
-
*/
|
|
551
|
-
goog.html.SafeHtml.concat = function(var_args) {
|
|
552
|
-
var dir = goog.i18n.bidi.Dir.NEUTRAL;
|
|
553
|
-
var content = '';
|
|
554
|
-
|
|
555
|
-
/**
|
|
556
|
-
* @param {!goog.html.SafeHtml.TextOrHtml_|
|
|
557
|
-
* !Array<!goog.html.SafeHtml.TextOrHtml_>} argument
|
|
558
|
-
*/
|
|
559
|
-
var addArgument = function(argument) {
|
|
560
|
-
if (goog.isArray(argument)) {
|
|
561
|
-
goog.array.forEach(argument, addArgument);
|
|
562
|
-
} else {
|
|
563
|
-
var html = goog.html.SafeHtml.htmlEscape(argument);
|
|
564
|
-
content += goog.html.SafeHtml.unwrap(html);
|
|
565
|
-
var htmlDir = html.getDirection();
|
|
566
|
-
if (dir == goog.i18n.bidi.Dir.NEUTRAL) {
|
|
567
|
-
dir = htmlDir;
|
|
568
|
-
} else if (htmlDir != goog.i18n.bidi.Dir.NEUTRAL && dir != htmlDir) {
|
|
569
|
-
dir = null;
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
};
|
|
573
|
-
|
|
574
|
-
goog.array.forEach(arguments, addArgument);
|
|
575
|
-
return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
576
|
-
content, dir);
|
|
577
|
-
};
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
/**
|
|
581
|
-
* Creates a new SafeHtml object with known directionality by concatenating the
|
|
582
|
-
* values.
|
|
583
|
-
* @param {!goog.i18n.bidi.Dir} dir Directionality.
|
|
584
|
-
* @param {...(!goog.html.SafeHtml.TextOrHtml_|
|
|
585
|
-
* !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Elements of array
|
|
586
|
-
* arguments would be processed recursively.
|
|
587
|
-
* @return {!goog.html.SafeHtml}
|
|
588
|
-
*/
|
|
589
|
-
goog.html.SafeHtml.concatWithDir = function(dir, var_args) {
|
|
590
|
-
var html = goog.html.SafeHtml.concat(goog.array.slice(arguments, 1));
|
|
591
|
-
html.dir_ = dir;
|
|
592
|
-
return html;
|
|
593
|
-
};
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
/**
|
|
597
|
-
* Type marker for the SafeHtml type, used to implement additional run-time
|
|
598
|
-
* type checking.
|
|
599
|
-
* @const {!Object}
|
|
600
|
-
* @private
|
|
601
|
-
*/
|
|
602
|
-
goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
/**
|
|
606
|
-
* Package-internal utility method to create SafeHtml instances.
|
|
607
|
-
*
|
|
608
|
-
* @param {string} html The string to initialize the SafeHtml object with.
|
|
609
|
-
* @param {?goog.i18n.bidi.Dir} dir The directionality of the SafeHtml to be
|
|
610
|
-
* constructed, or null if unknown.
|
|
611
|
-
* @return {!goog.html.SafeHtml} The initialized SafeHtml object.
|
|
612
|
-
* @package
|
|
613
|
-
*/
|
|
614
|
-
goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse = function(
|
|
615
|
-
html, dir) {
|
|
616
|
-
return new goog.html.SafeHtml().initSecurityPrivateDoNotAccessOrElse_(
|
|
617
|
-
html, dir);
|
|
618
|
-
};
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
/**
|
|
622
|
-
* Called from createSafeHtmlSecurityPrivateDoNotAccessOrElse(). This
|
|
623
|
-
* method exists only so that the compiler can dead code eliminate static
|
|
624
|
-
* fields (like EMPTY) when they're not accessed.
|
|
625
|
-
* @param {string} html
|
|
626
|
-
* @param {?goog.i18n.bidi.Dir} dir
|
|
627
|
-
* @return {!goog.html.SafeHtml}
|
|
628
|
-
* @private
|
|
629
|
-
*/
|
|
630
|
-
goog.html.SafeHtml.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(
|
|
631
|
-
html, dir) {
|
|
632
|
-
this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = html;
|
|
633
|
-
this.dir_ = dir;
|
|
634
|
-
return this;
|
|
635
|
-
};
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
/**
|
|
639
|
-
* Like create() but does not restrict which tags can be constructed.
|
|
640
|
-
*
|
|
641
|
-
* @param {string} tagName Tag name. Set or validated by caller.
|
|
642
|
-
* @param {!Object<string, goog.html.SafeHtml.AttributeValue_>=} opt_attributes
|
|
643
|
-
* @param {(!goog.html.SafeHtml.TextOrHtml_|
|
|
644
|
-
* !Array<!goog.html.SafeHtml.TextOrHtml_>)=} opt_content
|
|
645
|
-
* @return {!goog.html.SafeHtml}
|
|
646
|
-
* @throws {Error} If invalid or unsafe attribute name or value is provided.
|
|
647
|
-
* @throws {goog.asserts.AssertionError} If content for void tag is provided.
|
|
648
|
-
* @package
|
|
649
|
-
*/
|
|
650
|
-
goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse =
|
|
651
|
-
function(tagName, opt_attributes, opt_content) {
|
|
652
|
-
var dir = null;
|
|
653
|
-
var result = '<' + tagName;
|
|
654
|
-
|
|
655
|
-
if (opt_attributes) {
|
|
656
|
-
for (var name in opt_attributes) {
|
|
657
|
-
if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(name)) {
|
|
658
|
-
throw Error('Invalid attribute name "' + name + '".');
|
|
659
|
-
}
|
|
660
|
-
var value = opt_attributes[name];
|
|
661
|
-
if (!goog.isDefAndNotNull(value)) {
|
|
662
|
-
continue;
|
|
663
|
-
}
|
|
664
|
-
result += ' ' +
|
|
665
|
-
goog.html.SafeHtml.getAttrNameAndValue_(tagName, name, value);
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
var content = opt_content;
|
|
670
|
-
if (!goog.isDefAndNotNull(content)) {
|
|
671
|
-
content = [];
|
|
672
|
-
} else if (!goog.isArray(content)) {
|
|
673
|
-
content = [content];
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
if (goog.dom.tags.isVoidTag(tagName.toLowerCase())) {
|
|
677
|
-
goog.asserts.assert(!content.length,
|
|
678
|
-
'Void tag <' + tagName + '> does not allow content.');
|
|
679
|
-
result += '>';
|
|
680
|
-
} else {
|
|
681
|
-
var html = goog.html.SafeHtml.concat(content);
|
|
682
|
-
result += '>' + goog.html.SafeHtml.unwrap(html) + '</' + tagName + '>';
|
|
683
|
-
dir = html.getDirection();
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
var dirAttribute = opt_attributes && opt_attributes['dir'];
|
|
687
|
-
if (dirAttribute) {
|
|
688
|
-
if (/^(ltr|rtl|auto)$/i.test(dirAttribute)) {
|
|
689
|
-
// If the tag has the "dir" attribute specified then its direction is
|
|
690
|
-
// neutral because it can be safely used in any context.
|
|
691
|
-
dir = goog.i18n.bidi.Dir.NEUTRAL;
|
|
692
|
-
} else {
|
|
693
|
-
dir = null;
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
698
|
-
result, dir);
|
|
699
|
-
};
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
/**
|
|
703
|
-
* @param {!Object<string, string>} fixedAttributes
|
|
704
|
-
* @param {!Object<string, string>} defaultAttributes
|
|
705
|
-
* @param {!Object<string, goog.html.SafeHtml.AttributeValue_>=}
|
|
706
|
-
* opt_attributes Optional attributes passed to create*().
|
|
707
|
-
* @return {!Object<string, goog.html.SafeHtml.AttributeValue_>}
|
|
708
|
-
* @throws {Error} If opt_attributes contains an attribute with the same name
|
|
709
|
-
* as an attribute in fixedAttributes.
|
|
710
|
-
* @package
|
|
711
|
-
*/
|
|
712
|
-
goog.html.SafeHtml.combineAttributes = function(
|
|
713
|
-
fixedAttributes, defaultAttributes, opt_attributes) {
|
|
714
|
-
var combinedAttributes = {};
|
|
715
|
-
var name;
|
|
716
|
-
|
|
717
|
-
for (name in fixedAttributes) {
|
|
718
|
-
goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');
|
|
719
|
-
combinedAttributes[name] = fixedAttributes[name];
|
|
720
|
-
}
|
|
721
|
-
for (name in defaultAttributes) {
|
|
722
|
-
goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');
|
|
723
|
-
combinedAttributes[name] = defaultAttributes[name];
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
for (name in opt_attributes) {
|
|
727
|
-
var nameLower = name.toLowerCase();
|
|
728
|
-
if (nameLower in fixedAttributes) {
|
|
729
|
-
throw Error('Cannot override "' + nameLower + '" attribute, got "' +
|
|
730
|
-
name + '" with value "' + opt_attributes[name] + '"');
|
|
731
|
-
}
|
|
732
|
-
if (nameLower in defaultAttributes) {
|
|
733
|
-
delete combinedAttributes[nameLower];
|
|
734
|
-
}
|
|
735
|
-
combinedAttributes[name] = opt_attributes[name];
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
return combinedAttributes;
|
|
739
|
-
};
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
/**
|
|
743
|
-
* A SafeHtml instance corresponding to the HTML doctype: "<!DOCTYPE html>".
|
|
744
|
-
* @const {!goog.html.SafeHtml}
|
|
745
|
-
*/
|
|
746
|
-
goog.html.SafeHtml.DOCTYPE_HTML =
|
|
747
|
-
goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
748
|
-
'<!DOCTYPE html>', goog.i18n.bidi.Dir.NEUTRAL);
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
/**
|
|
752
|
-
* A SafeHtml instance corresponding to the empty string.
|
|
753
|
-
* @const {!goog.html.SafeHtml}
|
|
754
|
-
*/
|
|
755
|
-
goog.html.SafeHtml.EMPTY =
|
|
756
|
-
goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(
|
|
757
|
-
'', goog.i18n.bidi.Dir.NEUTRAL);
|