aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock126
-rw-r--r--Cargo.toml6
-rw-r--r--components/canvas/Cargo.toml13
-rw-r--r--components/canvas/backend.rs243
-rw-r--r--components/canvas/canvas_data.rs506
-rw-r--r--components/canvas/canvas_paint_thread.rs359
-rw-r--r--components/canvas/lib.rs8
-rw-r--r--components/canvas/raqote_backend.rs532
-rw-r--r--components/constellation/constellation.rs524
-rw-r--r--components/constellation/pipeline.rs5
-rw-r--r--components/constellation/tracing.rs5
-rw-r--r--components/devtools/actors/inspector/node.rs15
-rw-r--r--components/layout/dom.rs12
-rw-r--r--components/layout/flexbox/layout.rs9
-rw-r--r--components/layout/flow/float.rs3
-rw-r--r--components/layout/flow/inline/line.rs3
-rw-r--r--components/layout/flow/inline/mod.rs3
-rw-r--r--components/layout/flow/mod.rs4
-rw-r--r--components/layout/positioned.rs36
-rw-r--r--components/layout/replaced.rs35
-rw-r--r--components/layout/style_ext.rs6
-rw-r--r--components/layout/table/construct.rs27
-rw-r--r--components/layout/table/layout.rs6
-rw-r--r--components/layout/taffy/layout.rs5
-rw-r--r--components/net/async_runtime.rs40
-rw-r--r--components/net/connector.rs2
-rw-r--r--components/net/http_loader.rs4
-rw-r--r--components/net/resource_thread.rs2
-rw-r--r--components/net/websocket_loader.rs33
-rw-r--r--components/script/canvas_context.rs188
-rw-r--r--components/script/canvas_state.rs13
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs8
-rw-r--r--components/script/dom/dissimilaroriginwindow.rs7
-rw-r--r--components/script/dom/document.rs445
-rw-r--r--components/script/dom/element.rs40
-rw-r--r--components/script/dom/globalscope.rs199
-rw-r--r--components/script/dom/gpucanvascontext.rs3
-rw-r--r--components/script/dom/htmlcanvaselement.rs101
-rw-r--r--components/script/dom/htmldetailselement.rs4
-rw-r--r--components/script/dom/htmlelement.rs9
-rw-r--r--components/script/dom/htmlformelement.rs10
-rw-r--r--components/script/dom/htmltablecellelement.rs35
-rw-r--r--components/script/dom/htmltablecolelement.rs17
-rw-r--r--components/script/dom/macros.rs43
-rw-r--r--components/script/dom/messageport.rs38
-rw-r--r--components/script/dom/node.rs107
-rw-r--r--components/script/dom/nodelist.rs1
-rw-r--r--components/script/dom/offscreencanvas.rs58
-rw-r--r--components/script/dom/offscreencanvasrenderingcontext2d.rs29
-rw-r--r--components/script/dom/readablestream.rs8
-rw-r--r--components/script/dom/shadowroot.rs9
-rw-r--r--components/script/dom/underlyingsourcecontainer.rs2
-rw-r--r--components/script/dom/webgl2renderingcontext.rs4
-rw-r--r--components/script/dom/webglrenderingcontext.rs8
-rw-r--r--components/script/dom/webgpu/gpucanvascontext.rs9
-rw-r--r--components/script/dom/window.rs34
-rw-r--r--components/script/dom/windowproxy.rs17
-rw-r--r--components/script/dom/writablestream.rs4
-rw-r--r--components/script/dom/writablestreamdefaultcontroller.rs10
-rw-r--r--components/script/messaging.rs2
-rw-r--r--components/script/script_module.rs5
-rw-r--r--components/script/script_thread.rs81
-rw-r--r--components/script_bindings/codegen/Bindings.conf4
-rw-r--r--components/script_bindings/webidls/MessagePort.webidl1
-rw-r--r--components/script_bindings/webidls/ShadowRoot.webidl2
-rw-r--r--components/script_bindings/webidls/Window.webidl4
-rw-r--r--components/servo/Cargo.toml7
-rw-r--r--components/servo/lib.rs10
-rw-r--r--components/shared/constellation/from_script_message.rs36
-rw-r--r--components/shared/constellation/lib.rs19
-rw-r--r--components/shared/constellation/structured_data/transferable.rs7
-rw-r--r--components/shared/devtools/lib.rs9
-rw-r--r--components/shared/embedder/lib.rs75
-rw-r--r--components/shared/script/lib.rs14
-rw-r--r--components/shared/script_layout/lib.rs10
-rw-r--r--components/webdriver_server/actions.rs7
-rw-r--r--components/webdriver_server/capabilities.rs14
-rw-r--r--components/webdriver_server/lib.rs88
-rw-r--r--components/webgl/Cargo.toml36
-rw-r--r--components/webgl/lib.rs13
-rw-r--r--components/webgl/webgl_limits.rs (renamed from components/canvas/webgl_limits.rs)0
-rw-r--r--components/webgl/webgl_mode/inprocess.rs (renamed from components/canvas/webgl_mode/inprocess.rs)0
-rw-r--r--components/webgl/webgl_mode/mod.rs (renamed from components/canvas/webgl_mode/mod.rs)0
-rw-r--r--components/webgl/webgl_thread.rs (renamed from components/canvas/webgl_thread.rs)0
-rw-r--r--components/webgl/webxr.rs (renamed from components/canvas/webxr.rs)0
-rw-r--r--ports/servoshell/Cargo.toml2
-rw-r--r--python/servo/testing_commands.py6
-rw-r--r--python/wpt/run.py8
-rw-r--r--tests/wpt/include.ini22
-rw-r--r--tests/wpt/meta/MANIFEST.json1653
-rw-r--r--tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini8
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini2
-rw-r--r--tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini2
-rw-r--r--tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini18
-rw-r--r--tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini18
-rw-r--r--tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini3
-rw-r--r--tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini3
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini2
-rw-r--r--tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini3
-rw-r--r--tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini2
-rw-r--r--tests/wpt/meta/css/css-will-change/will-change-fixedpos-cb-003.html.ini2
-rw-r--r--tests/wpt/meta/css/filter-effects/filtered-html-is-not-container.html.ini2
-rw-r--r--tests/wpt/meta/dom/nodes/insertion-removing-steps/blur-event.window.js.ini2
-rw-r--r--tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini3
-rw-r--r--tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini6
-rw-r--r--tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html.ini3
-rw-r--r--tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe.html.ini3
-rw-r--r--tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini3
-rw-r--r--tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe.html.ini3
-rw-r--r--tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini3
-rw-r--r--tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini3
-rw-r--r--tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini3
-rw-r--r--tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini3
-rw-r--r--tests/wpt/meta/focus/iframe-focuses-parent-same-site.html.ini2
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini3
-rw-r--r--tests/wpt/meta/html/browsers/the-window-object/focus.window.js.ini3
-rw-r--r--tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini6
-rw-r--r--tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini5
-rw-r--r--tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini2
-rw-r--r--tests/wpt/meta/html/dom/idlharness.any.js.ini3
-rw-r--r--tests/wpt/meta/html/dom/idlharness.https.html.ini21
-rw-r--r--tests/wpt/meta/html/dom/reflection-tabular.html.ini36
-rw-r--r--tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini1
-rw-r--r--tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini9
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini2
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini3
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini15
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini17
-rw-r--r--tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini30
-rw-r--r--tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini3
-rw-r--r--tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini3
-rw-r--r--tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini6
-rw-r--r--tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini6
-rw-r--r--tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini6
-rw-r--r--tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini4896
-rw-r--r--tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini6
-rw-r--r--tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini3
-rw-r--r--tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/accept_alert/accept.py.ini27
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/add_cookie/add.py.ini42
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/add_cookie/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/back/back.py.ini19
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/back/user_prompts.py.ini73
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/close_window/close.py.ini19
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/close_window/user_prompts.py.ini73
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/delete.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/delete_cookie/delete.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/delete_cookie/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini7
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/dismiss_alert/dismiss.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_clear/clear.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_clear/disabled.py.ini115
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_clear/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/bubbling.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/center_point.py.ini33
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/events.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini33
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini49
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/scroll_into_view.py.ini30
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_click/user_prompts.py.ini73
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/content_editable.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/events.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/file_upload.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/form_controls.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/scroll_into_view.py.ini27
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_async_script/arguments.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_async_script/execute_async.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_async_script/node.py.ini33
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_async_script/user_prompts.py.ini73
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_async_script/window.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/arguments.py.ini88
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/execute.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/node.py.ini33
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/promise.py.ini27
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/user_prompts.py.ini73
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/execute_script/window.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_element/find.py.ini34
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_element/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini52
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_element_from_element/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/find.py.ini157
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_elements/find.py.ini76
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_elements/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/find.py.ini82
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/find.py.ini157
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini34
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/forward/user_prompts.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/fullscreen_window/from_minimized_window.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/fullscreen_window/fullscreen.py.ini18
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/fullscreen_window/stress.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/fullscreen_window/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_active_element/get.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_active_element/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_alert_text/get.py.ini22
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_computed_label/get.py.ini42
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_computed_label/user_prompts.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_computed_role/user_prompts.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_current_url/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini94
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_attribute/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_css_value/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini94
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_property/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_rect/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini33
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini42
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_named_cookie/get.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_named_cookie/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_page_source/source.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_page_source/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_title/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_window_handle/get.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_window_handle/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_window_handles/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_window_rect/get.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/get_window_rect/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/idlharness.window.js.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/interface/interface.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/is_element_enabled/user_prompts.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/is_element_selected/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/maximize_window/from_minimized_window.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/maximize_window/maximize.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/maximize_window/stress.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/maximize_window/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/minimize_window/minimize.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/minimize_window/stress.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/minimize_window/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/navigate_to/navigate.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/navigate_to/user_prompts.py.ini73
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_session/create_alwaysMatch.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_session/create_firstMatch.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_session/response.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_session/unhandled_prompt_behavior.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_session/websocket_url.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/new_window/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/invalid.py.ini91
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini24
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/key_events.py.ini273
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/key_modifiers.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/key_shortcuts.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/key_special_keys.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/key_tentative.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/none.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/perform.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_contextmenu.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_dblclick.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse.py.ini64
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini63
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini27
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pen.py.ini33
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_touch.py.ini42
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_tripleclick.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/sequence.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/user_prompts.py.ini58
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/perform_actions/wheel.py.ini39
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/permissions/set.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/print/background.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/print/orientation.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/print/printcmd.py.ini57
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/print/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/refresh/refresh.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/refresh/user_prompts.py.ini73
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/release_actions/release.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/release_actions/sequence.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/release_actions/sequence_tentative.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/send_alert_text/send.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/set_timeouts/set.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/set_timeouts/user_prompts.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/set_window_rect/from_minimized_window.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini39
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/set_window_rect/user_prompts.py.ini2
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini21
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_number.py.ini15
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_webelement.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/switch_to_parent_frame/switch.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/switch_to_window/alerts.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/switch_to_window/switch.py.ini12
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/iframe.py.ini9
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/screenshot.py.ini30
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/take_screenshot/iframe.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini6
-rw-r--r--tests/wpt/meta/webdriver/tests/classic/take_screenshot/user_prompts.py.ini55
-rw-r--r--tests/wpt/meta/webdriver/tests/interop/beforeunload_prompt.py.ini60
-rw-r--r--tests/wpt/meta/webdriver/tests/interop/frames.py.ini3
-rw-r--r--tests/wpt/meta/webdriver/tests/interop/shared_id_node.py.ini18
-rw-r--r--tests/wpt/meta/webdriver/tests/interop/shared_id_window.py.ini15
-rw-r--r--tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini3
-rw-r--r--tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini7
-rw-r--r--tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini19
-rw-r--r--tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini19
-rw-r--r--tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini3
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json16
-rw-r--r--tests/wpt/mozilla/tests/mozilla/FocusEvent.html7
-rw-r--r--tests/wpt/mozilla/tests/mozilla/focus_inter_documents.html207
-rw-r--r--tests/wpt/mozilla/tests/mozilla/form_reset-crash.html7
-rw-r--r--tests/wpt/tests/.github/workflows/docker.yml2
-rw-r--r--tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html13
-rw-r--r--tests/wpt/tests/ai/language_detection/detector-iframe.https.html3
-rw-r--r--tests/wpt/tests/ai/language_detection/detector-locale.https.window.js15
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.https.window.js49
-rw-r--r--tests/wpt/tests/ai/language_detection/detector.optional.https.window.js7
-rw-r--r--tests/wpt/tests/ai/language_detection/resources/util.js4
-rw-r--r--tests/wpt/tests/audio-output/setSinkId.https.html6
-rw-r--r--tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py18
-rw-r--r--tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py18
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js19
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js15
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js16
-rw-r--r--tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js43
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html30
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html39
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html32
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html41
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html59
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html110
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html67
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html118
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html21
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html29
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html48
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html64
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html48
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html71
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html103
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html110
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html30
-rw-r--r--tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html29
-rw-r--r--tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html30
-rw-r--r--tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html29
-rw-r--r--tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html17
-rw-r--r--tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html9
-rw-r--r--tests/wpt/tests/css/css-box/parsing/margin-trim.html14
-rw-r--r--tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html1
-rw-r--r--tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html1
-rw-r--r--tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html14
-rw-r--r--tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html1
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html49
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html45
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html96
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html59
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html59
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html35
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html78
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html46
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html64
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html64
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html52
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html39
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html133
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html44
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html115
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html116
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html135
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html115
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html63
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html104
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html60
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html41
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html28
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html62
-rw-r--r--tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html47
-rw-r--r--tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html13
-rw-r--r--tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html13
-rw-r--r--tests/wpt/tests/css/css-overflow/scroll-button-display-none.html54
-rw-r--r--tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html4
-rw-r--r--tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html31
-rw-r--r--tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html14
-rw-r--r--tests/wpt/tests/css/css-tables/colspan-zero-crash.html10
-rw-r--r--tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html128
-rw-r--r--tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html106
-rw-r--r--tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html187
-rw-r--r--tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html14
-rw-r--r--tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html19
-rw-r--r--tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html36
-rw-r--r--tests/wpt/tests/editing/include/editor-test-utils.js3
-rw-r--r--tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html13
-rw-r--r--tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js281
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js10
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/record-click.py21
-rw-r--r--tests/wpt/tests/fledge/tentative/resources/record-view.py19
-rw-r--r--tests/wpt/tests/focus/focus-element-crash.html33
-rw-r--r--tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml5
-rw-r--r--tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md9
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html19
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html62
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html71
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html19
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html65
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js144
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html94
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html91
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html90
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html91
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html57
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html37
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html44
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html44
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html44
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers1
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html62
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html55
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html55
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html43
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers2
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html43
-rw-r--r--tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers2
-rw-r--r--tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml3
-rw-r--r--tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html4
-rw-r--r--tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html10
-rw-r--r--tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-hit-test-during-load-event-crash.html9
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html49
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html55
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html192
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html129
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css14
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js13
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html16
-rw-r--r--tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html39
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html10
-rw-r--r--tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html57
-rw-r--r--tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html55
-rw-r--r--tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html41
-rw-r--r--tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html12
-rw-r--r--tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml4
-rw-r--r--tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini3
-rw-r--r--tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html71
-rw-r--r--tests/wpt/tests/interfaces/fedcm.idl6
-rw-r--r--tests/wpt/tests/interfaces/image-capture.idl2
-rw-r--r--tests/wpt/tests/interfaces/mediastream-recording.idl2
-rw-r--r--tests/wpt/tests/interfaces/turtledove.idl7
-rw-r--r--tests/wpt/tests/interfaces/webcodecs.idl2
-rw-r--r--tests/wpt/tests/interfaces/webcrypto.idl (renamed from tests/wpt/tests/interfaces/WebCryptoAPI.idl)0
-rw-r--r--tests/wpt/tests/interfaces/webgpu.idl1
-rw-r--r--tests/wpt/tests/interfaces/webnn.idl6
-rw-r--r--tests/wpt/tests/interfaces/webxr-depth-sensing.idl7
-rw-r--r--tests/wpt/tests/interfaces/webxr.idl9
-rw-r--r--tests/wpt/tests/interfaces/writing-assistance-apis.idl193
-rw-r--r--tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html4
-rw-r--r--tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html105
-rw-r--r--tests/wpt/tests/resources/chromium/webxr-test.js56
-rw-r--r--tests/wpt/tests/resources/testdriver.js55
-rw-r--r--tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html2
-rw-r--r--tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html2
-rw-r--r--tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html2
-rw-r--r--tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html8
-rw-r--r--tests/wpt/tests/shadow-dom/reference-target/tentative/form.html112
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html35
-rw-r--r--tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html66
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html (renamed from tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html)8
-rw-r--r--tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html (renamed from tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html)44
-rw-r--r--tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js68
-rw-r--r--tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html27
-rw-r--r--tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html33
-rw-r--r--tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html39
-rw-r--r--tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html33
-rw-r--r--tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html27
-rw-r--r--tests/wpt/tests/svg/styling/cx-sibling-index-crash.html5
-rw-r--r--tests/wpt/tests/tools/ci/requirements_tc.txt2
-rw-r--r--tests/wpt/tests/tools/requirements_tests.txt2
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py29
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py15
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py12
-rw-r--r--tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js11
-rw-r--r--tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html16
-rw-r--r--tests/wpt/tests/viewport/viewport-segments.html5
-rw-r--r--tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html8
-rw-r--r--tests/wpt/tests/web-animations/resources/keyframe-tests.js5
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py2
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py2
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py74
-rw-r--r--tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py2
-rw-r--r--tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js10
-rw-r--r--tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js38
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/abs.https.any.js63
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/concat.https.any.js46
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/neg.https.any.js63
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js366
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/relu.https.any.js56
-rw-r--r--tests/wpt/tests/webnn/conformance_tests/sub.https.any.js213
-rw-r--r--tests/wpt/tests/webnn/resources/utils.js22
-rw-r--r--tests/wpt/tests/webrtc-stats/supported-stats.https.html1
-rw-r--r--tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html24
-rw-r--r--tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html37
-rw-r--r--tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html61
-rw-r--r--tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html61
-rw-r--r--tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js31
-rw-r--r--tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini3
571 files changed, 17282 insertions, 9003 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 791ee0bb967..2f8ab0361fa 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -713,9 +713,9 @@ checksum = "28346c117b50270785fbc123bd6e4ecad20d0c6d5f43d081dc80a3abcc62be64"
[[package]]
name = "bytemuck"
-version = "1.22.0"
+version = "1.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
+checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c"
dependencies = [
"bytemuck_derive",
]
@@ -784,18 +784,13 @@ name = "canvas"
version = "0.0.1"
dependencies = [
"app_units",
- "bitflags 2.9.0",
- "byteorder",
"canvas_traits",
"compositing_traits",
"crossbeam-channel",
"cssparser",
"euclid",
- "fnv",
"font-kit",
"fonts",
- "glow",
- "half",
"ipc-channel",
"log",
"lyon_geom",
@@ -807,12 +802,8 @@ dependencies = [
"servo_arc",
"snapshot",
"stylo",
- "surfman",
"unicode-script",
- "webrender",
"webrender_api",
- "webxr",
- "webxr-api",
]
[[package]]
@@ -1074,7 +1065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [
"lazy_static",
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -3103,9 +3094,9 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.15.2"
+version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
dependencies = [
"foldhash",
"serde",
@@ -3430,7 +3421,7 @@ dependencies = [
"js-sys",
"log",
"wasm-bindgen",
- "windows-core 0.57.0",
+ "windows-core 0.58.0",
]
[[package]]
@@ -4334,6 +4325,7 @@ dependencies = [
"tracing",
"url",
"webdriver_server",
+ "webgl",
"webgpu",
"webrender",
"webrender_api",
@@ -5475,7 +5467,7 @@ dependencies = [
[[package]]
name = "peek-poke"
version = "0.3.0"
-source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71"
+source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074"
dependencies = [
"euclid",
"peek-poke-derive",
@@ -5484,13 +5476,12 @@ dependencies = [
[[package]]
name = "peek-poke-derive"
version = "0.3.0"
-source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71"
+source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074"
dependencies = [
"proc-macro2",
"quote",
"syn",
"synstructure",
- "unicode-xid",
]
[[package]]
@@ -6090,14 +6081,15 @@ dependencies = [
[[package]]
name = "ron"
-version = "0.8.1"
+version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
+checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f"
dependencies = [
- "base64 0.21.7",
+ "base64 0.22.1",
"bitflags 2.9.0",
"serde",
"serde_derive",
+ "unicode-ident",
]
[[package]]
@@ -6934,9 +6926,9 @@ dependencies = [
[[package]]
name = "sha2"
-version = "0.10.8"
+version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -7420,9 +7412,9 @@ dependencies = [
[[package]]
name = "synstructure"
-version = "0.13.1"
+version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
@@ -7834,9 +7826,9 @@ dependencies = [
[[package]]
name = "toml_edit"
-version = "0.22.25"
+version = "0.22.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485"
+checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
dependencies = [
"indexmap",
"serde",
@@ -8052,12 +8044,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
-
-[[package]]
name = "universal-hash"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8287,9 +8273,9 @@ checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49"
[[package]]
name = "wayland-backend"
-version = "0.3.9"
+version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2bea670be0e24795f39416e5461ccef0185b47df2749ed2b226b8a7557ac871"
+checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121"
dependencies = [
"cc",
"downcast-rs",
@@ -8301,9 +8287,9 @@ dependencies = [
[[package]]
name = "wayland-client"
-version = "0.31.8"
+version = "0.31.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f"
+checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61"
dependencies = [
"bitflags 2.9.0",
"rustix",
@@ -8324,9 +8310,9 @@ dependencies = [
[[package]]
name = "wayland-cursor"
-version = "0.31.8"
+version = "0.31.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d"
+checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182"
dependencies = [
"rustix",
"wayland-client",
@@ -8335,9 +8321,9 @@ dependencies = [
[[package]]
name = "wayland-protocols"
-version = "0.32.6"
+version = "0.32.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc"
+checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@@ -8347,9 +8333,9 @@ dependencies = [
[[package]]
name = "wayland-protocols-plasma"
-version = "0.3.6"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3"
+checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@@ -8360,9 +8346,9 @@ dependencies = [
[[package]]
name = "wayland-protocols-wlr"
-version = "0.3.6"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2"
+checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf"
dependencies = [
"bitflags 2.9.0",
"wayland-backend",
@@ -8490,6 +8476,30 @@ dependencies = [
]
[[package]]
+name = "webgl"
+version = "0.0.1"
+dependencies = [
+ "bitflags 2.9.0",
+ "byteorder",
+ "canvas_traits",
+ "compositing_traits",
+ "crossbeam-channel",
+ "euclid",
+ "fnv",
+ "glow",
+ "half",
+ "ipc-channel",
+ "log",
+ "pixels",
+ "snapshot",
+ "surfman",
+ "webrender",
+ "webrender_api",
+ "webxr",
+ "webxr-api",
+]
+
+[[package]]
name = "webgpu"
version = "0.0.1"
dependencies = [
@@ -8527,9 +8537,9 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "0.26.9"
+version = "0.26.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b"
+checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93"
dependencies = [
"rustls-pki-types",
]
@@ -8537,7 +8547,7 @@ dependencies = [
[[package]]
name = "webrender"
version = "0.66.0"
-source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71"
+source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074"
dependencies = [
"allocator-api2",
"bincode",
@@ -8572,7 +8582,7 @@ dependencies = [
[[package]]
name = "webrender_api"
version = "0.66.0"
-source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71"
+source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074"
dependencies = [
"app_units",
"bitflags 2.9.0",
@@ -8593,7 +8603,7 @@ dependencies = [
[[package]]
name = "webrender_build"
version = "0.0.2"
-source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71"
+source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074"
dependencies = [
"bitflags 2.9.0",
"lazy_static",
@@ -8785,7 +8795,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -9133,9 +9143,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winit"
-version = "0.30.9"
+version = "0.30.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0"
+checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e"
dependencies = [
"ahash",
"android-activity",
@@ -9185,9 +9195,9 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.7.7"
+version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5"
+checksum = "9e27d6ad3dac991091e4d35de9ba2d2d00647c5d0fc26c5496dee55984ae111b"
dependencies = [
"memchr",
]
@@ -9213,7 +9223,7 @@ dependencies = [
[[package]]
name = "wr_glyph_rasterizer"
version = "0.1.0"
-source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71"
+source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074"
dependencies = [
"core-foundation 0.9.4",
"core-graphics",
@@ -9237,8 +9247,8 @@ dependencies = [
[[package]]
name = "wr_malloc_size_of"
-version = "0.0.3"
-source = "git+https://github.com/servo/webrender?branch=0.66#88462530746749163bcf1dc89be20a19f2394e71"
+version = "0.2.0"
+source = "git+https://github.com/servo/webrender?branch=0.67#ae2477d9a6da403e5b5dce8a17415a2cd1563074"
dependencies = [
"app_units",
"euclid",
diff --git a/Cargo.toml b/Cargo.toml
index 21bc94bcfda..b43c38b21b9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -166,15 +166,15 @@ uuid = { version = "1.12.1", features = ["v4"] }
webdriver = "0.51.0"
webgpu_traits = { path = "components/shared/webgpu" }
webpki-roots = "0.26"
-webrender = { git = "https://github.com/servo/webrender", branch = "0.66", features = ["capture"] }
-webrender_api = { git = "https://github.com/servo/webrender", branch = "0.66" }
+webrender = { git = "https://github.com/servo/webrender", branch = "0.67", features = ["capture"] }
+webrender_api = { git = "https://github.com/servo/webrender", branch = "0.67" }
webxr-api = { path = "components/shared/webxr" }
wgpu-core = "25"
wgpu-types = "25"
winapi = "0.3"
windows-sys = "0.59"
wio = "0.2"
-wr_malloc_size_of = { git = "https://github.com/servo/webrender", branch = "0.66" }
+wr_malloc_size_of = { git = "https://github.com/servo/webrender", branch = "0.67" }
xi-unicode = "0.3.0"
xml5ever = "0.22"
diff --git a/components/canvas/Cargo.toml b/components/canvas/Cargo.toml
index 7e7b00efe11..6084fc6e434 100644
--- a/components/canvas/Cargo.toml
+++ b/components/canvas/Cargo.toml
@@ -11,24 +11,15 @@ rust-version.workspace = true
name = "canvas"
path = "lib.rs"
-[features]
-webgl_backtrace = ["canvas_traits/webgl_backtrace"]
-webxr = ["dep:webxr", "dep:webxr-api"]
-
[dependencies]
app_units = { workspace = true }
-bitflags = { workspace = true }
-byteorder = { workspace = true }
canvas_traits = { workspace = true }
compositing_traits = { workspace = true }
crossbeam-channel = { workspace = true }
cssparser = { workspace = true }
euclid = { workspace = true }
-fnv = { workspace = true }
font-kit = "0.14"
fonts = { path = "../fonts" }
-glow = { workspace = true }
-half = "2"
ipc-channel = { workspace = true }
log = { workspace = true }
lyon_geom = "1.0.4"
@@ -40,9 +31,5 @@ raqote = "0.8.5"
servo_arc = { workspace = true }
snapshot = { workspace = true }
stylo = { workspace = true }
-surfman = { workspace = true }
unicode-script = { workspace = true }
-webrender = { workspace = true }
webrender_api = { workspace = true }
-webxr = { path = "../webxr", features = ["ipc"], optional = true }
-webxr-api = { workspace = true, features = ["ipc"], optional = true }
diff --git a/components/canvas/backend.rs b/components/canvas/backend.rs
new file mode 100644
index 00000000000..53acbea8b8d
--- /dev/null
+++ b/components/canvas/backend.rs
@@ -0,0 +1,243 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use canvas_traits::canvas::{
+ CompositionOrBlending, FillOrStrokeStyle, LineCapStyle, LineJoinStyle,
+};
+use euclid::Angle;
+use euclid::default::{Point2D, Rect, Size2D, Transform2D, Vector2D};
+use lyon_geom::Arc;
+use style::color::AbsoluteColor;
+
+use crate::canvas_data::{CanvasPaintState, Filter, TextRun};
+
+pub(crate) trait Backend: Clone + Sized {
+ type Pattern<'a>: PatternHelpers + Clone;
+ type StrokeOptions: StrokeOptionsHelpers + Clone;
+ type Color: Clone;
+ type DrawOptions: DrawOptionsHelpers + Clone;
+ type CompositionOp;
+ type DrawTarget: GenericDrawTarget<Self>;
+ type PathBuilder: GenericPathBuilder<Self>;
+ type SourceSurface;
+ type Bytes<'a>: AsRef<[u8]>;
+ type Path: PathHelpers<Self> + Clone;
+ type GradientStop;
+ type GradientStops;
+
+ fn get_composition_op(&self, opts: &Self::DrawOptions) -> Self::CompositionOp;
+ fn need_to_draw_shadow(&self, color: &Self::Color) -> bool;
+ fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_, Self>);
+ fn set_fill_style(
+ &mut self,
+ style: FillOrStrokeStyle,
+ state: &mut CanvasPaintState<'_, Self>,
+ drawtarget: &Self::DrawTarget,
+ );
+ fn set_stroke_style(
+ &mut self,
+ style: FillOrStrokeStyle,
+ state: &mut CanvasPaintState<'_, Self>,
+ drawtarget: &Self::DrawTarget,
+ );
+ fn set_global_composition(
+ &mut self,
+ op: CompositionOrBlending,
+ state: &mut CanvasPaintState<'_, Self>,
+ );
+ fn create_drawtarget(&self, size: Size2D<u64>) -> Self::DrawTarget;
+ fn new_paint_state<'a>(&self) -> CanvasPaintState<'a, Self>;
+}
+
+// This defines required methods for a DrawTarget (currently only implemented for raqote). The
+// prototypes are derived from the now-removed Azure backend's methods.
+pub(crate) trait GenericDrawTarget<B: Backend> {
+ fn clear_rect(&mut self, rect: &Rect<f32>);
+ fn copy_surface(
+ &mut self,
+ surface: B::SourceSurface,
+ source: Rect<i32>,
+ destination: Point2D<i32>,
+ );
+ fn create_path_builder(&self) -> B::PathBuilder;
+ fn create_similar_draw_target(&self, size: &Size2D<i32>) -> Self;
+ fn create_source_surface_from_data(&self, data: &[u8]) -> Option<B::SourceSurface>;
+ fn draw_surface(
+ &mut self,
+ surface: B::SourceSurface,
+ dest: Rect<f64>,
+ source: Rect<f64>,
+ filter: Filter,
+ draw_options: &B::DrawOptions,
+ );
+ fn draw_surface_with_shadow(
+ &self,
+ surface: B::SourceSurface,
+ dest: &Point2D<f32>,
+ color: &B::Color,
+ offset: &Vector2D<f32>,
+ sigma: f32,
+ operator: B::CompositionOp,
+ );
+ fn fill(&mut self, path: &B::Path, pattern: B::Pattern<'_>, draw_options: &B::DrawOptions);
+ fn fill_text(
+ &mut self,
+ text_runs: Vec<TextRun>,
+ start: Point2D<f32>,
+ pattern: &B::Pattern<'_>,
+ draw_options: &B::DrawOptions,
+ );
+ fn fill_rect(
+ &mut self,
+ rect: &Rect<f32>,
+ pattern: B::Pattern<'_>,
+ draw_options: Option<&B::DrawOptions>,
+ );
+ fn get_size(&self) -> Size2D<i32>;
+ fn get_transform(&self) -> Transform2D<f32>;
+ fn pop_clip(&mut self);
+ fn push_clip(&mut self, path: &B::Path);
+ fn set_transform(&mut self, matrix: &Transform2D<f32>);
+ fn stroke(
+ &mut self,
+ path: &B::Path,
+ pattern: B::Pattern<'_>,
+ stroke_options: &B::StrokeOptions,
+ draw_options: &B::DrawOptions,
+ );
+ fn stroke_line(
+ &mut self,
+ start: Point2D<f32>,
+ end: Point2D<f32>,
+ pattern: B::Pattern<'_>,
+ stroke_options: &B::StrokeOptions,
+ draw_options: &B::DrawOptions,
+ );
+ fn stroke_rect(
+ &mut self,
+ rect: &Rect<f32>,
+ pattern: B::Pattern<'_>,
+ stroke_options: &B::StrokeOptions,
+ draw_options: &B::DrawOptions,
+ );
+ fn surface(&self) -> B::SourceSurface;
+ fn bytes(&'_ self) -> B::Bytes<'_>;
+}
+
+/// A generic PathBuilder that abstracts the interface for azure's and raqote's PathBuilder.
+pub(crate) trait GenericPathBuilder<B: Backend> {
+ fn arc(
+ &mut self,
+ origin: Point2D<f32>,
+ radius: f32,
+ start_angle: f32,
+ end_angle: f32,
+ anticlockwise: bool,
+ );
+ fn bezier_curve_to(
+ &mut self,
+ control_point1: &Point2D<f32>,
+ control_point2: &Point2D<f32>,
+ control_point3: &Point2D<f32>,
+ );
+ fn close(&mut self);
+ #[allow(clippy::too_many_arguments)]
+ fn ellipse(
+ &mut self,
+ origin: Point2D<f32>,
+ radius_x: f32,
+ radius_y: f32,
+ rotation_angle: f32,
+ start_angle: f32,
+ end_angle: f32,
+ anticlockwise: bool,
+ ) {
+ let mut start = Angle::radians(start_angle);
+ let mut end = Angle::radians(end_angle);
+
+ // Wrap angles mod 2 * PI if necessary
+ if !anticlockwise && start > end + Angle::two_pi() ||
+ anticlockwise && end > start + Angle::two_pi()
+ {
+ start = start.positive();
+ end = end.positive();
+ }
+
+ // Calculate the total arc we're going to sweep.
+ let sweep = match anticlockwise {
+ true => {
+ if end - start == Angle::two_pi() {
+ -Angle::two_pi()
+ } else if end > start {
+ -(Angle::two_pi() - (end - start))
+ } else {
+ -(start - end)
+ }
+ },
+ false => {
+ if start - end == Angle::two_pi() {
+ Angle::two_pi()
+ } else if start > end {
+ Angle::two_pi() - (start - end)
+ } else {
+ end - start
+ }
+ },
+ };
+
+ let arc: Arc<f32> = Arc {
+ center: origin,
+ radii: Vector2D::new(radius_x, radius_y),
+ start_angle: start,
+ sweep_angle: sweep,
+ x_rotation: Angle::radians(rotation_angle),
+ };
+
+ self.line_to(arc.from());
+
+ arc.for_each_quadratic_bezier(&mut |q| {
+ self.quadratic_curve_to(&q.ctrl, &q.to);
+ });
+ }
+ fn get_current_point(&mut self) -> Option<Point2D<f32>>;
+ fn line_to(&mut self, point: Point2D<f32>);
+ fn move_to(&mut self, point: Point2D<f32>);
+ fn quadratic_curve_to(&mut self, control_point: &Point2D<f32>, end_point: &Point2D<f32>);
+ fn svg_arc(
+ &mut self,
+ radius_x: f32,
+ radius_y: f32,
+ rotation_angle: f32,
+ large_arc: bool,
+ sweep: bool,
+ end_point: Point2D<f32>,
+ );
+ fn finish(&mut self) -> B::Path;
+}
+
+pub(crate) trait PatternHelpers {
+ fn is_zero_size_gradient(&self) -> bool;
+ fn draw_rect(&self, rect: &Rect<f32>) -> Rect<f32>;
+}
+
+pub(crate) trait StrokeOptionsHelpers {
+ fn set_line_width(&mut self, _val: f32);
+ fn set_miter_limit(&mut self, _val: f32);
+ fn set_line_join(&mut self, val: LineJoinStyle);
+ fn set_line_cap(&mut self, val: LineCapStyle);
+ fn set_line_dash(&mut self, items: Vec<f32>);
+ fn set_line_dash_offset(&mut self, offset: f32);
+}
+
+pub(crate) trait DrawOptionsHelpers {
+ fn set_alpha(&mut self, val: f32);
+}
+
+pub(crate) trait PathHelpers<B: Backend> {
+ fn transformed_copy_to_builder(&self, transform: &Transform2D<f32>) -> B::PathBuilder;
+
+ fn contains_point(&self, x: f64, y: f64, path_transform: &Transform2D<f32>) -> bool;
+
+ fn copy_to_builder(&self) -> B::PathBuilder;
+}
diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs
index 2667b7f6b44..ea30589d0af 100644
--- a/components/canvas/canvas_data.rs
+++ b/components/canvas/canvas_data.rs
@@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+use std::marker::PhantomData;
use std::mem;
use std::sync::Arc;
@@ -16,7 +17,6 @@ use fonts::{
};
use ipc_channel::ipc::{IpcSender, IpcSharedMemory};
use log::warn;
-use num_traits::ToPrimitive;
use range::Range;
use servo_arc::Arc as ServoArc;
use snapshot::Snapshot;
@@ -26,14 +26,17 @@ use unicode_script::Script;
use webrender_api::units::RectExt as RectExt_;
use webrender_api::{ImageDescriptor, ImageDescriptorFlags, ImageFormat, ImageKey};
-use crate::raqote_backend::Repetition;
+use crate::backend::{
+ Backend, DrawOptionsHelpers as _, GenericDrawTarget as _, GenericPathBuilder, PathHelpers,
+ PatternHelpers, StrokeOptionsHelpers as _,
+};
// Asserts on WR texture cache update for zero sized image with raw data.
// https://github.com/servo/webrender/blob/main/webrender/src/texture_cache.rs#L1475
const MIN_WR_IMAGE_SIZE: Size2D<u64> = Size2D::new(1, 1);
-fn to_path(path: &[PathSegment], mut builder: Box<dyn GenericPathBuilder>) -> Path {
- let mut build_ref = PathBuilderRef {
+fn to_path<B: Backend>(path: &[PathSegment], mut builder: B::PathBuilder) -> B::Path {
+ let mut build_ref = PathBuilderRef::<B> {
builder: &mut builder,
transform: Transform2D::identity(),
};
@@ -112,20 +115,20 @@ fn to_path(path: &[PathSegment], mut builder: Box<dyn GenericPathBuilder>) -> Pa
/// draw the path, we convert it back to userspace and draw it
/// with the correct transform applied.
/// TODO: De-abstract now that Azure is removed?
-enum PathState {
+enum PathState<B: Backend> {
/// Path builder in user-space. If a transform has been applied
/// but no further path operations have occurred, it is stored
/// in the optional field.
- UserSpacePathBuilder(Box<dyn GenericPathBuilder>, Option<Transform2D<f32>>),
+ UserSpacePathBuilder(B::PathBuilder, Option<Transform2D<f32>>),
/// Path builder in device-space.
- DeviceSpacePathBuilder(Box<dyn GenericPathBuilder>),
+ DeviceSpacePathBuilder(B::PathBuilder),
/// Path in user-space. If a transform has been applied but
/// but no further path operations have occurred, it is stored
/// in the optional field.
- UserSpacePath(Path, Option<Transform2D<f32>>),
+ UserSpacePath(B::Path, Option<Transform2D<f32>>),
}
-impl PathState {
+impl<B: Backend> PathState<B> {
fn is_path(&self) -> bool {
match *self {
PathState::UserSpacePath(..) => true,
@@ -133,7 +136,7 @@ impl PathState {
}
}
- fn path(&self) -> &Path {
+ fn path(&self) -> &B::Path {
match *self {
PathState::UserSpacePath(ref p, _) => p,
PathState::UserSpacePathBuilder(..) | PathState::DeviceSpacePathBuilder(..) => {
@@ -143,84 +146,14 @@ impl PathState {
}
}
-pub trait Backend {
- fn get_composition_op(&self, opts: &DrawOptions) -> CompositionOp;
- fn need_to_draw_shadow(&self, color: &Color) -> bool;
- fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_>);
- fn set_fill_style(
- &mut self,
- style: FillOrStrokeStyle,
- state: &mut CanvasPaintState<'_>,
- drawtarget: &dyn GenericDrawTarget,
- );
- fn set_stroke_style(
- &mut self,
- style: FillOrStrokeStyle,
- state: &mut CanvasPaintState<'_>,
- drawtarget: &dyn GenericDrawTarget,
- );
- fn set_global_composition(
- &mut self,
- op: CompositionOrBlending,
- state: &mut CanvasPaintState<'_>,
- );
- fn create_drawtarget(&self, size: Size2D<u64>) -> Box<dyn GenericDrawTarget>;
- fn recreate_paint_state<'a>(&self, state: &CanvasPaintState<'a>) -> CanvasPaintState<'a>;
-}
-
-/// A generic PathBuilder that abstracts the interface for azure's and raqote's PathBuilder.
-/// TODO: De-abstract now that Azure is removed?
-pub trait GenericPathBuilder {
- fn arc(
- &mut self,
- origin: Point2D<f32>,
- radius: f32,
- start_angle: f32,
- end_angle: f32,
- anticlockwise: bool,
- );
- fn bezier_curve_to(
- &mut self,
- control_point1: &Point2D<f32>,
- control_point2: &Point2D<f32>,
- control_point3: &Point2D<f32>,
- );
- fn close(&mut self);
- #[allow(clippy::too_many_arguments)]
- fn ellipse(
- &mut self,
- origin: Point2D<f32>,
- radius_x: f32,
- radius_y: f32,
- rotation_angle: f32,
- start_angle: f32,
- end_angle: f32,
- anticlockwise: bool,
- );
- fn get_current_point(&mut self) -> Option<Point2D<f32>>;
- fn line_to(&mut self, point: Point2D<f32>);
- fn move_to(&mut self, point: Point2D<f32>);
- fn quadratic_curve_to(&mut self, control_point: &Point2D<f32>, end_point: &Point2D<f32>);
- fn svg_arc(
- &mut self,
- radius_x: f32,
- radius_y: f32,
- rotation_angle: f32,
- large_arc: bool,
- sweep: bool,
- end_point: Point2D<f32>,
- );
- fn finish(&mut self) -> Path;
-}
-
/// A wrapper around a stored PathBuilder and an optional transformation that should be
/// applied to any points to ensure they are in the matching device space.
-struct PathBuilderRef<'a> {
- builder: &'a mut Box<dyn GenericPathBuilder>,
+struct PathBuilderRef<'a, B: Backend> {
+ builder: &'a mut B::PathBuilder,
transform: Transform2D<f32>,
}
-impl PathBuilderRef<'_> {
+impl<B: Backend> PathBuilderRef<'_, B> {
fn line_to(&mut self, pt: &Point2D<f32>) {
let pt = self.transform.transform_point(*pt);
self.builder.line_to(pt);
@@ -341,7 +274,7 @@ impl PathBuilderRef<'_> {
}
#[allow(clippy::too_many_arguments)]
- pub fn ellipse(
+ pub(crate) fn ellipse(
&mut self,
center: &Point2D<f32>,
radius_x: f32,
@@ -430,9 +363,9 @@ impl UnshapedTextRun<'_> {
}
}
-pub struct TextRun {
- pub font: FontRef,
- pub glyphs: Arc<GlyphStore>,
+pub(crate) struct TextRun {
+ pub(crate) font: FontRef,
+ pub(crate) glyphs: Arc<GlyphStore>,
}
impl TextRun {
@@ -458,149 +391,31 @@ impl TextRun {
}
}
-// This defines required methods for a DrawTarget (currently only implemented for raqote). The
-// prototypes are derived from the now-removed Azure backend's methods.
-pub trait GenericDrawTarget {
- fn clear_rect(&mut self, rect: &Rect<f32>);
- fn copy_surface(
- &mut self,
- surface: SourceSurface,
- source: Rect<i32>,
- destination: Point2D<i32>,
- );
- fn create_gradient_stops(&self, gradient_stops: Vec<GradientStop>) -> GradientStops;
- fn create_path_builder(&self) -> Box<dyn GenericPathBuilder>;
- fn create_similar_draw_target(&self, size: &Size2D<i32>) -> Box<dyn GenericDrawTarget>;
- fn create_source_surface_from_data(&self, data: &[u8]) -> Option<SourceSurface>;
- fn draw_surface(
- &mut self,
- surface: SourceSurface,
- dest: Rect<f64>,
- source: Rect<f64>,
- filter: Filter,
- draw_options: &DrawOptions,
- );
- fn draw_surface_with_shadow(
- &self,
- surface: SourceSurface,
- dest: &Point2D<f32>,
- color: &Color,
- offset: &Vector2D<f32>,
- sigma: f32,
- operator: CompositionOp,
- );
- fn fill(&mut self, path: &Path, pattern: Pattern, draw_options: &DrawOptions);
- fn fill_text(
- &mut self,
- text_runs: Vec<TextRun>,
- start: Point2D<f32>,
- pattern: &Pattern,
- draw_options: &DrawOptions,
- );
- fn fill_rect(&mut self, rect: &Rect<f32>, pattern: Pattern, draw_options: Option<&DrawOptions>);
- fn get_size(&self) -> Size2D<i32>;
- fn get_transform(&self) -> Transform2D<f32>;
- fn pop_clip(&mut self);
- fn push_clip(&mut self, path: &Path);
- fn set_transform(&mut self, matrix: &Transform2D<f32>);
- fn snapshot(&self) -> SourceSurface;
- fn stroke(
- &mut self,
- path: &Path,
- pattern: Pattern,
- stroke_options: &StrokeOptions,
- draw_options: &DrawOptions,
- );
- fn stroke_line(
- &mut self,
- start: Point2D<f32>,
- end: Point2D<f32>,
- pattern: Pattern,
- stroke_options: &StrokeOptions,
- draw_options: &DrawOptions,
- );
- fn stroke_rect(
- &mut self,
- rect: &Rect<f32>,
- pattern: Pattern,
- stroke_options: &StrokeOptions,
- draw_options: &DrawOptions,
- );
- fn snapshot_data(&self) -> &[u8];
-}
-
-pub enum GradientStop {
- Raqote(raqote::GradientStop),
-}
-
-pub enum GradientStops {
- Raqote(Vec<raqote::GradientStop>),
-}
-
-#[derive(Clone)]
-pub enum Color {
- Raqote(raqote::SolidSource),
-}
-
-#[derive(Clone)]
-pub enum CompositionOp {
- Raqote(raqote::BlendMode),
-}
-
-#[derive(Clone)]
-pub enum SourceSurface {
- Raqote(Vec<u8>), // TODO: See if we can avoid the alloc (probably?)
-}
-
-#[derive(Clone)]
-pub enum Path {
- Raqote(raqote::Path),
-}
-
-#[derive(Clone)]
-pub enum Pattern<'a> {
- Raqote(crate::raqote_backend::Pattern<'a>),
-}
-
-#[derive(Clone)]
-pub enum DrawOptions {
- Raqote(raqote::DrawOptions),
-}
-
-#[derive(Clone)]
-pub enum StrokeOptions {
- Raqote(raqote::StrokeStyle),
-}
-
#[derive(Clone, Copy)]
-pub enum Filter {
+pub(crate) enum Filter {
Bilinear,
Nearest,
}
-pub struct CanvasData<'a> {
- backend: Box<dyn Backend>,
- drawtarget: Box<dyn GenericDrawTarget>,
- path_state: Option<PathState>,
- state: CanvasPaintState<'a>,
- saved_states: Vec<CanvasPaintState<'a>>,
+pub(crate) struct CanvasData<'a, B: Backend> {
+ backend: B,
+ drawtarget: B::DrawTarget,
+ path_state: Option<PathState<B>>,
+ state: CanvasPaintState<'a, B>,
+ saved_states: Vec<CanvasPaintState<'a, B>>,
compositor_api: CrossProcessCompositorApi,
image_key: ImageKey,
font_context: Arc<FontContext>,
}
-fn create_backend() -> Box<dyn Backend> {
- Box::new(crate::raqote_backend::RaqoteBackend)
-}
-
-impl<'a> CanvasData<'a> {
- pub fn new(
+impl<'a, B: Backend> CanvasData<'a, B> {
+ pub(crate) fn new(
size: Size2D<u64>,
compositor_api: CrossProcessCompositorApi,
font_context: Arc<FontContext>,
- ) -> CanvasData<'a> {
+ backend: B,
+ ) -> CanvasData<'a, B> {
let size = size.max(MIN_WR_IMAGE_SIZE);
- let backend = create_backend();
let draw_target = backend.create_drawtarget(size);
let image_key = compositor_api.generate_image_key().unwrap();
let descriptor = ImageDescriptor {
@@ -611,13 +426,13 @@ impl<'a> CanvasData<'a> {
flags: ImageDescriptorFlags::empty(),
};
let data =
- SerializableImageData::Raw(IpcSharedMemory::from_bytes(draw_target.snapshot_data()));
+ SerializableImageData::Raw(IpcSharedMemory::from_bytes(draw_target.bytes().as_ref()));
compositor_api.update_images(vec![ImageUpdate::AddImage(image_key, descriptor, data)]);
CanvasData {
+ state: backend.new_paint_state(),
backend,
drawtarget: draw_target,
path_state: None,
- state: CanvasPaintState::default(),
saved_states: vec![],
compositor_api,
image_key,
@@ -625,11 +440,11 @@ impl<'a> CanvasData<'a> {
}
}
- pub fn image_key(&self) -> ImageKey {
+ pub(crate) fn image_key(&self) -> ImageKey {
self.image_key
}
- pub fn draw_image(
+ pub(crate) fn draw_image(
&mut self,
image_data: &[u8],
image_size: Size2D<u64>,
@@ -648,8 +463,8 @@ impl<'a> CanvasData<'a> {
};
let draw_options = self.state.draw_options.clone();
- let writer = |draw_target: &mut dyn GenericDrawTarget| {
- write_image(
+ let writer = |draw_target: &mut B::DrawTarget| {
+ write_image::<B>(
draw_target,
image_data,
source_rect.size,
@@ -669,15 +484,15 @@ impl<'a> CanvasData<'a> {
// TODO(pylbrecht) pass another closure for raqote
self.draw_with_shadow(&rect, writer);
} else {
- writer(&mut *self.drawtarget);
+ writer(&mut self.drawtarget);
}
}
- pub fn save_context_state(&mut self) {
+ pub(crate) fn save_context_state(&mut self) {
self.saved_states.push(self.state.clone());
}
- pub fn restore_context_state(&mut self) {
+ pub(crate) fn restore_context_state(&mut self) {
if let Some(state) = self.saved_states.pop() {
let _ = mem::replace(&mut self.state, state);
self.drawtarget.set_transform(&self.state.transform);
@@ -685,7 +500,7 @@ impl<'a> CanvasData<'a> {
}
}
- pub fn fill_text_with_size(
+ pub(crate) fn fill_text_with_size(
&mut self,
text: String,
x: f64,
@@ -764,7 +579,7 @@ impl<'a> CanvasData<'a> {
}
/// <https://html.spec.whatwg.org/multipage/#text-preparation-algorithm>
- pub fn fill_text(
+ pub(crate) fn fill_text(
&mut self,
text: String,
x: f64,
@@ -782,7 +597,7 @@ impl<'a> CanvasData<'a> {
/// <https://html.spec.whatwg.org/multipage/#text-preparation-algorithm>
/// <https://html.spec.whatwg.org/multipage/#dom-context-2d-measuretext>
- pub fn measure_text(&mut self, text: String) -> TextMetrics {
+ pub(crate) fn measure_text(&mut self, text: String) -> TextMetrics {
// > Step 2: Replace all ASCII whitespace in text with U+0020 SPACE characters.
let text = replace_ascii_whitespace(text);
let Some(ref font_style) = self.state.font_style else {
@@ -934,49 +749,15 @@ impl<'a> CanvasData<'a> {
point2(x + anchor_x, y + anchor_y)
}
- pub fn fill_rect(&mut self, rect: &Rect<f32>) {
+ pub(crate) fn fill_rect(&mut self, rect: &Rect<f32>) {
if self.state.fill_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
- let draw_rect = match &self.state.fill_style {
- Pattern::Raqote(pattern) => match pattern {
- crate::raqote_backend::Pattern::Surface(pattern) => {
- let pattern_rect = Rect::new(Point2D::origin(), pattern.size());
- let mut draw_rect = rect.intersection(&pattern_rect).unwrap_or(Rect::zero());
-
- match pattern.repetition() {
- Repetition::NoRepeat => {
- draw_rect.size.width =
- draw_rect.size.width.min(pattern_rect.size.width);
- draw_rect.size.height =
- draw_rect.size.height.min(pattern_rect.size.height);
- },
- Repetition::RepeatX => {
- draw_rect.size.width = rect.size.width;
- draw_rect.size.height =
- draw_rect.size.height.min(pattern_rect.size.height);
- },
- Repetition::RepeatY => {
- draw_rect.size.height = rect.size.height;
- draw_rect.size.width =
- draw_rect.size.width.min(pattern_rect.size.width);
- },
- Repetition::Repeat => {
- draw_rect = *rect;
- },
- }
-
- draw_rect
- },
- crate::raqote_backend::Pattern::Color(..) |
- crate::raqote_backend::Pattern::LinearGradient(..) |
- crate::raqote_backend::Pattern::RadialGradient(..) => *rect,
- },
- };
+ let draw_rect = self.state.fill_style.draw_rect(rect);
if self.need_to_draw_shadow() {
- self.draw_with_shadow(&draw_rect, |new_draw_target: &mut dyn GenericDrawTarget| {
+ self.draw_with_shadow(&draw_rect, |new_draw_target: &mut B::DrawTarget| {
new_draw_target.fill_rect(
&draw_rect,
self.state.fill_style.clone(),
@@ -992,17 +773,17 @@ impl<'a> CanvasData<'a> {
}
}
- pub fn clear_rect(&mut self, rect: &Rect<f32>) {
+ pub(crate) fn clear_rect(&mut self, rect: &Rect<f32>) {
self.drawtarget.clear_rect(rect);
}
- pub fn stroke_rect(&mut self, rect: &Rect<f32>) {
+ pub(crate) fn stroke_rect(&mut self, rect: &Rect<f32>) {
if self.state.stroke_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
if self.need_to_draw_shadow() {
- self.draw_with_shadow(rect, |new_draw_target: &mut dyn GenericDrawTarget| {
+ self.draw_with_shadow(rect, |new_draw_target: &mut B::DrawTarget| {
new_draw_target.stroke_rect(
rect,
self.state.stroke_style.clone(),
@@ -1030,12 +811,12 @@ impl<'a> CanvasData<'a> {
}
}
- pub fn begin_path(&mut self) {
+ pub(crate) fn begin_path(&mut self) {
// Erase any traces of previous paths that existed before this.
self.path_state = None;
}
- pub fn close_path(&mut self) {
+ pub(crate) fn close_path(&mut self) {
self.path_builder().close();
}
@@ -1097,14 +878,14 @@ impl<'a> CanvasData<'a> {
assert!(self.path_state.as_ref().unwrap().is_path())
}
- fn path(&self) -> &Path {
+ fn path(&self) -> &B::Path {
self.path_state
.as_ref()
.expect("Should have called ensure_path()")
.path()
}
- pub fn fill(&mut self) {
+ pub(crate) fn fill(&mut self) {
if self.state.fill_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
@@ -1113,16 +894,16 @@ impl<'a> CanvasData<'a> {
self.drawtarget.fill(
&self.path().clone(),
self.state.fill_style.clone(),
- &self.state.draw_options,
+ &self.state.draw_options.clone(),
);
}
- pub fn fill_path(&mut self, path: &[PathSegment]) {
+ pub(crate) fn fill_path(&mut self, path: &[PathSegment]) {
if self.state.fill_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
- let path = to_path(path, self.drawtarget.create_path_builder());
+ let path = to_path::<B>(path, self.drawtarget.create_path_builder());
self.drawtarget.fill(
&path,
@@ -1131,7 +912,7 @@ impl<'a> CanvasData<'a> {
);
}
- pub fn stroke(&mut self) {
+ pub(crate) fn stroke(&mut self) {
if self.state.stroke_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
@@ -1145,12 +926,12 @@ impl<'a> CanvasData<'a> {
);
}
- pub fn stroke_path(&mut self, path: &[PathSegment]) {
+ pub(crate) fn stroke_path(&mut self, path: &[PathSegment]) {
if self.state.stroke_style.is_zero_size_gradient() {
return; // Paint nothing if gradient size is zero.
}
- let path = to_path(path, self.drawtarget.create_path_builder());
+ let path = to_path::<B>(path, self.drawtarget.create_path_builder());
self.drawtarget.stroke(
&path,
@@ -1160,18 +941,18 @@ impl<'a> CanvasData<'a> {
);
}
- pub fn clip(&mut self) {
+ pub(crate) fn clip(&mut self) {
self.ensure_path();
let path = self.path().clone();
self.drawtarget.push_clip(&path);
}
- pub fn clip_path(&mut self, path: &[PathSegment]) {
- let path = to_path(path, self.drawtarget.create_path_builder());
+ pub(crate) fn clip_path(&mut self, path: &[PathSegment]) {
+ let path = to_path::<B>(path, self.drawtarget.create_path_builder());
self.drawtarget.push_clip(&path);
}
- pub fn is_point_in_path(
+ pub(crate) fn is_point_in_path(
&mut self,
x: f64,
y: f64,
@@ -1190,7 +971,7 @@ impl<'a> CanvasData<'a> {
chan.send(result).unwrap();
}
- pub fn is_point_in_path_(
+ pub(crate) fn is_point_in_path_(
&mut self,
path: &[PathSegment],
x: f64,
@@ -1202,7 +983,7 @@ impl<'a> CanvasData<'a> {
Some(PathState::UserSpacePath(_, Some(transform))) => transform,
Some(_) | None => &self.drawtarget.get_transform(),
};
- let result = to_path(path, self.drawtarget.create_path_builder()).contains_point(
+ let result = to_path::<B>(path, self.drawtarget.create_path_builder()).contains_point(
x,
y,
path_transform,
@@ -1210,15 +991,15 @@ impl<'a> CanvasData<'a> {
chan.send(result).unwrap();
}
- pub fn move_to(&mut self, point: &Point2D<f32>) {
+ pub(crate) fn move_to(&mut self, point: &Point2D<f32>) {
self.path_builder().move_to(point);
}
- pub fn line_to(&mut self, point: &Point2D<f32>) {
+ pub(crate) fn line_to(&mut self, point: &Point2D<f32>) {
self.path_builder().line_to(point);
}
- fn path_builder(&mut self) -> PathBuilderRef {
+ fn path_builder(&mut self) -> PathBuilderRef<B> {
if self.path_state.is_none() {
self.path_state = Some(PathState::UserSpacePathBuilder(
self.drawtarget.create_path_builder(),
@@ -1283,18 +1064,18 @@ impl<'a> CanvasData<'a> {
}
}
- pub fn rect(&mut self, rect: &Rect<f32>) {
+ pub(crate) fn rect(&mut self, rect: &Rect<f32>) {
self.path_builder().rect(rect);
}
- pub fn quadratic_curve_to(&mut self, cp: &Point2D<f32>, endpoint: &Point2D<f32>) {
+ pub(crate) fn quadratic_curve_to(&mut self, cp: &Point2D<f32>, endpoint: &Point2D<f32>) {
if self.path_state.is_none() {
self.move_to(cp);
}
self.path_builder().quadratic_curve_to(cp, endpoint);
}
- pub fn bezier_curve_to(
+ pub(crate) fn bezier_curve_to(
&mut self,
cp1: &Point2D<f32>,
cp2: &Point2D<f32>,
@@ -1306,7 +1087,7 @@ impl<'a> CanvasData<'a> {
self.path_builder().bezier_curve_to(cp1, cp2, endpoint);
}
- pub fn arc(
+ pub(crate) fn arc(
&mut self,
center: &Point2D<f32>,
radius: f32,
@@ -1318,12 +1099,12 @@ impl<'a> CanvasData<'a> {
.arc(center, radius, start_angle, end_angle, ccw);
}
- pub fn arc_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, radius: f32) {
+ pub(crate) fn arc_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, radius: f32) {
self.path_builder().arc_to(cp1, cp2, radius);
}
#[allow(clippy::too_many_arguments)]
- pub fn ellipse(
+ pub(crate) fn ellipse(
&mut self,
center: &Point2D<f32>,
radius_x: f32,
@@ -1344,45 +1125,45 @@ impl<'a> CanvasData<'a> {
);
}
- pub fn set_fill_style(&mut self, style: FillOrStrokeStyle) {
+ pub(crate) fn set_fill_style(&mut self, style: FillOrStrokeStyle) {
self.backend
- .set_fill_style(style, &mut self.state, &*self.drawtarget);
+ .set_fill_style(style, &mut self.state, &self.drawtarget);
}
- pub fn set_stroke_style(&mut self, style: FillOrStrokeStyle) {
+ pub(crate) fn set_stroke_style(&mut self, style: FillOrStrokeStyle) {
self.backend
- .set_stroke_style(style, &mut self.state, &*self.drawtarget);
+ .set_stroke_style(style, &mut self.state, &self.drawtarget);
}
- pub fn set_line_width(&mut self, width: f32) {
+ pub(crate) fn set_line_width(&mut self, width: f32) {
self.state.stroke_opts.set_line_width(width);
}
- pub fn set_line_cap(&mut self, cap: LineCapStyle) {
+ pub(crate) fn set_line_cap(&mut self, cap: LineCapStyle) {
self.state.stroke_opts.set_line_cap(cap);
}
- pub fn set_line_join(&mut self, join: LineJoinStyle) {
+ pub(crate) fn set_line_join(&mut self, join: LineJoinStyle) {
self.state.stroke_opts.set_line_join(join);
}
- pub fn set_miter_limit(&mut self, limit: f32) {
+ pub(crate) fn set_miter_limit(&mut self, limit: f32) {
self.state.stroke_opts.set_miter_limit(limit);
}
- pub fn set_line_dash(&mut self, items: Vec<f32>) {
+ pub(crate) fn set_line_dash(&mut self, items: Vec<f32>) {
self.state.stroke_opts.set_line_dash(items);
}
- pub fn set_line_dash_offset(&mut self, offset: f32) {
+ pub(crate) fn set_line_dash_offset(&mut self, offset: f32) {
self.state.stroke_opts.set_line_dash_offset(offset);
}
- pub fn get_transform(&self) -> Transform2D<f32> {
+ pub(crate) fn get_transform(&self) -> Transform2D<f32> {
self.drawtarget.get_transform()
}
- pub fn set_transform(&mut self, transform: &Transform2D<f32>) {
+ pub(crate) fn set_transform(&mut self, transform: &Transform2D<f32>) {
// If there is an in-progress path, store the existing transformation required
// to move between device and user space.
match self.path_state.as_mut() {
@@ -1398,32 +1179,28 @@ impl<'a> CanvasData<'a> {
self.drawtarget.set_transform(transform)
}
- pub fn set_global_alpha(&mut self, alpha: f32) {
+ pub(crate) fn set_global_alpha(&mut self, alpha: f32) {
self.state.draw_options.set_alpha(alpha);
}
- pub fn set_global_composition(&mut self, op: CompositionOrBlending) {
+ pub(crate) fn set_global_composition(&mut self, op: CompositionOrBlending) {
self.backend.set_global_composition(op, &mut self.state);
}
- pub fn recreate(&mut self, size: Option<Size2D<u64>>) {
+ pub(crate) fn recreate(&mut self, size: Option<Size2D<u64>>) {
let size = size
.unwrap_or_else(|| self.drawtarget.get_size().to_u64())
.max(MIN_WR_IMAGE_SIZE);
self.drawtarget = self
.backend
.create_drawtarget(Size2D::new(size.width, size.height));
- self.state = self.backend.recreate_paint_state(&self.state);
+ self.state = self.backend.new_paint_state();
self.saved_states.clear();
self.update_image_rendering();
}
- pub fn snapshot(&self) {
- self.drawtarget.snapshot_data();
- }
-
/// Update image in WebRender
- pub fn update_image_rendering(&mut self) {
+ pub(crate) fn update_image_rendering(&mut self) {
let descriptor = ImageDescriptor {
size: self.drawtarget.get_size().cast_unit(),
stride: None,
@@ -1432,7 +1209,7 @@ impl<'a> CanvasData<'a> {
flags: ImageDescriptorFlags::empty(),
};
let data = SerializableImageData::Raw(IpcSharedMemory::from_bytes(
- self.drawtarget.snapshot_data(),
+ self.drawtarget.bytes().as_ref(),
));
self.compositor_api
@@ -1444,7 +1221,7 @@ impl<'a> CanvasData<'a> {
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata
- pub fn put_image_data(&mut self, mut imagedata: Vec<u8>, rect: Rect<u64>) {
+ pub(crate) fn put_image_data(&mut self, mut imagedata: Vec<u8>, rect: Rect<u64>) {
assert_eq!(imagedata.len() % 4, 0);
assert_eq!(rect.size.area() as usize, imagedata.len() / 4);
pixels::rgba8_byte_swap_and_premultiply_inplace(&mut imagedata);
@@ -1459,31 +1236,31 @@ impl<'a> CanvasData<'a> {
);
}
- pub fn set_shadow_offset_x(&mut self, value: f64) {
+ pub(crate) fn set_shadow_offset_x(&mut self, value: f64) {
self.state.shadow_offset_x = value;
}
- pub fn set_shadow_offset_y(&mut self, value: f64) {
+ pub(crate) fn set_shadow_offset_y(&mut self, value: f64) {
self.state.shadow_offset_y = value;
}
- pub fn set_shadow_blur(&mut self, value: f64) {
+ pub(crate) fn set_shadow_blur(&mut self, value: f64) {
self.state.shadow_blur = value;
}
- pub fn set_shadow_color(&mut self, value: AbsoluteColor) {
+ pub(crate) fn set_shadow_color(&mut self, value: AbsoluteColor) {
self.backend.set_shadow_color(value, &mut self.state);
}
- pub fn set_font(&mut self, font_style: FontStyleStruct) {
+ pub(crate) fn set_font(&mut self, font_style: FontStyleStruct) {
self.state.font_style = Some(ServoArc::new(font_style))
}
- pub fn set_text_align(&mut self, text_align: TextAlign) {
+ pub(crate) fn set_text_align(&mut self, text_align: TextAlign) {
self.state.text_align = text_align;
}
- pub fn set_text_baseline(&mut self, text_baseline: TextBaseline) {
+ pub(crate) fn set_text_baseline(&mut self, text_baseline: TextBaseline) {
self.state.text_baseline = text_baseline;
}
@@ -1495,7 +1272,7 @@ impl<'a> CanvasData<'a> {
self.state.shadow_blur != 0.0f64)
}
- fn create_draw_target_for_shadow(&self, source_rect: &Rect<f32>) -> Box<dyn GenericDrawTarget> {
+ fn create_draw_target_for_shadow(&self, source_rect: &Rect<f32>) -> B::DrawTarget {
let mut draw_target = self.drawtarget.create_similar_draw_target(&Size2D::new(
source_rect.size.width as i32,
source_rect.size.height as i32,
@@ -1509,13 +1286,13 @@ impl<'a> CanvasData<'a> {
fn draw_with_shadow<F>(&self, rect: &Rect<f32>, draw_shadow_source: F)
where
- F: FnOnce(&mut dyn GenericDrawTarget),
+ F: FnOnce(&mut B::DrawTarget),
{
let shadow_src_rect = self.state.transform.outer_transformed_rect(rect);
let mut new_draw_target = self.create_draw_target_for_shadow(&shadow_src_rect);
- draw_shadow_source(&mut *new_draw_target);
+ draw_shadow_source(&mut new_draw_target);
self.drawtarget.draw_surface_with_shadow(
- new_draw_target.snapshot(),
+ new_draw_target.surface(),
&Point2D::new(shadow_src_rect.origin.x, shadow_src_rect.origin.y),
&self.state.shadow_color,
&Vector2D::new(
@@ -1531,7 +1308,7 @@ impl<'a> CanvasData<'a> {
/// canvas_size: The size of the canvas we're reading from
/// read_rect: The area of the canvas we want to read from
#[allow(unsafe_code)]
- pub fn read_pixels(
+ pub(crate) fn read_pixels(
&self,
read_rect: Option<Rect<u64>>,
canvas_size: Option<Size2D<u64>>,
@@ -1546,11 +1323,11 @@ impl<'a> CanvasData<'a> {
{
vec![]
} else {
- let bytes = self.drawtarget.snapshot_data();
- pixels::rgba8_get_rect(bytes, canvas_size, read_rect).to_vec()
+ pixels::rgba8_get_rect(self.drawtarget.bytes().as_ref(), canvas_size, read_rect)
+ .to_vec()
}
} else {
- self.drawtarget.snapshot_data().to_vec()
+ self.drawtarget.bytes().as_ref().to_vec()
};
Snapshot::from_vec(
@@ -1564,7 +1341,7 @@ impl<'a> CanvasData<'a> {
}
}
-impl Drop for CanvasData<'_> {
+impl<B: Backend> Drop for CanvasData<'_, B> {
fn drop(&mut self) {
self.compositor_api
.update_images(vec![ImageUpdate::DeleteImage(self.image_key)]);
@@ -1575,20 +1352,21 @@ const HANGING_BASELINE_DEFAULT: f32 = 0.8;
const IDEOGRAPHIC_BASELINE_DEFAULT: f32 = 0.5;
#[derive(Clone)]
-pub struct CanvasPaintState<'a> {
- pub draw_options: DrawOptions,
- pub fill_style: Pattern<'a>,
- pub stroke_style: Pattern<'a>,
- pub stroke_opts: StrokeOptions,
+pub(crate) struct CanvasPaintState<'a, B: Backend> {
+ pub(crate) draw_options: B::DrawOptions,
+ pub(crate) fill_style: B::Pattern<'a>,
+ pub(crate) stroke_style: B::Pattern<'a>,
+ pub(crate) stroke_opts: B::StrokeOptions,
/// The current 2D transform matrix.
- pub transform: Transform2D<f32>,
- pub shadow_offset_x: f64,
- pub shadow_offset_y: f64,
- pub shadow_blur: f64,
- pub shadow_color: Color,
- pub font_style: Option<ServoArc<FontStyleStruct>>,
- pub text_align: TextAlign,
- pub text_baseline: TextBaseline,
+ pub(crate) transform: Transform2D<f32>,
+ pub(crate) shadow_offset_x: f64,
+ pub(crate) shadow_offset_y: f64,
+ pub(crate) shadow_blur: f64,
+ pub(crate) shadow_color: B::Color,
+ pub(crate) font_style: Option<ServoArc<FontStyleStruct>>,
+ pub(crate) text_align: TextAlign,
+ pub(crate) text_baseline: TextBaseline,
+ pub(crate) _backend: PhantomData<B>,
}
/// It writes an image to the destination target
@@ -1598,14 +1376,14 @@ pub struct CanvasPaintState<'a> {
/// dest_rect: Area of the destination target where the pixels will be copied
/// smoothing_enabled: It determines if smoothing is applied to the image result
/// premultiply: Determines whenever the image data should be premultiplied or not
-fn write_image(
- draw_target: &mut dyn GenericDrawTarget,
+fn write_image<B: Backend>(
+ draw_target: &mut B::DrawTarget,
mut image_data: Vec<u8>,
image_size: Size2D<f64>,
dest_rect: Rect<f64>,
smoothing_enabled: bool,
premultiply: bool,
- draw_options: &DrawOptions,
+ draw_options: &B::DrawOptions,
) {
if image_data.is_empty() {
return;
@@ -1634,25 +1412,11 @@ fn write_image(
draw_target.draw_surface(source_surface, dest_rect, image_rect, filter, draw_options);
}
-pub trait RectToi32 {
- fn to_i32(&self) -> Rect<i32>;
+pub(crate) trait RectToi32 {
fn ceil(&self) -> Rect<f64>;
}
impl RectToi32 for Rect<f64> {
- fn to_i32(&self) -> Rect<i32> {
- Rect::new(
- Point2D::new(
- self.origin.x.to_i32().unwrap(),
- self.origin.y.to_i32().unwrap(),
- ),
- Size2D::new(
- self.size.width.to_i32().unwrap(),
- self.size.height.to_i32().unwrap(),
- ),
- )
- }
-
fn ceil(&self) -> Rect<f64> {
Rect::new(
Point2D::new(self.origin.x.ceil(), self.origin.y.ceil()),
@@ -1661,22 +1425,6 @@ impl RectToi32 for Rect<f64> {
}
}
-pub trait RectExt {
- fn to_u64(&self) -> Rect<u64>;
-}
-
-impl RectExt for Rect<f64> {
- fn to_u64(&self) -> Rect<u64> {
- self.cast()
- }
-}
-
-impl RectExt for Rect<u32> {
- fn to_u64(&self) -> Rect<u64> {
- self.cast()
- }
-}
-
fn replace_ascii_whitespace(text: String) -> String {
text.chars()
.map(|c| match c {
diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs
index bb940d7ef81..82a221d560d 100644
--- a/components/canvas/canvas_paint_thread.rs
+++ b/components/canvas/canvas_paint_thread.rs
@@ -11,18 +11,21 @@ use canvas_traits::ConstellationCanvasMsg;
use canvas_traits::canvas::*;
use compositing_traits::CrossProcessCompositorApi;
use crossbeam_channel::{Sender, select, unbounded};
-use euclid::default::Size2D;
+use euclid::default::{Point2D, Rect, Size2D, Transform2D};
use fonts::{FontContext, SystemFontServiceProxy};
use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER;
use log::warn;
use net_traits::ResourceThreads;
+use style::color::AbsoluteColor;
+use style::properties::style_structs::Font as FontStyleStruct;
use webrender_api::ImageKey;
use crate::canvas_data::*;
+use crate::raqote_backend::RaqoteBackend;
pub struct CanvasPaintThread<'a> {
- canvases: HashMap<CanvasId, CanvasData<'a>>,
+ canvases: HashMap<CanvasId, Canvas<'a>>,
next_canvas_id: CanvasId,
compositor_api: CrossProcessCompositorApi,
font_context: Arc<FontContext>,
@@ -113,10 +116,14 @@ impl<'a> CanvasPaintThread<'a> {
let canvas_id = self.next_canvas_id;
self.next_canvas_id.0 += 1;
- let canvas_data =
- CanvasData::new(size, self.compositor_api.clone(), self.font_context.clone());
+ let canvas_data = CanvasData::new(
+ size,
+ self.compositor_api.clone(),
+ self.font_context.clone(),
+ RaqoteBackend,
+ );
let image_key = canvas_data.image_key();
- self.canvases.insert(canvas_id, canvas_data);
+ self.canvases.insert(canvas_id, Canvas::Raqote(canvas_data));
(canvas_id, image_key)
}
@@ -276,7 +283,347 @@ impl<'a> CanvasPaintThread<'a> {
}
}
- fn canvas(&mut self, canvas_id: CanvasId) -> &mut CanvasData<'a> {
+ fn canvas(&mut self, canvas_id: CanvasId) -> &mut Canvas<'a> {
self.canvases.get_mut(&canvas_id).expect("Bogus canvas id")
}
}
+
+enum Canvas<'a> {
+ Raqote(CanvasData<'a, RaqoteBackend>),
+}
+
+impl Canvas<'_> {
+ fn set_fill_style(&mut self, style: FillOrStrokeStyle) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_fill_style(style),
+ }
+ }
+
+ fn fill(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.fill(),
+ }
+ }
+
+ fn fill_text(&mut self, text: String, x: f64, y: f64, max_width: Option<f64>, is_rtl: bool) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.fill_text(text, x, y, max_width, is_rtl),
+ }
+ }
+
+ fn fill_rect(&mut self, rect: &Rect<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.fill_rect(rect),
+ }
+ }
+
+ fn set_stroke_style(&mut self, style: FillOrStrokeStyle) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_stroke_style(style),
+ }
+ }
+
+ fn stroke_rect(&mut self, rect: &Rect<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.stroke_rect(rect),
+ }
+ }
+
+ fn begin_path(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.begin_path(),
+ }
+ }
+
+ fn close_path(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.close_path(),
+ }
+ }
+
+ fn fill_path(&mut self, path: &[PathSegment]) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.fill_path(path),
+ }
+ }
+
+ fn stroke(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.stroke(),
+ }
+ }
+
+ fn stroke_path(&mut self, path: &[PathSegment]) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.stroke_path(path),
+ }
+ }
+
+ fn clip(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.clip(),
+ }
+ }
+
+ fn is_point_in_path(&mut self, x: f64, y: f64, fill_rule: FillRule, chan: IpcSender<bool>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.is_point_in_path(x, y, fill_rule, chan),
+ }
+ }
+
+ fn is_point_in_path_(
+ &mut self,
+ path: &[PathSegment],
+ x: f64,
+ y: f64,
+ fill_rule: FillRule,
+ chan: IpcSender<bool>,
+ ) {
+ match self {
+ Canvas::Raqote(canvas_data) => {
+ canvas_data.is_point_in_path_(path, x, y, fill_rule, chan)
+ },
+ }
+ }
+
+ fn clear_rect(&mut self, rect: &Rect<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.clear_rect(rect),
+ }
+ }
+
+ fn draw_image(
+ &mut self,
+ data: &[u8],
+ size: Size2D<u64>,
+ dest_rect: Rect<f64>,
+ source_rect: Rect<f64>,
+ smoothing_enabled: bool,
+ is_premultiplied: bool,
+ ) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.draw_image(
+ data,
+ size,
+ dest_rect,
+ source_rect,
+ smoothing_enabled,
+ is_premultiplied,
+ ),
+ }
+ }
+
+ fn read_pixels(
+ &mut self,
+ read_rect: Option<Rect<u64>>,
+ canvas_size: Option<Size2D<u64>>,
+ ) -> snapshot::Snapshot {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.read_pixels(read_rect, canvas_size),
+ }
+ }
+
+ fn move_to(&mut self, point: &Point2D<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.move_to(point),
+ }
+ }
+
+ fn line_to(&mut self, point: &Point2D<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.line_to(point),
+ }
+ }
+
+ fn rect(&mut self, rect: &Rect<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.rect(rect),
+ }
+ }
+
+ fn quadratic_curve_to(&mut self, cp: &Point2D<f32>, pt: &Point2D<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.quadratic_curve_to(cp, pt),
+ }
+ }
+
+ fn bezier_curve_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, pt: &Point2D<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.bezier_curve_to(cp1, cp2, pt),
+ }
+ }
+
+ fn arc(&mut self, center: &Point2D<f32>, radius: f32, start: f32, end: f32, ccw: bool) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.arc(center, radius, start, end, ccw),
+ }
+ }
+
+ fn arc_to(&mut self, cp1: &Point2D<f32>, cp2: &Point2D<f32>, radius: f32) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.arc_to(cp1, cp2, radius),
+ }
+ }
+
+ #[allow(clippy::too_many_arguments)]
+ fn ellipse(
+ &mut self,
+ center: &Point2D<f32>,
+ radius_x: f32,
+ radius_y: f32,
+ rotation: f32,
+ start: f32,
+ end: f32,
+ ccw: bool,
+ ) {
+ match self {
+ Canvas::Raqote(canvas_data) => {
+ canvas_data.ellipse(center, radius_x, radius_y, rotation, start, end, ccw)
+ },
+ }
+ }
+
+ fn restore_context_state(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.restore_context_state(),
+ }
+ }
+
+ fn save_context_state(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.save_context_state(),
+ }
+ }
+
+ fn set_line_width(&mut self, width: f32) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_line_width(width),
+ }
+ }
+
+ fn set_line_cap(&mut self, cap: LineCapStyle) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_line_cap(cap),
+ }
+ }
+
+ fn set_line_join(&mut self, join: LineJoinStyle) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_line_join(join),
+ }
+ }
+
+ fn set_miter_limit(&mut self, limit: f32) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_miter_limit(limit),
+ }
+ }
+
+ fn set_line_dash(&mut self, items: Vec<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_line_dash(items),
+ }
+ }
+
+ fn set_line_dash_offset(&mut self, offset: f32) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_line_dash_offset(offset),
+ }
+ }
+
+ fn set_transform(&mut self, matrix: &Transform2D<f32>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_transform(matrix),
+ }
+ }
+
+ fn set_global_alpha(&mut self, alpha: f32) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_global_alpha(alpha),
+ }
+ }
+
+ fn set_global_composition(&mut self, op: CompositionOrBlending) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_global_composition(op),
+ }
+ }
+
+ fn set_shadow_offset_x(&mut self, value: f64) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_shadow_offset_x(value),
+ }
+ }
+
+ fn set_shadow_offset_y(&mut self, value: f64) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_shadow_offset_y(value),
+ }
+ }
+
+ fn set_shadow_blur(&mut self, value: f64) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_shadow_blur(value),
+ }
+ }
+
+ fn set_shadow_color(&mut self, color: AbsoluteColor) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_shadow_color(color),
+ }
+ }
+
+ fn set_font(&mut self, font_style: FontStyleStruct) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_font(font_style),
+ }
+ }
+
+ fn set_text_align(&mut self, text_align: TextAlign) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_text_align(text_align),
+ }
+ }
+
+ fn set_text_baseline(&mut self, text_baseline: TextBaseline) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.set_text_baseline(text_baseline),
+ }
+ }
+
+ fn measure_text(&mut self, text: String) -> TextMetrics {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.measure_text(text),
+ }
+ }
+
+ fn clip_path(&mut self, path: &[PathSegment]) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.clip_path(path),
+ }
+ }
+
+ fn get_transform(&self) -> Transform2D<f32> {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.get_transform(),
+ }
+ }
+
+ fn put_image_data(&mut self, unwrap: Vec<u8>, rect: Rect<u64>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.put_image_data(unwrap, rect),
+ }
+ }
+
+ fn update_image_rendering(&mut self) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.update_image_rendering(),
+ }
+ }
+
+ fn recreate(&mut self, size: Option<Size2D<u64>>) {
+ match self {
+ Canvas::Raqote(canvas_data) => canvas_data.recreate(size),
+ }
+ }
+}
diff --git a/components/canvas/lib.rs b/components/canvas/lib.rs
index d2c62c1d8b6..91ab58b0e8b 100644
--- a/components/canvas/lib.rs
+++ b/components/canvas/lib.rs
@@ -4,14 +4,8 @@
#![deny(unsafe_code)]
+mod backend;
mod raqote_backend;
-pub use webgl_mode::WebGLComm;
-
pub mod canvas_data;
pub mod canvas_paint_thread;
-mod webgl_limits;
-mod webgl_mode;
-pub mod webgl_thread;
-#[cfg(feature = "webxr")]
-mod webxr;
diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs
index 12137e41f41..efe0ffd05b8 100644
--- a/components/canvas/raqote_backend.rs
+++ b/components/canvas/raqote_backend.rs
@@ -7,20 +7,19 @@ use std::collections::HashMap;
use canvas_traits::canvas::*;
use cssparser::color::clamp_unit_f32;
-use euclid::Angle;
use euclid::default::{Point2D, Rect, Size2D, Transform2D, Vector2D};
use font_kit::font::Font;
use fonts::{ByteIndex, FontIdentifier, FontTemplateRefMethods};
use log::warn;
-use lyon_geom::Arc;
use range::Range;
use raqote::PathOp;
use style::color::AbsoluteColor;
-use crate::canvas_data::{
- self, Backend, CanvasPaintState, Color, CompositionOp, DrawOptions, Filter, GenericDrawTarget,
- GenericPathBuilder, GradientStop, GradientStops, Path, SourceSurface, StrokeOptions, TextRun,
+use crate::backend::{
+ Backend, DrawOptionsHelpers, GenericDrawTarget, GenericPathBuilder, PathHelpers,
+ PatternHelpers, StrokeOptionsHelpers,
};
+use crate::canvas_data::{CanvasPaintState, Filter, TextRun};
thread_local! {
/// The shared font cache used by all canvases that render on a thread. It would be nicer
@@ -30,80 +29,85 @@ thread_local! {
static SHARED_FONT_CACHE: RefCell<HashMap<FontIdentifier, Font>> = RefCell::default();
}
-#[derive(Default)]
-pub struct RaqoteBackend;
+#[derive(Clone, Default)]
+pub(crate) struct RaqoteBackend;
impl Backend for RaqoteBackend {
- fn get_composition_op(&self, opts: &DrawOptions) -> CompositionOp {
- CompositionOp::Raqote(opts.as_raqote().blend_mode)
+ type Pattern<'a> = Pattern<'a>;
+ type StrokeOptions = raqote::StrokeStyle;
+ type Color = raqote::SolidSource;
+ type DrawOptions = raqote::DrawOptions;
+ type CompositionOp = raqote::BlendMode;
+ type DrawTarget = raqote::DrawTarget;
+ type PathBuilder = PathBuilder;
+ type SourceSurface = Vec<u8>; // TODO: See if we can avoid the alloc (probably?)
+ type Bytes<'a> = &'a [u8];
+ type Path = raqote::Path;
+ type GradientStop = raqote::GradientStop;
+ type GradientStops = Vec<raqote::GradientStop>;
+
+ fn get_composition_op(&self, opts: &Self::DrawOptions) -> Self::CompositionOp {
+ opts.blend_mode
}
- fn need_to_draw_shadow(&self, color: &Color) -> bool {
- color.as_raqote().a != 0
+ fn need_to_draw_shadow(&self, color: &Self::Color) -> bool {
+ color.a != 0
}
- fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_>) {
- state.shadow_color = Color::Raqote(color.to_raqote_style());
+ fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_, Self>) {
+ state.shadow_color = color.to_raqote_style();
}
fn set_fill_style(
&mut self,
style: FillOrStrokeStyle,
- state: &mut CanvasPaintState<'_>,
- _drawtarget: &dyn GenericDrawTarget,
+ state: &mut CanvasPaintState<'_, Self>,
+ _drawtarget: &Self::DrawTarget,
) {
if let Some(pattern) = style.to_raqote_pattern() {
- state.fill_style = canvas_data::Pattern::Raqote(pattern);
+ state.fill_style = pattern;
}
}
fn set_stroke_style(
&mut self,
style: FillOrStrokeStyle,
- state: &mut CanvasPaintState<'_>,
- _drawtarget: &dyn GenericDrawTarget,
+ state: &mut CanvasPaintState<'_, Self>,
+ _drawtarget: &Self::DrawTarget,
) {
if let Some(pattern) = style.to_raqote_pattern() {
- state.stroke_style = canvas_data::Pattern::Raqote(pattern);
+ state.stroke_style = pattern;
}
}
fn set_global_composition(
&mut self,
op: CompositionOrBlending,
- state: &mut CanvasPaintState<'_>,
+ state: &mut CanvasPaintState<'_, Self>,
) {
- state.draw_options.as_raqote_mut().blend_mode = op.to_raqote_style();
- }
-
- fn create_drawtarget(&self, size: Size2D<u64>) -> Box<dyn GenericDrawTarget> {
- Box::new(raqote::DrawTarget::new(
- size.width as i32,
- size.height as i32,
- ))
+ state.draw_options.blend_mode = op.to_raqote_style();
}
- fn recreate_paint_state<'a>(&self, _state: &CanvasPaintState<'a>) -> CanvasPaintState<'a> {
- CanvasPaintState::default()
+ fn create_drawtarget(&self, size: Size2D<u64>) -> Self::DrawTarget {
+ raqote::DrawTarget::new(size.width as i32, size.height as i32)
}
-}
-impl Default for CanvasPaintState<'_> {
- fn default() -> Self {
+ fn new_paint_state<'a>(&self) -> CanvasPaintState<'a, Self> {
let pattern = Pattern::Color(255, 0, 0, 0);
CanvasPaintState {
- draw_options: DrawOptions::Raqote(raqote::DrawOptions::new()),
- fill_style: canvas_data::Pattern::Raqote(pattern.clone()),
- stroke_style: canvas_data::Pattern::Raqote(pattern),
- stroke_opts: StrokeOptions::Raqote(Default::default()),
+ draw_options: raqote::DrawOptions::new(),
+ fill_style: pattern.clone(),
+ stroke_style: pattern,
+ stroke_opts: Default::default(),
transform: Transform2D::identity(),
shadow_offset_x: 0.0,
shadow_offset_y: 0.0,
shadow_blur: 0.0,
- shadow_color: Color::Raqote(raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0)),
+ shadow_color: raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0),
font_style: None,
text_align: TextAlign::default(),
text_baseline: TextBaseline::default(),
+ _backend: std::marker::PhantomData,
}
}
}
@@ -230,136 +234,122 @@ impl Repetition {
}
}
-impl canvas_data::Pattern<'_> {
- pub fn source(&self) -> raqote::Source {
+pub fn source<'a>(pattern: &Pattern<'a>) -> raqote::Source<'a> {
+ match pattern {
+ Pattern::Color(a, r, g, b) => raqote::Source::Solid(
+ raqote::SolidSource::from_unpremultiplied_argb(*a, *r, *g, *b),
+ ),
+ Pattern::LinearGradient(pattern) => raqote::Source::new_linear_gradient(
+ pattern.gradient.clone(),
+ pattern.start,
+ pattern.end,
+ raqote::Spread::Pad,
+ ),
+ Pattern::RadialGradient(pattern) => raqote::Source::new_two_circle_radial_gradient(
+ pattern.gradient.clone(),
+ pattern.center1,
+ pattern.radius1,
+ pattern.center2,
+ pattern.radius2,
+ raqote::Spread::Pad,
+ ),
+ Pattern::Surface(pattern) => raqote::Source::Image(
+ pattern.image,
+ pattern.extend,
+ pattern.filter,
+ pattern.transform,
+ ),
+ }
+}
+
+impl PatternHelpers for Pattern<'_> {
+ fn is_zero_size_gradient(&self) -> bool {
match self {
- canvas_data::Pattern::Raqote(pattern) => match pattern {
- Pattern::Color(a, r, g, b) => raqote::Source::Solid(
- raqote::SolidSource::from_unpremultiplied_argb(*a, *r, *g, *b),
- ),
- Pattern::LinearGradient(pattern) => raqote::Source::new_linear_gradient(
- pattern.gradient.clone(),
- pattern.start,
- pattern.end,
- raqote::Spread::Pad,
- ),
- Pattern::RadialGradient(pattern) => raqote::Source::new_two_circle_radial_gradient(
- pattern.gradient.clone(),
- pattern.center1,
- pattern.radius1,
- pattern.center2,
- pattern.radius2,
- raqote::Spread::Pad,
- ),
- Pattern::Surface(pattern) => raqote::Source::Image(
- pattern.image,
- pattern.extend,
- pattern.filter,
- pattern.transform,
- ),
+ Pattern::RadialGradient(pattern) => {
+ let centers_equal = pattern.center1 == pattern.center2;
+ let radii_equal = pattern.radius1 == pattern.radius2;
+ (centers_equal && radii_equal) || pattern.gradient.stops.is_empty()
},
+ Pattern::LinearGradient(pattern) => {
+ (pattern.start == pattern.end) || pattern.gradient.stops.is_empty()
+ },
+ Pattern::Color(..) | Pattern::Surface(..) => false,
}
}
- pub fn is_zero_size_gradient(&self) -> bool {
+
+ fn draw_rect(&self, rect: &Rect<f32>) -> Rect<f32> {
match self {
- canvas_data::Pattern::Raqote(pattern) => match pattern {
- Pattern::RadialGradient(pattern) => {
- let centers_equal = pattern.center1 == pattern.center2;
- let radii_equal = pattern.radius1 == pattern.radius2;
- (centers_equal && radii_equal) || pattern.gradient.stops.is_empty()
- },
- Pattern::LinearGradient(pattern) => {
- (pattern.start == pattern.end) || pattern.gradient.stops.is_empty()
- },
- Pattern::Color(..) | Pattern::Surface(..) => false,
+ Pattern::Surface(pattern) => {
+ let pattern_rect = Rect::new(Point2D::origin(), pattern.size());
+ let mut draw_rect = rect.intersection(&pattern_rect).unwrap_or(Rect::zero());
+
+ match pattern.repetition() {
+ Repetition::NoRepeat => {
+ draw_rect.size.width = draw_rect.size.width.min(pattern_rect.size.width);
+ draw_rect.size.height = draw_rect.size.height.min(pattern_rect.size.height);
+ },
+ Repetition::RepeatX => {
+ draw_rect.size.width = rect.size.width;
+ draw_rect.size.height = draw_rect.size.height.min(pattern_rect.size.height);
+ },
+ Repetition::RepeatY => {
+ draw_rect.size.height = rect.size.height;
+ draw_rect.size.width = draw_rect.size.width.min(pattern_rect.size.width);
+ },
+ Repetition::Repeat => {
+ draw_rect = *rect;
+ },
+ }
+
+ draw_rect
},
+ Pattern::Color(..) | Pattern::LinearGradient(..) | Pattern::RadialGradient(..) => *rect,
}
}
}
-impl StrokeOptions {
- pub fn set_line_width(&mut self, _val: f32) {
- match self {
- StrokeOptions::Raqote(options) => options.width = _val,
- }
- }
- pub fn set_miter_limit(&mut self, _val: f32) {
- match self {
- StrokeOptions::Raqote(options) => options.miter_limit = _val,
- }
+impl StrokeOptionsHelpers for raqote::StrokeStyle {
+ fn set_line_width(&mut self, _val: f32) {
+ self.width = _val;
}
- pub fn set_line_join(&mut self, val: LineJoinStyle) {
- match self {
- StrokeOptions::Raqote(options) => options.join = val.to_raqote_style(),
- }
+ fn set_miter_limit(&mut self, _val: f32) {
+ self.miter_limit = _val;
}
- pub fn set_line_cap(&mut self, val: LineCapStyle) {
- match self {
- StrokeOptions::Raqote(options) => options.cap = val.to_raqote_style(),
- }
+ fn set_line_join(&mut self, val: LineJoinStyle) {
+ self.join = val.to_raqote_style();
}
- pub fn set_line_dash(&mut self, items: Vec<f32>) {
- match self {
- StrokeOptions::Raqote(options) => options.dash_array = items,
- }
+ fn set_line_cap(&mut self, val: LineCapStyle) {
+ self.cap = val.to_raqote_style();
}
- pub fn set_line_dash_offset(&mut self, offset: f32) {
- match self {
- StrokeOptions::Raqote(options) => options.dash_offset = offset,
- }
+ fn set_line_dash(&mut self, items: Vec<f32>) {
+ self.dash_array = items;
}
- pub fn as_raqote(&self) -> &raqote::StrokeStyle {
- match self {
- StrokeOptions::Raqote(options) => options,
- }
+ fn set_line_dash_offset(&mut self, offset: f32) {
+ self.dash_offset = offset;
}
}
-impl DrawOptions {
- pub fn set_alpha(&mut self, val: f32) {
- match self {
- DrawOptions::Raqote(draw_options) => draw_options.alpha = val,
- }
- }
- pub fn as_raqote(&self) -> &raqote::DrawOptions {
- match self {
- DrawOptions::Raqote(options) => options,
- }
- }
- fn as_raqote_mut(&mut self) -> &mut raqote::DrawOptions {
- match self {
- DrawOptions::Raqote(options) => options,
- }
+impl DrawOptionsHelpers for raqote::DrawOptions {
+ fn set_alpha(&mut self, val: f32) {
+ self.alpha = val;
}
}
-impl Path {
- pub fn transformed_copy_to_builder(
- &self,
- transform: &Transform2D<f32>,
- ) -> Box<dyn GenericPathBuilder> {
- Box::new(PathBuilder(Some(raqote::PathBuilder::from(
- self.as_raqote().clone().transform(transform),
- ))))
+impl PathHelpers<RaqoteBackend> for raqote::Path {
+ fn transformed_copy_to_builder(&self, transform: &Transform2D<f32>) -> PathBuilder {
+ PathBuilder(Some(raqote::PathBuilder::from(
+ self.clone().transform(transform),
+ )))
}
- pub fn contains_point(&self, x: f64, y: f64, path_transform: &Transform2D<f32>) -> bool {
- self.as_raqote()
- .clone()
+ fn contains_point(&self, x: f64, y: f64, path_transform: &Transform2D<f32>) -> bool {
+ self.clone()
.transform(path_transform)
.contains_point(0.1, x as f32, y as f32)
}
- pub fn copy_to_builder(&self) -> Box<dyn GenericPathBuilder> {
- Box::new(PathBuilder(Some(raqote::PathBuilder::from(
- self.as_raqote().clone(),
- ))))
- }
-
- pub fn as_raqote(&self) -> &raqote::Path {
- match self {
- Path::Raqote(p) => p,
- }
+ fn copy_to_builder(&self) -> PathBuilder {
+ PathBuilder(Some(raqote::PathBuilder::from(self.clone())))
}
}
@@ -373,7 +363,7 @@ fn create_gradient_stops(gradient_stops: Vec<CanvasGradientStop>) -> Vec<raqote:
stops
}
-impl GenericDrawTarget for raqote::DrawTarget {
+impl GenericDrawTarget<RaqoteBackend> for raqote::DrawTarget {
fn clear_rect(&mut self, rect: &Rect<f32>) {
let mut pb = raqote::PathBuilder::new();
pb.rect(
@@ -385,59 +375,47 @@ impl GenericDrawTarget for raqote::DrawTarget {
let mut options = raqote::DrawOptions::new();
options.blend_mode = raqote::BlendMode::Clear;
let pattern = Pattern::Color(0, 0, 0, 0);
- GenericDrawTarget::fill(
- self,
- &Path::Raqote(pb.finish()),
- canvas_data::Pattern::Raqote(pattern),
- &DrawOptions::Raqote(options),
- );
+ <Self as GenericDrawTarget<RaqoteBackend>>::fill(self, &pb.finish(), pattern, &options);
}
#[allow(unsafe_code)]
fn copy_surface(
&mut self,
- surface: SourceSurface,
+ surface: <RaqoteBackend as Backend>::SourceSurface,
source: Rect<i32>,
destination: Point2D<i32>,
) {
let mut dt = raqote::DrawTarget::new(source.size.width, source.size.height);
- let data = surface.as_raqote();
+ let data = surface;
let s = unsafe { std::slice::from_raw_parts(data.as_ptr() as *const u32, data.len() / 4) };
dt.get_data_mut().copy_from_slice(s);
raqote::DrawTarget::copy_surface(self, &dt, source.to_box2d(), destination);
}
- // TODO(pylbrecht)
- // Somehow a duplicate of `create_gradient_stops()` with different types.
- // It feels cumbersome to convert GradientStop back and forth just to use
- // `create_gradient_stops()`, so I'll leave this here for now.
- fn create_gradient_stops(&self, gradient_stops: Vec<GradientStop>) -> GradientStops {
- let mut stops = gradient_stops
- .into_iter()
- .map(|item| *item.as_raqote())
- .collect::<Vec<raqote::GradientStop>>();
- // https://www.w3.org/html/test/results/2dcontext/annotated-spec/canvas.html#testrefs.2d.gradient.interpolate.overlap
- stops.sort_by(|a, b| a.position.partial_cmp(&b.position).unwrap());
- GradientStops::Raqote(stops)
- }
- fn create_path_builder(&self) -> Box<dyn GenericPathBuilder> {
- Box::new(PathBuilder::new())
+ fn create_path_builder(&self) -> <RaqoteBackend as Backend>::PathBuilder {
+ PathBuilder::new()
}
- fn create_similar_draw_target(&self, size: &Size2D<i32>) -> Box<dyn GenericDrawTarget> {
- Box::new(raqote::DrawTarget::new(size.width, size.height))
+ fn create_similar_draw_target(
+ &self,
+ size: &Size2D<i32>,
+ ) -> <RaqoteBackend as Backend>::DrawTarget {
+ raqote::DrawTarget::new(size.width, size.height)
}
- fn create_source_surface_from_data(&self, data: &[u8]) -> Option<SourceSurface> {
- Some(SourceSurface::Raqote(data.to_vec()))
+ fn create_source_surface_from_data(
+ &self,
+ data: &[u8],
+ ) -> Option<<RaqoteBackend as Backend>::SourceSurface> {
+ Some(data.to_vec())
}
#[allow(unsafe_code)]
fn draw_surface(
&mut self,
- surface: SourceSurface,
+ surface: <RaqoteBackend as Backend>::SourceSurface,
dest: Rect<f64>,
source: Rect<f64>,
filter: Filter,
- draw_options: &DrawOptions,
+ draw_options: &<RaqoteBackend as Backend>::DrawOptions,
) {
- let surface_data = surface.as_raqote();
+ let surface_data = surface;
let image = raqote::Image {
width: source.size.width as i32,
height: source.size.height as i32,
@@ -470,33 +448,29 @@ impl GenericDrawTarget for raqote::DrawTarget {
dest.size.height as f32,
);
- GenericDrawTarget::fill(
- self,
- &Path::Raqote(pb.finish()),
- canvas_data::Pattern::Raqote(pattern),
- draw_options,
- );
+ <Self as GenericDrawTarget<RaqoteBackend>>::fill(self, &pb.finish(), pattern, draw_options);
}
fn draw_surface_with_shadow(
&self,
- _surface: SourceSurface,
+ _surface: <RaqoteBackend as Backend>::SourceSurface,
_dest: &Point2D<f32>,
- _color: &Color,
+ _color: &<RaqoteBackend as Backend>::Color,
_offset: &Vector2D<f32>,
_sigma: f32,
- _operator: CompositionOp,
+ _operator: <RaqoteBackend as Backend>::CompositionOp,
) {
warn!("no support for drawing shadows");
}
- fn fill(&mut self, path: &Path, pattern: canvas_data::Pattern, draw_options: &DrawOptions) {
- match draw_options.as_raqote().blend_mode {
+ fn fill(
+ &mut self,
+ path: &<RaqoteBackend as Backend>::Path,
+ pattern: <RaqoteBackend as Backend>::Pattern<'_>,
+ draw_options: &<RaqoteBackend as Backend>::DrawOptions,
+ ) {
+ match draw_options.blend_mode {
raqote::BlendMode::Src => {
self.clear(raqote::SolidSource::from_unpremultiplied_argb(0, 0, 0, 0));
- self.fill(
- path.as_raqote(),
- &pattern.source(),
- draw_options.as_raqote(),
- );
+ self.fill(path, &source(&pattern), draw_options);
},
raqote::BlendMode::Clear |
raqote::BlendMode::SrcAtop |
@@ -505,26 +479,19 @@ impl GenericDrawTarget for raqote::DrawTarget {
raqote::BlendMode::Xor |
raqote::BlendMode::DstOver |
raqote::BlendMode::SrcOver => {
- self.fill(
- path.as_raqote(),
- &pattern.source(),
- draw_options.as_raqote(),
- );
+ self.fill(path, &source(&pattern), draw_options);
},
raqote::BlendMode::SrcIn |
raqote::BlendMode::SrcOut |
raqote::BlendMode::DstIn |
raqote::BlendMode::DstAtop => {
- let mut options = *draw_options.as_raqote();
+ let mut options = *draw_options;
self.push_layer_with_blend(1., options.blend_mode);
options.blend_mode = raqote::BlendMode::SrcOver;
- self.fill(path.as_raqote(), &pattern.source(), &options);
+ self.fill(path, &source(&pattern), &options);
self.pop_layer();
},
- _ => warn!(
- "unrecognized blend mode: {:?}",
- draw_options.as_raqote().blend_mode
- ),
+ _ => warn!("unrecognized blend mode: {:?}", draw_options.blend_mode),
}
}
@@ -532,8 +499,8 @@ impl GenericDrawTarget for raqote::DrawTarget {
&mut self,
text_runs: Vec<TextRun>,
start: Point2D<f32>,
- pattern: &canvas_data::Pattern,
- draw_options: &DrawOptions,
+ pattern: &<RaqoteBackend as Backend>::Pattern<'_>,
+ draw_options: &<RaqoteBackend as Backend>::DrawOptions,
) {
let mut advance = 0.;
for run in text_runs.iter() {
@@ -581,8 +548,8 @@ impl GenericDrawTarget for raqote::DrawTarget {
run.font.descriptor.pt_size.to_f32_px(),
&ids,
&positions,
- &pattern.source(),
- draw_options.as_raqote(),
+ &source(pattern),
+ draw_options,
);
})
}
@@ -591,8 +558,8 @@ impl GenericDrawTarget for raqote::DrawTarget {
fn fill_rect(
&mut self,
rect: &Rect<f32>,
- pattern: canvas_data::Pattern,
- draw_options: Option<&DrawOptions>,
+ pattern: <RaqoteBackend as Backend>::Pattern<'_>,
+ draw_options: Option<&<RaqoteBackend as Backend>::DrawOptions>,
) {
let mut pb = raqote::PathBuilder::new();
pb.rect(
@@ -602,16 +569,16 @@ impl GenericDrawTarget for raqote::DrawTarget {
rect.size.height,
);
let draw_options = if let Some(options) = draw_options {
- *options.as_raqote()
+ *options
} else {
raqote::DrawOptions::new()
};
- GenericDrawTarget::fill(
+ <Self as GenericDrawTarget<RaqoteBackend>>::fill(
self,
- &Path::Raqote(pb.finish()),
+ &pb.finish(),
pattern,
- &DrawOptions::Raqote(draw_options),
+ &draw_options,
);
}
fn get_size(&self) -> Size2D<i32> {
@@ -623,41 +590,36 @@ impl GenericDrawTarget for raqote::DrawTarget {
fn pop_clip(&mut self) {
self.pop_clip();
}
- fn push_clip(&mut self, path: &Path) {
- self.push_clip(path.as_raqote());
+ fn push_clip(&mut self, path: &<RaqoteBackend as Backend>::Path) {
+ self.push_clip(path);
}
fn set_transform(&mut self, matrix: &Transform2D<f32>) {
self.set_transform(matrix);
}
- fn snapshot(&self) -> SourceSurface {
- SourceSurface::Raqote(self.snapshot_data().to_vec())
+ fn surface(&self) -> <RaqoteBackend as Backend>::SourceSurface {
+ self.bytes().to_vec()
}
fn stroke(
&mut self,
- path: &Path,
- pattern: canvas_data::Pattern,
- stroke_options: &StrokeOptions,
- draw_options: &DrawOptions,
+ path: &<RaqoteBackend as Backend>::Path,
+ pattern: Pattern<'_>,
+ stroke_options: &<RaqoteBackend as Backend>::StrokeOptions,
+ draw_options: &<RaqoteBackend as Backend>::DrawOptions,
) {
- self.stroke(
- path.as_raqote(),
- &pattern.source(),
- stroke_options.as_raqote(),
- draw_options.as_raqote(),
- );
+ self.stroke(path, &source(&pattern), stroke_options, draw_options);
}
fn stroke_line(
&mut self,
start: Point2D<f32>,
end: Point2D<f32>,
- pattern: canvas_data::Pattern,
- stroke_options: &StrokeOptions,
- draw_options: &DrawOptions,
+ pattern: <RaqoteBackend as Backend>::Pattern<'_>,
+ stroke_options: &<RaqoteBackend as Backend>::StrokeOptions,
+ draw_options: &<RaqoteBackend as Backend>::DrawOptions,
) {
let mut pb = raqote::PathBuilder::new();
pb.move_to(start.x, start.y);
pb.line_to(end.x, end.y);
- let mut stroke_options = stroke_options.as_raqote().clone();
+ let mut stroke_options = stroke_options.clone();
let cap = match stroke_options.join {
raqote::LineJoin::Round => raqote::LineCap::Round,
_ => raqote::LineCap::Butt,
@@ -666,17 +628,17 @@ impl GenericDrawTarget for raqote::DrawTarget {
self.stroke(
&pb.finish(),
- &pattern.source(),
+ &source(&pattern),
&stroke_options,
- draw_options.as_raqote(),
+ draw_options,
);
}
fn stroke_rect(
&mut self,
rect: &Rect<f32>,
- pattern: canvas_data::Pattern,
- stroke_options: &StrokeOptions,
- draw_options: &DrawOptions,
+ pattern: <RaqoteBackend as Backend>::Pattern<'_>,
+ stroke_options: &<RaqoteBackend as Backend>::StrokeOptions,
+ draw_options: &<RaqoteBackend as Backend>::DrawOptions,
) {
let mut pb = raqote::PathBuilder::new();
pb.rect(
@@ -688,13 +650,13 @@ impl GenericDrawTarget for raqote::DrawTarget {
self.stroke(
&pb.finish(),
- &pattern.source(),
- stroke_options.as_raqote(),
- draw_options.as_raqote(),
+ &source(&pattern),
+ stroke_options,
+ draw_options,
);
}
#[allow(unsafe_code)]
- fn snapshot_data(&self) -> &[u8] {
+ fn bytes(&self) -> &[u8] {
let v = self.get_data();
unsafe { std::slice::from_raw_parts(v.as_ptr() as *const u8, std::mem::size_of_val(v)) }
}
@@ -709,7 +671,7 @@ impl Filter {
}
}
-struct PathBuilder(Option<raqote::PathBuilder>);
+pub(crate) struct PathBuilder(Option<raqote::PathBuilder>);
impl PathBuilder {
fn new() -> PathBuilder {
@@ -717,7 +679,7 @@ impl PathBuilder {
}
}
-impl GenericPathBuilder for PathBuilder {
+impl GenericPathBuilder<RaqoteBackend> for PathBuilder {
fn arc(
&mut self,
origin: Point2D<f32>,
@@ -726,7 +688,8 @@ impl GenericPathBuilder for PathBuilder {
end_angle: f32,
anticlockwise: bool,
) {
- self.ellipse(
+ <PathBuilder as GenericPathBuilder<RaqoteBackend>>::ellipse(
+ self,
origin,
radius,
radius,
@@ -736,6 +699,7 @@ impl GenericPathBuilder for PathBuilder {
anticlockwise,
);
}
+
fn bezier_curve_to(
&mut self,
control_point1: &Point2D<f32>,
@@ -751,66 +715,10 @@ impl GenericPathBuilder for PathBuilder {
control_point3.y,
);
}
+
fn close(&mut self) {
self.0.as_mut().unwrap().close();
}
- fn ellipse(
- &mut self,
- origin: Point2D<f32>,
- radius_x: f32,
- radius_y: f32,
- rotation_angle: f32,
- start_angle: f32,
- end_angle: f32,
- anticlockwise: bool,
- ) {
- let mut start = Angle::radians(start_angle);
- let mut end = Angle::radians(end_angle);
-
- // Wrap angles mod 2 * PI if necessary
- if !anticlockwise && start > end + Angle::two_pi() ||
- anticlockwise && end > start + Angle::two_pi()
- {
- start = start.positive();
- end = end.positive();
- }
-
- // Calculate the total arc we're going to sweep.
- let sweep = match anticlockwise {
- true => {
- if end - start == Angle::two_pi() {
- -Angle::two_pi()
- } else if end > start {
- -(Angle::two_pi() - (end - start))
- } else {
- -(start - end)
- }
- },
- false => {
- if start - end == Angle::two_pi() {
- Angle::two_pi()
- } else if start > end {
- Angle::two_pi() - (start - end)
- } else {
- end - start
- }
- },
- };
-
- let arc: Arc<f32> = Arc {
- center: origin,
- radii: Vector2D::new(radius_x, radius_y),
- start_angle: start,
- sweep_angle: sweep,
- x_rotation: Angle::radians(rotation_angle),
- };
-
- self.line_to(arc.from());
-
- arc.for_each_quadratic_bezier(&mut |q| {
- self.quadratic_curve_to(&q.ctrl, &q.to);
- });
- }
fn svg_arc(
&mut self,
@@ -840,9 +748,9 @@ impl GenericPathBuilder for PathBuilder {
fn get_current_point(&mut self) -> Option<Point2D<f32>> {
let path = self.finish();
- self.0 = Some(path.as_raqote().clone().into());
+ self.0 = Some(path.clone().into());
- path.as_raqote().ops.iter().last().and_then(|op| match op {
+ path.ops.iter().last().and_then(|op| match op {
PathOp::MoveTo(point) | PathOp::LineTo(point) => Some(Point2D::new(point.x, point.y)),
PathOp::CubicTo(_, _, point) => Some(Point2D::new(point.x, point.y)),
PathOp::QuadTo(_, point) => Some(Point2D::new(point.x, point.y)),
@@ -864,8 +772,8 @@ impl GenericPathBuilder for PathBuilder {
end_point.y,
);
}
- fn finish(&mut self) -> Path {
- Path::Raqote(self.0.take().unwrap().finish())
+ fn finish(&mut self) -> raqote::Path {
+ self.0.take().unwrap().finish()
}
}
@@ -977,14 +885,6 @@ impl ToRaqotePattern<'_> for FillOrStrokeStyle {
}
}
-impl Color {
- fn as_raqote(&self) -> &raqote::SolidSource {
- match self {
- Color::Raqote(s) => s,
- }
- }
-}
-
impl ToRaqoteStyle for AbsoluteColor {
type Target = raqote::SolidSource;
@@ -1054,19 +954,3 @@ impl ToRaqoteStyle for CompositionStyle {
}
}
}
-
-impl SourceSurface {
- fn as_raqote(&self) -> &Vec<u8> {
- match self {
- SourceSurface::Raqote(s) => s,
- }
- }
-}
-
-impl GradientStop {
- fn as_raqote(&self) -> &raqote::GradientStop {
- match self {
- GradientStop::Raqote(s) => s,
- }
- }
-}
diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs
index 2175028a81b..ad89c435717 100644
--- a/components/constellation/constellation.rs
+++ b/components/constellation/constellation.rs
@@ -115,9 +115,10 @@ use constellation_traits::{
AuxiliaryWebViewCreationRequest, AuxiliaryWebViewCreationResponse, BroadcastMsg, DocumentState,
EmbedderToConstellationMessage, IFrameLoadInfo, IFrameLoadInfoWithData, IFrameSandboxState,
IFrameSizeMsg, Job, LoadData, LoadOrigin, LogEntry, MessagePortMsg, NavigationHistoryBehavior,
- PaintMetricEvent, PortMessageTask, SWManagerMsg, SWManagerSenders, ScriptToConstellationChan,
- ScriptToConstellationMessage, ScrollState, ServiceWorkerManagerFactory, ServiceWorkerMsg,
- StructuredSerializedData, TraversalDirection, WindowSizeType,
+ PaintMetricEvent, PortMessageTask, PortTransferInfo, SWManagerMsg, SWManagerSenders,
+ ScriptToConstellationChan, ScriptToConstellationMessage, ScrollState,
+ ServiceWorkerManagerFactory, ServiceWorkerMsg, StructuredSerializedData, TraversalDirection,
+ WindowSizeType,
};
use crossbeam_channel::{Receiver, Select, Sender, unbounded};
use devtools_traits::{
@@ -127,10 +128,10 @@ use devtools_traits::{
use embedder_traits::resources::{self, Resource};
use embedder_traits::user_content_manager::UserContentManager;
use embedder_traits::{
- AnimationState, CompositorHitTestResult, Cursor, EmbedderMsg, EmbedderProxy, ImeEvent,
- InputEvent, MediaSessionActionType, MediaSessionEvent, MediaSessionPlaybackState, MouseButton,
- MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverCommandMsg,
- WebDriverLoadStatus,
+ AnimationState, CompositorHitTestResult, Cursor, EmbedderMsg, EmbedderProxy,
+ FocusSequenceNumber, ImeEvent, InputEvent, MediaSessionActionType, MediaSessionEvent,
+ MediaSessionPlaybackState, MouseButton, MouseButtonAction, MouseButtonEvent, Theme,
+ ViewportDetails, WebDriverCommandMsg, WebDriverLoadStatus,
};
use euclid::Size2D;
use euclid::default::Size2D as UntypedSize2D;
@@ -202,9 +203,6 @@ enum TransferState {
/// While a completion failed, another global requested to complete the transfer.
/// We are still buffering messages, and awaiting the return of the buffer from the global who failed.
CompletionRequested(MessagePortRouterId, VecDeque<PortMessageTask>),
- /// The entangled port has been removed while the port was in-transfer,
- /// the current port should be removed as well once it is managed again.
- EntangledRemoved,
}
#[derive(Debug)]
@@ -1043,6 +1041,44 @@ where
}
}
+ /// Enumerate the specified browsing context's ancestor pipelines up to
+ /// the top-level pipeline.
+ fn ancestor_pipelines_of_browsing_context_iter(
+ &self,
+ browsing_context_id: BrowsingContextId,
+ ) -> impl Iterator<Item = &Pipeline> + '_ {
+ let mut state: Option<PipelineId> = self
+ .browsing_contexts
+ .get(&browsing_context_id)
+ .and_then(|browsing_context| browsing_context.parent_pipeline_id);
+ std::iter::from_fn(move || {
+ if let Some(pipeline_id) = state {
+ let pipeline = self.pipelines.get(&pipeline_id)?;
+ let browsing_context = self.browsing_contexts.get(&pipeline.browsing_context_id)?;
+ state = browsing_context.parent_pipeline_id;
+ Some(pipeline)
+ } else {
+ None
+ }
+ })
+ }
+
+ /// Enumerate the specified browsing context's ancestor-or-self pipelines up
+ /// to the top-level pipeline.
+ fn ancestor_or_self_pipelines_of_browsing_context_iter(
+ &self,
+ browsing_context_id: BrowsingContextId,
+ ) -> impl Iterator<Item = &Pipeline> + '_ {
+ let this_pipeline = self
+ .browsing_contexts
+ .get(&browsing_context_id)
+ .map(|browsing_context| browsing_context.pipeline_id)
+ .and_then(|pipeline_id| self.pipelines.get(&pipeline_id));
+ this_pipeline
+ .into_iter()
+ .chain(self.ancestor_pipelines_of_browsing_context_iter(browsing_context_id))
+ }
+
/// Create a new browsing context and update the internal bookkeeping.
#[allow(clippy::too_many_arguments)]
fn new_browsing_context(
@@ -1486,12 +1522,12 @@ where
ScriptToConstellationMessage::NewMessagePort(router_id, port_id) => {
self.handle_new_messageport(router_id, port_id);
},
- ScriptToConstellationMessage::RemoveMessagePort(port_id) => {
- self.handle_remove_messageport(port_id);
- },
ScriptToConstellationMessage::EntanglePorts(port1, port2) => {
self.handle_entangle_messageports(port1, port2);
},
+ ScriptToConstellationMessage::DisentanglePorts(port1, port2) => {
+ self.handle_disentangle_messageports(port1, port2);
+ },
ScriptToConstellationMessage::NewBroadcastChannelRouter(
router_id,
response_sender,
@@ -1621,8 +1657,15 @@ where
data,
);
},
- ScriptToConstellationMessage::Focus => {
- self.handle_focus_msg(source_pipeline_id);
+ ScriptToConstellationMessage::Focus(focused_child_browsing_context_id, sequence) => {
+ self.handle_focus_msg(
+ source_pipeline_id,
+ focused_child_browsing_context_id,
+ sequence,
+ );
+ },
+ ScriptToConstellationMessage::FocusRemoteDocument(focused_browsing_context_id) => {
+ self.handle_focus_remote_document_msg(focused_browsing_context_id);
},
ScriptToConstellationMessage::SetThrottledComplete(throttled) => {
self.handle_set_throttled_complete(source_pipeline_id, throttled);
@@ -2072,17 +2115,6 @@ where
Entry::Occupied(entry) => entry,
};
match entry.get().state {
- TransferState::EntangledRemoved => {
- // If the entangled port has been removed while this one was in-transfer,
- // remove it now.
- if let Some(ipc_sender) = self.message_port_routers.get(&router_id) {
- let _ = ipc_sender.send(MessagePortMsg::RemoveMessagePort(port_id));
- } else {
- warn!("No message-port sender for {:?}", router_id);
- }
- entry.remove_entry();
- continue;
- },
TransferState::CompletionInProgress(expected_router_id) => {
// Here, the transfer was normally completed.
@@ -2106,9 +2138,9 @@ where
fn handle_message_port_transfer_failed(
&mut self,
- ports: HashMap<MessagePortId, VecDeque<PortMessageTask>>,
+ ports: HashMap<MessagePortId, PortTransferInfo>,
) {
- for (port_id, mut previous_buffer) in ports.into_iter() {
+ for (port_id, mut transfer_info) in ports.into_iter() {
let entry = match self.message_ports.remove(&port_id) {
None => {
warn!(
@@ -2120,11 +2152,6 @@ where
Some(entry) => entry,
};
let new_info = match entry.state {
- TransferState::EntangledRemoved => {
- // If the entangled port has been removed while this one was in-transfer,
- // just drop it.
- continue;
- },
TransferState::CompletionFailed(mut current_buffer) => {
// The transfer failed,
// and now the global has returned us the buffer we previously sent.
@@ -2132,7 +2159,7 @@ where
// Tasks in the previous buffer are older,
// hence need to be added to the front of the current one.
- while let Some(task) = previous_buffer.pop_back() {
+ while let Some(task) = transfer_info.port_message_queue.pop_back() {
current_buffer.push_front(task);
}
// Update the state to transfer-in-progress.
@@ -2151,7 +2178,7 @@ where
// Tasks in the previous buffer are older,
// hence need to be added to the front of the current one.
- while let Some(task) = previous_buffer.pop_back() {
+ while let Some(task) = transfer_info.port_message_queue.pop_back() {
current_buffer.push_front(task);
}
// Forward the buffered message-queue to complete the current transfer.
@@ -2159,7 +2186,10 @@ where
if ipc_sender
.send(MessagePortMsg::CompletePendingTransfer(
port_id,
- current_buffer,
+ PortTransferInfo {
+ port_message_queue: current_buffer,
+ disentangled: entry.entangled_with.is_none(),
+ },
))
.is_err()
{
@@ -2206,18 +2236,14 @@ where
Some(entry) => entry,
};
let new_info = match entry.state {
- TransferState::EntangledRemoved => {
- // If the entangled port has been removed while this one was in-transfer,
- // remove it now.
- if let Some(ipc_sender) = self.message_port_routers.get(&router_id) {
- let _ = ipc_sender.send(MessagePortMsg::RemoveMessagePort(port_id));
- } else {
- warn!("No message-port sender for {:?}", router_id);
- }
- continue;
- },
TransferState::TransferInProgress(buffer) => {
- response.insert(port_id, buffer);
+ response.insert(
+ port_id,
+ PortTransferInfo {
+ port_message_queue: buffer,
+ disentangled: entry.entangled_with.is_none(),
+ },
+ );
// If the port was in transfer, and a global is requesting completion,
// we note the start of the completion.
@@ -2296,10 +2322,6 @@ where
TransferState::TransferInProgress(queue) => queue.push_back(task),
TransferState::CompletionFailed(queue) => queue.push_back(task),
TransferState::CompletionRequested(_, queue) => queue.push_back(task),
- TransferState::EntangledRemoved => warn!(
- "Messageport received a message, but entangled has alread been removed {:?}",
- port_id
- ),
}
}
@@ -2365,59 +2387,6 @@ where
feature = "tracing",
tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace")
)]
- fn handle_remove_messageport(&mut self, port_id: MessagePortId) {
- let entangled = match self.message_ports.remove(&port_id) {
- Some(info) => info.entangled_with,
- None => {
- return warn!(
- "Constellation asked to remove unknown messageport {:?}",
- port_id
- );
- },
- };
- let entangled_id = match entangled {
- Some(id) => id,
- None => return,
- };
- let info = match self.message_ports.get_mut(&entangled_id) {
- Some(info) => info,
- None => {
- return warn!(
- "Constellation asked to remove unknown entangled messageport {:?}",
- entangled_id
- );
- },
- };
- let router_id = match info.state {
- TransferState::EntangledRemoved => {
- return warn!(
- "Constellation asked to remove entangled messageport by a port that was already removed {:?}",
- port_id
- );
- },
- TransferState::TransferInProgress(_) |
- TransferState::CompletionInProgress(_) |
- TransferState::CompletionFailed(_) |
- TransferState::CompletionRequested(_, _) => {
- // Note: since the port is in-transer, we don't have a router to send it a message
- // to let it know that its entangled port has been removed.
- // Hence we mark it so that it will be messaged and removed once the transfer completes.
- info.state = TransferState::EntangledRemoved;
- return;
- },
- TransferState::Managed(router_id) => router_id,
- };
- if let Some(sender) = self.message_port_routers.get(&router_id) {
- let _ = sender.send(MessagePortMsg::RemoveMessagePort(entangled_id));
- } else {
- warn!("No message-port sender for {:?}", router_id);
- }
- }
-
- #[cfg_attr(
- feature = "tracing",
- tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace")
- )]
fn handle_entangle_messageports(&mut self, port1: MessagePortId, port2: MessagePortId) {
if let Some(info) = self.message_ports.get_mut(&port1) {
info.entangled_with = Some(port2);
@@ -2437,6 +2406,57 @@ where
}
}
+ #[cfg_attr(
+ feature = "tracing",
+ tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace")
+ )]
+ /// <https://html.spec.whatwg.org/multipage/#disentangle>
+ fn handle_disentangle_messageports(
+ &mut self,
+ port1: MessagePortId,
+ port2: Option<MessagePortId>,
+ ) {
+ // Disentangle initiatorPort and otherPort,
+ // so that they are no longer entangled or associated with each other.
+ // Note: If `port2` is some, then this is the first message
+ // and `port1` is the initiatorPort, `port2` is the otherPort.
+ // We can immediately remove the initiator.
+ let _ = self.message_ports.remove(&port1);
+
+ // Note: the none case is when otherPort sent this message
+ // in response to completing its own local disentanglement.
+ let Some(port2) = port2 else {
+ return;
+ };
+
+ // Start disentanglement of the other port.
+ if let Some(info) = self.message_ports.get_mut(&port2) {
+ info.entangled_with = None;
+ match &mut info.state {
+ TransferState::Managed(router_id) |
+ TransferState::CompletionInProgress(router_id) => {
+ // We try to disentangle the other port now,
+ // and if it has been transfered out by the time the message is received,
+ // it will be ignored,
+ // and disentanglement will be completed as part of the transfer.
+ if let Some(ipc_sender) = self.message_port_routers.get(router_id) {
+ let _ = ipc_sender.send(MessagePortMsg::CompleteDisentanglement(port2));
+ } else {
+ warn!("No message-port sender for {:?}", router_id);
+ }
+ },
+ _ => {
+ // Note: the port is in transfer, disentanglement will complete along with it.
+ },
+ }
+ } else {
+ warn!(
+ "Constellation asked to disentangle unknown messageport: {:?}",
+ port2
+ );
+ }
+ }
+
/// <https://w3c.github.io/ServiceWorker/#schedule-job-algorithm>
/// and
/// <https://w3c.github.io/ServiceWorker/#dfn-job-queue>
@@ -4070,6 +4090,7 @@ where
}
new_pipeline.set_throttled(false);
+ self.notify_focus_state(new_pipeline_id);
}
self.update_activity(old_pipeline_id);
@@ -4275,66 +4296,231 @@ where
feature = "tracing",
tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace")
)]
- fn handle_focus_msg(&mut self, pipeline_id: PipelineId) {
- let (browsing_context_id, webview_id) = match self.pipelines.get(&pipeline_id) {
- Some(pipeline) => (pipeline.browsing_context_id, pipeline.webview_id),
+ fn handle_focus_msg(
+ &mut self,
+ pipeline_id: PipelineId,
+ focused_child_browsing_context_id: Option<BrowsingContextId>,
+ sequence: FocusSequenceNumber,
+ ) {
+ let (browsing_context_id, webview_id) = match self.pipelines.get_mut(&pipeline_id) {
+ Some(pipeline) => {
+ pipeline.focus_sequence = sequence;
+ (pipeline.browsing_context_id, pipeline.webview_id)
+ },
None => return warn!("{}: Focus parent after closure", pipeline_id),
};
+ // Ignore if the pipeline isn't fully active.
+ if self.get_activity(pipeline_id) != DocumentActivity::FullyActive {
+ debug!(
+ "Ignoring the focus request because pipeline {} is not \
+ fully active",
+ pipeline_id
+ );
+ return;
+ }
+
// Focus the top-level browsing context.
self.webviews.focus(webview_id);
self.embedder_proxy
.send(EmbedderMsg::WebViewFocused(webview_id));
- // Update the webview’s focused browsing context.
- match self.webviews.get_mut(webview_id) {
- Some(webview) => {
- webview.focused_browsing_context_id = browsing_context_id;
- },
- None => {
- return warn!(
- "{}: Browsing context for focus msg does not exist",
- webview_id
- );
- },
+ // If a container with a non-null nested browsing context is focused,
+ // the nested browsing context's active document becomes the focused
+ // area of the top-level browsing context instead.
+ let focused_browsing_context_id =
+ focused_child_browsing_context_id.unwrap_or(browsing_context_id);
+
+ // Send focus messages to the affected pipelines, except
+ // `pipeline_id`, which has already its local focus state
+ // updated.
+ self.focus_browsing_context(Some(pipeline_id), focused_browsing_context_id);
+ }
+
+ fn handle_focus_remote_document_msg(&mut self, focused_browsing_context_id: BrowsingContextId) {
+ let pipeline_id = match self.browsing_contexts.get(&focused_browsing_context_id) {
+ Some(browsing_context) => browsing_context.pipeline_id,
+ None => return warn!("Browsing context {} not found", focused_browsing_context_id),
};
- // Focus parent iframes recursively
- self.focus_parent_pipeline(browsing_context_id);
+ // Ignore if its active document isn't fully active.
+ if self.get_activity(pipeline_id) != DocumentActivity::FullyActive {
+ debug!(
+ "Ignoring the remote focus request because pipeline {} of \
+ browsing context {} is not fully active",
+ pipeline_id, focused_browsing_context_id,
+ );
+ return;
+ }
+
+ self.focus_browsing_context(None, focused_browsing_context_id);
}
+ /// Perform [the focusing steps][1] for the active document of
+ /// `focused_browsing_context_id`.
+ ///
+ /// If `initiator_pipeline_id` is specified, this method avoids sending
+ /// a message to `initiator_pipeline_id`, assuming its local focus state has
+ /// already been updated. This is necessary for performing the focusing
+ /// steps for an object that is not the document itself but something that
+ /// belongs to the document.
+ ///
+ /// [1]: https://html.spec.whatwg.org/multipage/#focusing-steps
#[cfg_attr(
feature = "tracing",
tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace")
)]
- fn focus_parent_pipeline(&mut self, browsing_context_id: BrowsingContextId) {
- let parent_pipeline_id = match self.browsing_contexts.get(&browsing_context_id) {
- Some(ctx) => ctx.parent_pipeline_id,
- None => {
- return warn!("{}: Focus parent after closure", browsing_context_id);
- },
+ fn focus_browsing_context(
+ &mut self,
+ initiator_pipeline_id: Option<PipelineId>,
+ focused_browsing_context_id: BrowsingContextId,
+ ) {
+ let webview_id = match self.browsing_contexts.get(&focused_browsing_context_id) {
+ Some(browsing_context) => browsing_context.top_level_id,
+ None => return warn!("Browsing context {} not found", focused_browsing_context_id),
};
- let parent_pipeline_id = match parent_pipeline_id {
- Some(parent_id) => parent_id,
+
+ // Update the webview’s focused browsing context.
+ let old_focused_browsing_context_id = match self.webviews.get_mut(webview_id) {
+ Some(browser) => replace(
+ &mut browser.focused_browsing_context_id,
+ focused_browsing_context_id,
+ ),
None => {
- return debug!("{}: Focus has no parent", browsing_context_id);
+ return warn!(
+ "{}: Browsing context for focus msg does not exist",
+ webview_id
+ );
},
};
- // Send a message to the parent of the provided browsing context (if it
- // exists) telling it to mark the iframe element as focused.
- let msg = ScriptThreadMessage::FocusIFrame(parent_pipeline_id, browsing_context_id);
- let (result, parent_browsing_context_id) = match self.pipelines.get(&parent_pipeline_id) {
- Some(pipeline) => {
- let result = pipeline.event_loop.send(msg);
- (result, pipeline.browsing_context_id)
+ // The following part is similar to [the focus update steps][1] except
+ // that only `Document`s in the given focus chains are considered. It's
+ // ultimately up to the script threads to fire focus events at the
+ // affected objects.
+ //
+ // [1]: https://html.spec.whatwg.org/multipage/#focus-update-steps
+ let mut old_focus_chain_pipelines: Vec<&Pipeline> = self
+ .ancestor_or_self_pipelines_of_browsing_context_iter(old_focused_browsing_context_id)
+ .collect();
+ let mut new_focus_chain_pipelines: Vec<&Pipeline> = self
+ .ancestor_or_self_pipelines_of_browsing_context_iter(focused_browsing_context_id)
+ .collect();
+
+ debug!(
+ "old_focus_chain_pipelines = {:?}",
+ old_focus_chain_pipelines
+ .iter()
+ .map(|p| p.id.to_string())
+ .collect::<Vec<_>>()
+ );
+ debug!(
+ "new_focus_chain_pipelines = {:?}",
+ new_focus_chain_pipelines
+ .iter()
+ .map(|p| p.id.to_string())
+ .collect::<Vec<_>>()
+ );
+
+ // At least the last entries should match. Otherwise something is wrong,
+ // and we don't want to proceed and crash the top-level pipeline by
+ // sending an impossible `Unfocus` message to it.
+ match (
+ &old_focus_chain_pipelines[..],
+ &new_focus_chain_pipelines[..],
+ ) {
+ ([.., p1], [.., p2]) if p1.id == p2.id => {},
+ _ => {
+ warn!("Aborting the focus operation - focus chain sanity check failed");
+ return;
},
- None => return warn!("{}: Focus after closure", parent_pipeline_id),
- };
- if let Err(e) = result {
- self.handle_send_error(parent_pipeline_id, e);
}
- self.focus_parent_pipeline(parent_browsing_context_id);
+
+ // > If the last entry in `old chain` and the last entry in `new chain`
+ // > are the same, pop the last entry from `old chain` and the last
+ // > entry from `new chain` and redo this step.
+ let mut first_common_pipeline_in_chain = None;
+ while let ([.., p1], [.., p2]) = (
+ &old_focus_chain_pipelines[..],
+ &new_focus_chain_pipelines[..],
+ ) {
+ if p1.id != p2.id {
+ break;
+ }
+ old_focus_chain_pipelines.pop();
+ first_common_pipeline_in_chain = new_focus_chain_pipelines.pop();
+ }
+
+ let mut send_errors = Vec::new();
+
+ // > For each entry `entry` in `old chain`, in order, run these
+ // > substeps: [...]
+ for &pipeline in old_focus_chain_pipelines.iter() {
+ if Some(pipeline.id) != initiator_pipeline_id {
+ let msg = ScriptThreadMessage::Unfocus(pipeline.id, pipeline.focus_sequence);
+ trace!("Sending {:?} to {}", msg, pipeline.id);
+ if let Err(e) = pipeline.event_loop.send(msg) {
+ send_errors.push((pipeline.id, e));
+ }
+ } else {
+ trace!(
+ "Not notifying {} - it's the initiator of this focus operation",
+ pipeline.id
+ );
+ }
+ }
+
+ // > For each entry entry in `new chain`, in reverse order, run these
+ // > substeps: [...]
+ let mut child_browsing_context_id = None;
+ for &pipeline in new_focus_chain_pipelines.iter().rev() {
+ // Don't send a message to the browsing context that initiated this
+ // focus operation. It already knows that it has gotten focus.
+ if Some(pipeline.id) != initiator_pipeline_id {
+ let msg = if let Some(child_browsing_context_id) = child_browsing_context_id {
+ // Focus the container element of `child_browsing_context_id`.
+ ScriptThreadMessage::FocusIFrame(
+ pipeline.id,
+ child_browsing_context_id,
+ pipeline.focus_sequence,
+ )
+ } else {
+ // Focus the document.
+ ScriptThreadMessage::FocusDocument(pipeline.id, pipeline.focus_sequence)
+ };
+ trace!("Sending {:?} to {}", msg, pipeline.id);
+ if let Err(e) = pipeline.event_loop.send(msg) {
+ send_errors.push((pipeline.id, e));
+ }
+ } else {
+ trace!(
+ "Not notifying {} - it's the initiator of this focus operation",
+ pipeline.id
+ );
+ }
+ child_browsing_context_id = Some(pipeline.browsing_context_id);
+ }
+
+ if let (Some(pipeline), Some(child_browsing_context_id)) =
+ (first_common_pipeline_in_chain, child_browsing_context_id)
+ {
+ if Some(pipeline.id) != initiator_pipeline_id {
+ // Focus the container element of `child_browsing_context_id`.
+ let msg = ScriptThreadMessage::FocusIFrame(
+ pipeline.id,
+ child_browsing_context_id,
+ pipeline.focus_sequence,
+ );
+ trace!("Sending {:?} to {}", msg, pipeline.id);
+ if let Err(e) = pipeline.event_loop.send(msg) {
+ send_errors.push((pipeline.id, e));
+ }
+ }
+ }
+
+ for (pipeline_id, e) in send_errors {
+ self.handle_send_error(pipeline_id, e);
+ }
}
#[cfg_attr(
@@ -4929,10 +5115,42 @@ where
self.trim_history(top_level_id);
}
+ self.notify_focus_state(change.new_pipeline_id);
+
self.notify_history_changed(change.webview_id);
self.update_webview_in_compositor(change.webview_id);
}
+ /// Update the focus state of the specified pipeline that recently became
+ /// active (thus doesn't have a focused container element) and may have
+ /// out-dated information.
+ fn notify_focus_state(&mut self, pipeline_id: PipelineId) {
+ let pipeline = match self.pipelines.get(&pipeline_id) {
+ Some(pipeline) => pipeline,
+ None => return warn!("Pipeline {} is closed", pipeline_id),
+ };
+
+ let is_focused = match self.webviews.get(pipeline.webview_id) {
+ Some(webview) => webview.focused_browsing_context_id == pipeline.browsing_context_id,
+ None => {
+ return warn!(
+ "Pipeline {}'s top-level browsing context {} is closed",
+ pipeline_id, pipeline.webview_id
+ );
+ },
+ };
+
+ // If the browsing context is focused, focus the document
+ let msg = if is_focused {
+ ScriptThreadMessage::FocusDocument(pipeline_id, pipeline.focus_sequence)
+ } else {
+ ScriptThreadMessage::Unfocus(pipeline_id, pipeline.focus_sequence)
+ };
+ if let Err(e) = pipeline.event_loop.send(msg) {
+ self.handle_send_error(pipeline_id, e);
+ }
+ }
+
#[cfg_attr(
feature = "tracing",
tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace")
@@ -5382,7 +5600,29 @@ where
None => {
warn!("{parent_pipeline_id}: Child closed after parent");
},
- Some(parent_pipeline) => parent_pipeline.remove_child(browsing_context_id),
+ Some(parent_pipeline) => {
+ parent_pipeline.remove_child(browsing_context_id);
+
+ // If `browsing_context_id` has focus, focus the parent
+ // browsing context
+ if let Some(webview) = self.webviews.get_mut(browsing_context.top_level_id) {
+ if webview.focused_browsing_context_id == browsing_context_id {
+ trace!(
+ "About-to-be-closed browsing context {} is currently focused, so \
+ focusing its parent {}",
+ browsing_context_id, parent_pipeline.browsing_context_id
+ );
+ webview.focused_browsing_context_id =
+ parent_pipeline.browsing_context_id;
+ }
+ } else {
+ warn!(
+ "Browsing context {} contains a reference to \
+ a non-existent top-level browsing context {}",
+ browsing_context_id, browsing_context.top_level_id
+ );
+ }
+ },
};
}
debug!("{}: Closed", browsing_context_id);
diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs
index 2e139578ffe..556ef9bd60f 100644
--- a/components/constellation/pipeline.rs
+++ b/components/constellation/pipeline.rs
@@ -25,7 +25,7 @@ use constellation_traits::{LoadData, SWManagerMsg, ScriptToConstellationChan};
use crossbeam_channel::{Sender, unbounded};
use devtools_traits::{DevtoolsControlMsg, ScriptToDevtoolsControlMsg};
use embedder_traits::user_content_manager::UserContentManager;
-use embedder_traits::{AnimationState, ViewportDetails};
+use embedder_traits::{AnimationState, FocusSequenceNumber, ViewportDetails};
use fonts::{SystemFontServiceProxy, SystemFontServiceProxySender};
use ipc_channel::Error;
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
@@ -102,6 +102,8 @@ pub struct Pipeline {
/// The last compositor [`Epoch`] that was laid out in this pipeline if "exit after load" is
/// enabled.
pub layout_epoch: Epoch,
+
+ pub focus_sequence: FocusSequenceNumber,
}
/// Initial setup data needed to construct a pipeline.
@@ -370,6 +372,7 @@ impl Pipeline {
completely_loaded: false,
title: String::new(),
layout_epoch: Epoch(0),
+ focus_sequence: FocusSequenceNumber::default(),
};
pipeline.set_throttled(throttled);
diff --git a/components/constellation/tracing.rs b/components/constellation/tracing.rs
index a939bbafc48..eff7f755c6b 100644
--- a/components/constellation/tracing.rs
+++ b/components/constellation/tracing.rs
@@ -123,8 +123,8 @@ mod from_script {
Self::RemoveMessagePortRouter(..) => target!("RemoveMessagePortRouter"),
Self::RerouteMessagePort(..) => target!("RerouteMessagePort"),
Self::MessagePortShipped(..) => target!("MessagePortShipped"),
- Self::RemoveMessagePort(..) => target!("RemoveMessagePort"),
Self::EntanglePorts(..) => target!("EntanglePorts"),
+ Self::DisentanglePorts(..) => target!("DisentanglePorts"),
Self::NewBroadcastChannelRouter(..) => target!("NewBroadcastChannelRouter"),
Self::RemoveBroadcastChannelRouter(..) => target!("RemoveBroadcastChannelRouter"),
Self::NewBroadcastChannelNameInRouter(..) => {
@@ -138,7 +138,8 @@ mod from_script {
Self::BroadcastStorageEvent(..) => target!("BroadcastStorageEvent"),
Self::ChangeRunningAnimationsState(..) => target!("ChangeRunningAnimationsState"),
Self::CreateCanvasPaintThread(..) => target!("CreateCanvasPaintThread"),
- Self::Focus => target!("Focus"),
+ Self::Focus(..) => target!("Focus"),
+ Self::FocusRemoteDocument(..) => target!("FocusRemoteDocument"),
Self::GetTopForBrowsingContext(..) => target!("GetTopForBrowsingContext"),
Self::GetBrowsingContextInfo(..) => target!("GetBrowsingContextInfo"),
Self::GetChildBrowsingContextId(..) => target!("GetChildBrowsingContextId"),
diff --git a/components/devtools/actors/inspector/node.rs b/components/devtools/actors/inspector/node.rs
index 10ff9801844..a731f15b2d8 100644
--- a/components/devtools/actors/inspector/node.rs
+++ b/components/devtools/actors/inspector/node.rs
@@ -78,6 +78,18 @@ pub struct NodeActorMsg {
shadow_root_mode: Option<String>,
traits: HashMap<String, ()>,
attrs: Vec<AttrMsg>,
+
+ /// The `DOCTYPE` name if this is a `DocumentType` node, `None` otherwise
+ #[serde(skip_serializing_if = "Option::is_none")]
+ name: Option<String>,
+
+ /// The `DOCTYPE` public identifier if this is a `DocumentType` node, `None` otherwise
+ #[serde(skip_serializing_if = "Option::is_none")]
+ public_id: Option<String>,
+
+ /// The `DOCTYPE` system identifier if this is a `DocumentType` node, `None` otherwise
+ #[serde(skip_serializing_if = "Option::is_none")]
+ system_id: Option<String>,
}
pub struct NodeActor {
@@ -276,6 +288,9 @@ impl NodeInfoToProtocol for NodeInfo {
value: attr.value,
})
.collect(),
+ name: self.doctype_name,
+ public_id: self.doctype_public_identifier,
+ system_id: self.doctype_system_identifier,
}
}
}
diff --git a/components/layout/dom.rs b/components/layout/dom.rs
index add4b3ac2d5..8f2697e670a 100644
--- a/components/layout/dom.rs
+++ b/components/layout/dom.rs
@@ -15,8 +15,7 @@ use script_layout_interface::wrapper_traits::{
LayoutDataTrait, LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
};
use script_layout_interface::{
- GenericLayoutDataTrait, HTMLCanvasDataSource, LayoutElementType,
- LayoutNodeType as ScriptLayoutNodeType,
+ GenericLayoutDataTrait, LayoutElementType, LayoutNodeType as ScriptLayoutNodeType,
};
use servo_arc::Arc as ServoArc;
use style::properties::ComputedValues;
@@ -29,7 +28,7 @@ use crate::flow::BlockLevelBox;
use crate::flow::inline::InlineItem;
use crate::fragment_tree::Fragment;
use crate::geom::PhysicalSize;
-use crate::replaced::{CanvasInfo, CanvasSource};
+use crate::replaced::CanvasInfo;
use crate::table::TableLevelBox;
use crate::taffy::TaffyItemBox;
@@ -220,12 +219,7 @@ where
fn as_canvas(self) -> Option<(CanvasInfo, PhysicalSize<f64>)> {
let node = self.to_threadsafe();
let canvas_data = node.canvas_data()?;
- let source = match canvas_data.source {
- HTMLCanvasDataSource::WebGL(texture_id) => CanvasSource::WebGL(texture_id),
- HTMLCanvasDataSource::Image(image_key) => CanvasSource::Image(image_key),
- HTMLCanvasDataSource::WebGPU(image_key) => CanvasSource::WebGPU(image_key),
- HTMLCanvasDataSource::Empty => CanvasSource::Empty,
- };
+ let source = canvas_data.source;
Some((
CanvasInfo { source },
PhysicalSize::new(canvas_data.width.into(), canvas_data.height.into()),
diff --git a/components/layout/flexbox/layout.rs b/components/layout/flexbox/layout.rs
index 77069236787..a5540123681 100644
--- a/components/layout/flexbox/layout.rs
+++ b/components/layout/flexbox/layout.rs
@@ -1774,7 +1774,9 @@ impl FlexItem<'_> {
non_stretch_layout_result: Option<&mut FlexItemLayoutResult>,
) -> Option<FlexItemLayoutResult> {
let containing_block = flex_context.containing_block;
- let mut positioning_context = PositioningContext::new_for_style(self.box_.style())
+ let independent_formatting_context = &self.box_.independent_formatting_context;
+ let mut positioning_context = independent_formatting_context
+ .new_positioning_context()
.unwrap_or_else(|| {
PositioningContext::new_for_subtree(
flex_context
@@ -1783,7 +1785,6 @@ impl FlexItem<'_> {
)
});
- let independent_formatting_context = &self.box_.independent_formatting_context;
let item_writing_mode = independent_formatting_context.style().writing_mode;
let item_is_horizontal = item_writing_mode.is_horizontal();
let flex_axis = flex_context.config.flex_axis;
@@ -2616,7 +2617,9 @@ impl FlexItemBox {
cross_size_stretches_to_container_size: bool,
intrinsic_sizing_mode: IntrinsicSizingMode,
) -> Au {
- let mut positioning_context = PositioningContext::new_for_style(self.style())
+ let mut positioning_context = self
+ .independent_formatting_context
+ .new_positioning_context()
.unwrap_or_else(|| {
PositioningContext::new_for_subtree(
flex_context
diff --git a/components/layout/flow/float.rs b/components/layout/flow/float.rs
index 0570ce0d0f4..dbc50c07603 100644
--- a/components/layout/flow/float.rs
+++ b/components/layout/flow/float.rs
@@ -913,11 +913,10 @@ impl FloatBox {
positioning_context: &mut PositioningContext,
containing_block: &ContainingBlock,
) -> BoxFragment {
- let style = self.contents.style().clone();
positioning_context.layout_maybe_position_relative_fragment(
layout_context,
containing_block,
- &style,
+ &self.contents.base,
|positioning_context| {
self.contents
.layout_float_or_atomic_inline(
diff --git a/components/layout/flow/inline/line.rs b/components/layout/flow/inline/line.rs
index c42f32c9242..e65eaed2367 100644
--- a/components/layout/flow/inline/line.rs
+++ b/components/layout/flow/inline/line.rs
@@ -326,13 +326,12 @@ impl LineItemLayout<'_, '_> {
let inline_box = self.layout.ifc.inline_boxes.get(identifier);
let inline_box = &*(inline_box.borrow());
- let style = &inline_box.base.style;
let space_above_baseline = inline_box_state.calculate_space_above_baseline();
let block_start_offset =
self.calculate_inline_box_block_start(inline_box_state, space_above_baseline);
let positioning_context_or_start_offset_in_parent =
- match PositioningContext::new_for_style(style) {
+ match inline_box.base.new_positioning_context() {
Some(positioning_context) => Either::Left(positioning_context),
None => Either::Right(self.current_positioning_context_mut().len()),
};
diff --git a/components/layout/flow/inline/mod.rs b/components/layout/flow/inline/mod.rs
index dabb9773410..25fbaa324b1 100644
--- a/components/layout/flow/inline/mod.rs
+++ b/components/layout/flow/inline/mod.rs
@@ -2004,7 +2004,8 @@ impl IndependentFormattingContext {
bidi_level: Level,
) {
// We need to know the inline size of the atomic before deciding whether to do the line break.
- let mut child_positioning_context = PositioningContext::new_for_style(self.style())
+ let mut child_positioning_context = self
+ .new_positioning_context()
.unwrap_or_else(|| PositioningContext::new_for_subtree(true));
let IndependentFloatOrAtomicLayoutResult {
mut fragment,
diff --git a/components/layout/flow/mod.rs b/components/layout/flow/mod.rs
index d983e8592c4..983282dc389 100644
--- a/components/layout/flow/mod.rs
+++ b/components/layout/flow/mod.rs
@@ -779,7 +779,7 @@ impl BlockLevelBox {
ArcRefCell::new(positioning_context.layout_maybe_position_relative_fragment(
layout_context,
containing_block,
- &base.style,
+ base,
|positioning_context| {
layout_in_flow_non_replaced_block_level_same_formatting_context(
layout_context,
@@ -798,7 +798,7 @@ impl BlockLevelBox {
positioning_context.layout_maybe_position_relative_fragment(
layout_context,
containing_block,
- independent.style(),
+ &independent.base,
|positioning_context| {
independent.layout_in_flow_block_level(
layout_context,
diff --git a/components/layout/positioned.rs b/components/layout/positioned.rs
index 5f08e4e86c5..6bfe2af87ef 100644
--- a/components/layout/positioned.rs
+++ b/components/layout/positioned.rs
@@ -29,6 +29,7 @@ use crate::geom::{
PhysicalPoint, PhysicalRect, PhysicalSides, PhysicalSize, PhysicalVec, Size, Sizes, ToLogical,
ToLogicalWithContainingBlock,
};
+use crate::layout_box_base::LayoutBoxBase;
use crate::sizing::ContentSizes;
use crate::style_ext::{Clamp, ComputedValuesExt, ContentBoxSizesAndPBM, DisplayInside};
use crate::{
@@ -103,6 +104,20 @@ impl AbsolutelyPositionedBox {
}
}
+impl IndependentFormattingContext {
+ #[inline]
+ pub(crate) fn new_positioning_context(&self) -> Option<PositioningContext> {
+ self.base.new_positioning_context()
+ }
+}
+
+impl LayoutBoxBase {
+ #[inline]
+ pub(crate) fn new_positioning_context(&self) -> Option<PositioningContext> {
+ PositioningContext::new_for_style(&self.style, &self.base_fragment_info.flags)
+ }
+}
+
impl PositioningContext {
pub(crate) fn new_for_containing_block_for_all_descendants() -> Self {
Self {
@@ -130,14 +145,10 @@ impl PositioningContext {
self.for_nearest_positioned_ancestor.is_some()
}
- pub(crate) fn new_for_style(style: &ComputedValues) -> Option<Self> {
- // NB: We never make PositioningContexts for replaced elements, which is why we always
- // pass false here.
- if style.establishes_containing_block_for_all_descendants(FragmentFlags::empty()) {
+ fn new_for_style(style: &ComputedValues, flags: &FragmentFlags) -> Option<Self> {
+ if style.establishes_containing_block_for_all_descendants(*flags) {
Some(Self::new_for_containing_block_for_all_descendants())
- } else if style
- .establishes_containing_block_for_absolute_descendants(FragmentFlags::empty())
- {
+ } else if style.establishes_containing_block_for_absolute_descendants(*flags) {
Some(Self {
for_nearest_positioned_ancestor: Some(Vec::new()),
for_nearest_containing_block_for_all_descendants: Vec::new(),
@@ -213,12 +224,12 @@ impl PositioningContext {
&mut self,
layout_context: &LayoutContext,
containing_block: &ContainingBlock,
- style: &ComputedValues,
+ base: &LayoutBoxBase,
fragment_layout_fn: impl FnOnce(&mut Self) -> BoxFragment,
) -> BoxFragment {
// Try to create a context, but if one isn't necessary, simply create the fragment
// using the given closure and the current `PositioningContext`.
- let mut new_context = match Self::new_for_style(style) {
+ let mut new_context = match base.new_positioning_context() {
Some(new_context) => new_context,
None => return fragment_layout_fn(self),
};
@@ -229,9 +240,8 @@ impl PositioningContext {
// If the new context has any hoisted boxes for the nearest containing block for
// pass them up the tree.
self.append(new_context);
-
- if style.clone_position() == Position::Relative {
- new_fragment.content_rect.origin += relative_adjustement(style, containing_block)
+ if base.style.clone_position() == Position::Relative {
+ new_fragment.content_rect.origin += relative_adjustement(&base.style, containing_block)
.to_physical_vector(containing_block.style.writing_mode)
}
@@ -586,7 +596,7 @@ impl HoistedAbsolutelyPositionedBox {
.sizes
}));
- let mut positioning_context = PositioningContext::new_for_style(&style).unwrap();
+ let mut positioning_context = context.new_positioning_context().unwrap();
let mut new_fragment = {
let content_size: LogicalVec2<Au>;
let fragments;
diff --git a/components/layout/replaced.rs b/components/layout/replaced.rs
index b82fb947074..bbebc57aa97 100644
--- a/components/layout/replaced.rs
+++ b/components/layout/replaced.rs
@@ -3,7 +3,6 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use std::cell::LazyCell;
-use std::fmt;
use std::sync::Arc;
use app_units::Au;
@@ -96,33 +95,9 @@ impl NaturalSizes {
}
}
-#[derive(MallocSizeOf)]
-pub(crate) enum CanvasSource {
- WebGL(ImageKey),
- Image(ImageKey),
- WebGPU(ImageKey),
- /// transparent black
- Empty,
-}
-
-impl fmt::Debug for CanvasSource {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(
- f,
- "{}",
- match *self {
- CanvasSource::WebGL(_) => "WebGL",
- CanvasSource::Image(_) => "Image",
- CanvasSource::WebGPU(_) => "WebGPU",
- CanvasSource::Empty => "Empty",
- }
- )
- }
-}
-
#[derive(Debug, MallocSizeOf)]
pub(crate) struct CanvasInfo {
- pub source: CanvasSource,
+ pub source: Option<ImageKey>,
}
#[derive(Debug, MallocSizeOf)]
@@ -388,12 +363,10 @@ impl ReplacedContents {
return vec![];
}
- let image_key = match canvas_info.source {
- CanvasSource::WebGL(image_key) => image_key,
- CanvasSource::WebGPU(image_key) => image_key,
- CanvasSource::Image(image_key) => image_key,
- CanvasSource::Empty => return vec![],
+ let Some(image_key) = canvas_info.source else {
+ return vec![];
};
+
vec![Fragment::Image(ArcRefCell::new(ImageFragment {
base: self.base_fragment_info.into(),
style: style.clone(),
diff --git a/components/layout/style_ext.rs b/components/layout/style_ext.rs
index 33a22cdf438..023db6b07f1 100644
--- a/components/layout/style_ext.rs
+++ b/components/layout/style_ext.rs
@@ -845,9 +845,9 @@ impl ComputedValuesExt for ComputedValues {
// > A value other than none for the filter property results in the creation of a containing
// > block for absolute and fixed positioned descendants unless the element it applies to is
// > a document root element in the current browsing context.
- // FIXME(#35391): Need to check if this is the root element.
- if !self.get_effects().filter.0.is_empty() ||
- will_change_bits.intersects(WillChangeBits::FIXPOS_CB_NON_SVG)
+ if !fragment_flags.contains(FragmentFlags::IS_ROOT_ELEMENT) &&
+ (!self.get_effects().filter.0.is_empty() ||
+ will_change_bits.intersects(WillChangeBits::FIXPOS_CB_NON_SVG))
{
return true;
}
diff --git a/components/layout/table/construct.rs b/components/layout/table/construct.rs
index f20360d3b56..56e11320be4 100644
--- a/components/layout/table/construct.rs
+++ b/components/layout/table/construct.rs
@@ -1019,15 +1019,16 @@ where
DisplayLayoutInternal::TableCell => {
// This value will already have filtered out rowspan=0
// in quirks mode, so we don't have to worry about that.
- //
- // The HTML specification limits the parsed value of `rowspan` to
- // 65534 and `colspan` to 1000, so we also enforce the same limits
- // when dealing with arbitrary DOM elements (perhaps created via
- // script).
let (rowspan, colspan) = if info.pseudo_element_type.is_none() {
let node = info.node.to_threadsafe();
- let rowspan = node.get_rowspan().unwrap_or(1).min(65534) as usize;
- let colspan = node.get_colspan().unwrap_or(1).min(1000) as usize;
+ let rowspan = node.get_rowspan().unwrap_or(1) as usize;
+ let colspan = node.get_colspan().unwrap_or(1) as usize;
+
+ // The HTML specification clamps value of `rowspan` to [0, 65534] and
+ // `colspan` to [1, 1000].
+ assert!((1..=1000).contains(&colspan));
+ assert!((0..=65534).contains(&rowspan));
+
(rowspan, colspan)
} else {
(1, 1)
@@ -1140,21 +1141,19 @@ fn add_column<'dom, Node: NodeExt<'dom>>(
is_anonymous: bool,
) -> ArcRefCell<TableTrack> {
let span = if column_info.pseudo_element_type.is_none() {
- column_info
- .node
- .to_threadsafe()
- .get_span()
- .unwrap_or(1)
- .min(1000) as usize
+ column_info.node.to_threadsafe().get_span().unwrap_or(1)
} else {
1
};
+ // The HTML specification clamps value of `span` for `<col>` to [1, 1000].
+ assert!((1..=1000).contains(&span));
+
let column = ArcRefCell::new(TableTrack {
base: LayoutBoxBase::new(column_info.into(), column_info.style.clone()),
group_index,
is_anonymous,
});
- collection.extend(repeat(column.clone()).take(span));
+ collection.extend(repeat(column.clone()).take(span as usize));
column
}
diff --git a/components/layout/table/layout.rs b/components/layout/table/layout.rs
index 2261f7d165c..0cbe3e9ca76 100644
--- a/components/layout/table/layout.rs
+++ b/components/layout/table/layout.rs
@@ -1503,7 +1503,7 @@ impl<'a> TableLayout<'a> {
layout_context: &LayoutContext,
parent_positioning_context: &mut PositioningContext,
) -> BoxFragment {
- let mut positioning_context = PositioningContext::new_for_style(caption.context.style());
+ let mut positioning_context = caption.context.new_positioning_context();
let containing_block = &ContainingBlock {
size: ContainingBlockSize {
inline: self.table_width + self.pbm.padding_border_sums.inline,
@@ -2325,7 +2325,7 @@ impl<'a> RowFragmentLayout<'a> {
Self {
row: table_row,
rect,
- positioning_context: PositioningContext::new_for_style(&table_row.base.style),
+ positioning_context: table_row.base.new_positioning_context(),
containing_block,
fragments: Vec::new(),
}
@@ -2410,7 +2410,7 @@ impl RowGroupFragmentLayout {
let row_group = row_group.borrow();
(
dimensions.get_row_group_rect(&row_group),
- PositioningContext::new_for_style(&row_group.base.style),
+ row_group.base.new_positioning_context(),
)
};
Self {
diff --git a/components/layout/taffy/layout.rs b/components/layout/taffy/layout.rs
index a7581136bf2..3777c902053 100644
--- a/components/layout/taffy/layout.rs
+++ b/components/layout/taffy/layout.rs
@@ -251,8 +251,9 @@ impl taffy::LayoutPartialTree for TaffyContainerContext<'_> {
style,
};
let layout = {
- let mut child_positioning_context =
- PositioningContext::new_for_style(style).unwrap_or_else(|| {
+ let mut child_positioning_context = independent_context
+ .new_positioning_context()
+ .unwrap_or_else(|| {
PositioningContext::new_for_subtree(
self.positioning_context
.collects_for_nearest_positioned_ancestor(),
diff --git a/components/net/async_runtime.rs b/components/net/async_runtime.rs
index c99068b1076..909bdef8fb0 100644
--- a/components/net/async_runtime.rs
+++ b/components/net/async_runtime.rs
@@ -2,31 +2,27 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use std::cmp::Ord;
+use std::sync::LazyLock;
use std::sync::atomic::{AtomicUsize, Ordering};
-use std::sync::{LazyLock, Mutex};
use std::thread;
use tokio::runtime::{Builder, Runtime};
-pub static HANDLE: LazyLock<Mutex<Option<Runtime>>> = LazyLock::new(|| {
- Mutex::new(Some(
- Builder::new_multi_thread()
- .thread_name_fn(|| {
- static ATOMIC_ID: AtomicUsize = AtomicUsize::new(0);
- let id = ATOMIC_ID.fetch_add(1, Ordering::Relaxed);
- format!("tokio-runtime-{}", id)
- })
- .worker_threads(
- thread::available_parallelism()
- .map(|i| i.get())
- .unwrap_or(servo_config::pref!(threadpools_fallback_worker_num) as usize)
- .min(
- servo_config::pref!(threadpools_async_runtime_workers_max).max(1) as usize,
- ),
- )
- .enable_io()
- .enable_time()
- .build()
- .unwrap(),
- ))
+pub static HANDLE: LazyLock<Runtime> = LazyLock::new(|| {
+ Builder::new_multi_thread()
+ .thread_name_fn(|| {
+ static ATOMIC_ID: AtomicUsize = AtomicUsize::new(0);
+ let id = ATOMIC_ID.fetch_add(1, Ordering::Relaxed);
+ format!("tokio-runtime-{}", id)
+ })
+ .worker_threads(
+ thread::available_parallelism()
+ .map(|i| i.get())
+ .unwrap_or(servo_config::pref!(threadpools_fallback_worker_num) as usize)
+ .min(servo_config::pref!(threadpools_async_runtime_workers_max).max(1) as usize),
+ )
+ .enable_io()
+ .enable_time()
+ .build()
+ .expect("Unable to build tokio-runtime runtime")
});
diff --git a/components/net/connector.rs b/components/net/connector.rs
index 12d0638d84d..e02ff8971e3 100644
--- a/components/net/connector.rs
+++ b/components/net/connector.rs
@@ -165,7 +165,7 @@ where
F: Future<Output = ()> + 'static + std::marker::Send,
{
fn execute(&self, fut: F) {
- HANDLE.lock().unwrap().as_ref().unwrap().spawn(fut);
+ HANDLE.spawn(fut);
}
}
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs
index 35624bb8645..e0867b8d07f 100644
--- a/components/net/http_loader.rs
+++ b/components/net/http_loader.rs
@@ -493,7 +493,7 @@ impl BodySink {
match self {
BodySink::Chunked(sender) => {
let sender = sender.clone();
- HANDLE.lock().unwrap().as_mut().unwrap().spawn(async move {
+ HANDLE.spawn(async move {
let _ = sender.send(Ok(Frame::data(bytes.into()))).await;
});
},
@@ -2016,7 +2016,7 @@ async fn http_network_fetch(
let url1 = request.url();
let url2 = url1.clone();
- HANDLE.lock().unwrap().as_ref().unwrap().spawn(
+ HANDLE.spawn(
res.into_body()
.map_err(|e| {
warn!("Error streaming response body: {:?}", e);
diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs
index b6f885f29b7..5d1ede28c32 100644
--- a/components/net/resource_thread.rs
+++ b/components/net/resource_thread.rs
@@ -771,7 +771,7 @@ impl CoreResourceManager {
_ => (FileTokenCheck::NotRequired, None),
};
- HANDLE.lock().unwrap().as_ref().unwrap().spawn(async move {
+ HANDLE.spawn(async move {
// XXXManishearth: Check origin against pipeline id (also ensure that the mode is allowed)
// todo load context / mimesniff in fetch
// todo referrer policy?
diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs
index 95f66558482..128436ac47c 100644
--- a/components/net/websocket_loader.rs
+++ b/components/net/websocket_loader.rs
@@ -418,24 +418,21 @@ fn connect(
tls_config.alpn_protocols = vec!["http/1.1".to_string().into()];
let resource_event_sender2 = resource_event_sender.clone();
- match HANDLE.lock().unwrap().as_mut() {
- Some(handle) => handle.spawn(
- start_websocket(
- http_state,
- req_url.clone(),
- resource_event_sender,
- protocols,
- client,
- tls_config,
- dom_action_receiver,
- )
- .map_err(move |e| {
- warn!("Failed to establish a WebSocket connection: {:?}", e);
- let _ = resource_event_sender2.send(WebSocketNetworkEvent::Fail);
- }),
- ),
- None => return Err("No runtime available".to_string()),
- };
+ HANDLE.spawn(
+ start_websocket(
+ http_state,
+ req_url.clone(),
+ resource_event_sender,
+ protocols,
+ client,
+ tls_config,
+ dom_action_receiver,
+ )
+ .map_err(move |e| {
+ warn!("Failed to establish a WebSocket connection: {:?}", e);
+ let _ = resource_event_sender2.send(WebSocketNetworkEvent::Fail);
+ }),
+ );
Ok(())
}
diff --git a/components/script/canvas_context.rs b/components/script/canvas_context.rs
index d49d31997e1..0a7545e9594 100644
--- a/components/script/canvas_context.rs
+++ b/components/script/canvas_context.rs
@@ -5,16 +5,23 @@
//! Common interfaces for Canvas Contexts
use euclid::default::Size2D;
-use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource};
+use script_bindings::root::Dom;
+use script_layout_interface::HTMLCanvasData;
use snapshot::Snapshot;
+use webrender_api::ImageKey;
use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanvas;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::node::{Node, NodeDamage};
+use crate::dom::types::{
+ CanvasRenderingContext2D, GPUCanvasContext, OffscreenCanvas, OffscreenCanvasRenderingContext2D,
+ WebGL2RenderingContext, WebGLRenderingContext,
+};
pub(crate) trait LayoutCanvasRenderingContextHelpers {
- fn canvas_data_source(self) -> HTMLCanvasDataSource;
+ /// `None` is rendered as transparent black (cleared canvas)
+ fn canvas_data_source(self) -> Option<ImageKey>;
}
pub(crate) trait LayoutHTMLCanvasElementHelpers {
@@ -85,3 +92,180 @@ impl CanvasHelpers for HTMLCanvasElementOrOffscreenCanvas {
}
}
}
+
+/// Non rooted variant of [`crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::RenderingContext`]
+#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
+#[derive(Clone, JSTraceable, MallocSizeOf)]
+pub(crate) enum RenderingContext {
+ Placeholder(Dom<OffscreenCanvas>),
+ Context2d(Dom<CanvasRenderingContext2D>),
+ WebGL(Dom<WebGLRenderingContext>),
+ WebGL2(Dom<WebGL2RenderingContext>),
+ #[cfg(feature = "webgpu")]
+ WebGPU(Dom<GPUCanvasContext>),
+}
+
+impl CanvasContext for RenderingContext {
+ type ID = ();
+
+ fn context_id(&self) -> Self::ID {}
+
+ fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).canvas(),
+ RenderingContext::Context2d(context) => context.canvas(),
+ RenderingContext::WebGL(context) => context.canvas(),
+ RenderingContext::WebGL2(context) => context.canvas(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.canvas(),
+ }
+ }
+
+ fn resize(&self) {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).resize(),
+ RenderingContext::Context2d(context) => context.resize(),
+ RenderingContext::WebGL(context) => context.resize(),
+ RenderingContext::WebGL2(context) => context.resize(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.resize(),
+ }
+ }
+
+ fn get_image_data(&self) -> Option<Snapshot> {
+ match self {
+ RenderingContext::Placeholder(context) => {
+ (*context.context().unwrap()).get_image_data()
+ },
+ RenderingContext::Context2d(context) => context.get_image_data(),
+ RenderingContext::WebGL(context) => context.get_image_data(),
+ RenderingContext::WebGL2(context) => context.get_image_data(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.get_image_data(),
+ }
+ }
+
+ fn origin_is_clean(&self) -> bool {
+ match self {
+ RenderingContext::Placeholder(context) => {
+ (*context.context().unwrap()).origin_is_clean()
+ },
+ RenderingContext::Context2d(context) => context.origin_is_clean(),
+ RenderingContext::WebGL(context) => context.origin_is_clean(),
+ RenderingContext::WebGL2(context) => context.origin_is_clean(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.origin_is_clean(),
+ }
+ }
+
+ fn size(&self) -> Size2D<u64> {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).size(),
+ RenderingContext::Context2d(context) => context.size(),
+ RenderingContext::WebGL(context) => context.size(),
+ RenderingContext::WebGL2(context) => context.size(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.size(),
+ }
+ }
+
+ fn mark_as_dirty(&self) {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).mark_as_dirty(),
+ RenderingContext::Context2d(context) => context.mark_as_dirty(),
+ RenderingContext::WebGL(context) => context.mark_as_dirty(),
+ RenderingContext::WebGL2(context) => context.mark_as_dirty(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.mark_as_dirty(),
+ }
+ }
+
+ fn update_rendering(&self) {
+ match self {
+ RenderingContext::Placeholder(context) => {
+ (*context.context().unwrap()).update_rendering()
+ },
+ RenderingContext::Context2d(context) => context.update_rendering(),
+ RenderingContext::WebGL(context) => context.update_rendering(),
+ RenderingContext::WebGL2(context) => context.update_rendering(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.update_rendering(),
+ }
+ }
+
+ fn onscreen(&self) -> bool {
+ match self {
+ RenderingContext::Placeholder(context) => (*context.context().unwrap()).onscreen(),
+ RenderingContext::Context2d(context) => context.onscreen(),
+ RenderingContext::WebGL(context) => context.onscreen(),
+ RenderingContext::WebGL2(context) => context.onscreen(),
+ #[cfg(feature = "webgpu")]
+ RenderingContext::WebGPU(context) => context.onscreen(),
+ }
+ }
+}
+
+/// Non rooted variant of [`crate::dom::bindings::codegen::Bindings::OffscreenCanvasBinding::OffscreenRenderingContext`]
+#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
+#[derive(Clone, JSTraceable, MallocSizeOf)]
+pub(crate) enum OffscreenRenderingContext {
+ Context2d(Dom<OffscreenCanvasRenderingContext2D>),
+ //WebGL(Dom<WebGLRenderingContext>),
+ //WebGL2(Dom<WebGL2RenderingContext>),
+ //#[cfg(feature = "webgpu")]
+ //WebGPU(Dom<GPUCanvasContext>),
+}
+
+impl CanvasContext for OffscreenRenderingContext {
+ type ID = ();
+
+ fn context_id(&self) -> Self::ID {}
+
+ fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.canvas(),
+ }
+ }
+
+ fn resize(&self) {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.resize(),
+ }
+ }
+
+ fn get_image_data(&self) -> Option<Snapshot> {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.get_image_data(),
+ }
+ }
+
+ fn origin_is_clean(&self) -> bool {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.origin_is_clean(),
+ }
+ }
+
+ fn size(&self) -> Size2D<u64> {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.size(),
+ }
+ }
+
+ fn mark_as_dirty(&self) {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.mark_as_dirty(),
+ }
+ }
+
+ fn update_rendering(&self) {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.update_rendering(),
+ }
+ }
+
+ fn onscreen(&self) -> bool {
+ match self {
+ OffscreenRenderingContext::Context2d(context) => context.onscreen(),
+ }
+ }
+}
diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs
index e9892818e92..dabe6a5728b 100644
--- a/components/script/canvas_state.rs
+++ b/components/script/canvas_state.rs
@@ -36,6 +36,7 @@ use style_traits::{CssWriter, ParsingMode};
use url::Url;
use webrender_api::ImageKey;
+use crate::canvas_context::{OffscreenRenderingContext, RenderingContext};
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::{
CanvasDirection, CanvasFillRule, CanvasImageSource, CanvasLineCap, CanvasLineJoin,
@@ -52,10 +53,10 @@ use crate::dom::canvaspattern::CanvasPattern;
use crate::dom::dommatrix::DOMMatrix;
use crate::dom::element::{Element, cors_setting_for_element};
use crate::dom::globalscope::GlobalScope;
-use crate::dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement};
+use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::imagedata::ImageData;
use crate::dom::node::{Node, NodeTraits};
-use crate::dom::offscreencanvas::{OffscreenCanvas, OffscreenCanvasContext};
+use crate::dom::offscreencanvas::OffscreenCanvas;
use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope;
use crate::dom::textmetrics::TextMetrics;
use crate::script_runtime::CanGc;
@@ -522,7 +523,7 @@ impl CanvasState {
if let Some(context) = canvas.context() {
match *context {
- OffscreenCanvasContext::OffscreenContext2d(ref context) => {
+ OffscreenRenderingContext::Context2d(ref context) => {
context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
self.get_canvas_id(),
image_size,
@@ -577,7 +578,7 @@ impl CanvasState {
if let Some(context) = canvas.context() {
match *context {
- CanvasContext::Context2d(ref context) => {
+ RenderingContext::Context2d(ref context) => {
context.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
self.get_canvas_id(),
image_size,
@@ -586,12 +587,12 @@ impl CanvasState {
smoothing_enabled,
));
},
- CanvasContext::Placeholder(ref context) => {
+ RenderingContext::Placeholder(ref context) => {
let Some(context) = context.context() else {
return Err(Error::InvalidState);
};
match *context {
- OffscreenCanvasContext::OffscreenContext2d(ref context) => context
+ OffscreenRenderingContext::Context2d(ref context) => context
.send_canvas_2d_msg(Canvas2dMsg::DrawImageInOther(
self.get_canvas_id(),
image_size,
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 38bd38ad511..046d478e49d 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -7,9 +7,9 @@ use dom_struct::dom_struct;
use euclid::default::Size2D;
use profile_traits::ipc;
use script_bindings::inheritance::Castable;
-use script_layout_interface::HTMLCanvasDataSource;
use servo_url::ServoUrl;
use snapshot::Snapshot;
+use webrender_api::ImageKey;
use crate::canvas_context::{CanvasContext, CanvasHelpers, LayoutCanvasRenderingContextHelpers};
use crate::canvas_state::CanvasState;
@@ -98,13 +98,13 @@ impl CanvasRenderingContext2D {
}
impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, CanvasRenderingContext2D> {
- fn canvas_data_source(self) -> HTMLCanvasDataSource {
+ fn canvas_data_source(self) -> Option<ImageKey> {
let canvas_state = &self.unsafe_get().canvas_state;
if canvas_state.is_paintable() {
- HTMLCanvasDataSource::Image(canvas_state.image_key())
+ Some(canvas_state.image_key())
} else {
- HTMLCanvasDataSource::Empty
+ None
}
}
}
diff --git a/components/script/dom/dissimilaroriginwindow.rs b/components/script/dom/dissimilaroriginwindow.rs
index b7fbe0855fe..70c384db822 100644
--- a/components/script/dom/dissimilaroriginwindow.rs
+++ b/components/script/dom/dissimilaroriginwindow.rs
@@ -181,12 +181,13 @@ impl DissimilarOriginWindowMethods<crate::DomTypeHolder> for DissimilarOriginWin
// https://html.spec.whatwg.org/multipage/#dom-window-blur
fn Blur(&self) {
- // TODO: Implement x-origin blur
+ // > User agents are encouraged to ignore calls to this `blur()` method
+ // > entirely.
}
- // https://html.spec.whatwg.org/multipage/#dom-focus
+ // https://html.spec.whatwg.org/multipage/#dom-window-focus
fn Focus(&self) {
- // TODO: Implement x-origin focus
+ self.window_proxy().focus();
}
// https://html.spec.whatwg.org/multipage/#dom-location
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 1e2a3747751..2baab15e1b8 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -30,8 +30,8 @@ use devtools_traits::ScriptToDevtoolsControlMsg;
use dom_struct::dom_struct;
use embedder_traits::{
AllowOrDeny, AnimationState, CompositorHitTestResult, ContextMenuResult, EditingActionEvent,
- EmbedderMsg, ImeEvent, InputEvent, LoadStatus, MouseButton, MouseButtonAction,
- MouseButtonEvent, TouchEvent, TouchEventType, TouchId, WheelEvent,
+ EmbedderMsg, FocusSequenceNumber, ImeEvent, InputEvent, LoadStatus, MouseButton,
+ MouseButtonAction, MouseButtonEvent, TouchEvent, TouchEventType, TouchId, WheelEvent,
};
use encoding_rs::{Encoding, UTF_8};
use euclid::default::{Point2D, Rect, Size2D};
@@ -270,12 +270,11 @@ pub(crate) enum IsHTMLDocument {
#[derive(JSTraceable, MallocSizeOf)]
#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
-enum FocusTransaction {
- /// No focus operation is in effect.
- NotInTransaction,
- /// A focus operation is in effect.
- /// Contains the element that has most recently requested focus for itself.
- InTransaction(Option<Dom<Element>>),
+struct FocusTransaction {
+ /// The focused element of this document.
+ element: Option<Dom<Element>>,
+ /// See [`Document::has_focus`].
+ has_focus: bool,
}
/// Information about a declarative refresh
@@ -341,9 +340,16 @@ pub(crate) struct Document {
/// Whether the DOMContentLoaded event has already been dispatched.
domcontentloaded_dispatched: Cell<bool>,
/// The state of this document's focus transaction.
- focus_transaction: DomRefCell<FocusTransaction>,
+ focus_transaction: DomRefCell<Option<FocusTransaction>>,
/// The element that currently has the document focus context.
focused: MutNullableDom<Element>,
+ /// The last sequence number sent to the constellation.
+ #[no_trace]
+ focus_sequence: Cell<FocusSequenceNumber>,
+ /// Indicates whether the container is included in the top-level browsing
+ /// context's focus chain (not considering system focus). Permanently `true`
+ /// for a top-level document.
+ has_focus: Cell<bool>,
/// The script element that is currently executing.
current_script: MutNullableDom<HTMLScriptElement>,
/// <https://html.spec.whatwg.org/multipage/#pending-parsing-blocking-script>
@@ -1120,122 +1126,318 @@ impl Document {
self.focused.get()
}
+ /// Get the last sequence number sent to the constellation.
+ ///
+ /// Received focus-related messages with sequence numbers less than the one
+ /// returned by this method must be discarded.
+ pub fn get_focus_sequence(&self) -> FocusSequenceNumber {
+ self.focus_sequence.get()
+ }
+
+ /// Generate the next sequence number for focus-related messages.
+ fn increment_fetch_focus_sequence(&self) -> FocusSequenceNumber {
+ self.focus_sequence.set(FocusSequenceNumber(
+ self.focus_sequence
+ .get()
+ .0
+ .checked_add(1)
+ .expect("too many focus messages have been sent"),
+ ));
+ self.focus_sequence.get()
+ }
+
/// Initiate a new round of checking for elements requesting focus. The last element to call
/// `request_focus` before `commit_focus_transaction` is called will receive focus.
fn begin_focus_transaction(&self) {
- *self.focus_transaction.borrow_mut() = FocusTransaction::InTransaction(Default::default());
+ // Initialize it with the current state
+ *self.focus_transaction.borrow_mut() = Some(FocusTransaction {
+ element: self.focused.get().as_deref().map(Dom::from_ref),
+ has_focus: self.has_focus.get(),
+ });
}
/// <https://html.spec.whatwg.org/multipage/#focus-fixup-rule>
pub(crate) fn perform_focus_fixup_rule(&self, not_focusable: &Element, can_gc: CanGc) {
+ // Return if `not_focusable` is not the designated focused area of the
+ // `Document`.
if Some(not_focusable) != self.focused.get().as_deref() {
return;
}
- self.request_focus(
- self.GetBody().as_ref().map(|e| e.upcast()),
- FocusType::Element,
- can_gc,
- )
+
+ let implicit_transaction = self.focus_transaction.borrow().is_none();
+
+ if implicit_transaction {
+ self.begin_focus_transaction();
+ }
+
+ // Designate the viewport as the new focused area of the `Document`, but
+ // do not run the focusing steps.
+ {
+ let mut focus_transaction = self.focus_transaction.borrow_mut();
+ focus_transaction.as_mut().unwrap().element = None;
+ }
+
+ if implicit_transaction {
+ self.commit_focus_transaction(FocusInitiator::Local, can_gc);
+ }
}
- /// Request that the given element receive focus once the current transaction is complete.
- /// If None is passed, then whatever element is currently focused will no longer be focused
- /// once the transaction is complete.
+ /// Request that the given element receive focus once the current
+ /// transaction is complete. `None` specifies to focus the document.
+ ///
+ /// If there's no ongoing transaction, this method automatically starts and
+ /// commits an implicit transaction.
pub(crate) fn request_focus(
&self,
elem: Option<&Element>,
- focus_type: FocusType,
+ focus_initiator: FocusInitiator,
can_gc: CanGc,
) {
- let implicit_transaction = matches!(
- *self.focus_transaction.borrow(),
- FocusTransaction::NotInTransaction
- );
+ // If an element is specified, and it's non-focusable, ignore the
+ // request.
+ if elem.is_some_and(|e| !e.is_focusable_area()) {
+ return;
+ }
+
+ let implicit_transaction = self.focus_transaction.borrow().is_none();
+
if implicit_transaction {
self.begin_focus_transaction();
}
- if elem.is_none_or(|e| e.is_focusable_area()) {
- *self.focus_transaction.borrow_mut() =
- FocusTransaction::InTransaction(elem.map(Dom::from_ref));
+
+ {
+ let mut focus_transaction = self.focus_transaction.borrow_mut();
+ let focus_transaction = focus_transaction.as_mut().unwrap();
+ focus_transaction.element = elem.map(Dom::from_ref);
+ focus_transaction.has_focus = true;
}
+
if implicit_transaction {
- self.commit_focus_transaction(focus_type, can_gc);
+ self.commit_focus_transaction(focus_initiator, can_gc);
+ }
+ }
+
+ /// Update the local focus state accordingly after being notified that the
+ /// document's container is removed from the top-level browsing context's
+ /// focus chain (not considering system focus).
+ pub(crate) fn handle_container_unfocus(&self, can_gc: CanGc) {
+ assert!(
+ self.window().parent_info().is_some(),
+ "top-level document cannot be unfocused",
+ );
+
+ // Since this method is called from an event loop, there mustn't be
+ // an in-progress focus transaction
+ assert!(
+ self.focus_transaction.borrow().is_none(),
+ "there mustn't be an in-progress focus transaction at this point"
+ );
+
+ // Start an implicit focus transaction
+ self.begin_focus_transaction();
+
+ // Update the transaction
+ {
+ let mut focus_transaction = self.focus_transaction.borrow_mut();
+ focus_transaction.as_mut().unwrap().has_focus = false;
}
+
+ // Commit the implicit focus transaction
+ self.commit_focus_transaction(FocusInitiator::Remote, can_gc);
}
/// Reassign the focus context to the element that last requested focus during this
- /// transaction, or none if no elements requested it.
- fn commit_focus_transaction(&self, focus_type: FocusType, can_gc: CanGc) {
- let possibly_focused = match *self.focus_transaction.borrow() {
- FocusTransaction::NotInTransaction => unreachable!(),
- FocusTransaction::InTransaction(ref elem) => {
- elem.as_ref().map(|e| DomRoot::from_ref(&**e))
- },
+ /// transaction, or the document if no elements requested it.
+ fn commit_focus_transaction(&self, focus_initiator: FocusInitiator, can_gc: CanGc) {
+ let (mut new_focused, new_focus_state) = {
+ let focus_transaction = self.focus_transaction.borrow();
+ let focus_transaction = focus_transaction
+ .as_ref()
+ .expect("no focus transaction in progress");
+ (
+ focus_transaction
+ .element
+ .as_ref()
+ .map(|e| DomRoot::from_ref(&**e)),
+ focus_transaction.has_focus,
+ )
};
- *self.focus_transaction.borrow_mut() = FocusTransaction::NotInTransaction;
- if self.focused == possibly_focused.as_deref() {
- return;
+ *self.focus_transaction.borrow_mut() = None;
+
+ if !new_focus_state {
+ // In many browsers, a document forgets its focused area when the
+ // document is removed from the top-level BC's focus chain
+ if new_focused.take().is_some() {
+ trace!(
+ "Forgetting the document's focused area because the \
+ document's container was removed from the top-level BC's \
+ focus chain"
+ );
+ }
}
- if let Some(ref elem) = self.focused.get() {
- let node = elem.upcast::<Node>();
- elem.set_focus_state(false);
- // FIXME: pass appropriate relatedTarget
- self.fire_focus_event(FocusEventType::Blur, node, None, can_gc);
- // Notify the embedder to hide the input method.
- if elem.input_method_type().is_some() {
- self.send_to_embedder(EmbedderMsg::HideIME(self.webview_id()));
+ let old_focused = self.focused.get();
+ let old_focus_state = self.has_focus.get();
+
+ debug!(
+ "Committing focus transaction: {:?} → {:?}",
+ (&old_focused, old_focus_state),
+ (&new_focused, new_focus_state),
+ );
+
+ // `*_focused_filtered` indicates the local element (if any) included in
+ // the top-level BC's focus chain.
+ let old_focused_filtered = old_focused.as_ref().filter(|_| old_focus_state);
+ let new_focused_filtered = new_focused.as_ref().filter(|_| new_focus_state);
+
+ let trace_focus_chain = |name, element, doc| {
+ trace!(
+ "{} local focus chain: {}",
+ name,
+ match (element, doc) {
+ (Some(e), _) => format!("[{:?}, document]", e),
+ (None, true) => "[document]".to_owned(),
+ (None, false) => "[]".to_owned(),
+ }
+ );
+ };
+
+ trace_focus_chain("Old", old_focused_filtered, old_focus_state);
+ trace_focus_chain("New", new_focused_filtered, new_focus_state);
+
+ if old_focused_filtered != new_focused_filtered {
+ if let Some(elem) = &old_focused_filtered {
+ let node = elem.upcast::<Node>();
+ elem.set_focus_state(false);
+ // FIXME: pass appropriate relatedTarget
+ if node.is_connected() {
+ self.fire_focus_event(FocusEventType::Blur, node.upcast(), None, can_gc);
+ }
+
+ // Notify the embedder to hide the input method.
+ if elem.input_method_type().is_some() {
+ self.send_to_embedder(EmbedderMsg::HideIME(self.webview_id()));
+ }
}
}
- self.focused.set(possibly_focused.as_deref());
+ if old_focus_state != new_focus_state && !new_focus_state {
+ self.fire_focus_event(FocusEventType::Blur, self.global().upcast(), None, can_gc);
+ }
- if let Some(ref elem) = self.focused.get() {
- elem.set_focus_state(true);
- let node = elem.upcast::<Node>();
- // FIXME: pass appropriate relatedTarget
- self.fire_focus_event(FocusEventType::Focus, node, None, can_gc);
- // Update the focus state for all elements in the focus chain.
- // https://html.spec.whatwg.org/multipage/#focus-chain
- if focus_type == FocusType::Element {
- self.window()
- .send_to_constellation(ScriptToConstellationMessage::Focus);
+ self.focused.set(new_focused.as_deref());
+ self.has_focus.set(new_focus_state);
+
+ if old_focus_state != new_focus_state && new_focus_state {
+ self.fire_focus_event(FocusEventType::Focus, self.global().upcast(), None, can_gc);
+ }
+
+ if old_focused_filtered != new_focused_filtered {
+ if let Some(elem) = &new_focused_filtered {
+ elem.set_focus_state(true);
+ let node = elem.upcast::<Node>();
+ // FIXME: pass appropriate relatedTarget
+ self.fire_focus_event(FocusEventType::Focus, node.upcast(), None, can_gc);
+
+ // Notify the embedder to display an input method.
+ if let Some(kind) = elem.input_method_type() {
+ let rect = elem.upcast::<Node>().bounding_content_box_or_zero(can_gc);
+ let rect = Rect::new(
+ Point2D::new(rect.origin.x.to_px(), rect.origin.y.to_px()),
+ Size2D::new(rect.size.width.to_px(), rect.size.height.to_px()),
+ );
+ let (text, multiline) = if let Some(input) = elem.downcast::<HTMLInputElement>()
+ {
+ (
+ Some((
+ (input.Value()).to_string(),
+ input.GetSelectionEnd().unwrap_or(0) as i32,
+ )),
+ false,
+ )
+ } else if let Some(textarea) = elem.downcast::<HTMLTextAreaElement>() {
+ (
+ Some((
+ (textarea.Value()).to_string(),
+ textarea.GetSelectionEnd().unwrap_or(0) as i32,
+ )),
+ true,
+ )
+ } else {
+ (None, false)
+ };
+ self.send_to_embedder(EmbedderMsg::ShowIME(
+ self.webview_id(),
+ kind,
+ text,
+ multiline,
+ DeviceIntRect::from_untyped(&rect.to_box2d()),
+ ));
+ }
}
+ }
+
+ if focus_initiator != FocusInitiator::Local {
+ return;
+ }
- // Notify the embedder to display an input method.
- if let Some(kind) = elem.input_method_type() {
- let rect = elem.upcast::<Node>().bounding_content_box_or_zero(can_gc);
- let rect = Rect::new(
- Point2D::new(rect.origin.x.to_px(), rect.origin.y.to_px()),
- Size2D::new(rect.size.width.to_px(), rect.size.height.to_px()),
+ // We are the initiator of the focus operation, so we must broadcast
+ // the change we intend to make.
+ match (old_focus_state, new_focus_state) {
+ (_, true) => {
+ // Advertise the change in the focus chain.
+ // <https://html.spec.whatwg.org/multipage/#focus-chain>
+ // <https://html.spec.whatwg.org/multipage/#focusing-steps>
+ //
+ // If the top-level BC doesn't have system focus, this won't
+ // have an immediate effect, but it will when we gain system
+ // focus again. Therefore we still have to send `ScriptMsg::
+ // Focus`.
+ //
+ // When a container with a non-null nested browsing context is
+ // focused, its active document becomes the focused area of the
+ // top-level browsing context instead. Therefore we need to let
+ // the constellation know if such a container is focused.
+ //
+ // > The focusing steps for an object `new focus target` [...]
+ // >
+ // > 3. If `new focus target` is a browsing context container
+ // > with non-null nested browsing context, then set
+ // > `new focus target` to the nested browsing context's
+ // > active document.
+ let child_browsing_context_id = new_focused
+ .as_ref()
+ .and_then(|elem| elem.downcast::<HTMLIFrameElement>())
+ .and_then(|iframe| iframe.browsing_context_id());
+
+ let sequence = self.increment_fetch_focus_sequence();
+
+ debug!(
+ "Advertising the focus request to the constellation \
+ with sequence number {} and child BC ID {}",
+ sequence,
+ child_browsing_context_id
+ .as_ref()
+ .map(|id| id as &dyn std::fmt::Display)
+ .unwrap_or(&"(none)"),
);
- let (text, multiline) = if let Some(input) = elem.downcast::<HTMLInputElement>() {
- (
- Some((
- input.Value().to_string(),
- input.GetSelectionEnd().unwrap_or(0) as i32,
- )),
- false,
- )
- } else if let Some(textarea) = elem.downcast::<HTMLTextAreaElement>() {
- (
- Some((
- textarea.Value().to_string(),
- textarea.GetSelectionEnd().unwrap_or(0) as i32,
- )),
- true,
- )
- } else {
- (None, false)
- };
- self.send_to_embedder(EmbedderMsg::ShowIME(
- self.webview_id(),
- kind,
- text,
- multiline,
- DeviceIntRect::from_untyped(&rect.to_box2d()),
- ));
- }
+
+ self.window()
+ .send_to_constellation(ScriptToConstellationMessage::Focus(
+ child_browsing_context_id,
+ sequence,
+ ));
+ },
+ (false, false) => {
+ // Our `Document` doesn't have focus, and we intend to keep it
+ // this way.
+ },
+ (true, false) => {
+ unreachable!(
+ "Can't lose the document's focus without specifying \
+ another one to focus"
+ );
+ },
}
}
@@ -1350,7 +1552,10 @@ impl Document {
}
self.begin_focus_transaction();
- self.request_focus(Some(&*el), FocusType::Element, can_gc);
+ // Try to focus `el`. If it's not focusable, focus the document
+ // instead.
+ self.request_focus(None, FocusInitiator::Local, can_gc);
+ self.request_focus(Some(&*el), FocusInitiator::Local, can_gc);
}
let dom_event = DomRoot::upcast::<Event>(MouseEvent::for_platform_mouse_event(
@@ -1388,7 +1593,9 @@ impl Document {
}
if let MouseButtonAction::Click = event.action {
- self.commit_focus_transaction(FocusType::Element, can_gc);
+ if self.focus_transaction.borrow().is_some() {
+ self.commit_focus_transaction(FocusInitiator::Local, can_gc);
+ }
self.maybe_fire_dblclick(
hit_test_result.point_in_viewport,
node,
@@ -2215,7 +2422,7 @@ impl Document {
ImeEvent::Dismissed => {
self.request_focus(
self.GetBody().as_ref().map(|e| e.upcast()),
- FocusType::Element,
+ FocusInitiator::Local,
can_gc,
);
return;
@@ -3194,7 +3401,7 @@ impl Document {
fn fire_focus_event(
&self,
focus_event_type: FocusEventType,
- node: &Node,
+ event_target: &EventTarget,
related_target: Option<&EventTarget>,
can_gc: CanGc,
) {
@@ -3214,8 +3421,7 @@ impl Document {
);
let event = event.upcast::<Event>();
event.set_trusted(true);
- let target = node.upcast();
- event.fire(target, can_gc);
+ event.fire(event_target, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#cookie-averse-document-object>
@@ -3795,6 +4001,8 @@ impl Document {
.and_then(|charset| Encoding::for_label(charset.as_bytes()))
.unwrap_or(UTF_8);
+ let has_focus = window.parent_info().is_none();
+
let has_browsing_context = has_browsing_context == HasBrowsingContext::Yes;
Document {
@@ -3842,8 +4050,10 @@ impl Document {
stylesheet_list: MutNullableDom::new(None),
ready_state: Cell::new(ready_state),
domcontentloaded_dispatched: Cell::new(domcontentloaded_dispatched),
- focus_transaction: DomRefCell::new(FocusTransaction::NotInTransaction),
+ focus_transaction: DomRefCell::new(None),
focused: Default::default(),
+ focus_sequence: Cell::new(FocusSequenceNumber::default()),
+ has_focus: Cell::new(has_focus),
current_script: Default::default(),
pending_parsing_blocking_script: Default::default(),
script_blocking_stylesheets_count: Cell::new(0u32),
@@ -4989,12 +5199,34 @@ impl DocumentMethods<crate::DomTypeHolder> for Document {
// https://html.spec.whatwg.org/multipage/#dom-document-hasfocus
fn HasFocus(&self) -> bool {
- // Step 1-2.
- if self.window().parent_info().is_none() && self.is_fully_active() {
- return true;
+ // <https://html.spec.whatwg.org/multipage/#has-focus-steps>
+ //
+ // > The has focus steps, given a `Document` object `target`, are as
+ // > follows:
+ // >
+ // > 1. If `target`'s browsing context's top-level browsing context does
+ // > not have system focus, then return false.
+
+ // > 2. Let `candidate` be `target`'s browsing context's top-level
+ // > browsing context's active document.
+ // >
+ // > 3. While true:
+ // >
+ // > 3.1. If `candidate` is target, then return true.
+ // >
+ // > 3.2. If the focused area of `candidate` is a browsing context
+ // > container with a non-null nested browsing context, then set
+ // > `candidate` to the active document of that browsing context
+ // > container's nested browsing context.
+ // >
+ // > 3.3. Otherwise, return false.
+ if self.window().parent_info().is_none() {
+ // 2 → 3 → (3.1 || ⋯ → 3.3)
+ self.is_fully_active()
+ } else {
+ // 2 → 3 → 3.2 → (⋯ → 3.1 || ⋯ → 3.3)
+ self.is_fully_active() && self.has_focus.get()
}
- // TODO Step 3.
- false
}
// https://html.spec.whatwg.org/multipage/#dom-document-domain
@@ -6397,6 +6629,17 @@ pub(crate) enum FocusType {
Parent, // Focusing a parent element (an iframe)
}
+/// Specifies the initiator of a focus operation.
+#[derive(Clone, Copy, PartialEq)]
+pub enum FocusInitiator {
+ /// The operation is initiated by this document and to be broadcasted
+ /// through the constellation.
+ Local,
+ /// The operation is initiated somewhere else, and we are updating our
+ /// internal state accordingly.
+ Remote,
+}
+
/// Focus events
pub(crate) enum FocusEventType {
Focus, // Element gained focus. Doesn't bubble.
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 3a8ac8f0cd8..c040078f707 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -327,7 +327,21 @@ impl Element {
)
}
- impl_rare_data!(ElementRareData);
+ fn rare_data(&self) -> Ref<Option<Box<ElementRareData>>> {
+ self.rare_data.borrow()
+ }
+
+ fn rare_data_mut(&self) -> RefMut<Option<Box<ElementRareData>>> {
+ self.rare_data.borrow_mut()
+ }
+
+ fn ensure_rare_data(&self) -> RefMut<Box<ElementRareData>> {
+ let mut rare_data = self.rare_data.borrow_mut();
+ if rare_data.is_none() {
+ *rare_data = Some(Default::default());
+ }
+ RefMut::map(rare_data, |rare_data| rare_data.as_mut().unwrap())
+ }
pub(crate) fn restyle(&self, damage: NodeDamage) {
let doc = self.node.owner_doc();
@@ -3011,28 +3025,8 @@ impl ElementMethods<crate::DomTypeHolder> for Element {
DomRoot::from_ref(self.upcast())
};
- // Step 3. Unsafely set HTML given target, this, and compliantHTML.
- // Let newChildren be the result of the HTML fragment parsing algorithm.
- let new_children = ServoParser::parse_html_fragment(self, html, true, can_gc);
-
- let context_document = {
- if let Some(template) = self.downcast::<HTMLTemplateElement>() {
- template.Content(can_gc).upcast::<Node>().owner_doc()
- } else {
- self.owner_document()
- }
- };
-
- // Let fragment be a new DocumentFragment whose node document is contextElement's node document.
- let frag = DocumentFragment::new(&context_document, can_gc);
-
- // For each node in newChildren, append node to fragment.
- for child in new_children {
- frag.upcast::<Node>().AppendChild(&child, can_gc).unwrap();
- }
-
- // Replace all with fragment within target.
- Node::replace_all(Some(frag.upcast()), &target, can_gc);
+ // Step 3. Unsafely set HTML given target, this, and compliantHTML
+ Node::unsafely_set_html(&target, self, html, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#dom-element-gethtml>
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index b3345b90fc0..efa9a9a97ab 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -457,8 +457,9 @@ pub(crate) struct ManagedMessagePort {
/// and only add them, and ask the constellation to complete the transfer,
/// in a subsequent task if the port hasn't been re-transfered.
pending: bool,
- /// Has the port been closed? If closed, it can be dropped and later GC'ed.
- closed: bool,
+ /// Whether the port has been closed by script in this global,
+ /// so it can be removed.
+ explicitly_closed: bool,
/// Note: it may seem strange to use a pair of options, versus for example an enum.
/// But it looks like tranform streams will require both of those in their transfer.
/// This will be resolved when we reach that point of the implementation.
@@ -546,12 +547,17 @@ impl MessageListener {
let mut succeeded = vec![];
let mut failed = HashMap::new();
- for (id, buffer) in ports.into_iter() {
+ for (id, info) in ports.into_iter() {
if global.is_managing_port(&id) {
succeeded.push(id);
- global.complete_port_transfer(id, buffer);
+ global.complete_port_transfer(
+ id,
+ info.port_message_queue,
+ info.disentangled,
+ CanGc::note()
+ );
} else {
- failed.insert(id, buffer);
+ failed.insert(id, info);
}
}
let _ = global.script_to_constellation_chan().send(
@@ -560,13 +566,21 @@ impl MessageListener {
})
);
},
- MessagePortMsg::CompletePendingTransfer(port_id, buffer) => {
+ MessagePortMsg::CompletePendingTransfer(port_id, info) => {
let context = self.context.clone();
self.task_source.queue(task!(complete_pending: move || {
let global = context.root();
- global.complete_port_transfer(port_id, buffer);
+ global.complete_port_transfer(port_id, info.port_message_queue, info.disentangled, CanGc::note());
}));
},
+ MessagePortMsg::CompleteDisentanglement(port_id) => {
+ let context = self.context.clone();
+ self.task_source
+ .queue(task!(try_complete_disentanglement: move || {
+ let global = context.root();
+ global.try_complete_disentanglement(port_id, CanGc::note());
+ }));
+ },
MessagePortMsg::NewTask(port_id, task) => {
let context = self.context.clone();
self.task_source.queue(task!(process_new_task: move || {
@@ -574,14 +588,6 @@ impl MessageListener {
global.route_task_to_port(port_id, task, CanGc::note());
}));
},
- MessagePortMsg::RemoveMessagePort(port_id) => {
- let context = self.context.clone();
- self.task_source
- .queue(task!(process_remove_message_port: move || {
- let global = context.root();
- global.note_entangled_port_removed(&port_id);
- }));
- },
}
}
}
@@ -871,7 +877,13 @@ impl GlobalScope {
}
/// Complete the transfer of a message-port.
- fn complete_port_transfer(&self, port_id: MessagePortId, tasks: VecDeque<PortMessageTask>) {
+ fn complete_port_transfer(
+ &self,
+ port_id: MessagePortId,
+ tasks: VecDeque<PortMessageTask>,
+ disentangled: bool,
+ can_gc: CanGc,
+ ) {
let should_start = if let MessagePortState::Managed(_id, message_ports) =
&mut *self.message_port_state.borrow_mut()
{
@@ -885,6 +897,10 @@ impl GlobalScope {
}
if let Some(port_impl) = managed_port.port_impl.as_mut() {
port_impl.complete_transfer(tasks);
+ if disentangled {
+ port_impl.disentangle();
+ managed_port.dom_port.disentangle();
+ }
port_impl.enabled()
} else {
panic!("managed-port has no port-impl.");
@@ -895,7 +911,45 @@ impl GlobalScope {
panic!("complete_port_transfer called for an unknown port.");
};
if should_start {
- self.start_message_port(&port_id);
+ self.start_message_port(&port_id, can_gc);
+ }
+ }
+
+ /// The closing of `otherPort`, if it is in a different global.
+ /// <https://html.spec.whatwg.org/multipage/#disentangle>
+ fn try_complete_disentanglement(&self, port_id: MessagePortId, can_gc: CanGc) {
+ let dom_port = if let MessagePortState::Managed(_id, message_ports) =
+ &mut *self.message_port_state.borrow_mut()
+ {
+ let dom_port = if let Some(managed_port) = message_ports.get_mut(&port_id) {
+ if managed_port.pending {
+ unreachable!("CompleteDisentanglement msg received for a pending port.");
+ }
+ let port_impl = managed_port
+ .port_impl
+ .as_mut()
+ .expect("managed-port has no port-impl.");
+ port_impl.disentangle();
+ managed_port.dom_port.as_rooted()
+ } else {
+ // Note: this, and the other return below,
+ // can happen if the port has already been transferred out of this global,
+ // in which case the disentanglement will complete along with the transfer.
+ return;
+ };
+ dom_port
+ } else {
+ return;
+ };
+
+ // Fire an event named close at otherPort.
+ dom_port.upcast().fire_event(atom!("close"), can_gc);
+
+ let res = self.script_to_constellation_chan().send(
+ ScriptToConstellationMessage::DisentanglePorts(port_id, None),
+ );
+ if res.is_err() {
+ warn!("Sending DisentanglePorts failed");
}
}
@@ -951,8 +1005,64 @@ impl GlobalScope {
}
/// <https://html.spec.whatwg.org/multipage/#disentangle>
- pub(crate) fn disentangle_port(&self, _port: &MessagePort) {
- // TODO: #36465
+ pub(crate) fn disentangle_port(&self, port: &MessagePort, can_gc: CanGc) {
+ let initiator_port = port.message_port_id();
+ // Let otherPort be the MessagePort which initiatorPort was entangled with.
+ let Some(other_port) = port.disentangle() else {
+ // Assert: otherPort exists.
+ // Note: ignoring the assert,
+ // because the streams spec seems to disentangle ports that are disentangled already.
+ return;
+ };
+
+ // Disentangle initiatorPort and otherPort, so that they are no longer entangled or associated with each other.
+ // Note: this is done in part here, and in part at the constellation(if otherPort is in another global).
+ let dom_port = if let MessagePortState::Managed(_id, message_ports) =
+ &mut *self.message_port_state.borrow_mut()
+ {
+ let mut dom_port = None;
+ for port_id in &[initiator_port, &other_port] {
+ match message_ports.get_mut(port_id) {
+ None => {
+ continue;
+ },
+ Some(managed_port) => {
+ let port_impl = managed_port
+ .port_impl
+ .as_mut()
+ .expect("managed-port has no port-impl.");
+ managed_port.dom_port.disentangle();
+ port_impl.disentangle();
+
+ if **port_id == other_port {
+ dom_port = Some(managed_port.dom_port.as_rooted())
+ }
+ },
+ }
+ }
+ dom_port
+ } else {
+ panic!("disentangle_port called on a global not managing any ports.");
+ };
+
+ // Fire an event named close at `otherPort`.
+ // Note: done here if the port is managed by the same global as `initialPort`.
+ if let Some(dom_port) = dom_port {
+ dom_port.upcast().fire_event(atom!("close"), can_gc);
+ }
+
+ let chan = self.script_to_constellation_chan().clone();
+ let initiator_port = *initiator_port;
+ self.task_manager()
+ .port_message_queue()
+ .queue(task!(post_message: move || {
+ // Note: we do this in a task to ensure it doesn't affect messages that are still to be routed,
+ // see the task queueing in `post_messageport_msg`.
+ let res = chan.send(ScriptToConstellationMessage::DisentanglePorts(initiator_port, Some(other_port)));
+ if res.is_err() {
+ warn!("Sending DisentanglePorts failed");
+ }
+ }));
}
/// <https://html.spec.whatwg.org/multipage/#entangle>
@@ -984,18 +1094,6 @@ impl GlobalScope {
.send(ScriptToConstellationMessage::EntanglePorts(port1, port2));
}
- /// Note that the entangled port of `port_id` has been removed in another global.
- pub(crate) fn note_entangled_port_removed(&self, port_id: &MessagePortId) {
- // Note: currently this is a no-op,
- // as we only use the `close` method to manage the local lifecyle of a port.
- // This could be used as part of lifecyle management to determine a port can be GC'ed.
- // See https://github.com/servo/servo/issues/25772
- warn!(
- "Entangled port of {:?} has been removed in another global",
- port_id
- );
- }
-
/// Handle the transfer of a port in the current task.
pub(crate) fn mark_port_as_transferred(&self, port_id: &MessagePortId) -> MessagePortImpl {
if let MessagePortState::Managed(_id, message_ports) =
@@ -1021,20 +1119,21 @@ impl GlobalScope {
}
/// <https://html.spec.whatwg.org/multipage/#dom-messageport-start>
- pub(crate) fn start_message_port(&self, port_id: &MessagePortId) {
- let message_buffer = if let MessagePortState::Managed(_id, message_ports) =
+ pub(crate) fn start_message_port(&self, port_id: &MessagePortId, can_gc: CanGc) {
+ let (message_buffer, dom_port) = if let MessagePortState::Managed(_id, message_ports) =
&mut *self.message_port_state.borrow_mut()
{
- match message_ports.get_mut(port_id) {
+ let (message_buffer, dom_port) = match message_ports.get_mut(port_id) {
None => panic!("start_message_port called on a unknown port."),
Some(managed_port) => {
if let Some(port_impl) = managed_port.port_impl.as_mut() {
- port_impl.start()
+ (port_impl.start(), managed_port.dom_port.as_rooted())
} else {
panic!("managed-port has no port-impl.");
}
},
- }
+ };
+ (message_buffer, dom_port)
} else {
return warn!("start_message_port called on a global not managing any ports.");
};
@@ -1042,6 +1141,18 @@ impl GlobalScope {
for task in message_buffer {
self.route_task_to_port(*port_id, task, CanGc::note());
}
+ if dom_port.disentangled() {
+ // <https://html.spec.whatwg.org/multipage/#disentangle>
+ // Fire an event named close at otherPort.
+ dom_port.upcast().fire_event(atom!("close"), can_gc);
+
+ let res = self.script_to_constellation_chan().send(
+ ScriptToConstellationMessage::DisentanglePorts(*port_id, None),
+ );
+ if res.is_err() {
+ warn!("Sending DisentanglePorts failed");
+ }
+ }
}
}
@@ -1055,7 +1166,7 @@ impl GlobalScope {
Some(managed_port) => {
if let Some(port_impl) = managed_port.port_impl.as_mut() {
port_impl.close();
- managed_port.closed = true;
+ managed_port.explicitly_closed = true;
} else {
panic!("managed-port has no port-impl.");
}
@@ -1436,12 +1547,7 @@ impl GlobalScope {
let to_be_removed: Vec<MessagePortId> = message_ports
.iter()
.filter_map(|(id, managed_port)| {
- if managed_port.closed {
- // Let the constellation know to drop this port and the one it is entangled with,
- // and to forward this message to the script-process where the entangled is found.
- let _ = self
- .script_to_constellation_chan()
- .send(ScriptToConstellationMessage::RemoveMessagePort(*id));
+ if managed_port.explicitly_closed {
Some(*id)
} else {
None
@@ -1451,6 +1557,9 @@ impl GlobalScope {
for id in to_be_removed {
message_ports.remove(&id);
}
+ // Note: ports are only removed throught explicit closure by script in this global.
+ // TODO: #25772
+ // TODO: remove ports when we can be sure their port message queue is empty(via the constellation).
message_ports.is_empty()
} else {
false
@@ -1581,7 +1690,7 @@ impl GlobalScope {
port_impl: Some(port_impl),
dom_port: Dom::from_ref(dom_port),
pending: true,
- closed: false,
+ explicitly_closed: false,
cross_realm_transform_readable: None,
cross_realm_transform_writable: None,
},
@@ -1605,7 +1714,7 @@ impl GlobalScope {
port_impl: Some(port_impl),
dom_port: Dom::from_ref(dom_port),
pending: false,
- closed: false,
+ explicitly_closed: false,
cross_realm_transform_readable: None,
cross_realm_transform_writable: None,
},
diff --git a/components/script/dom/gpucanvascontext.rs b/components/script/dom/gpucanvascontext.rs
index 5304d0f5d3b..2bdabf3e0ab 100644
--- a/components/script/dom/gpucanvascontext.rs
+++ b/components/script/dom/gpucanvascontext.rs
@@ -3,7 +3,6 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use dom_struct::dom_struct;
-use script_layout_interface::HTMLCanvasDataSource;
use crate::dom::bindings::codegen::Bindings::GPUCanvasContextBinding::GPUCanvasContextMethods;
use crate::dom::bindings::codegen::UnionTypes;
@@ -31,7 +30,7 @@ impl GPUCanvasContextMethods<crate::DomTypeHolder> for GPUCanvasContext {
}
impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, GPUCanvasContext> {
- fn canvas_data_source(self) -> HTMLCanvasDataSource {
+ fn canvas_data_source(self) -> Option<ImageKey> {
unimplemented!()
}
}
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index bb27d28cea8..56e008839ba 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -21,20 +21,19 @@ use image::{ColorType, ImageEncoder};
use ipc_channel::ipc::{self as ipcchan};
use js::error::throw_type_error;
use js::rust::{HandleObject, HandleValue};
-use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource};
+use script_layout_interface::HTMLCanvasData;
use servo_media::streams::MediaStreamType;
use servo_media::streams::registry::MediaStreamId;
use snapshot::Snapshot;
use style::attr::AttrValue;
-use crate::canvas_context::CanvasContext as _;
pub(crate) use crate::canvas_context::*;
use crate::conversions::Convert;
use crate::dom::attr::Attr;
use crate::dom::bindings::callback::ExceptionHandling;
use crate::dom::bindings::cell::{DomRefCell, Ref, ref_filter_map};
use crate::dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::{
- BlobCallback, HTMLCanvasElementMethods, RenderingContext,
+ BlobCallback, HTMLCanvasElementMethods, RenderingContext as RootedRenderingContext,
};
use crate::dom::bindings::codegen::Bindings::MediaStreamBinding::MediaStreamMethods;
use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes;
@@ -104,21 +103,10 @@ impl EncodedImageType {
}
}
-#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
-#[derive(Clone, JSTraceable, MallocSizeOf)]
-pub(crate) enum CanvasContext {
- Placeholder(Dom<OffscreenCanvas>),
- Context2d(Dom<CanvasRenderingContext2D>),
- WebGL(Dom<WebGLRenderingContext>),
- WebGL2(Dom<WebGL2RenderingContext>),
- #[cfg(feature = "webgpu")]
- WebGPU(Dom<GPUCanvasContext>),
-}
-
#[dom_struct]
pub(crate) struct HTMLCanvasElement {
htmlelement: HTMLElement,
- context: DomRefCell<Option<CanvasContext>>,
+ context: DomRefCell<Option<RenderingContext>>,
// This id and hashmap are used to keep track of ongoing toBlob() calls.
callback_id: Cell<u32>,
#[ignore_malloc_size_of = "not implemented for webidl callbacks"]
@@ -159,14 +147,7 @@ impl HTMLCanvasElement {
fn recreate_contexts_after_resize(&self) {
if let Some(ref context) = *self.context.borrow() {
- match *context {
- CanvasContext::Context2d(ref context) => context.resize(),
- CanvasContext::WebGL(ref context) => context.resize(),
- CanvasContext::WebGL2(ref context) => context.resize(),
- #[cfg(feature = "webgpu")]
- CanvasContext::WebGPU(ref context) => context.resize(),
- CanvasContext::Placeholder(ref context) => context.resize(self.get_size().cast()),
- }
+ context.resize()
}
}
@@ -176,23 +157,14 @@ impl HTMLCanvasElement {
pub(crate) fn origin_is_clean(&self) -> bool {
match *self.context.borrow() {
- Some(CanvasContext::Context2d(ref context)) => context.origin_is_clean(),
+ Some(ref context) => context.origin_is_clean(),
_ => true,
}
}
pub(crate) fn mark_as_dirty(&self) {
if let Some(ref context) = *self.context.borrow() {
- match *context {
- CanvasContext::Context2d(ref context) => context.mark_as_dirty(),
- CanvasContext::WebGL(ref context) => context.mark_as_dirty(),
- CanvasContext::WebGL2(ref context) => context.mark_as_dirty(),
- #[cfg(feature = "webgpu")]
- CanvasContext::WebGPU(ref context) => context.mark_as_dirty(),
- CanvasContext::Placeholder(ref _context) => {
- // TODO: Should this be marked as dirty?
- },
- }
+ context.mark_as_dirty()
}
}
@@ -222,12 +194,14 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> {
fn data(self) -> HTMLCanvasData {
let source = unsafe {
match self.unsafe_get().context.borrow_for_layout().as_ref() {
- Some(CanvasContext::Context2d(context)) => context.to_layout().canvas_data_source(),
- Some(CanvasContext::WebGL(context)) => context.to_layout().canvas_data_source(),
- Some(CanvasContext::WebGL2(context)) => context.to_layout().canvas_data_source(),
+ Some(RenderingContext::Context2d(context)) => {
+ context.to_layout().canvas_data_source()
+ },
+ Some(RenderingContext::WebGL(context)) => context.to_layout().canvas_data_source(),
+ Some(RenderingContext::WebGL2(context)) => context.to_layout().canvas_data_source(),
#[cfg(feature = "webgpu")]
- Some(CanvasContext::WebGPU(context)) => context.to_layout().canvas_data_source(),
- Some(CanvasContext::Placeholder(_)) | None => HTMLCanvasDataSource::Empty,
+ Some(RenderingContext::WebGPU(context)) => context.to_layout().canvas_data_source(),
+ Some(RenderingContext::Placeholder(_)) | None => None,
}
};
@@ -246,14 +220,14 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom<'_, HTMLCanvasElement> {
}
impl HTMLCanvasElement {
- pub(crate) fn context(&self) -> Option<Ref<CanvasContext>> {
+ pub(crate) fn context(&self) -> Option<Ref<RenderingContext>> {
ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref())
}
fn get_or_init_2d_context(&self, can_gc: CanGc) -> Option<DomRoot<CanvasRenderingContext2D>> {
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -261,7 +235,7 @@ impl HTMLCanvasElement {
let window = self.owner_window();
let size = self.get_size();
let context = CanvasRenderingContext2D::new(window.as_global_scope(), self, size, can_gc);
- *self.context.borrow_mut() = Some(CanvasContext::Context2d(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() = Some(RenderingContext::Context2d(Dom::from_ref(&*context)));
Some(context)
}
@@ -273,7 +247,7 @@ impl HTMLCanvasElement {
) -> Option<DomRoot<WebGLRenderingContext>> {
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::WebGL(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::WebGL(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -289,7 +263,7 @@ impl HTMLCanvasElement {
attrs,
can_gc,
)?;
- *self.context.borrow_mut() = Some(CanvasContext::WebGL(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() = Some(RenderingContext::WebGL(Dom::from_ref(&*context)));
Some(context)
}
@@ -305,7 +279,7 @@ impl HTMLCanvasElement {
}
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::WebGL2(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::WebGL2(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -314,7 +288,7 @@ impl HTMLCanvasElement {
let attrs = Self::get_gl_attributes(cx, options)?;
let canvas = HTMLCanvasElementOrOffscreenCanvas::HTMLCanvasElement(DomRoot::from_ref(self));
let context = WebGL2RenderingContext::new(&window, &canvas, size, attrs, can_gc)?;
- *self.context.borrow_mut() = Some(CanvasContext::WebGL2(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() = Some(RenderingContext::WebGL2(Dom::from_ref(&*context)));
Some(context)
}
@@ -327,7 +301,7 @@ impl HTMLCanvasElement {
fn get_or_init_webgpu_context(&self, can_gc: CanGc) -> Option<DomRoot<GPUCanvasContext>> {
if let Some(ctx) = self.context() {
return match *ctx {
- CanvasContext::WebGPU(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ RenderingContext::WebGPU(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
@@ -341,7 +315,8 @@ impl HTMLCanvasElement {
.expect("Failed to get WebGPU channel")
.map(|channel| {
let context = GPUCanvasContext::new(&global_scope, self, channel, can_gc);
- *self.context.borrow_mut() = Some(CanvasContext::WebGPU(Dom::from_ref(&*context)));
+ *self.context.borrow_mut() =
+ Some(RenderingContext::WebGPU(Dom::from_ref(&*context)));
context
})
}
@@ -349,8 +324,8 @@ impl HTMLCanvasElement {
/// Gets the base WebGLRenderingContext for WebGL or WebGL 2, if exists.
pub(crate) fn get_base_webgl_context(&self) -> Option<DomRoot<WebGLRenderingContext>> {
match *self.context.borrow() {
- Some(CanvasContext::WebGL(ref context)) => Some(DomRoot::from_ref(context)),
- Some(CanvasContext::WebGL2(ref context)) => Some(context.base_context()),
+ Some(RenderingContext::WebGL(ref context)) => Some(DomRoot::from_ref(context)),
+ Some(RenderingContext::WebGL2(ref context)) => Some(context.base_context()),
_ => None,
}
}
@@ -378,12 +353,7 @@ impl HTMLCanvasElement {
pub(crate) fn get_image_data(&self) -> Option<Snapshot> {
match self.context.borrow().as_ref() {
- Some(CanvasContext::Context2d(context)) => context.get_image_data(),
- Some(CanvasContext::WebGL(context)) => context.get_image_data(),
- Some(CanvasContext::WebGL2(context)) => context.get_image_data(),
- #[cfg(feature = "webgpu")]
- Some(CanvasContext::WebGPU(context)) => context.get_image_data(),
- Some(CanvasContext::Placeholder(context)) => context.get_image_data(),
+ Some(context) => context.get_image_data(),
None => {
let size = self.get_size();
if size.width == 0 || size.height == 0 {
@@ -466,7 +436,7 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
// is set to placeholder, the user agent must throw an "InvalidStateError" DOMException and leave the
// attribute's value unchanged.
fn SetWidth(&self, value: u32, can_gc: CanGc) -> Fallible<()> {
- if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() {
+ if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() {
return Err(Error::InvalidState);
}
@@ -485,7 +455,7 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
// https://html.spec.whatwg.org/multipage/#dom-canvas-height
fn SetHeight(&self, value: u32, can_gc: CanGc) -> Fallible<()> {
- if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() {
+ if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() {
return Err(Error::InvalidState);
}
@@ -506,26 +476,26 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
id: DOMString,
options: HandleValue,
can_gc: CanGc,
- ) -> Fallible<Option<RenderingContext>> {
+ ) -> Fallible<Option<RootedRenderingContext>> {
// Always throw an InvalidState exception when the canvas is in Placeholder mode (See table in the spec).
- if let Some(CanvasContext::Placeholder(_)) = *self.context.borrow() {
+ if let Some(RenderingContext::Placeholder(_)) = *self.context.borrow() {
return Err(Error::InvalidState);
}
Ok(match &*id {
"2d" => self
.get_or_init_2d_context(can_gc)
- .map(RenderingContext::CanvasRenderingContext2D),
+ .map(RootedRenderingContext::CanvasRenderingContext2D),
"webgl" | "experimental-webgl" => self
.get_or_init_webgl_context(cx, options, can_gc)
- .map(RenderingContext::WebGLRenderingContext),
+ .map(RootedRenderingContext::WebGLRenderingContext),
"webgl2" | "experimental-webgl2" => self
.get_or_init_webgl2_context(cx, options, can_gc)
- .map(RenderingContext::WebGL2RenderingContext),
+ .map(RootedRenderingContext::WebGL2RenderingContext),
#[cfg(feature = "webgpu")]
"webgpu" => self
.get_or_init_webgpu_context(can_gc)
- .map(RenderingContext::GPUCanvasContext),
+ .map(RootedRenderingContext::GPUCanvasContext),
_ => None,
})
}
@@ -672,7 +642,8 @@ impl HTMLCanvasElementMethods<crate::DomTypeHolder> for HTMLCanvasElement {
can_gc,
);
// Step 4. Set this canvas element's context mode to placeholder.
- *self.context.borrow_mut() = Some(CanvasContext::Placeholder(offscreen_canvas.as_traced()));
+ *self.context.borrow_mut() =
+ Some(RenderingContext::Placeholder(offscreen_canvas.as_traced()));
// Step 5. Return offscreenCanvas.
Ok(offscreen_canvas)
diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs
index a3e2a05af32..1d48b8e7a97 100644
--- a/components/script/dom/htmldetailselement.rs
+++ b/components/script/dom/htmldetailselement.rs
@@ -178,8 +178,6 @@ impl HTMLDetailsElement {
}
}
shadow_tree.descendants.Assign(slottable_children);
-
- self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
}
fn update_shadow_tree_styles(&self, can_gc: CanGc) {
@@ -214,8 +212,6 @@ impl HTMLDetailsElement {
.implicit_summary
.upcast::<Element>()
.set_string_attribute(&local_name!("style"), implicit_summary_style.into(), can_gc);
-
- self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
}
}
diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs
index 9505d5182c7..e7efbde9b1d 100644
--- a/components/script/dom/htmlelement.rs
+++ b/components/script/dom/htmlelement.rs
@@ -32,7 +32,7 @@ use crate::dom::bindings::str::DOMString;
use crate::dom::characterdata::CharacterData;
use crate::dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner};
use crate::dom::customelementregistry::CallbackReaction;
-use crate::dom::document::{Document, FocusType};
+use crate::dom::document::{Document, FocusInitiator};
use crate::dom::documentfragment::DocumentFragment;
use crate::dom::domstringmap::DOMStringMap;
use crate::dom::element::{AttributeMutation, Element};
@@ -415,18 +415,19 @@ impl HTMLElementMethods<crate::DomTypeHolder> for HTMLElement {
// TODO: Mark the element as locked for focus and run the focusing steps.
// https://html.spec.whatwg.org/multipage/#focusing-steps
let document = self.owner_document();
- document.request_focus(Some(self.upcast()), FocusType::Element, can_gc);
+ document.request_focus(Some(self.upcast()), FocusInitiator::Local, can_gc);
}
// https://html.spec.whatwg.org/multipage/#dom-blur
fn Blur(&self, can_gc: CanGc) {
- // TODO: Run the unfocusing steps.
+ // TODO: Run the unfocusing steps. Focus the top-level document, not
+ // the current document.
if !self.as_element().focus_state() {
return;
}
// https://html.spec.whatwg.org/multipage/#unfocusing-steps
let document = self.owner_document();
- document.request_focus(None, FocusType::Element, can_gc);
+ document.request_focus(None, FocusInitiator::Local, can_gc);
}
// https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent
diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs
index ce6dcca66f3..2421b683bf7 100644
--- a/components/script/dom/htmlformelement.rs
+++ b/components/script/dom/htmlformelement.rs
@@ -1270,8 +1270,14 @@ impl HTMLFormElement {
return;
}
- let controls = self.controls.borrow();
- for child in controls.iter() {
+ let controls: Vec<_> = self
+ .controls
+ .borrow()
+ .iter()
+ .map(|c| c.as_rooted())
+ .collect();
+
+ for child in controls {
let child = child.upcast::<Node>();
match child.type_id() {
diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs
index 4f312e928c4..8b553923230 100644
--- a/components/script/dom/htmltablecellelement.rs
+++ b/components/script/dom/htmltablecellelement.rs
@@ -70,13 +70,17 @@ impl HTMLTableCellElementMethods<crate::DomTypeHolder> for HTMLTableCellElement
make_uint_getter!(ColSpan, "colspan", DEFAULT_COLSPAN);
// https://html.spec.whatwg.org/multipage/#dom-tdth-colspan
- make_uint_setter!(SetColSpan, "colspan", DEFAULT_COLSPAN);
+ // > The colSpan IDL attribute must reflect the colspan content attribute. It is clamped to
+ // > the range [1, 1000], and its default value is 1.
+ make_clamped_uint_setter!(SetColSpan, "colspan", 1, 1000, 1);
// https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan
make_uint_getter!(RowSpan, "rowspan", DEFAULT_ROWSPAN);
// https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan
- make_uint_setter!(SetRowSpan, "rowspan", DEFAULT_ROWSPAN);
+ // > The rowSpan IDL attribute must reflect the rowspan content attribute. It is clamped to
+ // > the range [0, 65534], and its default value is 1.
+ make_clamped_uint_setter!(SetRowSpan, "rowspan", 0, 65534, 1);
// https://html.spec.whatwg.org/multipage/#dom-tdth-bgcolor
make_getter!(BgColor, "bgcolor");
@@ -174,23 +178,26 @@ impl VirtualMethods for HTMLTableCellElement {
match *local_name {
local_name!("colspan") => {
let mut attr = AttrValue::from_u32(value.into(), DEFAULT_COLSPAN);
- if let AttrValue::UInt(_, ref mut val) = attr {
- if *val == 0 {
- *val = 1;
- }
+ if let AttrValue::UInt(_, ref mut value) = attr {
+ // From <https://html.spec.whatwg.org/multipage/#dom-tdth-colspan>:
+ // > The colSpan IDL attribute must reflect the colspan content attribute. It is clamped to
+ // > the range [1, 1000], and its default value is 1.
+ *value = (*value).clamp(1, 1000);
}
attr
},
local_name!("rowspan") => {
let mut attr = AttrValue::from_u32(value.into(), DEFAULT_ROWSPAN);
- if let AttrValue::UInt(_, ref mut val) = attr {
- if *val == 0 {
- let node = self.upcast::<Node>();
- let doc = node.owner_doc();
- // rowspan = 0 is not supported in quirks mode
- if doc.quirks_mode() != QuirksMode::NoQuirks {
- *val = 1;
- }
+ if let AttrValue::UInt(_, ref mut value) = attr {
+ // From <https://html.spec.whatwg.org/multipage/#dom-tdth-rowspan>:
+ // > The rowSpan IDL attribute must reflect the rowspan content attribute. It is clamped to
+ // > the range [0, 65534], and its default value is 1.
+ // Note that rowspan = 0 is not supported in quirks mode.
+ let document = self.upcast::<Node>().owner_doc();
+ if document.quirks_mode() != QuirksMode::NoQuirks {
+ *value = (*value).clamp(1, 65534);
+ } else {
+ *value = (*value).clamp(0, 65534);
}
}
attr
diff --git a/components/script/dom/htmltablecolelement.rs b/components/script/dom/htmltablecolelement.rs
index c7ad4afd944..9e8eecf1147 100644
--- a/components/script/dom/htmltablecolelement.rs
+++ b/components/script/dom/htmltablecolelement.rs
@@ -20,8 +20,6 @@ use crate::dom::node::Node;
use crate::dom::virtualmethods::VirtualMethods;
use crate::script_runtime::CanGc;
-const DEFAULT_SPAN: u32 = 1;
-
#[dom_struct]
pub(crate) struct HTMLTableColElement {
htmlelement: HTMLElement,
@@ -62,9 +60,11 @@ impl HTMLTableColElement {
impl HTMLTableColElementMethods<crate::DomTypeHolder> for HTMLTableColElement {
// <https://html.spec.whatwg.org/multipage/#attr-col-span>
- make_uint_getter!(Span, "span", DEFAULT_SPAN);
+ make_uint_getter!(Span, "span", 1);
// <https://html.spec.whatwg.org/multipage/#attr-col-span>
- make_uint_setter!(SetSpan, "span", DEFAULT_SPAN);
+ // > The span IDL attribute must reflect the content attribute of the same name. It is clamped
+ // > to the range [1, 1000], and its default value is 1.
+ make_clamped_uint_setter!(SetSpan, "span", 1, 1000, 1);
}
pub(crate) trait HTMLTableColElementLayoutHelpers<'dom> {
@@ -96,11 +96,12 @@ impl VirtualMethods for HTMLTableColElement {
fn parse_plain_attribute(&self, local_name: &LocalName, value: DOMString) -> AttrValue {
match *local_name {
local_name!("span") => {
- let mut attr = AttrValue::from_u32(value.into(), DEFAULT_SPAN);
+ let mut attr = AttrValue::from_u32(value.into(), 1);
if let AttrValue::UInt(_, ref mut val) = attr {
- if *val == 0 {
- *val = 1;
- }
+ // From <https://html.spec.whatwg.org/multipage/#attr-col-span>:
+ // > The span IDL attribute must reflect the content attribute of the same name.
+ // > It is clamped to the range [1, 1000], and its default value is 1.
+ *val = (*val).clamp(1, 1000);
}
attr
},
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index b3f222af0da..997341984c6 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -318,6 +318,26 @@ macro_rules! make_uint_setter(
);
#[macro_export]
+macro_rules! make_clamped_uint_setter(
+ ($attr:ident, $htmlname:tt, $min:expr, $max:expr, $default:expr) => (
+ fn $attr(&self, value: u32) {
+ use $crate::dom::bindings::inheritance::Castable;
+ use $crate::dom::element::Element;
+ use $crate::dom::values::UNSIGNED_LONG_MAX;
+ use $crate::script_runtime::CanGc;
+ let value = if value > UNSIGNED_LONG_MAX {
+ $default
+ } else {
+ value.clamp($min, $max)
+ };
+
+ let element = self.upcast::<Element>();
+ element.set_uint_attribute(&html5ever::local_name!($htmlname), value, CanGc::note())
+ }
+ );
+);
+
+#[macro_export]
macro_rules! make_limited_uint_setter(
($attr:ident, $htmlname:tt, $default:expr) => (
fn $attr(&self, value: u32) -> $crate::dom::bindings::error::ErrorResult {
@@ -719,26 +739,3 @@ macro_rules! handle_potential_webgl_error {
handle_potential_webgl_error!($context, $call, ())
};
}
-
-macro_rules! impl_rare_data (
- ($type:ty) => (
- fn rare_data(&self) -> Ref<Option<Box<$type>>> {
- self.rare_data.borrow()
- }
-
- #[allow(dead_code)]
- fn rare_data_mut(&self) -> RefMut<Option<Box<$type>>> {
- self.rare_data.borrow_mut()
- }
-
- fn ensure_rare_data(&self) -> RefMut<Box<$type>> {
- let mut rare_data = self.rare_data.borrow_mut();
- if rare_data.is_none() {
- *rare_data = Some(Default::default());
- }
- RefMut::map(rare_data, |rare_data| {
- rare_data.as_mut().unwrap()
- })
- }
- );
-);
diff --git a/components/script/dom/messageport.rs b/components/script/dom/messageport.rs
index 85d94c1aa7a..d70d3139b96 100644
--- a/components/script/dom/messageport.rs
+++ b/components/script/dom/messageport.rs
@@ -83,6 +83,20 @@ impl MessagePort {
*self.entangled_port.borrow_mut() = Some(other_id);
}
+ /// <https://html.spec.whatwg.org/multipage/#disentangle>
+ pub(crate) fn disentangle(&self) -> Option<MessagePortId> {
+ // Disentangle initiatorPort and otherPort, so that they are no longer entangled or associated with each other.
+ // Note: called from `disentangle_port` in the global, where the rest happens.
+ self.entangled_port.borrow_mut().take()
+ }
+
+ /// Has the port been disentangled?
+ /// Used when starting the port to fire the `close` event,
+ /// to cover the case of a disentanglement while in transfer.
+ pub(crate) fn disentangled(&self) -> bool {
+ self.entangled_port.borrow().is_none()
+ }
+
pub(crate) fn message_port_id(&self) -> &MessagePortId {
&self.message_port_id
}
@@ -314,20 +328,28 @@ impl MessagePortMethods<crate::DomTypeHolder> for MessagePort {
}
/// <https://html.spec.whatwg.org/multipage/#dom-messageport-start>
- fn Start(&self) {
+ fn Start(&self, can_gc: CanGc) {
if self.detached.get() {
return;
}
- self.global().start_message_port(self.message_port_id());
+ self.global()
+ .start_message_port(self.message_port_id(), can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#dom-messageport-close>
- fn Close(&self) {
+ fn Close(&self, can_gc: CanGc) {
if self.detached.get() {
return;
}
+
+ // Set this's [[Detached]] internal slot value to true.
self.detached.set(true);
- self.global().close_message_port(self.message_port_id());
+
+ let global = self.global();
+ global.close_message_port(self.message_port_id());
+
+ // If this is entangled, disentangle it.
+ global.disentangle_port(self, can_gc);
}
/// <https://html.spec.whatwg.org/multipage/#handler-messageport-onmessage>
@@ -340,15 +362,19 @@ impl MessagePortMethods<crate::DomTypeHolder> for MessagePort {
}
/// <https://html.spec.whatwg.org/multipage/#handler-messageport-onmessage>
- fn SetOnmessage(&self, listener: Option<Rc<EventHandlerNonNull>>) {
+ fn SetOnmessage(&self, listener: Option<Rc<EventHandlerNonNull>>, can_gc: CanGc) {
if self.detached.get() {
return;
}
self.set_onmessage(listener);
// Note: we cannot use the event_handler macro, due to the need to start the port.
- self.global().start_message_port(self.message_port_id());
+ self.global()
+ .start_message_port(self.message_port_id(), can_gc);
}
// <https://html.spec.whatwg.org/multipage/#handler-messageport-onmessageerror>
event_handler!(messageerror, GetOnmessageerror, SetOnmessageerror);
+
+ // <https://html.spec.whatwg.org/multipage/#handler-messageport-onclose>
+ event_handler!(close, GetOnclose, SetOnclose);
}
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index b56126076da..e9d36a01426 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -110,7 +110,7 @@ use crate::dom::pointerevent::{PointerEvent, PointerId};
use crate::dom::processinginstruction::ProcessingInstruction;
use crate::dom::range::WeakRangeVec;
use crate::dom::raredata::NodeRareData;
-use crate::dom::servoparser::serialize_html_fragment;
+use crate::dom::servoparser::{ServoParser, serialize_html_fragment};
use crate::dom::shadowroot::{IsUserAgentWidget, LayoutShadowRootHelpers, ShadowRoot};
use crate::dom::stylesheetlist::StyleSheetListOwner;
use crate::dom::svgsvgelement::{LayoutSVGSVGElementHelpers, SVGSVGElement};
@@ -316,6 +316,34 @@ impl Node {
}
}
+ /// Implements the "unsafely set HTML" algorithm as specified in:
+ /// <https://html.spec.whatwg.org/multipage/#concept-unsafely-set-html>
+ pub fn unsafely_set_html(
+ target: &Node,
+ context_element: &Element,
+ html: DOMString,
+ can_gc: CanGc,
+ ) {
+ // Step 1. Let newChildren be the result of the HTML fragment parsing algorithm.
+ let new_children = ServoParser::parse_html_fragment(context_element, html, true, can_gc);
+
+ // Step 2. Let fragment be a new DocumentFragment whose node document is contextElement's node document.
+
+ let context_document = context_element.owner_document();
+ let fragment = DocumentFragment::new(&context_document, can_gc);
+
+ // Step 3. For each node in newChildren, append node to fragment.
+ for child in new_children {
+ fragment
+ .upcast::<Node>()
+ .AppendChild(&child, can_gc)
+ .unwrap();
+ }
+
+ // Step 4. Replace all with fragment within target.
+ Node::replace_all(Some(fragment.upcast()), target, can_gc);
+ }
+
pub(crate) fn clean_up_style_and_layout_data(&self) {
self.owner_doc().cancel_animations_for_node(self);
self.style_data.borrow_mut().take();
@@ -564,7 +592,17 @@ impl Iterator for QuerySelectorIterator {
}
impl Node {
- impl_rare_data!(NodeRareData);
+ fn rare_data(&self) -> Ref<Option<Box<NodeRareData>>> {
+ self.rare_data.borrow()
+ }
+
+ fn ensure_rare_data(&self) -> RefMut<Box<NodeRareData>> {
+ let mut rare_data = self.rare_data.borrow_mut();
+ if rare_data.is_none() {
+ *rare_data = Some(Default::default());
+ }
+ RefMut::map(rare_data, |rare_data| rare_data.as_mut().unwrap())
+ }
/// Returns true if this node is before `other` in the same connected DOM
/// tree.
@@ -1007,24 +1045,25 @@ impl Node {
/// <https://dom.spec.whatwg.org/#dom-childnode-replacewith>
pub(crate) fn replace_with(&self, nodes: Vec<NodeOrString>, can_gc: CanGc) -> ErrorResult {
- // Step 1.
- let parent = if let Some(parent) = self.GetParentNode() {
- parent
- } else {
- // Step 2.
+ // Step 1. Let parent be this’s parent.
+ let Some(parent) = self.GetParentNode() else {
+ // Step 2. If parent is null, then return.
return Ok(());
};
- // Step 3.
+
+ // Step 3. Let viableNextSibling be this’s first following sibling not in nodes; otherwise null.
let viable_next_sibling = first_node_not_in(self.following_siblings(), &nodes);
- // Step 4.
+
+ // Step 4. Let node be the result of converting nodes into a node, given nodes and this’s node document.
let node = self
.owner_doc()
.node_from_nodes_and_strings(nodes, can_gc)?;
+
if self.parent_node == Some(&*parent) {
- // Step 5.
+ // Step 5. If this’s parent is parent, replace this with node within parent.
parent.ReplaceChild(&node, self, can_gc)?;
} else {
- // Step 6.
+ // Step 6. Otherwise, pre-insert node into parent before viableNextSibling.
Node::pre_insert(&node, &parent, viable_next_sibling.as_deref(), can_gc)?;
}
Ok(())
@@ -1272,6 +1311,21 @@ impl Node {
is_shadow_host,
shadow_root_mode,
display,
+ doctype_name: self
+ .downcast::<DocumentType>()
+ .map(DocumentType::name)
+ .cloned()
+ .map(String::from),
+ doctype_public_identifier: self
+ .downcast::<DocumentType>()
+ .map(DocumentType::public_id)
+ .cloned()
+ .map(String::from),
+ doctype_system_identifier: self
+ .downcast::<DocumentType>()
+ .map(DocumentType::system_id)
+ .cloned()
+ .map(String::from),
}
}
@@ -3172,24 +3226,29 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
/// <https://dom.spec.whatwg.org/#concept-node-replace>
fn ReplaceChild(&self, node: &Node, child: &Node, can_gc: CanGc) -> Fallible<DomRoot<Node>> {
- // Step 1.
+ // Step 1. If parent is not a Document, DocumentFragment, or Element node,
+ // then throw a "HierarchyRequestError" DOMException.
match self.type_id() {
NodeTypeId::Document(_) | NodeTypeId::DocumentFragment(_) | NodeTypeId::Element(..) => {
},
_ => return Err(Error::HierarchyRequest),
}
- // Step 2.
+ // Step 2. If node is a host-including inclusive ancestor of parent,
+ // then throw a "HierarchyRequestError" DOMException.
if node.is_inclusive_ancestor_of(self) {
return Err(Error::HierarchyRequest);
}
- // Step 3.
+ // Step 3. If child’s parent is not parent, then throw a "NotFoundError" DOMException.
if !self.is_parent_of(child) {
return Err(Error::NotFound);
}
- // Step 4-5.
+ // Step 4. If node is not a DocumentFragment, DocumentType, Element, or CharacterData node,
+ // then throw a "HierarchyRequestError" DOMException.
+ // Step 5. If either node is a Text node and parent is a document,
+ // or node is a doctype and parent is not a document, then throw a "HierarchyRequestError" DOMException.
match node.type_id() {
NodeTypeId::CharacterData(CharacterDataTypeId::Text(_)) if self.is::<Document>() => {
return Err(Error::HierarchyRequest);
@@ -3201,7 +3260,8 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
_ => (),
}
- // Step 6.
+ // Step 6. If parent is a document, and any of the statements below, switched on the interface node implements,
+ // are true, then throw a "HierarchyRequestError" DOMException.
if self.is::<Document>() {
match node.type_id() {
// Step 6.1
@@ -3255,7 +3315,8 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
}
}
- // Step 7-8.
+ // Step 7. Let referenceChild be child’s next sibling.
+ // Step 8. If referenceChild is node, then set referenceChild to node’s next sibling.
let child_next_sibling = child.GetNextSibling();
let node_next_sibling = node.GetNextSibling();
let reference_child = if child_next_sibling.as_deref() == Some(node) {
@@ -3264,7 +3325,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
child_next_sibling.as_deref()
};
- // Step 9.
+ // Step 9. Let previousSibling be child’s previous sibling.
let previous_sibling = child.GetPreviousSibling();
// NOTE: All existing browsers assume that adoption is performed here, which does not follow the DOM spec.
@@ -3285,7 +3346,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
None
};
- // Step 12.
+ // Step 12. Let nodes be node’s children if node is a DocumentFragment node; otherwise « node ».
rooted_vec!(let mut nodes);
let nodes = if node.type_id() ==
NodeTypeId::DocumentFragment(DocumentFragmentTypeId::DocumentFragment) ||
@@ -3297,7 +3358,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
from_ref(&node)
};
- // Step 13.
+ // Step 13. Insert node into parent before referenceChild with the suppress observers flag set.
Node::insert(
node,
self,
@@ -3306,13 +3367,15 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
can_gc,
);
- // Step 14.
vtable_for(self).children_changed(&ChildrenMutation::replace(
previous_sibling.as_deref(),
&removed_child,
nodes,
reference_child,
));
+
+ // Step 14. Queue a tree mutation record for parent with nodes, removedNodes,
+ // previousSibling, and referenceChild.
let removed = removed_child.map(|r| [r]);
let mutation = LazyCell::new(|| Mutation::ChildList {
added: Some(nodes),
@@ -3323,7 +3386,7 @@ impl NodeMethods<crate::DomTypeHolder> for Node {
MutationObserver::queue_a_mutation_record(self, mutation);
- // Step 15.
+ // Step 15. Return child.
Ok(DomRoot::from_ref(child))
}
diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs
index b349f16a986..1ec2dc3f78b 100644
--- a/components/script/dom/nodelist.rs
+++ b/components/script/dom/nodelist.rs
@@ -175,7 +175,6 @@ impl NodeList {
#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
pub(crate) struct ChildrenList {
node: Dom<Node>,
- #[ignore_malloc_size_of = "Defined in rust-mozjs"]
last_visited: MutNullableDom<Node>,
last_index: Cell<u32>,
}
diff --git a/components/script/dom/offscreencanvas.rs b/components/script/dom/offscreencanvas.rs
index aabe5955e12..9947d35f4e0 100644
--- a/components/script/dom/offscreencanvas.rs
+++ b/components/script/dom/offscreencanvas.rs
@@ -9,9 +9,10 @@ use euclid::default::Size2D;
use js::rust::{HandleObject, HandleValue};
use snapshot::Snapshot;
+use crate::canvas_context::{CanvasContext, OffscreenRenderingContext};
use crate::dom::bindings::cell::{DomRefCell, Ref, ref_filter_map};
use crate::dom::bindings::codegen::Bindings::OffscreenCanvasBinding::{
- OffscreenCanvasMethods, OffscreenRenderingContext,
+ OffscreenCanvasMethods, OffscreenRenderingContext as RootedOffscreenRenderingContext,
};
use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::reflector::{DomGlobal, reflect_dom_object_with_proto};
@@ -23,20 +24,12 @@ use crate::dom::htmlcanvaselement::HTMLCanvasElement;
use crate::dom::offscreencanvasrenderingcontext2d::OffscreenCanvasRenderingContext2D;
use crate::script_runtime::{CanGc, JSContext};
-#[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)]
-#[derive(Clone, JSTraceable, MallocSizeOf)]
-pub(crate) enum OffscreenCanvasContext {
- OffscreenContext2d(Dom<OffscreenCanvasRenderingContext2D>),
- //WebGL(Dom<WebGLRenderingContext>),
- //WebGL2(Dom<WebGL2RenderingContext>),
-}
-
#[dom_struct]
pub(crate) struct OffscreenCanvas {
eventtarget: EventTarget,
width: Cell<u64>,
height: Cell<u64>,
- context: DomRefCell<Option<OffscreenCanvasContext>>,
+ context: DomRefCell<Option<OffscreenRenderingContext>>,
placeholder: Option<Dom<HTMLCanvasElement>>,
}
@@ -77,20 +70,18 @@ impl OffscreenCanvas {
pub(crate) fn origin_is_clean(&self) -> bool {
match *self.context.borrow() {
- Some(OffscreenCanvasContext::OffscreenContext2d(ref context)) => {
- context.origin_is_clean()
- },
+ Some(ref context) => context.origin_is_clean(),
_ => true,
}
}
- pub(crate) fn context(&self) -> Option<Ref<OffscreenCanvasContext>> {
+ pub(crate) fn context(&self) -> Option<Ref<OffscreenRenderingContext>> {
ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref())
}
pub(crate) fn get_image_data(&self) -> Option<Snapshot> {
match self.context.borrow().as_ref() {
- Some(OffscreenCanvasContext::OffscreenContext2d(context)) => context.get_image_data(),
+ Some(context) => context.get_image_data(),
None => {
let size = self.get_size();
if size.width == 0 || size.height == 0 {
@@ -108,13 +99,13 @@ impl OffscreenCanvas {
) -> Option<DomRoot<OffscreenCanvasRenderingContext2D>> {
if let Some(ctx) = self.context() {
return match *ctx {
- OffscreenCanvasContext::OffscreenContext2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
+ OffscreenRenderingContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
};
}
let context = OffscreenCanvasRenderingContext2D::new(&self.global(), self, can_gc);
- *self.context.borrow_mut() = Some(OffscreenCanvasContext::OffscreenContext2d(
- Dom::from_ref(&*context),
- ));
+ *self.context.borrow_mut() = Some(OffscreenRenderingContext::Context2d(Dom::from_ref(
+ &*context,
+ )));
Some(context)
}
@@ -125,19 +116,6 @@ impl OffscreenCanvas {
pub(crate) fn placeholder(&self) -> Option<&HTMLCanvasElement> {
self.placeholder.as_deref()
}
-
- pub(crate) fn resize(&self, size: Size2D<u64>) {
- self.width.set(size.width);
- self.height.set(size.height);
-
- if let Some(canvas_context) = self.context() {
- match &*canvas_context {
- OffscreenCanvasContext::OffscreenContext2d(rendering_context) => {
- rendering_context.set_canvas_bitmap_dimensions(self.get_size());
- },
- }
- }
- }
}
impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
@@ -160,11 +138,11 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
id: DOMString,
_options: HandleValue,
can_gc: CanGc,
- ) -> Fallible<Option<OffscreenRenderingContext>> {
+ ) -> Fallible<Option<RootedOffscreenRenderingContext>> {
match &*id {
"2d" => Ok(self
.get_or_init_2d_context(can_gc)
- .map(OffscreenRenderingContext::OffscreenCanvasRenderingContext2D)),
+ .map(RootedOffscreenRenderingContext::OffscreenCanvasRenderingContext2D)),
/*"webgl" | "experimental-webgl" => self
.get_or_init_webgl_context(cx, options)
.map(OffscreenRenderingContext::WebGLRenderingContext),
@@ -187,11 +165,7 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
self.width.set(value);
if let Some(canvas_context) = self.context() {
- match &*canvas_context {
- OffscreenCanvasContext::OffscreenContext2d(rendering_context) => {
- rendering_context.set_canvas_bitmap_dimensions(self.get_size());
- },
- }
+ canvas_context.resize();
}
if let Some(canvas) = &self.placeholder {
@@ -209,11 +183,7 @@ impl OffscreenCanvasMethods<crate::DomTypeHolder> for OffscreenCanvas {
self.height.set(value);
if let Some(canvas_context) = self.context() {
- match &*canvas_context {
- OffscreenCanvasContext::OffscreenContext2d(rendering_context) => {
- rendering_context.set_canvas_bitmap_dimensions(self.get_size());
- },
- }
+ canvas_context.resize();
}
if let Some(canvas) = &self.placeholder {
diff --git a/components/script/dom/offscreencanvasrenderingcontext2d.rs b/components/script/dom/offscreencanvasrenderingcontext2d.rs
index b2d0f3201ca..d7ca0e9dc4d 100644
--- a/components/script/dom/offscreencanvasrenderingcontext2d.rs
+++ b/components/script/dom/offscreencanvasrenderingcontext2d.rs
@@ -3,11 +3,10 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::dom::bindings::codegen::GenericBindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2D_Binding::CanvasRenderingContext2DMethods;
-use crate::canvas_context::CanvasContext as _;
+use crate::canvas_context::CanvasContext;
use crate::dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrOffscreenCanvas;
use canvas_traits::canvas::Canvas2dMsg;
use dom_struct::dom_struct;
-use euclid::default::Size2D;
use snapshot::Snapshot;
use crate::dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::{
@@ -64,21 +63,33 @@ impl OffscreenCanvasRenderingContext2D {
reflect_dom_object(boxed, global, can_gc)
}
- pub(crate) fn set_canvas_bitmap_dimensions(&self, size: Size2D<u64>) {
- self.context.set_canvas_bitmap_dimensions(size.cast());
- }
-
pub(crate) fn send_canvas_2d_msg(&self, msg: Canvas2dMsg) {
self.context.send_canvas_2d_msg(msg)
}
+}
- pub(crate) fn origin_is_clean(&self) -> bool {
- self.context.origin_is_clean()
+impl CanvasContext for OffscreenCanvasRenderingContext2D {
+ type ID = <CanvasRenderingContext2D as CanvasContext>::ID;
+
+ fn context_id(&self) -> Self::ID {
+ self.context.context_id()
+ }
+
+ fn canvas(&self) -> HTMLCanvasElementOrOffscreenCanvas {
+ self.context.canvas()
+ }
+
+ fn resize(&self) {
+ self.context.resize()
}
- pub(crate) fn get_image_data(&self) -> Option<Snapshot> {
+ fn get_image_data(&self) -> Option<Snapshot> {
self.context.get_image_data()
}
+
+ fn origin_is_clean(&self) -> bool {
+ self.context.origin_is_clean()
+ }
}
impl OffscreenCanvasRenderingContext2DMethods<crate::DomTypeHolder>
diff --git a/components/script/dom/readablestream.rs b/components/script/dom/readablestream.rs
index 51393ab33ae..4982bfa32e3 100644
--- a/components/script/dom/readablestream.rs
+++ b/components/script/dom/readablestream.rs
@@ -1825,7 +1825,7 @@ impl ReadableStream {
global.note_cross_realm_transform_readable(&cross_realm_transform_readable, port_id);
// Enable port’s port message queue.
- port.Start();
+ port.Start(can_gc);
// Perform ! SetUpReadableStreamDefaultController
controller
@@ -2093,7 +2093,7 @@ impl CrossRealmTransformReadable {
self.controller.close(can_gc);
// Disentangle port.
- global.disentangle_port(port);
+ global.disentangle_port(port, can_gc);
}
// Otherwise, if type is "error",
@@ -2102,7 +2102,7 @@ impl CrossRealmTransformReadable {
self.controller.error(value.handle(), can_gc);
// Disentangle port.
- global.disentangle_port(port);
+ global.disentangle_port(port, can_gc);
}
}
@@ -2129,7 +2129,7 @@ impl CrossRealmTransformReadable {
self.controller.error(rooted_error.handle(), can_gc);
// Disentangle port.
- global.disentangle_port(port);
+ global.disentangle_port(port, can_gc);
}
}
diff --git a/components/script/dom/shadowroot.rs b/components/script/dom/shadowroot.rs
index 72b074ed6f4..14d9c24b10e 100644
--- a/components/script/dom/shadowroot.rs
+++ b/components/script/dom/shadowroot.rs
@@ -453,6 +453,15 @@ impl ShadowRootMethods<crate::DomTypeHolder> for ShadowRoot {
self.slot_assignment_mode
}
+ /// <https://html.spec.whatwg.org/multipage/#dom-shadowroot-sethtmlunsafe>
+ fn SetHTMLUnsafe(&self, html: DOMString, can_gc: CanGc) {
+ // Step 2. Unsafely set HTMl given this, this's shadow host, and complaintHTML
+ let target = self.upcast::<Node>();
+ let context_element = self.Host();
+
+ Node::unsafely_set_html(target, &context_element, html, can_gc);
+ }
+
// https://dom.spec.whatwg.org/#dom-shadowroot-onslotchange
event_handler!(onslotchange, GetOnslotchange, SetOnslotchange);
}
diff --git a/components/script/dom/underlyingsourcecontainer.rs b/components/script/dom/underlyingsourcecontainer.rs
index 541a831693a..4acb58bafef 100644
--- a/components/script/dom/underlyingsourcecontainer.rs
+++ b/components/script/dom/underlyingsourcecontainer.rs
@@ -151,7 +151,7 @@ impl UnderlyingSourceContainer {
let result = port.pack_and_post_message_handling_error("error", reason, can_gc);
// Disentangle port.
- self.global().disentangle_port(port);
+ self.global().disentangle_port(port, can_gc);
let promise = Promise::new(&self.global(), can_gc);
diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs
index 416454d8719..5e538b53b5f 100644
--- a/components/script/dom/webgl2renderingcontext.rs
+++ b/components/script/dom/webgl2renderingcontext.rs
@@ -22,10 +22,10 @@ use js::jsval::{BooleanValue, DoubleValue, Int32Value, NullValue, ObjectValue, U
use js::rust::{CustomAutoRooterGuard, HandleObject, MutableHandleValue};
use js::typedarray::{ArrayBufferView, CreateWith, Float32, Int32Array, Uint32, Uint32Array};
use script_bindings::interfaces::WebGL2RenderingContextHelpers;
-use script_layout_interface::HTMLCanvasDataSource;
use servo_config::pref;
use snapshot::Snapshot;
use url::Host;
+use webrender_api::ImageKey;
use crate::canvas_context::CanvasContext;
use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::{
@@ -4702,7 +4702,7 @@ impl WebGL2RenderingContextMethods<crate::DomTypeHolder> for WebGL2RenderingCont
impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, WebGL2RenderingContext> {
#[allow(unsafe_code)]
- fn canvas_data_source(self) -> HTMLCanvasDataSource {
+ fn canvas_data_source(self) -> Option<ImageKey> {
let this = self.unsafe_get();
unsafe { (*this.base.to_layout().unsafe_get()).layout_handle() }
}
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 9996a3cf504..98170f9655b 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -31,7 +31,6 @@ use js::typedarray::{
};
use net_traits::image_cache::ImageResponse;
use pixels::{self, PixelFormat};
-use script_layout_interface::HTMLCanvasDataSource;
use serde::{Deserialize, Serialize};
use servo_config::pref;
use snapshot::Snapshot;
@@ -875,9 +874,8 @@ impl WebGLRenderingContext {
receiver.recv().unwrap()
}
- pub(crate) fn layout_handle(&self) -> HTMLCanvasDataSource {
- let image_key = self.webrender_image;
- HTMLCanvasDataSource::WebGL(image_key)
+ pub(crate) fn layout_handle(&self) -> Option<ImageKey> {
+ Some(self.webrender_image)
}
// https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/
@@ -4829,7 +4827,7 @@ impl WebGLRenderingContextMethods<crate::DomTypeHolder> for WebGLRenderingContex
}
impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, WebGLRenderingContext> {
- fn canvas_data_source(self) -> HTMLCanvasDataSource {
+ fn canvas_data_source(self) -> Option<ImageKey> {
(*self.unsafe_get()).layout_handle()
}
}
diff --git a/components/script/dom/webgpu/gpucanvascontext.rs b/components/script/dom/webgpu/gpucanvascontext.rs
index c81f96f651f..359b1b14003 100644
--- a/components/script/dom/webgpu/gpucanvascontext.rs
+++ b/components/script/dom/webgpu/gpucanvascontext.rs
@@ -8,7 +8,6 @@ use std::cell::RefCell;
use arrayvec::ArrayVec;
use dom_struct::dom_struct;
use ipc_channel::ipc::{self};
-use script_layout_interface::HTMLCanvasDataSource;
use snapshot::Snapshot;
use webgpu_traits::{
ContextConfiguration, PRESENTATION_BUFFER_COUNT, WebGPU, WebGPUContextId, WebGPURequest,
@@ -227,11 +226,11 @@ impl GPUCanvasContext {
// Internal helper methods
impl GPUCanvasContext {
- fn layout_handle(&self) -> HTMLCanvasDataSource {
+ fn layout_handle(&self) -> Option<ImageKey> {
if self.drawing_buffer.borrow().cleared {
- HTMLCanvasDataSource::Empty
+ None
} else {
- HTMLCanvasDataSource::WebGPU(self.webrender_image)
+ Some(self.webrender_image)
}
}
@@ -301,7 +300,7 @@ impl CanvasContext for GPUCanvasContext {
}
impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, GPUCanvasContext> {
- fn canvas_data_source(self) -> HTMLCanvasDataSource {
+ fn canvas_data_source(self) -> Option<ImageKey> {
(*self.unsafe_get()).layout_handle()
}
}
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index e210476a5df..90782e217b7 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -787,6 +787,32 @@ impl WindowMethods<crate::DomTypeHolder> for Window {
doc.abort(can_gc);
}
+ /// <https://html.spec.whatwg.org/multipage/#dom-window-focus>
+ fn Focus(&self) {
+ // > 1. Let `current` be this `Window` object's browsing context.
+ // >
+ // > 2. If `current` is null, then return.
+ let current = match self.undiscarded_window_proxy() {
+ Some(proxy) => proxy,
+ None => return,
+ };
+
+ // > 3. Run the focusing steps with `current`.
+ current.focus();
+
+ // > 4. If current is a top-level browsing context, user agents are
+ // > encouraged to trigger some sort of notification to indicate to
+ // > the user that the page is attempting to gain focus.
+ //
+ // TODO: Step 4
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-window-blur
+ fn Blur(&self) {
+ // > User agents are encouraged to ignore calls to this `blur()` method
+ // > entirely.
+ }
+
// https://html.spec.whatwg.org/multipage/#dom-open
fn Open(
&self,
@@ -1220,7 +1246,7 @@ impl WindowMethods<crate::DomTypeHolder> for Window {
let rv = jsval_to_webdriver(cx, &self.globalscope, val, realm, can_gc);
let opt_chan = self.webdriver_script_chan.borrow_mut().take();
if let Some(chan) = opt_chan {
- chan.send(rv).unwrap();
+ let _ = chan.send(rv);
}
}
@@ -1229,9 +1255,9 @@ impl WindowMethods<crate::DomTypeHolder> for Window {
let opt_chan = self.webdriver_script_chan.borrow_mut().take();
if let Some(chan) = opt_chan {
if let Ok(rv) = rv {
- chan.send(Err(WebDriverJSError::JSException(rv))).unwrap();
+ let _ = chan.send(Err(WebDriverJSError::JSException(rv)));
} else {
- chan.send(rv).unwrap();
+ let _ = chan.send(rv);
}
}
}
@@ -1239,7 +1265,7 @@ impl WindowMethods<crate::DomTypeHolder> for Window {
fn WebdriverTimeout(&self) {
let opt_chan = self.webdriver_script_chan.borrow_mut().take();
if let Some(chan) = opt_chan {
- chan.send(Err(WebDriverJSError::Timeout)).unwrap();
+ let _ = chan.send(Err(WebDriverJSError::Timeout));
}
}
diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs
index e3fc81bf7ec..dc02f9feb49 100644
--- a/components/script/dom/windowproxy.rs
+++ b/components/script/dom/windowproxy.rs
@@ -620,6 +620,23 @@ impl WindowProxy {
result
}
+ /// Run [the focusing steps] with this browsing context.
+ ///
+ /// [the focusing steps]: https://html.spec.whatwg.org/multipage/#focusing-steps
+ pub fn focus(&self) {
+ debug!(
+ "Requesting the constellation to initiate a focus operation for \
+ browsing context {}",
+ self.browsing_context_id()
+ );
+ self.global()
+ .script_to_constellation_chan()
+ .send(ScriptToConstellationMessage::FocusRemoteDocument(
+ self.browsing_context_id(),
+ ))
+ .unwrap();
+ }
+
#[allow(unsafe_code)]
/// Change the Window that this WindowProxy resolves to.
// TODO: support setting the window proxy to a dummy value,
diff --git a/components/script/dom/writablestream.rs b/components/script/dom/writablestream.rs
index 8c2b2434cd2..1b029f592de 100644
--- a/components/script/dom/writablestream.rs
+++ b/components/script/dom/writablestream.rs
@@ -893,7 +893,7 @@ impl WritableStream {
global.note_cross_realm_transform_writable(&cross_realm_transform_writable, port_id);
// Enable port’s port message queue.
- port.Start();
+ port.Start(can_gc);
// Perform ! SetUpWritableStreamDefaultController
controller
@@ -1202,7 +1202,7 @@ impl CrossRealmTransformWritable {
.error_if_needed(cx, rooted_error.handle(), global, can_gc);
// Disentangle port.
- global.disentangle_port(port);
+ global.disentangle_port(port, can_gc);
}
}
diff --git a/components/script/dom/writablestreamdefaultcontroller.rs b/components/script/dom/writablestreamdefaultcontroller.rs
index 301404ffdb2..084165a6892 100644
--- a/components/script/dom/writablestreamdefaultcontroller.rs
+++ b/components/script/dom/writablestreamdefaultcontroller.rs
@@ -173,11 +173,11 @@ impl Callback for TransferBackPressurePromiseReaction {
self.port
.pack_and_post_message_handling_error("chunk", chunk.handle(), can_gc);
- // Disentangle port.
- global.disentangle_port(&self.port);
-
// If result is an abrupt completion,
if let Err(error) = result {
+ // Disentangle port.
+ global.disentangle_port(&self.port, can_gc);
+
// Return a promise rejected with result.[[Value]].
self.result_promise.reject_error(error, can_gc);
} else {
@@ -609,7 +609,7 @@ impl WritableStreamDefaultController {
let result = port.pack_and_post_message_handling_error("error", reason, can_gc);
// Disentangle port.
- global.disentangle_port(port);
+ global.disentangle_port(port, can_gc);
let promise = Promise::new(global, can_gc);
@@ -752,7 +752,7 @@ impl WritableStreamDefaultController {
.expect("Sending close should not fail.");
// Disentangle port.
- global.disentangle_port(port);
+ global.disentangle_port(port, can_gc);
// Return a promise resolved with undefined.
Promise::new_resolved(global, cx, (), can_gc)
diff --git a/components/script/messaging.rs b/components/script/messaging.rs
index 7d0b7aabe05..e0ea9e30af2 100644
--- a/components/script/messaging.rs
+++ b/components/script/messaging.rs
@@ -72,6 +72,8 @@ impl MixedMessage {
ScriptThreadMessage::UpdateHistoryState(id, ..) => Some(*id),
ScriptThreadMessage::RemoveHistoryStates(id, ..) => Some(*id),
ScriptThreadMessage::FocusIFrame(id, ..) => Some(*id),
+ ScriptThreadMessage::FocusDocument(id, ..) => Some(*id),
+ ScriptThreadMessage::Unfocus(id, ..) => Some(*id),
ScriptThreadMessage::WebDriverScriptCommand(id, ..) => Some(*id),
ScriptThreadMessage::TickAllAnimations(..) => None,
ScriptThreadMessage::WebFontLoaded(id, ..) => Some(*id),
diff --git a/components/script/script_module.rs b/components/script/script_module.rs
index c7697adeea6..0aa35a2eda8 100644
--- a/components/script/script_module.rs
+++ b/components/script/script_module.rs
@@ -1369,7 +1369,7 @@ pub(crate) unsafe extern "C" fn host_import_module_dynamically(
true
}
-#[derive(Clone, JSTraceable, MallocSizeOf)]
+#[derive(Clone, Debug, JSTraceable, MallocSizeOf)]
/// <https://html.spec.whatwg.org/multipage/#script-fetch-options>
pub(crate) struct ScriptFetchOptions {
#[no_trace]
@@ -1763,7 +1763,8 @@ fn fetch_single_module_script(
.mode(mode)
.insecure_requests_policy(global.insecure_requests_policy())
.has_trustworthy_ancestor_origin(global.has_trustworthy_ancestor_origin())
- .policy_container(global.policy_container().to_owned());
+ .policy_container(global.policy_container().to_owned())
+ .cryptographic_nonce_metadata(options.cryptographic_nonce.clone());
let context = Arc::new(Mutex::new(ModuleContext {
owner,
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index f78b5bf281b..2129979ad42 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -50,8 +50,9 @@ use devtools_traits::{
};
use embedder_traits::user_content_manager::UserContentManager;
use embedder_traits::{
- CompositorHitTestResult, EmbedderMsg, InputEvent, MediaSessionActionType, MouseButton,
- MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverScriptCommand,
+ CompositorHitTestResult, EmbedderMsg, FocusSequenceNumber, InputEvent, MediaSessionActionType,
+ MouseButton, MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails,
+ WebDriverScriptCommand,
};
use euclid::Point2D;
use euclid::default::Rect;
@@ -124,7 +125,7 @@ use crate::dom::customelementregistry::{
CallbackReaction, CustomElementDefinition, CustomElementReactionStack,
};
use crate::dom::document::{
- Document, DocumentSource, FocusType, HasBrowsingContext, IsHTMLDocument, TouchEventResult,
+ Document, DocumentSource, FocusInitiator, HasBrowsingContext, IsHTMLDocument, TouchEventResult,
};
use crate::dom::element::Element;
use crate::dom::globalscope::GlobalScope;
@@ -331,8 +332,7 @@ pub struct ScriptThread {
#[no_trace]
layout_factory: Arc<dyn LayoutFactory>,
- // Mouse down point.
- // In future, this shall be mouse_down_point for primary button
+ /// The screen coordinates where the primary mouse button was pressed.
#[no_trace]
relative_mouse_down_point: Cell<Point2D<f32, DevicePixel>>,
}
@@ -1804,8 +1804,14 @@ impl ScriptThread {
ScriptThreadMessage::RemoveHistoryStates(pipeline_id, history_states) => {
self.handle_remove_history_states(pipeline_id, history_states)
},
- ScriptThreadMessage::FocusIFrame(parent_pipeline_id, frame_id) => {
- self.handle_focus_iframe_msg(parent_pipeline_id, frame_id, can_gc)
+ ScriptThreadMessage::FocusIFrame(parent_pipeline_id, frame_id, sequence) => {
+ self.handle_focus_iframe_msg(parent_pipeline_id, frame_id, sequence, can_gc)
+ },
+ ScriptThreadMessage::FocusDocument(pipeline_id, sequence) => {
+ self.handle_focus_document_msg(pipeline_id, sequence, can_gc)
+ },
+ ScriptThreadMessage::Unfocus(pipeline_id, sequence) => {
+ self.handle_unfocus_msg(pipeline_id, sequence, can_gc)
},
ScriptThreadMessage::WebDriverScriptCommand(pipeline_id, msg) => {
self.handle_webdriver_msg(pipeline_id, msg, can_gc)
@@ -2514,6 +2520,7 @@ impl ScriptThread {
&self,
parent_pipeline_id: PipelineId,
browsing_context_id: BrowsingContextId,
+ sequence: FocusSequenceNumber,
can_gc: CanGc,
) {
let document = self
@@ -2533,7 +2540,65 @@ impl ScriptThread {
return;
};
- document.request_focus(Some(&iframe_element_root), FocusType::Parent, can_gc);
+ if document.get_focus_sequence() > sequence {
+ debug!(
+ "Disregarding the FocusIFrame message because the contained sequence number is \
+ too old ({:?} < {:?})",
+ sequence,
+ document.get_focus_sequence()
+ );
+ return;
+ }
+
+ document.request_focus(Some(&iframe_element_root), FocusInitiator::Remote, can_gc);
+ }
+
+ fn handle_focus_document_msg(
+ &self,
+ pipeline_id: PipelineId,
+ sequence: FocusSequenceNumber,
+ can_gc: CanGc,
+ ) {
+ if let Some(doc) = self.documents.borrow().find_document(pipeline_id) {
+ if doc.get_focus_sequence() > sequence {
+ debug!(
+ "Disregarding the FocusDocument message because the contained sequence number is \
+ too old ({:?} < {:?})",
+ sequence,
+ doc.get_focus_sequence()
+ );
+ return;
+ }
+ doc.request_focus(None, FocusInitiator::Remote, can_gc);
+ } else {
+ warn!(
+ "Couldn't find document by pipleline_id:{pipeline_id:?} when handle_focus_document_msg."
+ );
+ }
+ }
+
+ fn handle_unfocus_msg(
+ &self,
+ pipeline_id: PipelineId,
+ sequence: FocusSequenceNumber,
+ can_gc: CanGc,
+ ) {
+ if let Some(doc) = self.documents.borrow().find_document(pipeline_id) {
+ if doc.get_focus_sequence() > sequence {
+ debug!(
+ "Disregarding the Unfocus message because the contained sequence number is \
+ too old ({:?} < {:?})",
+ sequence,
+ doc.get_focus_sequence()
+ );
+ return;
+ }
+ doc.handle_container_unfocus(can_gc);
+ } else {
+ warn!(
+ "Couldn't find document by pipleline_id:{pipeline_id:?} when handle_unfocus_msg."
+ );
+ }
}
fn handle_post_message_msg(
diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf
index c50bc31a7f5..6396e3ced0c 100644
--- a/components/script_bindings/codegen/Bindings.conf
+++ b/components/script_bindings/codegen/Bindings.conf
@@ -474,7 +474,7 @@ DOMInterfaces = {
'MessagePort': {
'weakReferenceable': True,
- 'canGc': ['GetOnmessage'],
+ 'canGc': ['Close', 'GetOnmessage', 'SetOnmessage', 'Start'],
},
'MessageEvent': {
@@ -579,7 +579,7 @@ DOMInterfaces = {
},
'ShadowRoot': {
- 'canGc': ['ElementFromPoint', 'ElementsFromPoint', 'SetInnerHTML', 'GetHTML', 'InnerHTML'],
+ 'canGc': ['SetHTMLUnsafe', 'ElementFromPoint', 'ElementsFromPoint', 'SetInnerHTML', 'GetHTML', 'InnerHTML'],
},
'StaticRange': {
diff --git a/components/script_bindings/webidls/MessagePort.webidl b/components/script_bindings/webidls/MessagePort.webidl
index 6fc1f432b38..b7082fc7fc3 100644
--- a/components/script_bindings/webidls/MessagePort.webidl
+++ b/components/script_bindings/webidls/MessagePort.webidl
@@ -16,6 +16,7 @@ interface MessagePort : EventTarget {
// event handlers
attribute EventHandler onmessage;
attribute EventHandler onmessageerror;
+ attribute EventHandler onclose;
};
dictionary StructuredSerializeOptions {
diff --git a/components/script_bindings/webidls/ShadowRoot.webidl b/components/script_bindings/webidls/ShadowRoot.webidl
index 6e3f2032294..cb0926afc10 100644
--- a/components/script_bindings/webidls/ShadowRoot.webidl
+++ b/components/script_bindings/webidls/ShadowRoot.webidl
@@ -25,7 +25,7 @@ ShadowRoot includes DocumentOrShadowRoot;
// https://html.spec.whatwg.org/multipage/#dom-parsing-and-serialization
partial interface ShadowRoot {
- // [CEReactions] undefined setHTMLUnsafe((TrustedHTML or DOMString) html);
+ [CEReactions] undefined setHTMLUnsafe(DOMString html);
DOMString getHTML(optional GetHTMLOptions options = {});
// [CEReactions] attribute (TrustedHTML or [LegacyNullToEmptyString] DOMString) innerHTML;
diff --git a/components/script_bindings/webidls/Window.webidl b/components/script_bindings/webidls/Window.webidl
index 81c442b119f..eb7c3e1d03d 100644
--- a/components/script_bindings/webidls/Window.webidl
+++ b/components/script_bindings/webidls/Window.webidl
@@ -27,8 +27,8 @@
[CrossOriginCallable] undefined close();
[CrossOriginReadable] readonly attribute boolean closed;
undefined stop();
- //[CrossOriginCallable] void focus();
- //[CrossOriginCallable] void blur();
+ [CrossOriginCallable] undefined focus();
+ [CrossOriginCallable] undefined blur();
// other browsing contexts
[Replaceable, CrossOriginReadable] readonly attribute WindowProxy frames;
diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml
index 498d170492d..b49f60e742a 100644
--- a/components/servo/Cargo.toml
+++ b/components/servo/Cargo.toml
@@ -46,14 +46,14 @@ tracing = [
webdriver = ["webdriver_server"]
webgl_backtrace = [
"script/webgl_backtrace",
- "canvas/webgl_backtrace",
+ "webgl/webgl_backtrace",
"canvas_traits/webgl_backtrace",
]
webxr = [
"dep:webxr",
"dep:webxr-api",
"compositing/webxr",
- "canvas/webxr",
+ "webgl/webxr",
"script/webxr",
]
webgpu = [
@@ -68,7 +68,8 @@ base = { workspace = true }
bincode = { workspace = true }
bluetooth = { path = "../bluetooth", optional = true }
bluetooth_traits = { workspace = true, optional = true }
-canvas = { path = "../canvas", default-features = false }
+canvas = { path = "../canvas" }
+webgl = { path = "../webgl", default-features = false }
canvas_traits = { workspace = true }
cfg-if = { workspace = true }
compositing = { path = "../compositing" }
diff --git a/components/servo/lib.rs b/components/servo/lib.rs
index 7fb990527ec..366685e1123 100644
--- a/components/servo/lib.rs
+++ b/components/servo/lib.rs
@@ -38,7 +38,6 @@ use base::id::{PipelineNamespace, PipelineNamespaceId};
use bluetooth::BluetoothThreadFactory;
#[cfg(feature = "bluetooth")]
use bluetooth_traits::BluetoothRequest;
-use canvas::WebGLComm;
use canvas::canvas_paint_thread::CanvasPaintThread;
use canvas_traits::webgl::{GlType, WebGLThreads};
use clipboard_delegate::StringRequest;
@@ -99,6 +98,7 @@ use servo_delegate::DefaultServoDelegate;
use servo_media::ServoMedia;
use servo_media::player::context::GlContext;
use servo_url::ServoUrl;
+use webgl::WebGLComm;
#[cfg(feature = "webgpu")]
pub use webgpu;
#[cfg(feature = "webgpu")]
@@ -120,6 +120,7 @@ pub use {bluetooth, bluetooth_traits};
use crate::proxies::ConstellationProxy;
use crate::responders::ServoErrorChannel;
pub use crate::servo_delegate::{ServoDelegate, ServoError};
+use crate::webrender_api::FrameReadyParams;
pub use crate::webview::{WebView, WebViewBuilder};
pub use crate::webview_delegate::{
AllowOrDenyRequest, AuthenticationRequest, FormControl, NavigationRequest, PermissionRequest,
@@ -233,14 +234,13 @@ impl webrender_api::RenderNotifier for RenderNotifier {
fn new_frame_ready(
&self,
document_id: DocumentId,
- _scrolled: bool,
- composite_needed: bool,
- _frame_publish_id: FramePublishId,
+ _: FramePublishId,
+ frame_ready_params: &FrameReadyParams,
) {
self.compositor_proxy
.send(CompositorMsg::NewWebRenderFrameReady(
document_id,
- composite_needed,
+ frame_ready_params.render,
));
}
}
diff --git a/components/shared/constellation/from_script_message.rs b/components/shared/constellation/from_script_message.rs
index 8346551fd15..ddc9f788617 100644
--- a/components/shared/constellation/from_script_message.rs
+++ b/components/shared/constellation/from_script_message.rs
@@ -4,7 +4,7 @@
//! Messages send from the ScriptThread to the Constellation.
-use std::collections::{HashMap, VecDeque};
+use std::collections::HashMap;
use std::fmt;
use base::Epoch;
@@ -15,7 +15,8 @@ use base::id::{
use canvas_traits::canvas::{CanvasId, CanvasMsg};
use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId};
use embedder_traits::{
- AnimationState, EmbedderMsg, MediaSessionEvent, TouchEventResult, ViewportDetails,
+ AnimationState, EmbedderMsg, FocusSequenceNumber, MediaSessionEvent, TouchEventResult,
+ ViewportDetails,
};
use euclid::default::Size2D as UntypedSize2D;
use http::{HeaderMap, Method};
@@ -34,7 +35,9 @@ use webgpu_traits::{WebGPU, WebGPUAdapterResponse};
use webrender_api::ImageKey;
use crate::structured_data::{BroadcastMsg, StructuredSerializedData};
-use crate::{LogEntry, MessagePortMsg, PortMessageTask, TraversalDirection, WindowSizeType};
+use crate::{
+ LogEntry, MessagePortMsg, PortMessageTask, PortTransferInfo, TraversalDirection, WindowSizeType,
+};
/// A Script to Constellation channel.
#[derive(Clone, Debug, Deserialize, Serialize)]
@@ -469,7 +472,7 @@ pub enum ScriptToConstellationMessage {
/* The ids of ports transferred successfully */
Vec<MessagePortId>,
/* The ids, and buffers, of ports whose transfer failed */
- HashMap<MessagePortId, VecDeque<PortMessageTask>>,
+ HashMap<MessagePortId, PortTransferInfo>,
),
/// A new message-port was created or transferred, with corresponding control-sender.
NewMessagePort(MessagePortRouterId, MessagePortId),
@@ -481,10 +484,14 @@ pub enum ScriptToConstellationMessage {
RerouteMessagePort(MessagePortId, PortMessageTask),
/// A message-port was shipped, let the entangled port know.
MessagePortShipped(MessagePortId),
- /// A message-port has been discarded by script.
- RemoveMessagePort(MessagePortId),
/// Entangle two message-ports.
EntanglePorts(MessagePortId, MessagePortId),
+ /// Disentangle two message-ports.
+ /// The first is the initiator, the second the other port,
+ /// unless the message is sent to complete a disentanglement,
+ /// in which case the first one is the other port,
+ /// and the second is none.
+ DisentanglePorts(MessagePortId, Option<MessagePortId>),
/// A global has started managing broadcast-channels.
NewBroadcastChannelRouter(
BroadcastChannelRouterId,
@@ -519,8 +526,21 @@ pub enum ScriptToConstellationMessage {
UntypedSize2D<u64>,
IpcSender<(IpcSender<CanvasMsg>, CanvasId, ImageKey)>,
),
- /// Notifies the constellation that this frame has received focus.
- Focus,
+ /// Notifies the constellation that this pipeline is requesting focus.
+ ///
+ /// When this message is sent, the sender pipeline has already its local
+ /// focus state updated. The constellation, after receiving this message,
+ /// will broadcast messages to other pipelines that are affected by this
+ /// focus operation.
+ ///
+ /// The first field contains the browsing context ID of the container
+ /// element if one was focused.
+ ///
+ /// The second field is a sequence number that the constellation should use
+ /// when sending a focus-related message to the sender pipeline next time.
+ Focus(Option<BrowsingContextId>, FocusSequenceNumber),
+ /// Requests the constellation to focus the specified browsing context.
+ FocusRemoteDocument(BrowsingContextId),
/// Get the top-level browsing context info for a given browsing context.
GetTopForBrowsingContext(BrowsingContextId, IpcSender<Option<WebViewId>>),
/// Get the browsing context id of the browsing context in which pipeline is
diff --git a/components/shared/constellation/lib.rs b/components/shared/constellation/lib.rs
index b3d4fe525a1..559bc2dd2d1 100644
--- a/components/shared/constellation/lib.rs
+++ b/components/shared/constellation/lib.rs
@@ -157,18 +157,29 @@ pub struct PortMessageTask {
pub data: StructuredSerializedData,
}
+/// The information needed by a global to process the transfer of a port.
+#[derive(Debug, Deserialize, MallocSizeOf, Serialize)]
+pub struct PortTransferInfo {
+ /// <https://html.spec.whatwg.org/multipage/#port-message-queue>
+ pub port_message_queue: VecDeque<PortMessageTask>,
+ /// A boolean indicating whether the port has been disentangled while in transfer,
+ /// if so, the disentanglement should be completed along with the transfer.
+ /// <https://html.spec.whatwg.org/multipage/#disentangle>
+ pub disentangled: bool,
+}
+
/// Messages for communication between the constellation and a global managing ports.
#[derive(Debug, Deserialize, Serialize)]
#[allow(clippy::large_enum_variant)]
pub enum MessagePortMsg {
/// Complete the transfer for a batch of ports.
- CompleteTransfer(HashMap<MessagePortId, VecDeque<PortMessageTask>>),
+ CompleteTransfer(HashMap<MessagePortId, PortTransferInfo>),
/// Complete the transfer of a single port,
/// whose transfer was pending because it had been requested
/// while a previous failed transfer was being rolled-back.
- CompletePendingTransfer(MessagePortId, VecDeque<PortMessageTask>),
- /// Remove a port, the entangled one doesn't exists anymore.
- RemoveMessagePort(MessagePortId),
+ CompletePendingTransfer(MessagePortId, PortTransferInfo),
+ /// <https://html.spec.whatwg.org/multipage/#disentangle>
+ CompleteDisentanglement(MessagePortId),
/// Handle a new port-message-task.
NewTask(MessagePortId, PortMessageTask),
}
diff --git a/components/shared/constellation/structured_data/transferable.rs b/components/shared/constellation/structured_data/transferable.rs
index cd6388f5f34..7e4fe0e6d2d 100644
--- a/components/shared/constellation/structured_data/transferable.rs
+++ b/components/shared/constellation/structured_data/transferable.rs
@@ -77,7 +77,12 @@ impl MessagePortImpl {
self.entangled_port
}
- /// Entanged this port with another.
+ /// <https://html.spec.whatwg.org/multipage/#disentangle>
+ pub fn disentangle(&mut self) -> Option<MessagePortId> {
+ self.entangled_port.take()
+ }
+
+ /// <https://html.spec.whatwg.org/multipage/#entangle>
pub fn entangle(&mut self, other_id: MessagePortId) {
self.entangled_port = Some(other_id);
}
diff --git a/components/shared/devtools/lib.rs b/components/shared/devtools/lib.rs
index 0cf99d22658..c07f4529073 100644
--- a/components/shared/devtools/lib.rs
+++ b/components/shared/devtools/lib.rs
@@ -144,6 +144,15 @@ pub struct NodeInfo {
pub shadow_root_mode: Option<ShadowRootMode>,
pub is_shadow_host: bool,
pub display: Option<String>,
+
+ /// The `DOCTYPE` name if this is a `DocumentType` node, `None` otherwise
+ pub doctype_name: Option<String>,
+
+ /// The `DOCTYPE` public identifier if this is a `DocumentType` node , `None` otherwise
+ pub doctype_public_identifier: Option<String>,
+
+ /// The `DOCTYPE` system identifier if this is a `DocumentType` node, `None` otherwise
+ pub doctype_system_identifier: Option<String>,
}
pub struct StartedTimelineMarker {
diff --git a/components/shared/embedder/lib.rs b/components/shared/embedder/lib.rs
index 5f1171859dc..c87fa9019ef 100644
--- a/components/shared/embedder/lib.rs
+++ b/components/shared/embedder/lib.rs
@@ -14,7 +14,7 @@ pub mod user_content_manager;
mod webdriver;
use std::ffi::c_void;
-use std::fmt::{Debug, Error, Formatter};
+use std::fmt::{Debug, Display, Error, Formatter};
use std::path::PathBuf;
use std::sync::Arc;
@@ -784,3 +784,76 @@ pub enum AnimationState {
/// No animations are active but callbacks are queued
NoAnimationCallbacksPresent,
}
+
+/// A sequence number generated by a script thread for its pipelines. The
+/// constellation attaches the target pipeline's last seen `FocusSequenceNumber`
+/// to every focus-related message it sends.
+///
+/// This is used to resolve the inconsistency that occurs due to bidirectional
+/// focus state synchronization and provide eventual consistency. Example:
+///
+/// ```text
+/// script constellation
+/// -----------------------------------------------------------------------
+/// send ActivateDocument ----------> receive ActivateDocument
+/// ,---- send FocusDocument
+/// |
+/// focus an iframe |
+/// send Focus -----------------|---> receive Focus
+/// | focus the iframe's content document
+/// receive FocusDocument <-----' send FocusDocument to the content pipeline --> ...
+/// unfocus the iframe
+/// focus the document
+///
+/// Final state: Final state:
+/// the iframe is not focused the iframe is focused
+/// ```
+///
+/// When the above sequence completes, from the script thread's point of view,
+/// the iframe is unfocused, but from the constellation's point of view, the
+/// iframe is still focused.
+///
+/// This inconsistency can be resolved by associating a sequence number to each
+/// message. Whenever a script thread initiates a focus operation, it generates
+/// and sends a brand new sequence number. The constellation attaches the
+/// last-received sequence number to each message it sends. This way, the script
+/// thread can discard out-dated incoming focus messages, and eventually, all
+/// actors converge to the consistent state which is determined based on the
+/// last focus message received by the constellation.
+///
+/// ```text
+/// script constellation
+/// -----------------------------------------------------------------------
+/// send ActivateDocument ----------> receive ActivateDocument
+/// ,---- send FocusDocument (0)
+/// |
+/// seq_number += 1 |
+/// focus an iframe |
+/// send Focus (1) -------------|---> receive Focus (1)
+/// | focus the iframe's content document
+/// receive FocusDocument (0) <-' send FocusDocument to the content pipeline --> ...
+/// ignore it because 0 < 1
+///
+/// Final state: Final state:
+/// the iframe is focused the iframe is focused
+/// ```
+#[derive(
+ Clone,
+ Copy,
+ Debug,
+ Default,
+ Deserialize,
+ Eq,
+ Hash,
+ MallocSizeOf,
+ PartialEq,
+ Serialize,
+ PartialOrd,
+)]
+pub struct FocusSequenceNumber(pub u64);
+
+impl Display for FocusSequenceNumber {
+ fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
+ Display::fmt(&self.0, f)
+ }
+}
diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs
index 7323907cba3..748c42400a8 100644
--- a/components/shared/script/lib.rs
+++ b/components/shared/script/lib.rs
@@ -27,8 +27,8 @@ use crossbeam_channel::{RecvTimeoutError, Sender};
use devtools_traits::ScriptToDevtoolsControlMsg;
use embedder_traits::user_content_manager::UserContentManager;
use embedder_traits::{
- CompositorHitTestResult, InputEvent, MediaSessionActionType, Theme, ViewportDetails,
- WebDriverScriptCommand,
+ CompositorHitTestResult, FocusSequenceNumber, InputEvent, MediaSessionActionType, Theme,
+ ViewportDetails, WebDriverScriptCommand,
};
use euclid::{Rect, Scale, Size2D, UnknownUnit};
use ipc_channel::ipc::{IpcReceiver, IpcSender};
@@ -191,7 +191,15 @@ pub enum ScriptThreadMessage {
RemoveHistoryStates(PipelineId, Vec<HistoryStateId>),
/// Set an iframe to be focused. Used when an element in an iframe gains focus.
/// PipelineId is for the parent, BrowsingContextId is for the nested browsing context
- FocusIFrame(PipelineId, BrowsingContextId),
+ FocusIFrame(PipelineId, BrowsingContextId, FocusSequenceNumber),
+ /// Focus the document. Used when the container gains focus.
+ FocusDocument(PipelineId, FocusSequenceNumber),
+ /// Notifies that the document's container (e.g., an iframe) is not included
+ /// in the top-level browsing context's focus chain (not considering system
+ /// focus) anymore.
+ ///
+ /// Obviously, this message is invalid for a top-level document.
+ Unfocus(PipelineId, FocusSequenceNumber),
/// Passes a webdriver command to the script thread for execution
WebDriverScriptCommand(PipelineId, WebDriverScriptCommand),
/// Notifies script thread that all animations are done
diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs
index a40b8c403c1..66baccd5147 100644
--- a/components/shared/script_layout/lib.rs
+++ b/components/shared/script_layout/lib.rs
@@ -117,16 +117,8 @@ pub enum LayoutElementType {
SVGSVGElement,
}
-pub enum HTMLCanvasDataSource {
- WebGL(ImageKey),
- Image(ImageKey),
- WebGPU(ImageKey),
- /// transparent black
- Empty,
-}
-
pub struct HTMLCanvasData {
- pub source: HTMLCanvasDataSource,
+ pub source: Option<ImageKey>,
pub width: u32,
pub height: u32,
}
diff --git a/components/webdriver_server/actions.rs b/components/webdriver_server/actions.rs
index f69a09a2577..fbede5b5887 100644
--- a/components/webdriver_server/actions.rs
+++ b/components/webdriver_server/actions.rs
@@ -76,7 +76,7 @@ fn compute_tick_duration(tick_actions: &ActionSequence) -> u64 {
}
},
ActionsType::Key { actions: _ } => (),
- ActionsType::Wheel { .. } => todo!("Not implemented."),
+ ActionsType::Wheel { .. } => log::error!("not implemented"),
}
duration
}
@@ -176,7 +176,10 @@ impl Handler {
}
}
},
- ActionsType::Wheel { .. } => todo!("Not implemented."),
+ ActionsType::Wheel { .. } => {
+ log::error!("not yet implemented");
+ return Err(ErrorStatus::UnsupportedOperation);
+ },
}
Ok(())
diff --git a/components/webdriver_server/capabilities.rs b/components/webdriver_server/capabilities.rs
index 477a3bfd34c..32596f5275a 100644
--- a/components/webdriver_server/capabilities.rs
+++ b/components/webdriver_server/capabilities.rs
@@ -4,7 +4,7 @@
use serde_json::{Map, Value};
use webdriver::capabilities::{BrowserCapabilities, Capabilities};
-use webdriver::error::{WebDriverError, WebDriverResult};
+use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult};
pub struct ServoCapabilities {
pub browser_name: String,
@@ -79,42 +79,42 @@ impl BrowserCapabilities for ServoCapabilities {
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
- todo!()
+ Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_virtual_authenticators(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
- todo!()
+ Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_uvm(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
- todo!()
+ Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_prf(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
- todo!()
+ Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_large_blob(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
- todo!()
+ Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
fn webauthn_extension_cred_blob(
&mut self,
_: &serde_json::Map<std::string::String, Value>,
) -> Result<bool, WebDriverError> {
- todo!()
+ Err(WebDriverError::new(ErrorStatus::UnsupportedOperation, ""))
}
}
diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs
index ce83a8f3cc1..d003ebf8adb 100644
--- a/components/webdriver_server/lib.rs
+++ b/components/webdriver_server/lib.rs
@@ -29,7 +29,7 @@ use embedder_traits::{
use euclid::{Rect, Size2D};
use http::method::Method;
use image::{DynamicImage, ImageFormat, RgbaImage};
-use ipc_channel::ipc::{self, IpcSender};
+use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use ipc_channel::router::ROUTER;
use keyboard_types::webdriver::send_keys;
use log::{debug, info};
@@ -678,7 +678,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
self.top_level_script_command(WebDriverScriptCommand::GetUrl(sender))?;
- let url = receiver.recv().unwrap();
+ let url = wait_for_script_response(receiver)?;
Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(url.as_str())?,
@@ -694,7 +694,7 @@ impl Handler {
.send(EmbedderToConstellationMessage::WebDriverCommand(cmd_msg))
.unwrap();
- let window_size = receiver.recv().unwrap();
+ let window_size = wait_for_script_response(receiver)?;
let window_size_response = WindowRectResponse {
x: 0,
y: 0,
@@ -738,7 +738,7 @@ impl Handler {
.unwrap();
});
- let window_size = receiver.recv().unwrap();
+ let window_size = wait_for_script_response(receiver)?;
let window_size_response = WindowRectResponse {
x: 0,
y: 0,
@@ -756,7 +756,7 @@ impl Handler {
sender,
))?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(is_enabled) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(is_enabled)?,
))),
@@ -772,7 +772,7 @@ impl Handler {
sender,
))?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(is_selected) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(is_selected)?,
))),
@@ -812,7 +812,7 @@ impl Handler {
self.top_level_script_command(WebDriverScriptCommand::GetTitle(sender))?;
- let value = receiver.recv().unwrap();
+ let value = wait_for_script_response(receiver)?;
Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
)))
@@ -874,7 +874,7 @@ impl Handler {
},
}
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => {
let value_resp = serde_json::to_value(
value.map(|x| serde_json::to_value(WebElement(x)).unwrap()),
@@ -1005,7 +1005,7 @@ impl Handler {
let cmd = WebDriverScriptCommand::GetBrowsingContextId(frame_id, sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(browsing_context_id) => {
self.session_mut()?.browsing_context_id = browsing_context_id;
Ok(WebDriverResponse::Void)
@@ -1047,7 +1047,7 @@ impl Handler {
},
}
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => {
let resp_value: Vec<Value> = value
.into_iter()
@@ -1103,7 +1103,7 @@ impl Handler {
},
}
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => {
let value_resp = serde_json::to_value(
value.map(|x| serde_json::to_value(WebElement(x)).unwrap()),
@@ -1156,7 +1156,7 @@ impl Handler {
},
}
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => {
let resp_value: Vec<Value> = value
.into_iter()
@@ -1175,7 +1175,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetElementRect(element.to_string(), sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(rect) => {
let response = ElementRectResponse {
x: rect.origin.x,
@@ -1193,7 +1193,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetElementText(element.to_string(), sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
))),
@@ -1205,9 +1205,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetActiveElement(sender);
self.browsing_context_script_command(cmd)?;
- let value = receiver
- .recv()
- .unwrap()
+ let value = wait_for_script_response(receiver)?
.map(|x| serde_json::to_value(WebElement(x)).unwrap());
Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
@@ -1218,7 +1216,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetComputedRole(element.to_string(), sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
))),
@@ -1230,7 +1228,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetElementTagName(element.to_string(), sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
))),
@@ -1250,7 +1248,7 @@ impl Handler {
sender,
);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
))),
@@ -1272,7 +1270,7 @@ impl Handler {
);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(SendableWebDriverJSValue(value))?,
))),
@@ -1289,7 +1287,7 @@ impl Handler {
let cmd =
WebDriverScriptCommand::GetElementCSS(element.to_string(), name.to_owned(), sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(value) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(value)?,
))),
@@ -1301,7 +1299,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetCookies(sender);
self.browsing_context_script_command(cmd)?;
- let cookies = receiver.recv().unwrap();
+ let cookies = wait_for_script_response(receiver)?;
let response = cookies
.into_iter()
.map(|cookie| cookie_msg_to_cookie(cookie.into_inner()))
@@ -1313,12 +1311,14 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::GetCookie(name, sender);
self.browsing_context_script_command(cmd)?;
- let cookies = receiver.recv().unwrap();
- let response = cookies
+ let cookies = wait_for_script_response(receiver)?;
+ let Some(response) = cookies
.into_iter()
.map(|cookie| cookie_msg_to_cookie(cookie.into_inner()))
.next()
- .unwrap();
+ else {
+ return Err(WebDriverError::new(ErrorStatus::NoSuchCookie, ""));
+ };
Ok(WebDriverResponse::Cookie(CookieResponse(response)))
}
@@ -1342,7 +1342,7 @@ impl Handler {
let cmd = WebDriverScriptCommand::AddCookie(cookie_builder.build(), sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(_) => Ok(WebDriverResponse::Void),
Err(response) => match response {
WebDriverCookieError::InvalidDomain => Err(WebDriverError::new(
@@ -1361,7 +1361,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::DeleteCookie(name, sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(_) => Ok(WebDriverResponse::Void),
Err(error) => Err(WebDriverError::new(error, "")),
}
@@ -1371,7 +1371,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let cmd = WebDriverScriptCommand::DeleteCookies(sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(_) => Ok(WebDriverResponse::Void),
Err(error) => Err(WebDriverError::new(error, "")),
}
@@ -1426,7 +1426,7 @@ impl Handler {
let cmd = WebDriverScriptCommand::GetPageSource(sender);
self.browsing_context_script_command(cmd)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(source) => Ok(WebDriverResponse::Generic(ValueResponse(
serde_json::to_value(source)?,
))),
@@ -1487,9 +1487,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let command = WebDriverScriptCommand::ExecuteScript(script, sender);
self.browsing_context_script_command(command)?;
- let result = receiver
- .recv()
- .unwrap_or(Err(WebDriverJSError::BrowsingContextNotFound));
+ let result = wait_for_script_response(receiver)?;
self.postprocess_js_result(result)
}
@@ -1533,9 +1531,7 @@ impl Handler {
let (sender, receiver) = ipc::channel().unwrap();
let command = WebDriverScriptCommand::ExecuteAsyncScript(script, sender);
self.browsing_context_script_command(command)?;
- let result = receiver
- .recv()
- .unwrap_or(Err(WebDriverJSError::BrowsingContextNotFound));
+ let result = wait_for_script_response(receiver)?;
self.postprocess_js_result(result)
}
@@ -1589,10 +1585,7 @@ impl Handler {
.unwrap();
// TODO: distinguish the not found and not focusable cases
- receiver
- .recv()
- .unwrap()
- .map_err(|error| WebDriverError::new(error, ""))?;
+ wait_for_script_response(receiver)?.map_err(|error| WebDriverError::new(error, ""))?;
let input_events = send_keys(&keys.text);
@@ -1615,7 +1608,7 @@ impl Handler {
let command = WebDriverScriptCommand::ElementClick(element.to_string(), sender);
self.browsing_context_script_command(command)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(element_id) => match element_id {
Some(element_id) => {
let id = Uuid::new_v4().to_string();
@@ -1688,7 +1681,7 @@ impl Handler {
.send(EmbedderToConstellationMessage::WebDriverCommand(cmd_msg))
.unwrap();
- if let Some(x) = receiver.recv().unwrap() {
+ if let Some(x) = wait_for_script_response(receiver)? {
img = Some(x);
break;
};
@@ -1739,7 +1732,7 @@ impl Handler {
let command = WebDriverScriptCommand::GetBoundingClientRect(element.to_string(), sender);
self.browsing_context_script_command(command)?;
- match receiver.recv().unwrap() {
+ match wait_for_script_response(receiver)? {
Ok(rect) => {
let encoded = self.take_screenshot(Some(Rect::from_untyped(&rect)))?;
@@ -1944,3 +1937,12 @@ fn webdriver_value_to_js_argument(v: &Value) -> String {
},
}
}
+
+fn wait_for_script_response<T>(receiver: IpcReceiver<T>) -> Result<T, WebDriverError>
+where
+ T: for<'de> Deserialize<'de> + Serialize,
+{
+ receiver
+ .recv()
+ .map_err(|_| WebDriverError::new(ErrorStatus::NoSuchWindow, ""))
+}
diff --git a/components/webgl/Cargo.toml b/components/webgl/Cargo.toml
new file mode 100644
index 00000000000..b0c1c0ceb29
--- /dev/null
+++ b/components/webgl/Cargo.toml
@@ -0,0 +1,36 @@
+[package]
+name = "webgl"
+version.workspace = true
+authors.workspace = true
+license.workspace = true
+edition.workspace = true
+publish.workspace = true
+rust-version.workspace = true
+
+[lib]
+name = "webgl"
+path = "lib.rs"
+
+[features]
+webgl_backtrace = ["canvas_traits/webgl_backtrace"]
+webxr = ["dep:webxr", "dep:webxr-api"]
+
+[dependencies]
+bitflags = { workspace = true }
+byteorder = { workspace = true }
+canvas_traits = { workspace = true }
+compositing_traits = { workspace = true }
+crossbeam-channel = { workspace = true }
+euclid = { workspace = true }
+fnv = { workspace = true }
+glow = { workspace = true }
+half = "2"
+ipc-channel = { workspace = true }
+log = { workspace = true }
+pixels = { path = "../pixels" }
+snapshot = { workspace = true }
+surfman = { workspace = true }
+webrender = { workspace = true }
+webrender_api = { workspace = true }
+webxr = { path = "../webxr", features = ["ipc"], optional = true }
+webxr-api = { workspace = true, features = ["ipc"], optional = true }
diff --git a/components/webgl/lib.rs b/components/webgl/lib.rs
new file mode 100644
index 00000000000..923e7faad24
--- /dev/null
+++ b/components/webgl/lib.rs
@@ -0,0 +1,13 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+#![deny(unsafe_code)]
+
+pub use webgl_mode::WebGLComm;
+
+mod webgl_limits;
+mod webgl_mode;
+pub mod webgl_thread;
+#[cfg(feature = "webxr")]
+mod webxr;
diff --git a/components/canvas/webgl_limits.rs b/components/webgl/webgl_limits.rs
index f683b6efff6..f683b6efff6 100644
--- a/components/canvas/webgl_limits.rs
+++ b/components/webgl/webgl_limits.rs
diff --git a/components/canvas/webgl_mode/inprocess.rs b/components/webgl/webgl_mode/inprocess.rs
index 566da2c58c8..566da2c58c8 100644
--- a/components/canvas/webgl_mode/inprocess.rs
+++ b/components/webgl/webgl_mode/inprocess.rs
diff --git a/components/canvas/webgl_mode/mod.rs b/components/webgl/webgl_mode/mod.rs
index 8bc74f6e244..8bc74f6e244 100644
--- a/components/canvas/webgl_mode/mod.rs
+++ b/components/webgl/webgl_mode/mod.rs
diff --git a/components/canvas/webgl_thread.rs b/components/webgl/webgl_thread.rs
index b1ac2b2d3c4..b1ac2b2d3c4 100644
--- a/components/canvas/webgl_thread.rs
+++ b/components/webgl/webgl_thread.rs
diff --git a/components/canvas/webxr.rs b/components/webgl/webxr.rs
index d43303e7393..d43303e7393 100644
--- a/components/canvas/webxr.rs
+++ b/components/webgl/webxr.rs
diff --git a/ports/servoshell/Cargo.toml b/ports/servoshell/Cargo.toml
index c77ea06fa15..e000900e4ea 100644
--- a/ports/servoshell/Cargo.toml
+++ b/ports/servoshell/Cargo.toml
@@ -121,7 +121,7 @@ serde_json = { workspace = true }
servo_allocator = { path = "../../components/allocator" }
shellwords = "1.0.0"
surfman = { workspace = true, features = ["sm-raw-window-handle-06", "sm-x11"] }
-winit = "0.30.9"
+winit = "0.30.10"
[target.'cfg(any(all(target_os = "linux", not(target_env = "ohos")), target_os = "macos"))'.dependencies]
sig = "1.0"
diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py
index 845b09b622a..860217d062a 100644
--- a/python/servo/testing_commands.py
+++ b/python/servo/testing_commands.py
@@ -432,9 +432,9 @@ class MachCommands(CommandBase):
return [py, avd, apk]
@Command('test-jquery', description='Run the jQuery test suite', category='testing')
- @CommandBase.common_command_arguments(build_configuration=False, build_type=True)
- def test_jquery(self, build_type: BuildType):
- return self.jquery_test_runner("test", build_type)
+ @CommandBase.common_command_arguments(binary_selection=True)
+ def test_jquery(self, servo_binary: str):
+ return self.jquery_test_runner("test", servo_binary)
@Command('test-dromaeo', description='Run the Dromaeo test suite', category='testing')
@CommandArgument('tests', default=["recommended"], nargs="...", help="Specific tests to run")
diff --git a/python/wpt/run.py b/python/wpt/run.py
index 97639ff34b6..b40287cbd96 100644
--- a/python/wpt/run.py
+++ b/python/wpt/run.py
@@ -51,6 +51,11 @@ def run_tests(default_binary_path: str, **kwargs):
os.environ["RUST_BACKTRACE"] = "1"
os.environ["HOST_FILE"] = os.path.join(SERVO_ROOT, "tests", "wpt", "hosts")
+ # The pytest framework used in the webdriver conformance tests dumps the
+ # environment variables when unexpected results occur, and this variable
+ # makes CI logs unreadable.
+ github_context = os.environ.pop("GITHUB_CONTEXT", None)
+
set_if_none(kwargs, "product", "servo")
set_if_none(kwargs, "config", os.path.join(WPT_PATH, "config.ini"))
set_if_none(kwargs, "include_manifest", os.path.join(WPT_PATH, "include.ini"))
@@ -142,6 +147,9 @@ def run_tests(default_binary_path: str, **kwargs):
kwargs["pause_after_test"] = False
wptrunner.run_tests(**kwargs)
+ if github_context:
+ os.environ["GITHUB_CONTEXT"] = github_context
+
# Use the second run to mark tests from the first run as flaky, but
# discard the results otherwise.
# TODO: It might be a good idea to send the new results to the
diff --git a/tests/wpt/include.ini b/tests/wpt/include.ini
index fdbd71b9ee6..ba81ab64b83 100644
--- a/tests/wpt/include.ini
+++ b/tests/wpt/include.ini
@@ -278,10 +278,26 @@ skip: true
skip: false
[WebCryptoAPI]
skip: false
+[webdriver]
+ skip: false
+ [tests]
+ skip: false
+ [bidi]
+ skip: true
+ [classic]
+ skip: true
+ [interop]
+ skip: true
[webgl]
skip: false
[webidl]
skip: false
+[webmessaging]
+ skip: false
+[websockets]
+ skip: false
+[webstorage]
+ skip: false
[webvr]
skip: false
[webvtt]
@@ -292,12 +308,6 @@ skip: true
skip: false
[dom-overlay]
skip: true
-[webmessaging]
- skip: false
-[websockets]
- skip: false
-[webstorage]
- skip: false
[workers]
skip: false
[modules]
diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json
index 8ba5d8b0ff6..5385c0403b4 100644
--- a/tests/wpt/meta/MANIFEST.json
+++ b/tests/wpt/meta/MANIFEST.json
@@ -411,10 +411,12 @@
"ai": {
"language_detection": {
"availability-detached-crash.https.html": [
- "5f76d59eb3540048bc0586f2a1ac5b3b313a147e",
+ "ee5e27e35b60e89f17f8008d809f4d6040e4eb5b",
[
null,
- {}
+ {
+ "testdriver": true
+ }
]
]
}
@@ -790,6 +792,13 @@
{}
]
],
+ "chrome-bug-405795970.html": [
+ "5b45527fd9ccb2038fdd3f459bcf10a9514f199c",
+ [
+ null,
+ {}
+ ]
+ ],
"pseudo-element-animation-with-marker.html": [
"ba7fc2371abfdc463f8ed36e6f1bb39fb9ef6ef5",
[
@@ -4907,6 +4916,13 @@
{}
]
],
+ "colspan-zero-crash.html": [
+ "a50586a5bfa7551724b838a0438339a34b4930fb",
+ [
+ null,
+ {}
+ ]
+ ],
"crashtests": {
"caption-repaint-crash.html": [
"6a024d0c1d7ef58da06a489d80d187bcb2a3e350",
@@ -7459,6 +7475,15 @@
}
}
},
+ "focus": {
+ "focus-element-crash.html": [
+ "27df1c0b13081827685fa96e0cba2f7b9b03c89a",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"fullscreen": {
"crashtests": {
"backdrop-list-item.html": [
@@ -7815,6 +7840,13 @@
{}
]
],
+ "iframe-hit-test-during-load-event-crash.html": [
+ "f668fc51573647e633fc3ac6430735d6fb4dfea7",
+ [
+ null,
+ {}
+ ]
+ ],
"iframe-loading-lazy-simple-crash.html": [
"b0b251438f73811ce2ec4d82fe47ffb3a2445c93",
[
@@ -9884,6 +9916,13 @@
]
},
"styling": {
+ "cx-sibling-index-crash.html": [
+ "9fe97b12d774a547a2cb3bf65f9a9ad8f1af8a58",
+ [
+ null,
+ {}
+ ]
+ ],
"font-size-number-calc-crash.svg": [
"6b56d9df2b426e2376f87668a98f5e21ee56e37b",
[
@@ -10046,6 +10085,13 @@
null,
{}
]
+ ],
+ "sibling-index-offset-crash.html": [
+ "812a7952738231f4c1bc2bf22c0d87f9a39c86cd",
+ [
+ null,
+ {}
+ ]
]
},
"interfaces": {
@@ -124253,6 +124299,32 @@
},
"css-align": {
"abspos": {
+ "align-items-static-position-001.tentative.html": [
+ "06c11e6cdb61a519fdbc77d377fb0ace0e92f6b1",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-items-static-position-001-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-items-static-position-002.tentative.html": [
+ "f90004b5672a1fef9f42cf32ae13b06fc085e0ec",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-items-static-position-002-ref.tentative.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"align-items-static-position.html": [
"0b653ca5d6c2bbaf29b3834aec7d806169c8de55",
[
@@ -124292,6 +124364,110 @@
{}
]
],
+ "align-self-static-position-003.html": [
+ "39f871f4c2b837dc67b30d615e9c8ad0e4392d24",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-004.html": [
+ "afba7215b116506138434da5fa3c13ec832fb393",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-005.html": [
+ "e148f0ebda37797d5573f4c3a2d4b7c52e5a2f2e",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-006.html": [
+ "253b2a52f618a82fcf13b82bd61075bc2dcee8be",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-007.html": [
+ "ebe872aaab909e29abf3eed33840a577a616b34b",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-static-position-008.html": [
+ "187974884b4aded9a031c0c2fdc9d2caafd9ef5b",
+ [
+ null,
+ [
+ [
+ "/css/css-align/abspos/align-self-static-position-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-stretch-auto-margins-aspect-ratio.html": [
+ "4eaa9d2f3a6dbab63d3d931d4c58a427bc11976f",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "align-self-stretch-auto-margins.html": [
+ "9d1b6454c848c02b7fef360fb447d4d6b46ee8c0",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"align-self-stretch-auto-size.tentative.html": [
"74091feacfe63813aa4a6bbc3ef1b4d3e4e8a59c",
[
@@ -124317,6 +124493,32 @@
],
{}
]
+ ],
+ "justify-self-stretch-auto-margins-aspect-ratio.html": [
+ "c50b32f089b1b0043ac5d9dbd0f79906d82827f3",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "justify-self-stretch-auto-margins.html": [
+ "7d7b4bfc8570d3dde59fc903de7cb173b0b5baf8",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"baseline-of-scrollable-1a.html": [
@@ -186622,6 +186824,192 @@
{}
]
]
+ },
+ "tentative": {
+ "multicol": {
+ "multicol-gap-decorations-001.html": [
+ "c3752156c7d54f6620ade9715b4562582c6135f6",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-002.html": [
+ "0b632fa94ace20a253f5f56079d29adbb7997135",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-003.html": [
+ "2f2473fd04686283e120abd29b5f273da40c3ef3",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-004.html": [
+ "0dcbeef4df82f4d9dc6e2ed2215ee2fa39773052",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-005.html": [
+ "daa65e904e71ee62c83ba2a16933d13311328539",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-006.html": [
+ "64b3b007ab5f6282c95bb79a39a3bcf89d10de88",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-007.html": [
+ "1f23ed7f7ca34602f4310627edb5ae96885028b8",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-008.html": [
+ "ed299b5d9f68e8560d99cdd58fcc9b3830929117",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-009.html": [
+ "b00c6a70f8abf9894e548d9e40882e396ed5b1f0",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-010.html": [
+ "61bb4a9b93314bb7d96a90b98f67b175a4cf86c6",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-011.html": [
+ "cf588ded41ea3e811c241984ec8909e5fbcf14be",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-012.html": [
+ "078b810cf8e608b16dd2a898136f4ce757325ed9",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-013.html": [
+ "d4170084f066688fd136b2abeb40da03b1243816",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "multicol-gap-decorations-014.html": [
+ "1dcd393d99aa19021684e42e9f835e17281fc6a4",
+ [
+ null,
+ [
+ [
+ "/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ }
}
},
"css-grid": {
@@ -192723,6 +193111,32 @@
{}
]
],
+ "replaced-element-016.tentative.html": [
+ "2d5b401b8d20ac682675b3eeb23f264239b83d49",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "replaced-element-017.tentative.html": [
+ "575fa8c78179d3741948e0d987fc446534bb6a86",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"table-with-infinite-max-intrinsic-width.html": [
"877e982cd4c5987f131587da33a23f3b7a49d538",
[
@@ -249632,6 +250046,32 @@
{}
]
],
+ "intrinsic-percent-replaced-029.tentative.html": [
+ "feff03bbe2e1a1e18a22429a58a9d20cc0f9987b",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "intrinsic-percent-replaced-030.tentative.html": [
+ "5a6b103c22e20d23aa842e72ac6ffe6c9948156f",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"intrinsic-percent-replaced-dynamic-001.html": [
"1128ffa1759f26011c0639d8b5f498322c6396ac",
[
@@ -324185,6 +324625,19 @@
{}
]
],
+ "table-cell-align-006.html": [
+ "a8d33f281fda76603ea312601933fdf170ddf64b",
+ [
+ null,
+ [
+ [
+ "/css/css-writing-modes/reference/table-cell-align-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"table-cell-valign-001.html": [
"f3026810dd58cd04f87df5f3ae2ad474d5c289db",
[
@@ -347922,7 +348375,7 @@
]
],
"marquee-with-trusted-types.html": [
- "57f4985032165e989ba261c32c11c9acf0491908",
+ "f16c58bb85d71b011e4ee524dfb63184a5fca81a",
[
null,
[
@@ -353314,19 +353767,6 @@
}
]
],
- "select-multiple-base-appearance.html": [
- "48673b446bc8e6e6cce72e6c4d29671bed313779",
- [
- null,
- [
- [
- "/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"select-only-button-opt-in.tentative.html": [
"b010d15e8adab1ebfe448842e195e29b24d332fb",
[
@@ -353559,6 +353999,21 @@
]
]
},
+ "customizable-select-in-page": {
+ "customizable-select-in-page-appearance.tentative.html": [
+ "b3bf75eb0ff25df6d4737326940a498a11d264d2",
+ [
+ null,
+ [
+ [
+ "/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"reset-algorithm-rendering.html": [
"67da173ff2eb0d90c063294db486eaa34ea8878a",
[
@@ -361578,7 +362033,7 @@
]
],
"animation-with-transform.html": [
- "f741cc634d732624186d8d0a034822bef831c872",
+ "323d984c98938fbb5bd224560d7adf0711149430",
[
null,
[
@@ -361643,7 +362098,7 @@
]
],
"two-animations-attach-to-same-scroll-timeline-cancel-one.html": [
- "ed8e8337a65af3033e3df4e158333d225d88a56d",
+ "28973d2d1858421ff53bae1d667c160152d6ecda",
[
null,
[
@@ -361656,7 +362111,7 @@
]
],
"two-animations-attach-to-same-scroll-timeline.html": [
- "de50599fbafb634e44ccd9546e18bea8ba7f7f7e",
+ "45ba3f99ccdbf9ef64f915c1c124d7f946a1f74f",
[
null,
[
@@ -370753,7 +371208,7 @@
[]
],
"docker.yml": [
- "66794b69aba0f2ee5984c269434cdab2ee9a6cfc",
+ "5de0cc4bcb1faf6c919d41998bd9ec035e8594cf",
[]
],
"documentation.yml": [
@@ -371496,6 +371951,10 @@
"iframe-helper.html": [
"fe07de3f8abac59ddbd6ccfd706a5e69c5b8b4c4",
[]
+ ],
+ "util.js": [
+ "7cb3e7c2e13cb0415be019580ccfcc339cd7bd8f",
+ []
]
}
},
@@ -374126,6 +374585,14 @@
"eb50cb54ef867844ea741fe1fdb01df970e4deea",
[]
],
+ "clear-site-data-prefetchCache.py": [
+ "3a332dd58b2012154b6a193410be34dc3f92a172",
+ []
+ ],
+ "clear-site-data-prerenderCache.py": [
+ "bf845cfb699c311c145357ad12a5b4b056d2c986",
+ []
+ ],
"controlled-endpoint.py": [
"bb4f464088e46438f993d66ae0da134bb4410c7b",
[]
@@ -413745,6 +414212,14 @@
[]
],
"abspos": {
+ "align-items-static-position-001-ref.tentative.html": [
+ "22c1fd03e38792a3d697659c1e087178c453f1ed",
+ []
+ ],
+ "align-items-static-position-002-ref.tentative.html": [
+ "6f53b04178707a83eb2822e5807cf42d3c547ca6",
+ []
+ ],
"align-items-static-position-ref.html": [
"fd7093f98748709d0f6d03c9dc9993a7a1447446",
[]
@@ -413757,6 +414232,30 @@
"d8bef63aa292aecd1ce6628e27abbc2c196f8a29",
[]
],
+ "align-self-static-position-003-ref.html": [
+ "132bbb7360fb5a40130e0a7af9ffb3a9d2baf753",
+ []
+ ],
+ "align-self-static-position-004-ref.html": [
+ "68130ee1d7e723a6b5c4c8a7e3b78d7bdb2f35da",
+ []
+ ],
+ "align-self-static-position-005-ref.html": [
+ "947bd2704481f757f3d1f4bf51105483978cc7ff",
+ []
+ ],
+ "align-self-static-position-006-ref.html": [
+ "5bbafc6484585ad25223cf1b5825214e90705836",
+ []
+ ],
+ "align-self-static-position-007-ref.html": [
+ "bc9b5f4f6502f647e97332401308a87a64c339f0",
+ []
+ ],
+ "align-self-static-position-008-ref.html": [
+ "79cf612b8f846920af1d2d7b188376693c789b3f",
+ []
+ ],
"align-self-with-flex-grid-parent-ref.html": [
"c87289d450e9ec95677c17a6d72d3e34dec4d05d",
[]
@@ -430713,6 +431212,66 @@
"7e0d9cbcd6ff64b17bc8fe57616a37ba29a9fd8e",
[]
]
+ },
+ "tentative": {
+ "multicol": {
+ "multicol-gap-decorations-001-ref.html": [
+ "834c96ccd397fbc41abcfb80dbd298094cb929b1",
+ []
+ ],
+ "multicol-gap-decorations-002-ref.html": [
+ "d132f0ca6770be13d87ee66fb033f2f498d0e37b",
+ []
+ ],
+ "multicol-gap-decorations-003-ref.html": [
+ "cd26da243891f05c83c5d1eea17c747dcf390f05",
+ []
+ ],
+ "multicol-gap-decorations-004-ref.html": [
+ "002b1f2b594cf791b6d66613f48128e915517e01",
+ []
+ ],
+ "multicol-gap-decorations-005-ref.html": [
+ "6543021c97934a217568e567ac005166f7a9c0a0",
+ []
+ ],
+ "multicol-gap-decorations-006-ref.html": [
+ "4cb56d207fef4f801ec2063828103712267c030e",
+ []
+ ],
+ "multicol-gap-decorations-007-ref.html": [
+ "09973ddc690a899be9fb321e603b7831bfeb22a7",
+ []
+ ],
+ "multicol-gap-decorations-008-ref.html": [
+ "d49c2f50f1909d5b04be07798e62448d9b82ab72",
+ []
+ ],
+ "multicol-gap-decorations-009-ref.html": [
+ "124bf7eaeb1779d067d84f1c30560f45763add7c",
+ []
+ ],
+ "multicol-gap-decorations-010-ref.html": [
+ "9582ab4103d197d25823ed75dc8cafa83e0b1a7c",
+ []
+ ],
+ "multicol-gap-decorations-011-ref.html": [
+ "3387918d399cdbd3b39364ebe954a2a204a5145c",
+ []
+ ],
+ "multicol-gap-decorations-012-ref.html": [
+ "9fb5e85e920812d259e057c7538d35db56659b05",
+ []
+ ],
+ "multicol-gap-decorations-013-ref.html": [
+ "8e426d8ed32b25248e602e063e69678ca94b5e09",
+ []
+ ],
+ "multicol-gap-decorations-014-ref.html": [
+ "9d9674bd476896f0f1b03ec6835b069c97d9c8e5",
+ []
+ ]
+ }
}
},
"css-gcpm": {
@@ -454347,6 +454906,10 @@
"c5cd6fe28a97343b94989193c4583ddd2393538a",
[]
],
+ "table-cell-align-006-ref.html": [
+ "c5b52346fc0ad931aedb40339150146e067bc268",
+ []
+ ],
"table-cell-valign-001-ref.html": [
"03cb9ec9e4c6b1d7b6e0973b57f3c93ce293b1e4",
[]
@@ -460247,7 +460810,7 @@
},
"include": {
"editor-test-utils.js": [
- "9c5600af77bf22c936cbe383a9667790d2cd8c10",
+ "f0c4f58399263a453b11a37e54d7152d935adec5",
[]
],
"implementation.js": [
@@ -464908,7 +465471,7 @@
[]
],
"fledge-util.sub.js": [
- "0a18ea40d3d25e22acef6a7c32f0e644989294cf",
+ "49ebfd1c596c102970f0062592284b14da3841f9",
[]
],
"fledge_http_server_util.py": [
@@ -464927,6 +465490,14 @@
"54873674eb58783731237dde5ef299ce15947638",
[]
],
+ "record-click.py": [
+ "b4e76873d9b12227e350e2d4d01321cab05a44ce",
+ []
+ ],
+ "record-view.py": [
+ "d423b2d9c72930a1302738418eef197f28dfb661",
+ []
+ ],
"redirect-to-trusted-signals.py": [
"7da27cd6872f9119c8647be939aecc4452526e50",
[]
@@ -469611,6 +470182,10 @@
"2d.gradient.object.current.png": [
"d638d033868afd3aab0a7b26d5b2a0a2b95da010",
[]
+ ],
+ "WEB_FEATURES.yml": [
+ "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c",
+ []
]
},
"filters": {
@@ -470031,6 +470606,10 @@
]
},
"fill-and-stroke-styles": {
+ "WEB_FEATURES.yml": [
+ "5d9106c1cd63b77005e44a30177d9e623f4e98df",
+ []
+ ],
"conic-gradient-expected.html": [
"f347abc9d3939fb52c4fe08d949f8d96c4de3386",
[]
@@ -470941,6 +471520,10 @@
"2d.gradient.hueInterpolationMethod-expected.html": [
"13ae67ad970eb6bc6a94d837d3f2c01c2ad9c3ba",
[]
+ ],
+ "WEB_FEATURES.yml": [
+ "319b5b8e04cb32161be0d8eb36cc4ba99eb6459c",
+ []
]
},
"filters": {
@@ -472307,82 +472890,6 @@
"244167937219cfd784f13d8ed37eedead64665e9",
[]
]
- },
- "tentative": {
- "restrict-properties": {
- "README.md": [
- "b3c24c3f82d2dbf07eefa9fa2e88fcf3817473d2",
- []
- ],
- "coop-rp-in-navigation-chain.https.html.headers": [
- "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c",
- []
- ],
- "iframe-popup-about-blank.https.window.js.headers": [
- "19d0dbe4e18df8ba52c2a564853f5614a0469b95",
- []
- ],
- "iframe-popup-to-so.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "iframe-popup-to-soap.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "iframe-popup-to-un.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "iframe-popup.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "popup-so.https.html.headers": [
- "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
- []
- ],
- "popup-soap.https.html.headers": [
- "d83ed86fb9b5d159b9f380424887402edc96cb75",
- []
- ],
- "popup-un.https.html.headers": [
- "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c",
- []
- ],
- "popup-with-cross-origin.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "popup-with-same-origin.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "popup-with-same-site.https.html.headers": [
- "d5c99062d2bb8f9660b68c172754867b598ed43f",
- []
- ],
- "reporting-bcg-reuse.https.html.sub.headers": [
- "33abadd83dd9187bfa5ecf811f9fef7058412780",
- []
- ],
- "reporting-from-rp-ro.https.html.sub.headers": [
- "07ecad96f2493c7ddc70cc5f37d242c07f0cabb1",
- []
- ],
- "reporting-from-rp.https.html.sub.headers": [
- "a61e2919c8acb6be886ef16e764f1ba5dcabe9bc",
- []
- ],
- "reporting-to-rp-ro.https.html.headers": [
- "16903320bb50789e0a64f9620540f1cc8c0902fd",
- []
- ],
- "reporting-to-rp.https.html.headers": [
- "16903320bb50789e0a64f9620540f1cc8c0902fd",
- []
- ]
- }
}
},
"document-isolation-policy": {
@@ -476378,6 +476885,12 @@
[]
]
}
+ },
+ "writing-suggestions": {
+ "WEB_FEATURES.yml": [
+ "4700eca4a12b8b607c16d85ff987a8ef42ac81a3",
+ []
+ ]
}
},
"the-hidden-attribute": {
@@ -476989,7 +477502,7 @@
[]
],
"marquee-with-trusted-types-ref.html": [
- "b177f47b757cc278abe79f5b59d9063f6911dbd3",
+ "5042557212e58741859ad6750543540cff563493",
[]
]
}
@@ -479765,10 +480278,6 @@
"b351c80c273940c8422db8f66da959fb36e962cb",
[]
],
- "select-multiple-base-appearance-ref.html": [
- "45a74da7559c72ee5840c00842aef4fc23915e0e",
- []
- ],
"select-only-picker-opt-in-ref.html": [
"67a0abe43f2d1aad0b1d82da8b8cdfc77a25b549",
[]
@@ -479806,6 +480315,22 @@
[]
]
},
+ "customizable-select-in-page": {
+ "customizable-select-in-page-appearance-ref.html": [
+ "57ea51e367cfad284ed80e71870698dfed0b26e4",
+ []
+ ],
+ "resources": {
+ "customizable-select-in-page.css": [
+ "deb080b4756cf51d2ece9d2b132e9fff6ccd6f7c",
+ []
+ ],
+ "customizable-select-in-page.js": [
+ "1323094332135c46297a1df5c9fed1922efe8f4a",
+ []
+ ]
+ }
+ },
"reset-algorithm-rendering-ref.html": [
"acf192d1d55b7da110d04651093e3ebe0cd48214",
[]
@@ -483754,6 +484279,10 @@
},
"system-state-and-capabilities": {
"the-navigator-object": {
+ "WEB_FEATURES.yml": [
+ "a1af3e21a48f5941a078209963d1ae7bc379dd59",
+ []
+ ],
"resources": {
"handler-sw.js": [
"5fd915d17f98d8fa9c3c81451f46d71bc6cd024e",
@@ -484797,6 +485326,12 @@
[]
]
},
+ "emulation": {
+ "set_geolocation_override.https.html.ini": [
+ "7de34991442711cd389fe324dabd6005605268af",
+ []
+ ]
+ },
"permissions": {
"set_permission.https.html.ini": [
"2101196fa2fe436c3f94c5f84451f1746501c84d",
@@ -485259,10 +485794,6 @@
"035e1d233d6f5646768b78e878c9db43b84a0068",
[]
],
- "WebCryptoAPI.idl": [
- "ff7a89cd0d51be01760b9bfdb709393f4db5fd31",
- []
- ],
"accelerometer.idl": [
"a082224dc88e10e043d86d09cbf981616f6bb9a7",
[]
@@ -485588,7 +486119,7 @@
[]
],
"fedcm.idl": [
- "215f375432e930afb63c26fb9bdc42365ca8c61d",
+ "5ce2d260f114ddcc25210905ee010a9b96b47410",
[]
],
"fenced-frame.idl": [
@@ -485680,7 +486211,7 @@
[]
],
"image-capture.idl": [
- "21e03d4db8248d469671d8286be877e3ad7dc7b5",
+ "26cc7fab5cdf1f3209057cf159171961b779dcd5",
[]
],
"image-resource.idl": [
@@ -485820,7 +486351,7 @@
[]
],
"mediastream-recording.idl": [
- "496bfcf2e27da7a7da6c653b8e7f27b702f7386f",
+ "68c891cdc918e7468de8add96acce35d6d63102f",
[]
],
"model-element.idl": [
@@ -486112,7 +486643,7 @@
[]
],
"turtledove.idl": [
- "b9f50d47885cf9186c9a2dd3c2d08e1dc4054431",
+ "7f11cdc37908f411280ea6f79eeb759c85acbe62",
[]
],
"ua-client-hints.idl": [
@@ -486236,13 +486767,17 @@
[]
],
"webcodecs.idl": [
- "274ef96578a3d16b9fcda6e817c25e12373ec824",
+ "3d4db1ed49d316c31005a5be857ad7d48eca378d",
[]
],
"webcrypto-secure-curves.idl": [
"01bb290b747827bb4e45ea6d0c8f6146e59b01ee",
[]
],
+ "webcrypto.idl": [
+ "ff7a89cd0d51be01760b9bfdb709393f4db5fd31",
+ []
+ ],
"webdriver.idl": [
"194e2d806adb2131f7cdc56a70a46d7784cb7d75",
[]
@@ -486256,7 +486791,7 @@
[]
],
"webgpu.idl": [
- "de1f7c1e52bc401fed112469595f281736213027",
+ "4fec46a2557033a941b5da7a7481aa8125696ed2",
[]
],
"webhid.idl": [
@@ -486272,7 +486807,7 @@
[]
],
"webnn.idl": [
- "57f2a4a9890147e24f10e91537a626732db1f617",
+ "37fcc32501efbeb38c9686a8fc96e1ce062eb30a",
[]
],
"webrtc-encoded-transform.idl": [
@@ -486328,7 +486863,7 @@
[]
],
"webxr-depth-sensing.idl": [
- "9befd640646a132bff680de5f5b0d2edbe199e91",
+ "7ddbec7cc975dfd1c5be6f05f1a854fffe653e79",
[]
],
"webxr-dom-overlays.idl": [
@@ -486356,7 +486891,7 @@
[]
],
"webxr.idl": [
- "1098000d6c2edae1a36f8e6a035f0c53432207c8",
+ "874994086a250df0f3c0a0eed03375d9429aeaa9",
[]
],
"webxrlayers.idl": [
@@ -486371,6 +486906,10 @@
"527c41deb6cda2de79780899d15bc43f02b281db",
[]
],
+ "writing-assistance-apis.idl": [
+ "916daee754e3ef992ad8fa282882c88dd9aa0734",
+ []
+ ],
"xhr.idl": [
"6ff75fd27741369f9671509998a21aeb9de3761a",
[]
@@ -494077,7 +494616,7 @@
[]
],
"webxr-test.js": [
- "0885b559e6335d7bcd8a539b7d7e03f5843c74a5",
+ "ce2503b1bbcfbd5c4318c08b49020e9453c4b3a6",
[]
],
"webxr-test.js.headers": [
@@ -494566,7 +495105,7 @@
[]
],
"testdriver.js": [
- "f127e2b2c8d9091a767b1ead849af1d18167070f",
+ "6e8410b7ea46064438c8d276274b6fbb689f81d2",
[]
],
"testdriver.js.headers": [
@@ -501383,7 +501922,7 @@
[]
],
"requirements_tc.txt": [
- "cb4ba1947784f9b9ba39b3e43237640c7d1e802d",
+ "ada75c2f761904412048f3525f3010b658d174f9",
[]
],
"run_tc.py": [
@@ -502002,7 +502541,7 @@
[]
],
"requirements_tests.txt": [
- "833fdb3b8761b3d790fcd9bf70ba536bd8dd3251",
+ "ca00b8f1f9835eea866a0462962b705a63366de6",
[]
],
"runner": {
@@ -512773,7 +513312,7 @@
[]
],
"asyncactions.py": [
- "71187ee76d7a1aff4803903a8506cb4dac4a8a04",
+ "9925a4b511def24fda82522acb5c5f0f9f3e80a1",
[]
],
"base.py": [
@@ -512805,7 +513344,7 @@
[]
],
"executorwebdriver.py": [
- "123c89c98b21e9ec2616c6bfad3d91c5069ee89c",
+ "87403c2944d57e31c2612871262af9b77ce73235",
[]
],
"executorwktr.py": [
@@ -512821,7 +513360,7 @@
[]
],
"protocol.py": [
- "7630fe1f3580f6cbb3554e89e05ab34c2fa3ee8e",
+ "833dff45636c7e22697e47cfe692ebecfcf2d76f",
[]
],
"pytestrunner": {
@@ -512936,7 +513475,7 @@
[]
],
"testdriver-extra.js": [
- "d83ba4192eb52487bf9265a5c2eea22f21e49c64",
+ "ab8b04ba3cdfc3d7c351ce99c6289de6e99b8f3e",
[]
],
"testdriver-vendor.js": [
@@ -515979,7 +516518,7 @@
[]
],
"keyframe-tests.js": [
- "2bcce1ecf47f180d7f91a8160ad548e2ad06f5b9",
+ "34a84f45b20dea524016a6f479e9e0d0f5b7b2e7",
[]
],
"keyframe-utils.js": [
@@ -518793,7 +519332,7 @@
"close-event": {
"resources": {
"helper.js": [
- "cb9ea9fe981e95374b836255c752a42de788fc7b",
+ "48744ac1c5b530ef8d46c3d9a0378c698353a5bc",
[]
]
}
@@ -518911,7 +519450,7 @@
},
"resources": {
"utils.js": [
- "d19cb7cf760f63d60b26f008af7329fad0a568a1",
+ "50d7911a9181a5139d9e16f7c866112dc54d6d01",
[]
],
"utils_validation.js": [
@@ -521784,6 +522323,10 @@
"0cc425955374e214cd5dd9bdb75a654c7c69faa9",
[]
],
+ "matchDepthViewValues.js": [
+ "597f9734d3fe66c2600c291a643a6d70ec908a25",
+ []
+ ],
"pauseResumeTests.js": [
"e7513ef61c13b856ea9e49ff93ad9088e57163b3",
[]
@@ -550196,14 +550739,14 @@
"ai": {
"language_detection": {
"detector-iframe.https.html": [
- "3e90d36b5aa63a556b82337cdf7a26410b80ac36",
+ "ddcf82bec684024f855217c649bb2da6cbd1f577",
[
null,
{}
]
],
"detector-locale.https.window.js": [
- "a1c67db912961d8850bb4a430f92f7be4b450c87",
+ "80cbfa485e3944ba13de2aec3ba317e2cc84026f",
[
"ai/language_detection/detector-locale.https.window.html",
{
@@ -550217,6 +550760,18 @@
"window"
],
[
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "resources/util.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
"script",
"../resources/util.js"
],
@@ -550224,12 +550779,13 @@
"script",
"../resources/locale-util.js"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
"detector.https.window.js": [
- "e85ea6d249b17d3ed1505f206f5ac6659b6dfd94",
+ "b0255bc552b0d2f7c71f8567bab9e0102702cd4c",
[
"ai/language_detection/detector.https.window.html",
{
@@ -550243,6 +550799,18 @@
"window"
],
[
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "resources/util.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
"script",
"../resources/util.js"
],
@@ -550250,12 +550818,13 @@
"script",
"../resources/locale-util.js"
]
- ]
+ ],
+ "timeout": "long"
}
]
],
"detector.optional.https.window.js": [
- "7ffa1362dd5f97b68e7c678463dd5afa186d10dc",
+ "1dd248a9ecab667355702d00e865341122a2ebe2",
[
"ai/language_detection/detector.optional.https.window.html",
{
@@ -550269,10 +550838,23 @@
"window"
],
[
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "resources/util.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
"script",
"../resources/util.js"
]
- ]
+ ],
+ "timeout": "long"
}
]
]
@@ -551295,7 +551877,7 @@
]
],
"setSinkId.https.html": [
- "be65f0ac81bc41a89e5085a43124f7ee991fea7b",
+ "662596910ee9adf94f83d536fe9c67a49db67f4b",
[
null,
{
@@ -571982,7 +572564,7 @@
},
"cookie-store": {
"change_eventhandler_for_already_expired.https.window.js": [
- "89d84b13d1b53ec4d424b363ace9b26ed9685685",
+ "f3bbe0ea560974e9486941384e75a58d2d6a4637",
[
"cookie-store/change_eventhandler_for_already_expired.https.window.html",
{
@@ -572000,7 +572582,7 @@
]
],
"change_eventhandler_for_document_cookie.https.window.js": [
- "82b0f2baa2bb72f51d944e2138ad56f7a170ba7a",
+ "1937ebdae35942840dc3b641b5907f334048f3fb",
[
"cookie-store/change_eventhandler_for_document_cookie.https.window.html",
{
@@ -572018,7 +572600,7 @@
]
],
"change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js": [
- "8f5ef1cabbe7a742115ba81328e40ee789496edd",
+ "8517995acfe746bbff09243597d6d319e3af1bc2",
[
"cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.html",
{
@@ -572035,6 +572617,24 @@
}
]
],
+ "change_eventhandler_for_no_change.https.window.js": [
+ "5f9c2927433fc408c70c005789dc0bcc34d46caa",
+ [
+ "cookie-store/change_eventhandler_for_no_change.https.window.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Cookie Store API: Test that setting a duplicate cookie does not fire a second event."
+ ],
+ [
+ "script",
+ "resources/cookie-test-helpers.js"
+ ]
+ ]
+ }
+ ]
+ ],
"change_eventhandler_for_no_name_and_no_value.https.window.js": [
"4498caf59689cc3da875d1c56937f6d2a235cb5d",
[
@@ -580266,14 +580866,14 @@
]
],
"margin-trim-computed.html": [
- "ad2d17f2ef01d2f870a4f07cd3eccb226e4de0f2",
+ "c38adea9a68e1eeee53e8a42ba9d745546624f88",
[
null,
{}
]
],
"margin-trim.html": [
- "0d92f80b9b96ee409b141487f26cb664ce67f8df",
+ "e8679f9cbf3fb606c542ae8ccc653e0b90b96bbc",
[
null,
{}
@@ -584160,7 +584760,7 @@
]
],
"linear-timing-functions-syntax.html": [
- "0c949e9ea7dc50c86cd6877da1a10f7b2ba01625",
+ "408264b58dfe41dd7744d20419bae3a5fc7fd3eb",
[
null,
{}
@@ -584174,7 +584774,7 @@
]
],
"step-timing-functions-syntax.html": [
- "4e8b21e4413f8000ae584396355ed7df1c44a447",
+ "e8465ff7a3304184046f7eb81f93d51a61c19dad",
[
null,
{}
@@ -587326,7 +587926,7 @@
]
],
"font-palette-values-invalid.html": [
- "a3a0a88ba68c8fcc1f8b00054d7b12bc08d4b7af",
+ "32c9c4c5efeec345c24261b7bb0aa237f11d25e0",
[
null,
{}
@@ -587747,7 +588347,7 @@
]
],
"test_font_feature_values_parsing.html": [
- "7a5844d56008eae798652b59a335d08d24b34032",
+ "08c20142449646123ebdecde6f023511b45feed4",
[
null,
{}
@@ -595352,6 +595952,15 @@
}
]
],
+ "scroll-button-display-none.html": [
+ "8b3068be6dad6d1ccbe1134b9833ecc1c8b0f594",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"scroll-button-hover-remove.html": [
"af000012b4ec605fb0e30a34e50bc02119a9b925",
[
@@ -595950,7 +596559,7 @@
]
],
"overscroll-behavior-root.html": [
- "a116ead01b71db7b72bfd483b10b35b2e83ea1b8",
+ "71c5f6573d6f31f1ef872c09302063919597d8da",
[
null,
{
@@ -600428,6 +601037,13 @@
{}
]
],
+ "host-part-nesting.html": [
+ "c0dc8e20eee9ab3fda124ef99cb7623146b8a321",
+ [
+ null,
+ {}
+ ]
+ ],
"host-stylesheet.html": [
"2e65c4b1b57bd9959c68e85e11b442c67f2c5a42",
[
@@ -613586,6 +614202,13 @@
{}
]
],
+ "run_in_parallel.html": [
+ "1afdae2be9d8092953746d360d2a77ea1a538ba1",
+ [
+ null,
+ {}
+ ]
+ ],
"start-view-transition.html": [
"a1bc95891956e6678c8ee2ecd51be7d6e94b70ca",
[
@@ -622655,6 +623278,13 @@
]
],
"non-cancelable-when-passive": {
+ "generic-events-stay-cancelable.html": [
+ "961794728d3799a2096bad18dd60e79f619533a4",
+ [
+ null,
+ {}
+ ]
+ ],
"non-passive-mousewheel-event-listener-on-body.html": [
"5574fe0acbcccb64ff05213fa518c49d4149e7e4",
[
@@ -626762,7 +627392,7 @@
]
],
"XMLSerializer-serializeToString.html": [
- "c3b704bf18825c27e74c5db8177fa178925c9b26",
+ "6c294e464a5dc787abd4d10281ab2fe0555a0a3c",
[
null,
{}
@@ -626866,6 +627496,13 @@
{}
]
],
+ "xml-parse-serialize-roundtrip.html": [
+ "5195b9f04b5dd9f47937a5d11d2e82f09fdb9204",
+ [
+ null,
+ {}
+ ]
+ ],
"xml-serialization.xhtml": [
"852bbcc9fd1b1c91fd544dfc2fc462efc1195a4a",
[
@@ -630424,7 +631061,7 @@
]
],
"selection-change-not-fired-if-selection-set-to-root.html": [
- "39e8b46e69b2c469b4b5d4ed40314bd67a2b3524",
+ "cac621ad3cdd3b1b8c9fcbbdf09cac739f9756ff",
[
null,
{
@@ -669018,7 +669655,7 @@
]
],
"generate-bid-browser-signals.https.window.js": [
- "e472fccdc4da37c1a2cebb80921809cab5788b54",
+ "ee0cdd84efa4a3307bb674015c3eb5a8211fe962",
[
"fledge/tentative/generate-bid-browser-signals.https.window.html?1-4",
{
@@ -669077,7 +669714,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669141,7 +669786,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669205,7 +669858,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669269,7 +669930,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669333,14 +670002,22 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
}
],
[
- "fledge/tentative/generate-bid-browser-signals.https.window.html?29-last",
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?29-32",
{
"script_metadata": [
[
@@ -669397,7 +670074,159 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?33-36",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-4"
+ ],
+ [
+ "variant",
+ "?5-8"
+ ],
+ [
+ "variant",
+ "?9-12"
+ ],
+ [
+ "variant",
+ "?13-16"
+ ],
+ [
+ "variant",
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "fledge/tentative/generate-bid-browser-signals.https.window.html?37-last",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/common/utils.js"
+ ],
+ [
+ "script",
+ "resources/fledge-util.sub.js"
+ ],
+ [
+ "script",
+ "/common/subset-tests.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "variant",
+ "?1-4"
+ ],
+ [
+ "variant",
+ "?5-8"
+ ],
+ [
+ "variant",
+ "?9-12"
+ ],
+ [
+ "variant",
+ "?13-16"
+ ],
+ [
+ "variant",
+ "?17-20"
+ ],
+ [
+ "variant",
+ "?21-24"
+ ],
+ [
+ "variant",
+ "?25-28"
+ ],
+ [
+ "variant",
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669461,7 +670290,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -669525,7 +670362,15 @@
],
[
"variant",
- "?29-last"
+ "?29-32"
+ ],
+ [
+ "variant",
+ "?33-36"
+ ],
+ [
+ "variant",
+ "?37-last"
]
],
"timeout": "long"
@@ -717280,342 +718125,6 @@
}
]
]
- },
- "restrict-properties": {
- "access-reporting-closed.https.html": [
- "1c315b35d7fa81188aabf59c1c3196a5d5d2a2ea",
- [
- null,
- {}
- ]
- ],
- "access-reporting-openee-rp-ro.https.html": [
- "7a96f4f5762721378036b47d248c3ae1ef21dd2f",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "access-reporting-opener-rp-ro.https.html": [
- "9e1e85b16a5876c3e78656b8300c2fcc9e3e3ab1",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "access-reporting-post-message.https.html": [
- "5bc718e2a89a28a6867e83c0d85bc0cedefe39f6",
- [
- null,
- {}
- ]
- ],
- "coop-rp-in-navigation-chain.https.html": [
- "e5c877517488f755e08f69233439a817dd444164",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup-about-blank.https.window.js": [
- "1247400a4e37d2f6bd52b2731c2a3eb7f84a7185",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.html",
- {
- "script_metadata": [
- [
- "script",
- "/common/get-host-info.sub.js"
- ],
- [
- "script",
- "/common/utils.js"
- ],
- [
- "script",
- "/common/dispatcher/dispatcher.js"
- ]
- ]
- }
- ]
- ],
- "iframe-popup-to-so.https.html": [
- "8cf2679e190129e91de8e2af4ceef5b064fedba4",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?1-1",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?2-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?3-3",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?4-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?5-5",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?6-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?7-7",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?8-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup-to-soap.https.html": [
- "f3af3ca7db1bad6506fef6b519c8f244d2080d0e",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?1-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?3-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?5-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?7-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup-to-un.https.html": [
- "560dfd90511dca11a8b5f4fb30d88beb093c538a",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?1-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?3-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?5-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?7-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "iframe-popup.https.html": [
- "17840724d9e342aa52cdcc474356b25d554dfd63",
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?1-2",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?3-4",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?5-6",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?7-8",
- {
- "timeout": "long"
- }
- ],
- [
- "html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html?9-last",
- {
- "timeout": "long"
- }
- ]
- ],
- "named_targeting.https.html": [
- "10929847ee64d1f47e78b1c34af55c963871c055",
- [
- null,
- {}
- ]
- ],
- "popup-so.https.html": [
- "e5313a6e222d5b7671747516b8d056fda7e9db8b",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-soap.https.html": [
- "595a10a84bbc9c23ba609411e84f5e0bf107e6ac",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-u.https.html": [
- "595a10a84bbc9c23ba609411e84f5e0bf107e6ac",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-un.https.html": [
- "595a10a84bbc9c23ba609411e84f5e0bf107e6ac",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-with-cross-origin.https.html": [
- "a84d52584e9b4fbd6a9a35e5472c5a990fdf2351",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-with-same-origin.https.html": [
- "c0020fa23a478fd75aa27b69edb95c84f3e3789a",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "popup-with-same-site.https.html": [
- "7d115ac7e639a53c76f6bc1b7b7c9210d8d6bf89",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-bcg-reuse.https.html": [
- "9bc171a269c5284de80cad871baafd58fb297da0",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-from-rp-ro.https.html": [
- "b89030f218ffeb79da7269f70a3432f79700e95a",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-from-rp.https.html": [
- "6b31f7e0098da78db34e91ba179ac1ef86e3035d",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-to-rp-ro.https.html": [
- "c47e59cd8f1aeac7ee6b1dbe2177595730148a38",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ],
- "reporting-to-rp.https.html": [
- "ff60e8c5afda67ff3ca1573dab5405769b2b2cc3",
- [
- null,
- {
- "timeout": "long"
- }
- ]
- ]
}
}
},
@@ -732955,6 +733464,26 @@
]
]
},
+ "customizable-select-in-page": {
+ "customizable-select-in-page-keyboard-behavior.tentative.html": [
+ "24e6e39ea48236fc7b72604860913247b5f5f05c",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "customizable-select-in-page-mouse-behavior.tentative.html": [
+ "d5b93693cf7d65b1202f459223a8cf6b8cff581a",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ },
"inserted-or-removed.html": [
"0db2bf0e77a4a8a76ebcef1b0879cac9bb8c3fea",
[
@@ -733676,7 +734205,7 @@
]
],
"dialog-focusability.html": [
- "1e000866099c7044ce07fc812229293f645c2f27",
+ "5afb407640b7d2ee1487454464df9adb41419a8a",
[
null,
{
@@ -733786,7 +734315,7 @@
]
],
"dialog-requestclose.html": [
- "9a9c87167d5eaf93bd31c1f979450415dd9fba0d",
+ "6555f1b43bd399cc4e885f80a3a9cbee1dd752dc",
[
null,
{
@@ -739187,14 +739716,14 @@
],
"processing-model-1": {
"col-span-limits.html": [
- "a4a425b9c1f70926c77ad3eb1b8a8a87a4655de9",
+ "2a1ac80e65ad37a0e15ca383e67889b79f2308d0",
[
null,
{}
]
],
"span-limits.html": [
- "cdfa61bbcdc06ea62b80d042440d55fb0c89a186",
+ "798639b387562a54965d5283673a50773c2a3c49",
[
null,
{
@@ -741565,6 +742094,13 @@
{}
]
],
+ "serializing-cdata-in-html-document.html": [
+ "b2366285a41d946324981e771bfbfe2b157606f5",
+ [
+ null,
+ {}
+ ]
+ ],
"serializing-lt-gt.tentative.html": [
"6c74b443a838267be7f0d2ad8a8a80964c57209f",
[
@@ -747373,6 +747909,20 @@
]
]
},
+ "emulation": {
+ "set_geolocation_override.https.html": [
+ "5cbcf546423c772a98fd3725531754c366ab7b91",
+ [
+ null,
+ {
+ "testdriver": true,
+ "testdriver_features": [
+ "bidi"
+ ]
+ }
+ ]
+ ]
+ },
"permissions": {
"set_permission.https.html": [
"5b05e2374e2b4b451a0f98eabd36a6e72a03f933",
@@ -756018,7 +756568,7 @@
]
],
"MediaDevices-enumerateDevices-per-origin-ids.sub.https.html": [
- "714355f5c1c0b2fe37cff162c7be6240540cc0e2",
+ "467cf5d50c71c28675e87445ec311df53815a100",
[
null,
{
@@ -768920,7 +769470,7 @@
]
],
"pointerevent_pointerout_no_pointer_movement.html": [
- "856f2ce37cec59f70dc1a9ad4d3fe0436da3e4cd",
+ "1af166593266f671b1b4705e1911e46eb4c4b990",
[
null,
{
@@ -787708,7 +788258,7 @@
]
],
"fieldset-source.html": [
- "d75f30e664e325f4e43277b4036da0cbb157a990",
+ "cdd2e0be40c87d0cb932a341c9f2f9bf842f96b8",
[
null,
{}
@@ -793934,7 +794484,7 @@
]
],
"form.html": [
- "a4a5f37283848efcdb99b50b3aebb23df3235fe5",
+ "5ab144b05ed130409a09c116fcceecfc57cfaab5",
[
null,
{
@@ -796388,8 +796938,8 @@
{}
]
],
- "clear-prefetch-cache-after-clear-site-data-cache.https.html": [
- "c5796e48b768868f084ae5ad97a63fca5abf6992",
+ "clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html": [
+ "48f6264e852b0e32e6be06367e16b27f7cc6d14b",
[
null,
{}
@@ -797355,8 +797905,8 @@
}
]
],
- "cancel-prerendering-after-clear-site-data-cache-different-origins.https.html": [
- "34b77f8bc47346ecaac9e6f42856d2c5dcd66daf",
+ "cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html": [
+ "db52e758750f2757f722c025e3accf6fce13a9cc",
[
null,
{
@@ -797364,8 +797914,8 @@
}
]
],
- "cancel-prerendering-after-clear-site-data-cache-same-origin.https.html": [
- "cb253d45eaa8f70da33b3bfb13f222280058e9b7",
+ "cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html": [
+ "23d862c5130139bc5e20242e73cb8d2e4a93e332",
[
null,
{
@@ -806064,7 +806614,7 @@
],
"crashtests": {
"garbage-collection.any.js": [
- "b2ba5cd4c27e9120a9e69c358e6ff5be31b107fd",
+ "cf10f7f2e8317ed16dd5fe3a967c6f26efd0a335",
[
"streams/readable-streams/crashtests/garbage-collection.any.html",
{
@@ -814616,6 +815166,13 @@
]
},
"embedded": {
+ "attr-image-fetchpriority.html": [
+ "b083538a8b8ba723347860dda97afecadd1283ee",
+ [
+ null,
+ {}
+ ]
+ ],
"image-crossorigin.sub.html": [
"531512ec168003a55bd687b1b8db010e161f1b0e",
[
@@ -814919,6 +815476,33 @@
]
],
"interact": {
+ "focus-inside-hidden-svg-containers-01.html": [
+ "25765c5b93e66b597c3e66a3083e40e298491cb2",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "focus-inside-hidden-svg-containers-02.html": [
+ "fd9fd34275d0784d82ec0ef847b295c3ad93bcca",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "focus-inside-hidden-svg-containers-03.html": [
+ "097cff57b5ac8296f2e528f96e5333a7370e9722",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"inheritance.svg": [
"e67f19ed43529af5e34683b6853ae870435be014",
[
@@ -815796,6 +816380,13 @@
]
},
"scripted": {
+ "attr-script-fetchpriority.html": [
+ "2f73e1e59a8a450d0a1ad74e45cbb6d25c70bf4a",
+ [
+ null,
+ {}
+ ]
+ ],
"script-invalid-script-type.html": [
"9602dd525bd4d2b77b8d4ffadebef9e568a98c77",
[
@@ -822770,7 +823361,7 @@
},
"viewport": {
"viewport-segments.html": [
- "64f0eb9caefb0b862faabcfe0ab23df52c00735d",
+ "cd24f2bd230b6ce60da9fd230554856ae43d6b64",
[
null,
{}
@@ -822797,7 +823388,7 @@
]
],
"viewport-segments-segments-property.https.html": [
- "852e49fa7fecea5badf92dfafb6befa49800dd39",
+ "e6c9d8b4e169ad061ae7aef5ca270894dbb1db2c",
[
null,
{
@@ -848528,7 +849119,7 @@
]
],
"explicitly-closed.tentative.window.js": [
- "612003d58eaea908ad93294a7bbf777184356a28",
+ "12bfa0bd73e9278e39b825d4fa81437f943cbd02",
[
"webmessaging/message-channels/close-event/explicitly-closed.tentative.window.html",
{
@@ -849405,7 +849996,7 @@
"webnn": {
"conformance_tests": {
"abs.https.any.js": [
- "fcf144200f665b7f9370c2c3f0867f6cfc80a059",
+ "de6a5761df443ab6977ee3a61afc764eedd31c2c",
[
"webnn/conformance_tests/abs.https.any.html?cpu",
{
@@ -850665,7 +851256,7 @@
]
],
"concat.https.any.js": [
- "0208e2ec605387a8d4dac040b64a1465b61d6848",
+ "d41921720463d388eeb0e152b30e04d8246b40b0",
[
"webnn/conformance_tests/concat.https.any.html?cpu",
{
@@ -856308,7 +856899,7 @@
]
],
"neg.https.any.js": [
- "c03afc52516e3e59bd84c500afbbefe6ef7ce7cf",
+ "8bc10475453e24ce6e7d4049d5470b21d8e7b147",
[
"webnn/conformance_tests/neg.https.any.html?cpu",
{
@@ -857409,7 +858000,7 @@
]
],
"qdq_subgraph.https.any.js": [
- "8f6f2246b04f8a6fc9570eced30b31b841da5a06",
+ "3b59c3bb49d6441a77e83309f48a97dd982aea74",
[
"webnn/conformance_tests/qdq_subgraph.https.any.html?cpu",
{
@@ -859176,7 +859767,7 @@
]
],
"relu.https.any.js": [
- "16cc2a3fa67b4ffa77f2555b94e91d8d398e87ff",
+ "63ef9fa9ff09d41d60a228b79b20fd29ff911a21",
[
"webnn/conformance_tests/relu.https.any.html?cpu",
{
@@ -861639,7 +862230,7 @@
]
],
"sub.https.any.js": [
- "2f2fadf7282185eb92cbd7961ab3f1e9d35fd5a3",
+ "85b15f5a00051c0ece94f6202150c0b93b23260f",
[
"webnn/conformance_tests/sub.https.any.html?cpu",
{
@@ -878581,7 +879172,7 @@
]
],
"RTCConfiguration-iceServers.html": [
- "aa66bfbb2bfff0febc9404e4b73e0637a3226a70",
+ "bc7831361ab5f417b46a507b0e5977bef9bedd49",
[
null,
{}
@@ -878832,7 +879423,7 @@
]
],
"RTCPeerConnection-addTransceiver.https.html": [
- "3fd83a76fe2f687114de006bc877bc915a1809be",
+ "62df4293067e554dee9328f3f4f03556dedcdb10",
[
null,
{}
@@ -880805,7 +881396,7 @@
]
],
"supported-stats.https.html": [
- "677736f3cd8f33963c53d4fa9bee0c52f4826a5f",
+ "81aef5f94b90da1ee83de617ecabf0d3e11ad21d",
[
null,
{
@@ -897000,6 +897591,13 @@
{}
]
],
+ "depth_sensing_cpu_matchDepthViewIdentity.https.html": [
+ "f3256106e904b2b66291834197a80a4537c3c682",
+ [
+ null,
+ {}
+ ]
+ ],
"depth_sensing_cpu_pauseResume.https.html": [
"47469f4a0ea186e981843db8c00a1d72bc938907",
[
@@ -897065,6 +897663,13 @@
{}
]
],
+ "depth_sensing_gpu_matchDepthViewIdentity.https.html": [
+ "1813ddd449ec40a9722d38795b23c3397e02dc16",
+ [
+ null,
+ {}
+ ]
+ ],
"depth_sensing_gpu_pauseResume.https.html": [
"d51edb8cd3b85192fc5904df9f488e7c32356080",
[
@@ -926316,7 +926921,7 @@
]
],
"user_prompt_closed.py": [
- "fdb9e8b3ca7d5cc642ec69517f065887b16cdc24",
+ "8322829ebaf078152fd1874773ce0d110a0aac8e",
[
null,
{}
@@ -926339,7 +926944,7 @@
]
],
"user_prompt_opened.py": [
- "c24128004f73a8b09a61991837b1dad103f91789",
+ "a9051f662c8124b6ee4a8c1fc657a5a1aaf2a2b9",
[
null,
{}
@@ -926364,7 +926969,7 @@
]
],
"invalid.py": [
- "79241287fbc2b9a0dbd3c48e455d938e6bce7ad0",
+ "e804848e0be6c483340dcd8b3b4def10dddedce9",
[
null,
{}
@@ -926816,7 +927421,7 @@
]
],
"before_request_sent_cached.py": [
- "9483a707eab1d4caa561a193d641611cf92ffa2e",
+ "e8119d29d9e259208a11bed7c330a9ecbca49886",
[
null,
{}
diff --git a/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini
new file mode 100644
index 00000000000..88bb87548ec
--- /dev/null
+++ b/tests/wpt/meta/WebCryptoAPI/idlharness.https.any.js.ini
@@ -0,0 +1,8 @@
+[idlharness.https.any.html]
+ [idl_test setup]
+ expected: FAIL
+
+
+[idlharness.https.any.worker.html]
+ [idl_test setup]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini
new file mode 100644
index 00000000000..2f9fddf138a
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-003.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-003.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini
new file mode 100644
index 00000000000..f268ef7e7a6
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-004.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-004.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini
new file mode 100644
index 00000000000..07f1806f326
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-006.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-006.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini
new file mode 100644
index 00000000000..d5abf6545c2
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-007.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-007.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini
new file mode 100644
index 00000000000..bfeba12b70e
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-static-position-008.html.ini
@@ -0,0 +1,2 @@
+[align-self-static-position-008.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini
new file mode 100644
index 00000000000..6094b40bf56
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html.ini
@@ -0,0 +1,2 @@
+[align-self-stretch-auto-margins-aspect-ratio.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini
new file mode 100644
index 00000000000..cfef366e7b3
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/align-self-stretch-auto-margins.html.ini
@@ -0,0 +1,2 @@
+[align-self-stretch-auto-margins.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini
new file mode 100644
index 00000000000..bfba165e645
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html.ini
@@ -0,0 +1,2 @@
+[justify-self-stretch-auto-margins-aspect-ratio.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini
new file mode 100644
index 00000000000..75934b08795
--- /dev/null
+++ b/tests/wpt/meta/css/css-align/abspos/justify-self-stretch-auto-margins.html.ini
@@ -0,0 +1,2 @@
+[justify-self-stretch-auto-margins.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini
index 790872b29d0..ee2b86f6368 100644
--- a/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini
+++ b/tests/wpt/meta/css/css-box/parsing/margin-trim-computed.html.ini
@@ -46,3 +46,21 @@
[Property margin-trim value 'inline-start inline-end block-start']
expected: FAIL
+
+ [Property margin-trim value 'block-start inline-start block-end inline-end']
+ expected: FAIL
+
+ [Property margin-trim value 'block-start block-end inline-end inline-start']
+ expected: FAIL
+
+ [Property margin-trim value 'block-start block-end inline-start inline-end']
+ expected: FAIL
+
+ [Property margin-trim value 'inline-start block-end block-start inline-end']
+ expected: FAIL
+
+ [Property margin-trim value 'inline-start inline-end block-start block-end']
+ expected: FAIL
+
+ [Property margin-trim value 'inline-end block-end inline-start block-start']
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini
index cd977b53207..b75bfe7845a 100644
--- a/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini
+++ b/tests/wpt/meta/css/css-box/parsing/margin-trim.html.ini
@@ -43,3 +43,21 @@
[e.style['margin-trim'\] = "inline-end block-end inline-start block-start" should set the property value]
expected: FAIL
+
+ [e.style['margin-trim'\] = "block inline" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "inline block" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "block-start block-end inline-end inline-start" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "block-start block-end inline-start inline-end" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "inline-start block-end block-start inline-end" should set the property value]
+ expected: FAIL
+
+ [e.style['margin-trim'\] = "inline-start inline-end block-start block-end" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini
index 86c285fb78a..0d491bce6a4 100644
--- a/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini
+++ b/tests/wpt/meta/css/css-fonts/parsing/font-palette-values-invalid.html.ini
@@ -73,3 +73,6 @@
[CSS Fonts Module Level 4: parsing @font-palette-values 25]
expected: FAIL
+
+ [sibling-index() is invalid in base-palette descriptor]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini
index 6b1969e3049..b0922321d1f 100644
--- a/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini
+++ b/tests/wpt/meta/css/css-fonts/test_font_feature_values_parsing.html.ini
@@ -316,3 +316,6 @@
[basic parse tests - @font-feature-values bongo { @styleset { complex\\ blah: 1; } }]
expected: FAIL
+
+ [basic parse tests - @font-feature-values bongo { @stylistic { blah: sibling-index(); } }]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini
new file mode 100644
index 00000000000..09b5c2407df
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-001.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini
new file mode 100644
index 00000000000..d3d6008a74d
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-002.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini
new file mode 100644
index 00000000000..be28f9f62c3
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-003.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini
new file mode 100644
index 00000000000..f2c19d9824a
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-004.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini
new file mode 100644
index 00000000000..e63a9af4a63
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-005.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini
new file mode 100644
index 00000000000..e9fd7c8f430
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-006.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini
new file mode 100644
index 00000000000..f0da110b11d
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-007.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini
new file mode 100644
index 00000000000..fecb739fed1
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-008.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini
new file mode 100644
index 00000000000..15809ab6be8
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-009.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini
new file mode 100644
index 00000000000..087a090d25e
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-010.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini
new file mode 100644
index 00000000000..39cd43f8d3f
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-011.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini
new file mode 100644
index 00000000000..c60637403c8
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-012.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini
new file mode 100644
index 00000000000..319ec1ea8c7
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-013.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini
new file mode 100644
index 00000000000..7baae0182e4
--- /dev/null
+++ b/tests/wpt/meta/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html.ini
@@ -0,0 +1,2 @@
+[multicol-gap-decorations-014.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
new file mode 100644
index 00000000000..efff2a2620a
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/alignment/grid-content-alignment-with-abspos-001.html.ini
@@ -0,0 +1,3 @@
+[grid-content-alignment-with-abspos-001.html]
+ [.grid 1]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini
new file mode 100644
index 00000000000..39f8cc21286
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-016.tentative.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-016.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini
new file mode 100644
index 00000000000..77a110a0e75
--- /dev/null
+++ b/tests/wpt/meta/css/css-grid/grid-items/replaced-element-017.tentative.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-017.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini
new file mode 100644
index 00000000000..1a4d7b6af62
--- /dev/null
+++ b/tests/wpt/meta/css/css-sizing/intrinsic-percent-replaced-030.tentative.html.ini
@@ -0,0 +1,2 @@
+[intrinsic-percent-replaced-030.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/css/css-will-change/will-change-fixedpos-cb-003.html.ini b/tests/wpt/meta/css/css-will-change/will-change-fixedpos-cb-003.html.ini
deleted file mode 100644
index 77a5d26e728..00000000000
--- a/tests/wpt/meta/css/css-will-change/will-change-fixedpos-cb-003.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[will-change-fixedpos-cb-003.html]
- expected: FAIL
diff --git a/tests/wpt/meta/css/filter-effects/filtered-html-is-not-container.html.ini b/tests/wpt/meta/css/filter-effects/filtered-html-is-not-container.html.ini
deleted file mode 100644
index b366310b98b..00000000000
--- a/tests/wpt/meta/css/filter-effects/filtered-html-is-not-container.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[filtered-html-is-not-container.html]
- expected: FAIL
diff --git a/tests/wpt/meta/dom/nodes/insertion-removing-steps/blur-event.window.js.ini b/tests/wpt/meta/dom/nodes/insertion-removing-steps/blur-event.window.js.ini
deleted file mode 100644
index 9b57360d600..00000000000
--- a/tests/wpt/meta/dom/nodes/insertion-removing-steps/blur-event.window.js.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[blur-event.window.html]
- expected: CRASH
diff --git a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini
index dda18d32621..ad2c6663e6c 100644
--- a/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini
+++ b/tests/wpt/meta/domparsing/XMLSerializer-serializeToString.html.ini
@@ -67,3 +67,6 @@
[Check if a prefix bound to an empty namespace URI ("no namespace") serialize]
expected: FAIL
+
+ [Drop inconsistent xmlns="..." by matching on local name]
+ expected: FAIL
diff --git a/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini
new file mode 100644
index 00000000000..5424089439f
--- /dev/null
+++ b/tests/wpt/meta/domparsing/xml-parse-serialize-roundtrip.html.ini
@@ -0,0 +1,6 @@
+[xml-parse-serialize-roundtrip.html]
+ [DOMParser and XMLSerializer should round trip with CDATA sections: large CDATA]
+ expected: FAIL
+
+ [DOMParser and XMLSerializer should round trip with CDATA sections: multiple CDATAs]
+ expected: FAIL
diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html.ini
deleted file mode 100644
index 8f3aec5177f..00000000000
--- a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[activeelement-after-focusing-different-site-iframe-then-immediately-focusing-back.html]
- [Check focus event and active element after focusing different site iframe then immediately focusing back]
- expected: FAIL
diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe.html.ini
deleted file mode 100644
index b489ab52a39..00000000000
--- a/tests/wpt/meta/focus/activeelement-after-focusing-different-site-iframe.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[activeelement-after-focusing-different-site-iframe.html]
- [Check trailing events]
- expected: FAIL
diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini
index 5864035c9e1..612b845c7e9 100644
--- a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini
+++ b/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe-contentwindow.html.ini
@@ -1,2 +1,3 @@
[activeelement-after-focusing-same-site-iframe-contentwindow.html]
- expected: TIMEOUT
+ [Check result]
+ expected: FAIL
diff --git a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe.html.ini b/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe.html.ini
deleted file mode 100644
index 406e6a58324..00000000000
--- a/tests/wpt/meta/focus/activeelement-after-focusing-same-site-iframe.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[activeelement-after-focusing-same-site-iframe.html]
- [Check trailing events]
- expected: FAIL
diff --git a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini
index 532cbcbabfe..a58db5d3146 100644
--- a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini
+++ b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html.ini
@@ -1,2 +1,3 @@
[activeelement-after-immediately-focusing-different-site-iframe-contentwindow.html]
- expected: TIMEOUT
+ [Check result]
+ expected: FAIL
diff --git a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini
index 8483775c0c1..d8b0d3212c9 100644
--- a/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini
+++ b/tests/wpt/meta/focus/activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html.ini
@@ -1,2 +1,3 @@
[activeelement-after-immediately-focusing-same-site-iframe-contentwindow.html]
- expected: TIMEOUT
+ [Check result]
+ expected: FAIL
diff --git a/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini b/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini
index 8bdcea27053..1e3e377f307 100644
--- a/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini
+++ b/tests/wpt/meta/focus/focus-restoration-in-different-site-iframes-window.html.ini
@@ -1,2 +1,3 @@
[focus-restoration-in-different-site-iframes-window.html]
- expected: TIMEOUT
+ [Check result]
+ expected: FAIL
diff --git a/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini b/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini
index 53f4db35f7e..f19949138fa 100644
--- a/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini
+++ b/tests/wpt/meta/focus/focus-restoration-in-same-site-iframes-window.html.ini
@@ -1,2 +1,3 @@
[focus-restoration-in-same-site-iframes-window.html]
- expected: TIMEOUT
+ [Check result]
+ expected: FAIL
diff --git a/tests/wpt/meta/focus/iframe-focuses-parent-same-site.html.ini b/tests/wpt/meta/focus/iframe-focuses-parent-same-site.html.ini
deleted file mode 100644
index 8877baa8ac6..00000000000
--- a/tests/wpt/meta/focus/iframe-focuses-parent-same-site.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[iframe-focuses-parent-same-site.html]
- expected: TIMEOUT
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini
index 02a8e91ea04..d5f4fa2f799 100644
--- a/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html.ini
@@ -2,8 +2,5 @@
[window.open]
expected: FAIL
- [link click]
- expected: FAIL
-
[form submission]
expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini
new file mode 100644
index 00000000000..407f9d191c7
--- /dev/null
+++ b/tests/wpt/meta/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/cross-document-nav-cross-document-nav.html.ini
@@ -0,0 +1,3 @@
+[cross-document-nav-cross-document-nav.html]
+ [cross-document navigation then cross-document navigation]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini b/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini
index 6720c0f77da..3e682215a0e 100644
--- a/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini
+++ b/tests/wpt/meta/html/browsers/origin/cross-origin-objects/cross-origin-objects-function-caching.html.ini
@@ -1,7 +1,4 @@
[cross-origin-objects-function-caching.html]
- [Cross-origin Window methods are cached]
- expected: FAIL
-
[Cross-origin Location `replace` method is cached]
expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/the-window-object/focus.window.js.ini b/tests/wpt/meta/html/browsers/the-window-object/focus.window.js.ini
deleted file mode 100644
index 27a9640a02c..00000000000
--- a/tests/wpt/meta/html/browsers/the-window-object/focus.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[focus.window.html]
- [focus]
- expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini b/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini
index 8afe0888e4e..32cd3f302d4 100644
--- a/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini
+++ b/tests/wpt/meta/html/browsers/the-window-object/security-window/window-security.https.html.ini
@@ -328,9 +328,3 @@
[A SecurityError exception must be thrown when window.stop is accessed from a different origin.]
expected: FAIL
-
- [A SecurityError exception should not be thrown when window.blur is accessed from a different origin.]
- expected: FAIL
-
- [A SecurityError exception should not be thrown when window.focus is accessed from a different origin.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini b/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini
index e9061d31d26..94ad9ce191c 100644
--- a/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini
+++ b/tests/wpt/meta/html/browsers/the-window-object/window-properties.https.html.ini
@@ -1,9 +1,4 @@
[window-properties.https.html]
- [Window method: focus]
- expected: FAIL
-
- [Window method: blur]
- expected: FAIL
[Window method: print]
expected: FAIL
diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
index 7e036a1c4e4..5d2657041d1 100644
--- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
+++ b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-transfer.html.ini
@@ -1,5 +1,5 @@
[createImageBitmap-transfer.html]
- expected: TIMEOUT
+ expected: ERROR
[Transfer ImageBitmap created from a vector HTMLImageElement]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/idlharness.any.js.ini b/tests/wpt/meta/html/dom/idlharness.any.js.ini
index f17466adc7f..ad5e57e0759 100644
--- a/tests/wpt/meta/html/dom/idlharness.any.js.ini
+++ b/tests/wpt/meta/html/dom/idlharness.any.js.ini
@@ -95,9 +95,6 @@
[History interface: existence and properties of interface object]
expected: FAIL
- [MessagePort interface: attribute onclose]
- expected: FAIL
-
[WorkerGlobalScope interface: attribute onlanguagechange]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini
index 23b8e353fb0..25375c6ea47 100644
--- a/tests/wpt/meta/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini
@@ -1517,9 +1517,6 @@
[SVGSVGElement interface: attribute onpagereveal]
expected: FAIL
- [MessagePort interface: attribute onclose]
- expected: FAIL
-
[NotRestoredReasonDetails interface: existence and properties of interface object]
expected: FAIL
@@ -1738,9 +1735,6 @@
[Document interface: attribute all]
expected: FAIL
- [Window interface: operation focus()]
- expected: FAIL
-
[Window interface: attribute scrollbars]
expected: FAIL
@@ -1870,9 +1864,6 @@
[Document interface: new Document() must inherit property "dir" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "blur()" with the proper type]
- expected: FAIL
-
[Document interface: operation execCommand(DOMString, optional boolean, optional DOMString)]
expected: FAIL
@@ -1897,9 +1888,6 @@
[Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL
- [Window interface: operation blur()]
- expected: FAIL
-
[Document interface: iframe.contentDocument must inherit property "onslotchange" with the proper type]
expected: FAIL
@@ -1924,9 +1912,6 @@
[Document interface: documentWithHandlers must inherit property "onauxclick" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "focus()" with the proper type]
- expected: FAIL
-
[Document interface: documentWithHandlers must inherit property "onwebkitanimationend" with the proper type]
expected: FAIL
@@ -5375,9 +5360,6 @@
[Navigator interface: window.navigator must inherit property "pdfViewerEnabled" with the proper type]
expected: FAIL
- [MessagePort interface: attribute onclose]
- expected: FAIL
-
[SharedWorker interface: existence and properties of interface object]
expected: FAIL
@@ -5750,9 +5732,6 @@
[SVGSVGElement interface: attribute onunload]
expected: FAIL
- [ShadowRoot interface: operation setHTMLUnsafe((TrustedHTML or DOMString))]
- expected: FAIL
-
[OffscreenCanvasRenderingContext2D interface: operation getContextAttributes()]
expected: FAIL
diff --git a/tests/wpt/meta/html/dom/reflection-tabular.html.ini b/tests/wpt/meta/html/dom/reflection-tabular.html.ini
index 7550e2dc15d..1aeec1b3ef7 100644
--- a/tests/wpt/meta/html/dom/reflection-tabular.html.ini
+++ b/tests/wpt/meta/html/dom/reflection-tabular.html.ini
@@ -1487,9 +1487,6 @@
[colgroup.tabIndex: IDL set to -2147483648]
expected: FAIL
- [colgroup.span: setAttribute() to 2147483647]
- expected: FAIL
-
[colgroup.span: setAttribute() to 2147483648]
expected: FAIL
@@ -1499,9 +1496,6 @@
[colgroup.span: setAttribute() to 4294967296]
expected: FAIL
- [colgroup.span: setAttribute() to 1001]
- expected: FAIL
-
[colgroup.span: IDL set to 0]
expected: FAIL
@@ -2276,9 +2270,6 @@
[col.tabIndex: IDL set to -2147483648]
expected: FAIL
- [col.span: setAttribute() to 2147483647]
- expected: FAIL
-
[col.span: setAttribute() to 2147483648]
expected: FAIL
@@ -2288,9 +2279,6 @@
[col.span: setAttribute() to 4294967296]
expected: FAIL
- [col.span: setAttribute() to 1001]
- expected: FAIL
-
[col.span: IDL set to 0]
expected: FAIL
@@ -5657,9 +5645,6 @@
[td.tabIndex: IDL set to -2147483648]
expected: FAIL
- [td.colSpan: setAttribute() to 2147483647]
- expected: FAIL
-
[td.colSpan: setAttribute() to 2147483648]
expected: FAIL
@@ -5669,9 +5654,6 @@
[td.colSpan: setAttribute() to 4294967296]
expected: FAIL
- [td.colSpan: setAttribute() to 1001]
- expected: FAIL
-
[td.colSpan: IDL set to 0]
expected: FAIL
@@ -5684,9 +5666,6 @@
[td.colSpan: IDL set to 1001]
expected: FAIL
- [td.rowSpan: setAttribute() to 2147483647]
- expected: FAIL
-
[td.rowSpan: setAttribute() to 2147483648]
expected: FAIL
@@ -5696,9 +5675,6 @@
[td.rowSpan: setAttribute() to 4294967296]
expected: FAIL
- [td.rowSpan: setAttribute() to 65535]
- expected: FAIL
-
[td.rowSpan: IDL set to 2147483647]
expected: FAIL
@@ -7157,9 +7133,6 @@
[th.tabIndex: IDL set to -2147483648]
expected: FAIL
- [th.colSpan: setAttribute() to 2147483647]
- expected: FAIL
-
[th.colSpan: setAttribute() to 2147483648]
expected: FAIL
@@ -7169,9 +7142,6 @@
[th.colSpan: setAttribute() to 4294967296]
expected: FAIL
- [th.colSpan: setAttribute() to 1001]
- expected: FAIL
-
[th.colSpan: IDL set to 0]
expected: FAIL
@@ -7184,9 +7154,6 @@
[th.colSpan: IDL set to 1001]
expected: FAIL
- [th.rowSpan: setAttribute() to 2147483647]
- expected: FAIL
-
[th.rowSpan: setAttribute() to 2147483648]
expected: FAIL
@@ -7196,9 +7163,6 @@
[th.rowSpan: setAttribute() to 4294967296]
expected: FAIL
- [th.rowSpan: setAttribute() to 65535]
- expected: FAIL
-
[th.rowSpan: IDL set to 2147483647]
expected: FAIL
diff --git a/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini b/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini
index 8b8af2b9c2e..2ef0896e3b3 100644
--- a/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini
+++ b/tests/wpt/meta/html/infrastructure/urls/base-url/document-base-url-window-initiator-is-not-opener.https.window.js.ini
@@ -1,3 +1,4 @@
[document-base-url-window-initiator-is-not-opener.https.window.html]
+ expected: TIMEOUT
[window.open() gets base url from initiator not opener.]
expected: [FAIL, PASS, TIMEOUT]
diff --git a/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini
new file mode 100644
index 00000000000..ad3b45255f4
--- /dev/null
+++ b/tests/wpt/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html.ini
@@ -0,0 +1,2 @@
+[marquee-with-trusted-types.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
index 841bafc6eca..26704422bbe 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_escaping-2.html]
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index 62a6e7fc812..bbc1f35d8d9 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,4 +1,3 @@
[iframe_sandbox_popups_nonescaping-1.html]
- expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index c6f1e5d7d84..a6591b318dc 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,4 +1,4 @@
[iframe_sandbox_popups_nonescaping-2.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
index d89a1691435..ccdaf8d61b2 100644
--- a/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
+++ b/tests/wpt/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
@@ -1,4 +1,3 @@
[iframe_sandbox_popups_nonescaping-3.html]
- expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini
new file mode 100644
index 00000000000..8458e10e93e
--- /dev/null
+++ b/tests/wpt/meta/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html.ini
@@ -0,0 +1,2 @@
+[customizable-select-in-page-appearance.tentative.html]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
index 8dba4e9c469..bdba8dadafa 100644
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
+++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.js.ini
@@ -15,3 +15,6 @@
[blob-url.any.html]
[Different blob URLs pointing to the same blob resolve to different modules]
expected: FAIL
+
+ [Revoking a blob URL immediately after calling import will not fail]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini
deleted file mode 100644
index ccad3276c85..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/code-cache-nonce.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[code-cache-nonce.html]
- [First dynamic import should use nonce=abc]
- expected: FAIL
-
- [Second dynamic import should use nonce=def]
- expected: FAIL
-
- [Third dynamic import should use nonce=ghi]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini
deleted file mode 100644
index 0080e7908e9..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[propagate-nonce-external-classic.html]
- [Dynamically imported module should eval when imported from script w/ a valid nonce.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini
deleted file mode 100644
index 849c9b3e60d..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[propagate-nonce-external-module.html]
- expected: TIMEOUT
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini
deleted file mode 100644
index 74b32cc06dd..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[propagate-nonce-inline-classic.html]
- [Dynamically imported module should eval when imported from script w/ a valid nonce.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini
deleted file mode 100644
index eb08f590857..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[propagate-nonce-inline-module.html]
- [Dynamically imported module should eval when imported from script w/ a valid nonce.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini
index 9b3e3358ad3..8a3281def9e 100644
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini
+++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html.ini
@@ -1,18 +1,3 @@
[string-compilation-nonce-classic.html]
- [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
- [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
[setTimeout must inherit the nonce from the triggering script, thus execute]
expected: FAIL
-
- [direct eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [indirect eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [the Function constructor must inherit the nonce from the triggering script, thus execute]
- expected: FAIL \ No newline at end of file
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini
index 1d3b047b68b..98d0b640164 100644
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini
+++ b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html.ini
@@ -1,18 +1,3 @@
[string-compilation-nonce-module.html]
- [reflected inline event handlers must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
- [inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail]
- expected: PASS
-
- [direct eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [indirect eval must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
- [the Function constructor must inherit the nonce from the triggering script, thus execute]
- expected: FAIL
-
[setTimeout must inherit the nonce from the triggering script, thus execute]
- expected: FAIL \ No newline at end of file
+ expected: FAIL
diff --git a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini b/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini
deleted file mode 100644
index 64413107401..00000000000
--- a/tests/wpt/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/v8-code-cache.html.ini
+++ /dev/null
@@ -1,30 +0,0 @@
-[v8-code-cache.html]
- [text/javascript: Run #1]
- expected: FAIL
-
- [text/javascript: Run #2]
- expected: FAIL
-
- [text/javascript: Run #3]
- expected: FAIL
-
- [text/javascript: Run #4]
- expected: FAIL
-
- [text/javascript: Run #5]
- expected: FAIL
-
- [module: Run #1]
- expected: FAIL
-
- [module: Run #2]
- expected: FAIL
-
- [module: Run #3]
- expected: FAIL
-
- [module: Run #4]
- expected: FAIL
-
- [module: Run #5]
- expected: FAIL
diff --git a/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini
new file mode 100644
index 00000000000..d8b897fb81f
--- /dev/null
+++ b/tests/wpt/meta/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html.ini
@@ -0,0 +1,3 @@
+[serializing-cdata-in-html-document.html]
+ [Serializing CDATA in an HTML document]
+ expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini
deleted file mode 100644
index d0b3986d561..00000000000
--- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[setHTMLUnsafe-CEReactions.html]
- [ShadowRoot.setHTMLUnsafe should trigger custom element reactions.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini
deleted file mode 100644
index 850b529ff76..00000000000
--- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[setHTMLUnsafe.html]
- [ShadowRoot: setHTMLUnsafe with no shadowdom.]
- expected: FAIL
-
- [ShadowRoot: setHTMLUnsafe with shadowdom.]
- expected: FAIL
diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini
index c00e2949bf5..b229be268ec 100644
--- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini
+++ b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/event-listeners.window.js.ini
@@ -1,12 +1,6 @@
[event-listeners.window.html]
- [Standard event listeners are to be removed from Window]
- expected: FAIL
-
[Standard event listeners are to be removed from Window for an active but not fully active document]
expected: FAIL
- [Standard event listeners are to be removed from Window for a non-active document that is the associated Document of a Window (frame is removed)]
- expected: FAIL
-
[Custom event listeners are to be removed from Window for an active but not fully active document]
expected: FAIL
diff --git a/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini b/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini
index 0bb708b5b98..fb5e4d1adbe 100644
--- a/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini
+++ b/tests/wpt/meta/navigation-timing/test-navigation-type-reload.html.ini
@@ -22,9 +22,3 @@
[Reload domComplete > Original domComplete]
expected: FAIL
-
- [Reload loadEventEnd > Original loadEventEnd]
- expected: FAIL
-
- [Reload loadEventStart > Original loadEventStart]
- expected: FAIL
diff --git a/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini b/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini
deleted file mode 100644
index 3a96cb5998d..00000000000
--- a/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini
+++ /dev/null
@@ -1,4896 +0,0 @@
-[gethtml.html]
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <article><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <aside><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <blockquote><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <div><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <footer><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h1><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h2><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h3><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h4><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h5><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <h6><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <header><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <main><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <nav><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <p><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <section><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.]
- expected: FAIL
-
- [ShadowRoot.getHTML() on <span><span>light</span>, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.]
- expected: FAIL
diff --git a/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini b/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini
index 1e95f7f9744..855ee5803f5 100644
--- a/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini
+++ b/tests/wpt/meta/trusted-types/block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html.ini
@@ -1,9 +1,9 @@
[block-string-assignment-to-ShadowRoot-setHTMLUnsafe.html]
- [shadowRoot.setHTMLUnsafe(html) assigned via policy (successful HTML transformation).]
+ [`shadowRoot.setHTMLUnsafe(string)` assigned via default policy (successful HTML transformation).]
expected: FAIL
- [`shadowRoot.setHTMLUnsafe(string)` assigned via default policy (successful HTML transformation).]
+ [`shadowRoot.setHTMLUnsafe(string)` throws.]
expected: FAIL
- [`shadowRoot.setHTMLUnsafe(string)` assigned via default policy does not throw]
+ [`shadowRoot.setHTMLUnsafe(null)` throws.]
expected: FAIL
diff --git a/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini b/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini
index f42e7fa4f8b..79d9d1805d8 100644
--- a/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini
+++ b/tests/wpt/meta/trusted-types/trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html.ini
@@ -1,6 +1,3 @@
[trusted-types-reporting-for-ShadowRoot-setHTMLUnsafe.html]
- [No violation reported for TrustedHTML.]
- expected: FAIL
-
[Violation report for plain string.]
expected: FAIL
diff --git a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
index a8e069b27e7..3bfb92e671a 100644
--- a/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
+++ b/tests/wpt/meta/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini
@@ -760,3 +760,15 @@
[X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t1.7249685451109781e-36\t2.0512369275093079e-1\t2.0512369275093079e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.0512369275093079e-1 at index of 14680.\n\tMax RelError of 1.0000000000000000e+0 at index of 14680.\n]
expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-2.7021871583080320e+24\t2.0512369275093079e-1\t2.7021871583080320e+24\t1.3173452184234677e+25\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.7021871583080320e+24 at index of 14680.\n\tMax RelError of 1.3173452184234677e+25 at index of 14680.\n]
+ expected: FAIL
+
+ [X SNR (-445.2002225707384 dB) is not greater than or equal to 65.737. Got -445.2002225707384.]
+ expected: FAIL
+
+ [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[14680\]\t-4.2315589002308092e+19\t2.0512369275093079e-1\t4.2315589002308092e+19\t2.0629303438725304e+20\t3.8985999999999999e-3\n\t[14681\]\t1.1480505578219891e-2\t1.4340442419052124e-1\t1.3192391861230135e-1\t9.1994315626575540e-1\t3.8985999999999999e-3\n\tMax AbsError of 4.2315589002308092e+19 at index of 14680.\n\tMax RelError of 2.0629303438725304e+20 at index of 14680.\n]
+ expected: FAIL
+
+ [X SNR (-349.0959218623025 dB) is not greater than or equal to 65.737. Got -349.0959218623025.]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/accept_alert/accept.py.ini b/tests/wpt/meta/webdriver/tests/classic/accept_alert/accept.py.ini
new file mode 100644
index 00000000000..00caf69c8d5
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/accept_alert/accept.py.ini
@@ -0,0 +1,27 @@
+[accept.py]
+ [test_null_response_value]
+ expected: FAIL
+
+ [test_no_top_level_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_user_prompt]
+ expected: FAIL
+
+ [test_accept_alert]
+ expected: FAIL
+
+ [test_accept_confirm]
+ expected: FAIL
+
+ [test_accept_prompt]
+ expected: FAIL
+
+ [test_unexpected_alert]
+ expected: FAIL
+
+ [test_accept_in_popup_window]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/add_cookie/add.py.ini b/tests/wpt/meta/webdriver/tests/classic/add_cookie/add.py.ini
new file mode 100644
index 00000000000..37610cfc8ee
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/add_cookie/add.py.ini
@@ -0,0 +1,42 @@
+[add.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[about\]]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[blob\]]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[data\]]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[file\]]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[ftp\]]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[javascript\]]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[websocket\]]
+ expected: FAIL
+
+ [test_cookie_unsupported_scheme[secure websocket\]]
+ expected: FAIL
+
+ [test_add_non_session_cookie]
+ expected: FAIL
+
+ [test_add_cookie_with_valid_samesite_flag[None\]]
+ expected: FAIL
+
+ [test_add_cookie_with_valid_samesite_flag[Lax\]]
+ expected: FAIL
+
+ [test_add_cookie_with_valid_samesite_flag[Strict\]]
+ expected: FAIL
+
+ [test_add_cookie_with_invalid_samesite_flag]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/add_cookie/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/add_cookie/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/add_cookie/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/back/back.py.ini b/tests/wpt/meta/webdriver/tests/classic/back/back.py.ini
new file mode 100644
index 00000000000..10d35cc69e3
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/back/back.py.ini
@@ -0,0 +1,19 @@
+[back.py]
+ disabled: consistent panic
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_seen_nodes[http\]]
+ expected: FAIL
+
+ [test_seen_nodes[https\]]
+ expected: FAIL
+
+ [test_seen_nodes[https coop\]]
+ expected: FAIL
+
+ [test_history_pushstate]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/back/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/back/user_prompts.py.ini
new file mode 100644
index 00000000000..fcf10a0526c
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/back/user_prompts.py.ini
@@ -0,0 +1,73 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[beforeunload-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/close_window/close.py.ini b/tests/wpt/meta/webdriver/tests/classic/close_window/close.py.ini
new file mode 100644
index 00000000000..b1f13cee75e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/close_window/close.py.ini
@@ -0,0 +1,19 @@
+[close.py]
+ disabled: panic in test_close_browsing_context_with_accepted_beforeunload_prompt
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_close_browsing_context_with_accepted_beforeunload_prompt[tab\]]
+ expected: FAIL
+
+ [test_close_browsing_context_with_accepted_beforeunload_prompt[window\]]
+ expected: ERROR
+
+ [test_close_last_browsing_context]
+ expected: ERROR
+
+ [test_element_usage_after_closing_browsing_context]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/close_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/close_window/user_prompts.py.ini
new file mode 100644
index 00000000000..fcf10a0526c
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/close_window/user_prompts.py.ini
@@ -0,0 +1,73 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[beforeunload-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/delete.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/delete.py.ini
new file mode 100644
index 00000000000..1a53a7bbaf5
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/delete.py.ini
@@ -0,0 +1,3 @@
+[delete.py]
+ [test_no_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/delete_all_cookies/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_cookie/delete.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/delete.py.ini
new file mode 100644
index 00000000000..1a53a7bbaf5
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/delete.py.ini
@@ -0,0 +1,3 @@
+[delete.py]
+ [test_no_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_cookie/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/delete_cookie/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini b/tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini
new file mode 100644
index 00000000000..ee03ab08fe3
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/delete_session/delete.py.ini
@@ -0,0 +1,7 @@
+[delete.py]
+ expected: ERROR
+ [test_null_response_value]
+ expected: FAIL
+
+ [test_accepted_beforeunload_prompt]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/dismiss_alert/dismiss.py.ini b/tests/wpt/meta/webdriver/tests/classic/dismiss_alert/dismiss.py.ini
new file mode 100644
index 00000000000..cd2546ede8b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/dismiss_alert/dismiss.py.ini
@@ -0,0 +1,24 @@
+[dismiss.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_user_prompt]
+ expected: FAIL
+
+ [test_dismiss_alert]
+ expected: FAIL
+
+ [test_dismiss_confirm]
+ expected: FAIL
+
+ [test_dismiss_prompt]
+ expected: FAIL
+
+ [test_unexpected_alert]
+ expected: FAIL
+
+ [test_dismiss_in_popup_window]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_clear/clear.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_clear/clear.py.ini
new file mode 100644
index 00000000000..541ffc25ca6
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_clear/clear.py.ini
@@ -0,0 +1,2 @@
+[clear.py]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_clear/disabled.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_clear/disabled.py.ini
new file mode 100644
index 00000000000..f6367167d66
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_clear/disabled.py.ini
@@ -0,0 +1,115 @@
+[disabled.py]
+ expected: TIMEOUT
+ [test_button[button\]]
+ expected: FAIL
+
+ [test_button[reset\]]
+ expected: FAIL
+
+ [test_button[submit\]]
+ expected: FAIL
+
+ [test_input[button\]]
+ expected: FAIL
+
+ [test_input[checkbox\]]
+ expected: FAIL
+
+ [test_input[color\]]
+ expected: FAIL
+
+ [test_input[date\]]
+ expected: FAIL
+
+ [test_input[datetime-local\]]
+ expected: FAIL
+
+ [test_input[email\]]
+ expected: FAIL
+
+ [test_input[file\]]
+ expected: FAIL
+
+ [test_input[image\]]
+ expected: FAIL
+
+ [test_input[month\]]
+ expected: FAIL
+
+ [test_input[number\]]
+ expected: FAIL
+
+ [test_input[password\]]
+ expected: FAIL
+
+ [test_input[radio\]]
+ expected: FAIL
+
+ [test_input[range\]]
+ expected: FAIL
+
+ [test_input[reset\]]
+ expected: FAIL
+
+ [test_input[search\]]
+ expected: FAIL
+
+ [test_input[submit\]]
+ expected: FAIL
+
+ [test_input[tel\]]
+ expected: FAIL
+
+ [test_input[text\]]
+ expected: FAIL
+
+ [test_input[time\]]
+ expected: FAIL
+
+ [test_input[url\]]
+ expected: FAIL
+
+ [test_input[week\]]
+ expected: FAIL
+
+ [test_textarea]
+ expected: FAIL
+
+ [test_fieldset_descendant]
+ expected: FAIL
+
+ [test_fieldset_descendant_first_legend]
+ expected: FAIL
+
+ [test_fieldset_descendant_not_first_legend]
+ expected: FAIL
+
+ [test_option]
+ expected: FAIL
+
+ [test_option_optgroup]
+ expected: FAIL
+
+ [test_option_select]
+ expected: FAIL
+
+ [test_optgroup_select]
+ expected: FAIL
+
+ [test_select]
+ expected: FAIL
+
+ [test_xhtml[button\]]
+ expected: FAIL
+
+ [test_xhtml[input\]]
+ expected: FAIL
+
+ [test_xhtml[select\]]
+ expected: FAIL
+
+ [test_xhtml[textarea\]]
+ expected: FAIL
+
+ [test_xml]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_clear/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_clear/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_clear/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/bubbling.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/bubbling.py.ini
new file mode 100644
index 00000000000..d99f3672ef6
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/bubbling.py.ini
@@ -0,0 +1,6 @@
+[bubbling.py]
+ [test_click_event_bubbles_to_parents]
+ expected: FAIL
+
+ [test_spin_event_loop]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/center_point.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/center_point.py.ini
new file mode 100644
index 00000000000..3e3bfa2708e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/center_point.py.ini
@@ -0,0 +1,33 @@
+[center_point.py]
+ [test_entirely_in_view]
+ expected: FAIL
+
+ [test_css_pixel_rounding[1\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[2\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[3\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[4\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[5\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[6\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[7\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[8\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[9\]]
+ expected: FAIL
+
+ [test_css_pixel_rounding[10\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini
new file mode 100644
index 00000000000..ad0f9714ad1
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/click.py.ini
@@ -0,0 +1,21 @@
+[click.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/events.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/events.py.ini
new file mode 100644
index 00000000000..8f57d96cef8
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/events.py.ini
@@ -0,0 +1,3 @@
+[events.py]
+ [test_event_mousemove]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini
new file mode 100644
index 00000000000..982ea5ca753
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/interactability.py.ini
@@ -0,0 +1,33 @@
+[interactability.py]
+ [test_display_none]
+ expected: FAIL
+
+ [test_visibility_hidden]
+ expected: FAIL
+
+ [test_hidden]
+ expected: FAIL
+
+ [test_element_not_interactable_css_transform[translate(-100px, -100px)\]]
+ expected: FAIL
+
+ [test_element_not_interactable_css_transform[rotate(50deg)\]]
+ expected: FAIL
+
+ [test_element_not_interactable_out_of_view]
+ expected: FAIL
+
+ [test_zero_sized_element[div\]]
+ expected: FAIL
+
+ [test_zero_sized_element[span\]]
+ expected: FAIL
+
+ [test_element_intercepted]
+ expected: FAIL
+
+ [test_element_intercepted_no_pointer_events]
+ expected: FAIL
+
+ [test_element_not_visible_overflow_hidden]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini
new file mode 100644
index 00000000000..4811bba2d43
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/navigate.py.ini
@@ -0,0 +1,49 @@
+[navigate.py]
+ expected: TIMEOUT
+ [test_numbers_link]
+ expected: FAIL
+
+ [test_multi_line_link]
+ expected: FAIL
+
+ [test_navigation_retains_input_state]
+ expected: FAIL
+
+ [test_link_hash]
+ expected: FAIL
+
+ [test_link_from_toplevel_context_with_target[\]]
+ expected: FAIL
+
+ [test_link_from_toplevel_context_with_target[_blank\]]
+ expected: FAIL
+
+ [test_link_from_toplevel_context_with_target[_parent\]]
+ expected: FAIL
+
+ [test_link_from_toplevel_context_with_target[_self\]]
+ expected: FAIL
+
+ [test_link_from_toplevel_context_with_target[_top\]]
+ expected: FAIL
+
+ [test_link_from_nested_context_with_target[\]]
+ expected: FAIL
+
+ [test_link_from_nested_context_with_target[_blank\]]
+ expected: FAIL
+
+ [test_link_from_nested_context_with_target[_parent\]]
+ expected: FAIL
+
+ [test_link_from_nested_context_with_target[_self\]]
+ expected: FAIL
+
+ [test_link_from_nested_context_with_target[_top\]]
+ expected: FAIL
+
+ [test_link_cross_origin]
+ expected: FAIL
+
+ [test_link_closes_window]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/scroll_into_view.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/scroll_into_view.py.ini
new file mode 100644
index 00000000000..87c9c813881
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/scroll_into_view.py.ini
@@ -0,0 +1,30 @@
+[scroll_into_view.py]
+ [test_scroll_into_view]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[9\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[8\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[7\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[6\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[5\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[4\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[3\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[2\]]
+ expected: ERROR
+
+ [test_partially_visible_does_not_scroll[1\]]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini
new file mode 100644
index 00000000000..2bf7e5abac4
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/select.py.ini
@@ -0,0 +1,15 @@
+[select.py]
+ [test_click_option]
+ expected: FAIL
+
+ [test_click_preselected_option]
+ expected: FAIL
+
+ [test_click_deselects_others]
+ expected: FAIL
+
+ [test_click_selected_option]
+ expected: FAIL
+
+ [test_out_of_view_dropdown]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini
new file mode 100644
index 00000000000..92d8bfe9a3d
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/shadow_dom.py.ini
@@ -0,0 +1,15 @@
+[shadow_dom.py]
+ [test_shadow_element_click[host_element\]]
+ expected: FAIL
+
+ [test_shadow_element_click[checkbox_element\]]
+ expected: FAIL
+
+ [test_nested_shadow_element_click[outer_element\]]
+ expected: FAIL
+
+ [test_nested_shadow_element_click[inner_element\]]
+ expected: FAIL
+
+ [test_nested_shadow_element_click[checkbox\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_click/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_click/user_prompts.py.ini
new file mode 100644
index 00000000000..a050673119e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_click/user_prompts.py.ini
@@ -0,0 +1,73 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[beforeunload-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/content_editable.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/content_editable.py.ini
new file mode 100644
index 00000000000..3cf383a34ff
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/content_editable.py.ini
@@ -0,0 +1,9 @@
+[content_editable.py]
+ [test_sets_insertion_point_to_end]
+ expected: FAIL
+
+ [test_sets_insertion_point_to_after_last_text_node]
+ expected: FAIL
+
+ [test_no_move_caret_if_focused]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/events.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/events.py.ini
new file mode 100644
index 00000000000..26b3aaa641b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/events.py.ini
@@ -0,0 +1,9 @@
+[events.py]
+ [test_file_upload]
+ expected: FAIL
+
+ [test_form_control_send_text[input\]]
+ expected: FAIL
+
+ [test_form_control_send_text[textarea\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/file_upload.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/file_upload.py.ini
new file mode 100644
index 00000000000..4fd4b29e87f
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/file_upload.py.ini
@@ -0,0 +1,55 @@
+[file_upload.py]
+ expected: TIMEOUT
+ [test_empty_text]
+ expected: FAIL
+
+ [test_multiple_files]
+ expected: FAIL
+
+ [test_multiple_files_last_path_not_found]
+ expected: FAIL
+
+ [test_multiple_files_without_multiple_attribute]
+ expected: FAIL
+
+ [test_multiple_files_send_twice]
+ expected: FAIL
+
+ [test_multiple_files_reset_with_element_clear]
+ expected: FAIL
+
+ [test_single_file]
+ expected: FAIL
+
+ [test_single_file_replaces_without_multiple_attribute]
+ expected: FAIL
+
+ [test_single_file_appends_with_multiple_attribute]
+ expected: FAIL
+
+ [test_transparent]
+ expected: FAIL
+
+ [test_obscured]
+ expected: FAIL
+
+ [test_outside_viewport]
+ expected: FAIL
+
+ [test_hidden]
+ expected: FAIL
+
+ [test_display_none]
+ expected: FAIL
+
+ [test_not_focused]
+ expected: FAIL
+
+ [test_focused]
+ expected: ERROR
+
+ [test_strict_hidden]
+ expected: ERROR
+
+ [test_strict_display_none]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/form_controls.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/form_controls.py.ini
new file mode 100644
index 00000000000..5d4a3bd4de5
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/form_controls.py.ini
@@ -0,0 +1,6 @@
+[form_controls.py]
+ [test_input_append]
+ expected: FAIL
+
+ [test_textarea_append]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini
new file mode 100644
index 00000000000..9510b686ea1
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/interactability.py.ini
@@ -0,0 +1,24 @@
+[interactability.py]
+ [test_document_element_is_interactable]
+ expected: FAIL
+
+ [test_iframe_is_interactable]
+ expected: FAIL
+
+ [test_readonly_element]
+ expected: FAIL
+
+ [test_not_a_focusable_element]
+ expected: FAIL
+
+ [test_display_none]
+ expected: FAIL
+
+ [test_visibility_hidden]
+ expected: FAIL
+
+ [test_hidden]
+ expected: FAIL
+
+ [test_disabled]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/scroll_into_view.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/scroll_into_view.py.ini
new file mode 100644
index 00000000000..3e260cade03
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/scroll_into_view.py.ini
@@ -0,0 +1,27 @@
+[scroll_into_view.py]
+ [test_element_outside_of_not_scrollable_viewport]
+ expected: FAIL
+
+ [test_element_outside_of_scrollable_viewport]
+ expected: FAIL
+
+ [test_contenteditable_element_outside_of_scrollable_viewport]
+ expected: FAIL
+
+ [test_element_already_in_viewport[{block: 'start'}\]]
+ expected: FAIL
+
+ [test_element_already_in_viewport[{block: 'center'}\]]
+ expected: FAIL
+
+ [test_element_already_in_viewport[{block: 'end'}\]]
+ expected: FAIL
+
+ [test_element_already_in_viewport[{block: 'nearest'}\]]
+ expected: FAIL
+
+ [test_element_just_outside_viewport[Just above viewport\]]
+ expected: FAIL
+
+ [test_element_just_outside_viewport[Just below viewport\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini
new file mode 100644
index 00000000000..b2b09490191
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/send_keys.py.ini
@@ -0,0 +1,21 @@
+[send_keys.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/element_send_keys/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/arguments.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/arguments.py.ini
new file mode 100644
index 00000000000..6bcbe1197f6
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/arguments.py.ini
@@ -0,0 +1,2 @@
+[arguments.py]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini
new file mode 100644
index 00000000000..5d0711fe4ad
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/collections.py.ini
@@ -0,0 +1,12 @@
+[collections.py]
+ [test_array_in_array]
+ expected: FAIL
+
+ [test_dom_token_list]
+ expected: FAIL
+
+ [test_file_list]
+ expected: FAIL
+
+ [test_html_all_collection]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/execute_async.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/execute_async.py.ini
new file mode 100644
index 00000000000..6885d2e743e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/execute_async.py.ini
@@ -0,0 +1,21 @@
+[execute_async.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_abort_by_user_prompt[alert\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt[confirm\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt[prompt\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt_twice[alert\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt_twice[confirm\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt_twice[prompt\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/node.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/node.py.ini
new file mode 100644
index 00000000000..99dbcbef513
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/node.py.ini
@@ -0,0 +1,33 @@
+[node.py]
+ [test_detached_shadow_root[top_context\]]
+ expected: FAIL
+
+ [test_detached_shadow_root[child_context\]]
+ expected: FAIL
+
+ [test_stale_element[top_context\]]
+ expected: FAIL
+
+ [test_stale_element[child_context\]]
+ expected: FAIL
+
+ [test_element_reference[shadow-root\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[attribute\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[text\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[processing_instruction\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[comment\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[document\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[doctype\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/user_prompts.py.ini
new file mode 100644
index 00000000000..a050673119e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/user_prompts.py.ini
@@ -0,0 +1,73 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[beforeunload-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_async_script/window.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/window.py.ini
new file mode 100644
index 00000000000..5cd736463b1
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_async_script/window.py.ini
@@ -0,0 +1,6 @@
+[window.py]
+ [test_web_reference[window\]]
+ expected: FAIL
+
+ [test_window_open]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/arguments.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/arguments.py.ini
new file mode 100644
index 00000000000..8818990c5ef
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/arguments.py.ini
@@ -0,0 +1,88 @@
+[arguments.py]
+ expected: TIMEOUT
+ [test_no_such_element_with_unknown_id]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_no_such_shadow_root_with_unknown_id]
+ expected: FAIL
+
+ [test_no_such_shadow_root_from_other_window_handle[open\]]
+ expected: FAIL
+
+ [test_no_such_shadow_root_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_shadow_root_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_shadow_root_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_detached_shadow_root_reference[top_context\]]
+ expected: FAIL
+
+ [test_detached_shadow_root_reference[child_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[None-frame\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[None-window\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[False-frame\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[False-window\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[42-frame\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[42-window\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[value3-frame\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[value3-window\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[value4-frame\]]
+ expected: FAIL
+
+ [test_invalid_argument_for_window_with_invalid_type[value4-window\]]
+ expected: FAIL
+
+ [test_no_such_window_for_window_with_invalid_value]
+ expected: FAIL
+
+ [test_element_reference[frame\]]
+ expected: FAIL
+
+ [test_element_reference[node\]]
+ expected: FAIL
+
+ [test_element_reference[shadow-root\]]
+ expected: FAIL
+
+ [test_element_reference[window\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini
new file mode 100644
index 00000000000..68e5ec4b830
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/collections.py.ini
@@ -0,0 +1,12 @@
+[collections.py]
+ [test_dom_token_list]
+ expected: FAIL
+
+ [test_file_list]
+ expected: FAIL
+
+ [test_html_all_collection]
+ expected: FAIL
+
+ [test_array_in_array]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/execute.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/execute.py.ini
new file mode 100644
index 00000000000..8a1571d1d7b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/execute.py.ini
@@ -0,0 +1,24 @@
+[execute.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_opening_new_window_keeps_current_window_handle]
+ expected: FAIL
+
+ [test_abort_by_user_prompt[alert\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt[confirm\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt[prompt\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt_twice[alert\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt_twice[confirm\]]
+ expected: FAIL
+
+ [test_abort_by_user_prompt_twice[prompt\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/node.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/node.py.ini
new file mode 100644
index 00000000000..dd95e12798a
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/node.py.ini
@@ -0,0 +1,33 @@
+[node.py]
+ [test_detached_shadow_root[top_context\]]
+ expected: FAIL
+
+ [test_detached_shadow_root[child_context\]]
+ expected: FAIL
+
+ [test_stale_element[top_context\]]
+ expected: FAIL
+
+ [test_stale_element[child_context\]]
+ expected: FAIL
+
+ [test_web_reference[shadow-root\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[attribute\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[text\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[processing_instruction\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[comment\]]
+ expected: FAIL
+
+ [test_not_supported_nodes[document\]]
+ expected: ERROR
+
+ [test_not_supported_nodes[doctype\]]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/promise.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/promise.py.ini
new file mode 100644
index 00000000000..d5d950aa7ac
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/promise.py.ini
@@ -0,0 +1,27 @@
+[promise.py]
+ [test_promise_resolve]
+ expected: FAIL
+
+ [test_promise_resolve_delayed]
+ expected: FAIL
+
+ [test_promise_all_resolve]
+ expected: FAIL
+
+ [test_await_promise_resolve]
+ expected: FAIL
+
+ [test_promise_resolve_timeout]
+ expected: FAIL
+
+ [test_promise_reject]
+ expected: FAIL
+
+ [test_promise_reject_delayed]
+ expected: FAIL
+
+ [test_promise_all_reject]
+ expected: FAIL
+
+ [test_promise_reject_timeout]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/user_prompts.py.ini
new file mode 100644
index 00000000000..a050673119e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/user_prompts.py.ini
@@ -0,0 +1,73 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[beforeunload-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/execute_script/window.py.ini b/tests/wpt/meta/webdriver/tests/classic/execute_script/window.py.ini
new file mode 100644
index 00000000000..9de464ed4f0
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/execute_script/window.py.ini
@@ -0,0 +1,15 @@
+[window.py]
+ [test_web_reference[window\]]
+ expected: FAIL
+
+ [test_web_reference_in_array[window\]]
+ expected: FAIL
+
+ [test_web_reference_in_object[window\]]
+ expected: FAIL
+
+ [test_window_open]
+ expected: FAIL
+
+ [test_same_id_after_cross_origin_navigation]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element/find.py.ini
new file mode 100644
index 00000000000..7564f644b10
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_element/find.py.ini
@@ -0,0 +1,34 @@
+[find.py]
+ expected: TIMEOUT
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_such_element_with_unknown_selector[not-existent\]]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[existent-other-frame\]]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[existent-inside-shadow-root\]]
+ expected: FAIL
+
+ [test_find_element[xpath-//a\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[css selector-#linkText\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[link text-full link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[partial link text-link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[tag name-a\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[xpath-//*[name()='a'\]\]]
+ expected: FAIL
+
+ [test_htmldocument[xpath-/html\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_element/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini
new file mode 100644
index 00000000000..64a0652b75b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/find.py.ini
@@ -0,0 +1,52 @@
+[find.py]
+ expected: TIMEOUT
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[not-existent\]]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[existent-other-frame\]]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[existent-inside-shadow-root\]]
+ expected: FAIL
+
+ [test_no_such_element_with_startnode_from_other_window_handle]
+ expected: FAIL
+
+ [test_no_such_element_with_startnode_from_other_frame]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_find_element[xpath-//a\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[css selector-#linkText\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[link text-full link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[partial link text-link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[tag name-a\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[xpath-//*[name()='a'\]\]]
+ expected: FAIL
+
+ [test_parent_htmldocument]
+ expected: FAIL
+
+ [test_parent_of_document_node_errors]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_element/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/find.py.ini
new file mode 100644
index 00000000000..dba98c7726b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/find.py.ini
@@ -0,0 +1,157 @@
+[find.py]
+ expected: TIMEOUT
+ [test_null_parameter_value]
+ expected: FAIL
+
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_such_shadow_root_with_element]
+ expected: FAIL
+
+ [test_no_such_shadow_root_with_unknown_shadow_root]
+ expected: FAIL
+
+ [test_no_such_shadow_root_with_shadow_root_from_other_window_handle]
+ expected: FAIL
+
+ [test_no_such_shadow_root_with_shadow_root_from_other_frame]
+ expected: FAIL
+
+ [test_detached_shadow_root[top_context\]]
+ expected: FAIL
+
+ [test_detached_shadow_root[child_context\]]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[not-existent\]]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[existent-other-frame\]]
+ expected: FAIL
+
+ [test_no_such_element_with_unknown_selector[existent-outside-shadow-root\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[True\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[None\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[1\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[shadow_root_id3\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[shadow_root_id4\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[a\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[True\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[None\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[1\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[using4\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[using5\]]
+ expected: FAIL
+
+ [test_invalid_selector_argument[None\]]
+ expected: FAIL
+
+ [test_invalid_selector_argument[value1\]]
+ expected: FAIL
+
+ [test_invalid_selector_argument[value2\]]
+ expected: FAIL
+
+ [test_found_element_equivalence]
+ expected: FAIL
+
+ [test_find_element[open-css selector-#linkText\]]
+ expected: FAIL
+
+ [test_find_element[open-link text-full link text\]]
+ expected: FAIL
+
+ [test_find_element[open-partial link text-link text\]]
+ expected: FAIL
+
+ [test_find_element[open-tag name-a\]]
+ expected: FAIL
+
+ [test_find_element[open-xpath-//a\]]
+ expected: FAIL
+
+ [test_find_element[closed-css selector-#linkText\]]
+ expected: FAIL
+
+ [test_find_element[closed-link text-full link text\]]
+ expected: FAIL
+
+ [test_find_element[closed-partial link text-link text\]]
+ expected: FAIL
+
+ [test_find_element[closed-tag name-a\]]
+ expected: FAIL
+
+ [test_find_element[closed-xpath-//a\]]
+ expected: FAIL
+
+ [test_find_element_link_text[<a href=#>link text</a>-link text\]]
+ expected: FAIL
+
+ [test_find_element_link_text[<a href=#>&nbsp;link text&nbsp;</a>-link text\]]
+ expected: FAIL
+
+ [test_find_element_link_text[<a href=#>link<br>text</a>-link\\ntext\]]
+ expected: FAIL
+
+ [test_find_element_link_text[<a href=#>link&amp;text</a>-link&text\]]
+ expected: FAIL
+
+ [test_find_element_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_element_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_element_partial_link_text[<a href=#>partial link text</a>-link\]]
+ expected: FAIL
+
+ [test_find_element_partial_link_text[<a href=#>&nbsp;partial link text&nbsp;</a>-link\]]
+ expected: FAIL
+
+ [test_find_element_partial_link_text[<a href=#>partial link text</a>-k t\]]
+ expected: FAIL
+
+ [test_find_element_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]]
+ expected: FAIL
+
+ [test_find_element_partial_link_text[<a href=#>partial link&amp;text</a>-k&t\]]
+ expected: FAIL
+
+ [test_find_element_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]]
+ expected: FAIL
+
+ [test_find_element_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]]
+ expected: FAIL
+
+ [test_find_element_in_nested_shadow_root[open\]]
+ expected: FAIL
+
+ [test_find_element_in_nested_shadow_root[closed\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_element_from_shadow_root/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements/find.py.ini
new file mode 100644
index 00000000000..44f232824bb
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_elements/find.py.ini
@@ -0,0 +1,76 @@
+[find.py]
+ expected: TIMEOUT
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_find_elements[css selector-#linkText\]]
+ expected: FAIL
+
+ [test_find_elements[link text-full link text\]]
+ expected: FAIL
+
+ [test_find_elements[partial link text-link text\]]
+ expected: FAIL
+
+ [test_find_elements[tag name-a\]]
+ expected: FAIL
+
+ [test_find_elements[xpath-//a\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link text</a>-link text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>&nbsp;link text&nbsp;</a>-link text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link<br>text</a>-link\\ntext\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link&amp;text</a>-link&text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link text</a>-link\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>&nbsp;partial link text&nbsp;</a>-link\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link text</a>-k t\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link&amp;text</a>-k&t\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[css selector-#linkText\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[link text-full link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[partial link text-link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[tag name-a\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[xpath-//*[name()='a'\]\]]
+ expected: FAIL
+
+ [test_htmldocument[xpath-/html\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_elements/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/find.py.ini
new file mode 100644
index 00000000000..69ec1b4bbcc
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/find.py.ini
@@ -0,0 +1,82 @@
+[find.py]
+ expected: TIMEOUT
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_with_startnode_from_other_window_handle]
+ expected: FAIL
+
+ [test_no_such_element_with_startnode_from_other_frame]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_find_elements[xpath-//a\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link text</a>-link text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>&nbsp;link text&nbsp;</a>-link text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link<br>text</a>-link\\ntext\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link&amp;text</a>-link&text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link text</a>-link\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>&nbsp;partial link text&nbsp;</a>-link\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link text</a>-k t\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link&amp;text</a>-k&t\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[css selector-#linkText\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[link text-full link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[partial link text-link text\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[tag name-a\]]
+ expected: FAIL
+
+ [test_xhtml_namespace[xpath-//*[name()='a'\]\]]
+ expected: FAIL
+
+ [test_parent_htmldocument]
+ expected: FAIL
+
+ [test_parent_of_document_node_errors]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_element/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/find.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/find.py.ini
new file mode 100644
index 00000000000..5328af1b701
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/find.py.ini
@@ -0,0 +1,157 @@
+[find.py]
+ expected: TIMEOUT
+ [test_null_parameter_value]
+ expected: FAIL
+
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_such_shadow_root_with_element]
+ expected: FAIL
+
+ [test_no_such_shadow_root_with_unknown_shadow_root]
+ expected: FAIL
+
+ [test_no_such_shadow_root_with_shadow_root_from_other_window_handle]
+ expected: FAIL
+
+ [test_no_such_shadow_root_with_shadow_root_from_other_frame]
+ expected: FAIL
+
+ [test_detached_shadow_root[top_context\]]
+ expected: FAIL
+
+ [test_detached_shadow_root[child_context\]]
+ expected: FAIL
+
+ [test_no_elements_with_unknown_selector[not-existent\]]
+ expected: FAIL
+
+ [test_no_elements_with_unknown_selector[existent-other-frame\]]
+ expected: FAIL
+
+ [test_no_elements_with_unknown_selector[existent-outside-shadow-root\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[True\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[None\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[1\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[shadow_root_id3\]]
+ expected: FAIL
+
+ [test_invalid_shadow_root_id_argument[shadow_root_id4\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[a\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[True\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[None\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[1\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[using4\]]
+ expected: FAIL
+
+ [test_invalid_using_argument[using5\]]
+ expected: FAIL
+
+ [test_invalid_selector_argument[None\]]
+ expected: FAIL
+
+ [test_invalid_selector_argument[value1\]]
+ expected: FAIL
+
+ [test_invalid_selector_argument[value2\]]
+ expected: FAIL
+
+ [test_find_elements_equivalence]
+ expected: FAIL
+
+ [test_find_elements[open-css selector-#linkText\]]
+ expected: FAIL
+
+ [test_find_elements[open-link text-full link text\]]
+ expected: FAIL
+
+ [test_find_elements[open-partial link text-link text\]]
+ expected: FAIL
+
+ [test_find_elements[open-tag name-a\]]
+ expected: FAIL
+
+ [test_find_elements[open-xpath-//a\]]
+ expected: FAIL
+
+ [test_find_elements[closed-css selector-#linkText\]]
+ expected: FAIL
+
+ [test_find_elements[closed-link text-full link text\]]
+ expected: FAIL
+
+ [test_find_elements[closed-partial link text-link text\]]
+ expected: FAIL
+
+ [test_find_elements[closed-tag name-a\]]
+ expected: FAIL
+
+ [test_find_elements[closed-xpath-//a\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link text</a>-link text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>&nbsp;link text&nbsp;</a>-link text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link<br>text</a>-link\\ntext\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>link&amp;text</a>-link&text\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=#>LINK TEXT</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_elements_link_text[<a href=# style='text-transform: uppercase'>link text</a>-LINK TEXT\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link text</a>-link\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>&nbsp;partial link text&nbsp;</a>-link\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link text</a>-k t\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link<br>text</a>-k\\nt\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>partial link&amp;text</a>-k&t\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=#>PARTIAL LINK TEXT</a>-LINK\]]
+ expected: FAIL
+
+ [test_find_elements_partial_link_text[<a href=# style='text-transform: uppercase'>partial link text</a>-LINK\]]
+ expected: FAIL
+
+ [test_find_elements_in_nested_shadow_root[open\]]
+ expected: FAIL
+
+ [test_find_elements_in_nested_shadow_root[closed\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/find_elements_from_shadow_root/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini b/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini
new file mode 100644
index 00000000000..12538247f27
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/forward/forward.py.ini
@@ -0,0 +1,34 @@
+[forward.py]
+ disabled: consistent panic
+ [test_no_top_browsing_context]
+ expected: ERROR
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_basic]
+ expected: ERROR
+
+ [test_no_browsing_history]
+ expected: ERROR
+
+ [test_seen_nodes[http\]]
+ expected: ERROR
+
+ [test_seen_nodes[https\]]
+ expected: ERROR
+
+ [test_seen_nodes[https coop\]]
+ expected: ERROR
+
+ [test_history_pushstate]
+ expected: ERROR
+
+ [test_data_urls]
+ expected: ERROR
+
+ [test_fragments]
+ expected: ERROR
+
+ [test_removed_iframe]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/forward/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/forward/user_prompts.py.ini
new file mode 100644
index 00000000000..326fdd875ad
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/forward/user_prompts.py.ini
@@ -0,0 +1,3 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/from_minimized_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/from_minimized_window.py.ini
new file mode 100644
index 00000000000..99b10143b3e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/from_minimized_window.py.ini
@@ -0,0 +1,3 @@
+[from_minimized_window.py]
+ [test_fullscreen_from_minimized_window]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/fullscreen.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/fullscreen.py.ini
new file mode 100644
index 00000000000..d03f4481fba
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/fullscreen.py.ini
@@ -0,0 +1,18 @@
+[fullscreen.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_response_payload]
+ expected: FAIL
+
+ [test_fullscreen_from_normal_window]
+ expected: FAIL
+
+ [test_fullscreen_from_maximized_window]
+ expected: FAIL
+
+ [test_fullscreen_twice_is_idempotent]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/stress.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/stress.py.ini
new file mode 100644
index 00000000000..a6c136ac885
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/stress.py.ini
@@ -0,0 +1,15 @@
+[stress.py]
+ [test_stress[0\]]
+ expected: FAIL
+
+ [test_stress[1\]]
+ expected: FAIL
+
+ [test_stress[2\]]
+ expected: FAIL
+
+ [test_stress[3\]]
+ expected: FAIL
+
+ [test_stress[4\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/fullscreen_window/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_active_element/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_active_element/get.py.ini
new file mode 100644
index 00000000000..2d7e863ee5b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_active_element/get.py.ini
@@ -0,0 +1,6 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_active_element/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_active_element/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_active_element/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_alert_text/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_alert_text/get.py.ini
new file mode 100644
index 00000000000..fa50e27c0d1
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_alert_text/get.py.ini
@@ -0,0 +1,22 @@
+[get.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_user_prompt]
+ expected: FAIL
+
+ [test_get_alert_text]
+ expected: FAIL
+
+ [test_get_confirm_text]
+ expected: FAIL
+
+ [test_get_prompt_text]
+ expected: FAIL
+
+ [test_unexpected_alert]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_label/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/get.py.ini
new file mode 100644
index 00000000000..6f7cda2f119
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/get.py.ini
@@ -0,0 +1,42 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_invalid_value]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_get_computed_label[<button>ok</button>-button-ok\]]
+ expected: FAIL
+
+ [test_get_computed_label[<button aria-labelledby="one two"></button><div id=one>ok</div><div id=two>go</div>-button-ok go\]]
+ expected: FAIL
+
+ [test_get_computed_label[<button aria-label=foo>bar</button>-button-foo\]]
+ expected: FAIL
+
+ [test_get_computed_label[<label><input> foo</label>-input-foo\]]
+ expected: FAIL
+
+ [test_get_computed_label[<label for=b>foo<label><input id=b>-input-foo\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_label/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/user_prompts.py.ini
new file mode 100644
index 00000000000..913351aaa55
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_label/user_prompts.py.ini
@@ -0,0 +1,2 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734 \ No newline at end of file
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini
new file mode 100644
index 00000000000..abd4a7750b7
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/get.py.ini
@@ -0,0 +1,24 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_computed_roles[<article>foo</article>-article-article\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_computed_role/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/user_prompts.py.ini
new file mode 100644
index 00000000000..b168410dab1
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_computed_role/user_prompts.py.ini
@@ -0,0 +1,2 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_current_url/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_current_url/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_current_url/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini
new file mode 100644
index 00000000000..69b4a4c7d0b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/get.py.ini
@@ -0,0 +1,94 @@
+[get.py]
+ expected: TIMEOUT
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_normal]
+ expected: FAIL
+
+ [test_boolean_attribute[audio-attrs0\]]
+ expected: FAIL
+
+ [test_boolean_attribute[button-attrs1\]]
+ expected: FAIL
+
+ [test_boolean_attribute[details-attrs2\]]
+ expected: FAIL
+
+ [test_boolean_attribute[dialog-attrs3\]]
+ expected: FAIL
+
+ [test_boolean_attribute[fieldset-attrs4\]]
+ expected: FAIL
+
+ [test_boolean_attribute[form-attrs5\]]
+ expected: FAIL
+
+ [test_boolean_attribute[iframe-attrs6\]]
+ expected: FAIL
+
+ [test_boolean_attribute[img-attrs7\]]
+ expected: FAIL
+
+ [test_boolean_attribute[input-attrs8\]]
+ expected: FAIL
+
+ [test_boolean_attribute[menuitem-attrs9\]]
+ expected: FAIL
+
+ [test_boolean_attribute[ol-attrs10\]]
+ expected: FAIL
+
+ [test_boolean_attribute[optgroup-attrs11\]]
+ expected: FAIL
+
+ [test_boolean_attribute[option-attrs12\]]
+ expected: FAIL
+
+ [test_boolean_attribute[script-attrs13\]]
+ expected: FAIL
+
+ [test_boolean_attribute[select-attrs14\]]
+ expected: FAIL
+
+ [test_boolean_attribute[textarea-attrs15\]]
+ expected: FAIL
+
+ [test_boolean_attribute[track-attrs16\]]
+ expected: FAIL
+
+ [test_boolean_attribute[video-attrs17\]]
+ expected: FAIL
+
+ [test_global_boolean_attributes]
+ expected: FAIL
+
+ [test_anchor_href[relative\]]
+ expected: FAIL
+
+ [test_anchor_href[absolute\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_attribute/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini
new file mode 100644
index 00000000000..bcd25112776
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/get.py.ini
@@ -0,0 +1,21 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_css_value/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini
new file mode 100644
index 00000000000..646e2846e18
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_property/get.py.ini
@@ -0,0 +1,94 @@
+[get.py]
+ expected: TIMEOUT
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_property_non_existent]
+ expected: FAIL
+
+ [test_content_attribute]
+ expected: FAIL
+
+ [test_idl_attribute]
+ expected: FAIL
+
+ [test_primitives["foobar"-foobar\]]
+ expected: FAIL
+
+ [test_primitives[42-42\]]
+ expected: FAIL
+
+ [test_primitives[js_primitive2-py_primitive2\]]
+ expected: FAIL
+
+ [test_primitives[js_primitive3-py_primitive3\]]
+ expected: FAIL
+
+ [test_primitives[null-None\]]
+ expected: FAIL
+
+ [test_primitives[undefined-None\]]
+ expected: FAIL
+
+ [test_collection_dom_token_list]
+ expected: FAIL
+
+ [test_primitives_set_by_execute_script["foobar"-foobar\]]
+ expected: FAIL
+
+ [test_primitives_set_by_execute_script[42-42\]]
+ expected: FAIL
+
+ [test_primitives_set_by_execute_script[js_primitive2-py_primitive2\]]
+ expected: FAIL
+
+ [test_primitives_set_by_execute_script[js_primitive3-py_primitive3\]]
+ expected: FAIL
+
+ [test_primitives_set_by_execute_script[null-None\]]
+ expected: FAIL
+
+ [test_primitives_set_by_execute_script[undefined-None\]]
+ expected: FAIL
+
+ [test_web_reference[frame-WebFrame\]]
+ expected: FAIL
+
+ [test_web_reference[shadowRoot-ShadowRoot\]]
+ expected: FAIL
+
+ [test_web_reference[window-WebWindow\]]
+ expected: FAIL
+
+ [test_mutated_element]
+ expected: FAIL
+
+ [test_anchor_href[relative\]]
+ expected: FAIL
+
+ [test_anchor_href[absolute\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_property/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_property/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_property/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini
new file mode 100644
index 00000000000..065e9fbc4ce
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/get.py.ini
@@ -0,0 +1,24 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_basic]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_rect/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_rect/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini
new file mode 100644
index 00000000000..1b3957f08c8
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/get.py.ini
@@ -0,0 +1,33 @@
+[get.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_invalid_value]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_get_shadow_root]
+ expected: FAIL
+
+ [test_no_shadow_root]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_shadow_root/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini
new file mode 100644
index 00000000000..b810c389100
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/get.py.ini
@@ -0,0 +1,24 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_get_element_tag_name]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_tag_name/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini
new file mode 100644
index 00000000000..5f04f967054
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_text/get.py.ini
@@ -0,0 +1,42 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_transform_capitalize[space\]]
+ expected: FAIL
+
+ [test_transform_capitalize[dash\]]
+ expected: FAIL
+
+ [test_transform_capitalize[underscore\]]
+ expected: FAIL
+
+ [test_shadow_root_slot[custom outside\]]
+ expected: FAIL
+
+ [test_shadow_root_slot[default visible\]]
+ expected: FAIL
+
+ [test_shadow_root_slot[default outside\]]
+ expected: FAIL
+
+ [test_shadow_root_slot[default hidden\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/get.py.ini
new file mode 100644
index 00000000000..93b889d3a59
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/get.py.ini
@@ -0,0 +1,12 @@
+[get.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_get_named_session_cookie]
+ expected: FAIL
+
+ [test_get_named_cookie]
+ expected: FAIL
+
+ [test_duplicated_cookie]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_named_cookie/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_page_source/source.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_page_source/source.py.ini
new file mode 100644
index 00000000000..f1326acbc2f
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_page_source/source.py.ini
@@ -0,0 +1,3 @@
+[source.py]
+ [test_no_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_page_source/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_page_source/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_page_source/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_title/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_title/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_title/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_handle/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/get.py.ini
new file mode 100644
index 00000000000..0fb70be2b4d
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/get.py.ini
@@ -0,0 +1,3 @@
+[get.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_handle/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/user_prompts.py.ini
new file mode 100644
index 00000000000..0bc849b2704
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_window_handle/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert\]]
+ expected: FAIL
+
+ [test_default[confirm\]]
+ expected: FAIL
+
+ [test_default[prompt\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_handles/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_handles/user_prompts.py.ini
new file mode 100644
index 00000000000..0bc849b2704
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_window_handles/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert\]]
+ expected: FAIL
+
+ [test_default[confirm\]]
+ expected: FAIL
+
+ [test_default[prompt\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_rect/get.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/get.py.ini
new file mode 100644
index 00000000000..3394ac22306
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/get.py.ini
@@ -0,0 +1,6 @@
+[get.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_payload]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/get_window_rect/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/get_window_rect/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/idlharness.window.js.ini b/tests/wpt/meta/webdriver/tests/classic/idlharness.window.js.ini
new file mode 100644
index 00000000000..ee8e266e35f
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/idlharness.window.js.ini
@@ -0,0 +1,6 @@
+[idlharness.window.html]
+ [Navigator interface: attribute webdriver]
+ expected: FAIL
+
+ [Navigator interface: navigator must inherit property "webdriver" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/interface/interface.py.ini b/tests/wpt/meta/webdriver/tests/classic/interface/interface.py.ini
new file mode 100644
index 00000000000..9efc2c79243
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/interface/interface.py.ini
@@ -0,0 +1,3 @@
+[interface.py]
+ [test_navigator_webdriver_active]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini
new file mode 100644
index 00000000000..1f97f812861
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/enabled.py.ini
@@ -0,0 +1,2 @@
+[enabled.py]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/user_prompts.py.ini
new file mode 100644
index 00000000000..913351aaa55
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/is_element_enabled/user_prompts.py.ini
@@ -0,0 +1,2 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734 \ No newline at end of file
diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini
new file mode 100644
index 00000000000..f75724979c5
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/selected.py.ini
@@ -0,0 +1,21 @@
+[selected.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/is_element_selected/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/is_element_selected/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/from_minimized_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/from_minimized_window.py.ini
new file mode 100644
index 00000000000..5d3e1ccc1b2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/from_minimized_window.py.ini
@@ -0,0 +1,3 @@
+[from_minimized_window.py]
+ [test_restore_from_minimized]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/maximize.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/maximize.py.ini
new file mode 100644
index 00000000000..83d5c2fcf84
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/maximize.py.ini
@@ -0,0 +1,21 @@
+[maximize.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_response_payload]
+ expected: FAIL
+
+ [test_fully_exit_fullscreen]
+ expected: FAIL
+
+ [test_maximize_from_normal_window]
+ expected: FAIL
+
+ [test_maximize_with_window_already_at_maximum_size]
+ expected: FAIL
+
+ [test_maximize_twice_is_idempotent]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/stress.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/stress.py.ini
new file mode 100644
index 00000000000..a6c136ac885
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/stress.py.ini
@@ -0,0 +1,15 @@
+[stress.py]
+ [test_stress[0\]]
+ expected: FAIL
+
+ [test_stress[1\]]
+ expected: FAIL
+
+ [test_stress[2\]]
+ expected: FAIL
+
+ [test_stress[3\]]
+ expected: FAIL
+
+ [test_stress[4\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/maximize_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/maximize_window/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/maximize_window/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/minimize_window/minimize.py.ini b/tests/wpt/meta/webdriver/tests/classic/minimize_window/minimize.py.ini
new file mode 100644
index 00000000000..75af78405d0
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/minimize_window/minimize.py.ini
@@ -0,0 +1,21 @@
+[minimize.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_response_payload]
+ expected: FAIL
+
+ [test_restore_from_fullscreen]
+ expected: FAIL
+
+ [test_restore_from_maximized]
+ expected: FAIL
+
+ [test_minimize_from_normal_window]
+ expected: FAIL
+
+ [test_minimize_twice_is_idempotent]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/minimize_window/stress.py.ini b/tests/wpt/meta/webdriver/tests/classic/minimize_window/stress.py.ini
new file mode 100644
index 00000000000..a6c136ac885
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/minimize_window/stress.py.ini
@@ -0,0 +1,15 @@
+[stress.py]
+ [test_stress[0\]]
+ expected: FAIL
+
+ [test_stress[1\]]
+ expected: FAIL
+
+ [test_stress[2\]]
+ expected: FAIL
+
+ [test_stress[3\]]
+ expected: FAIL
+
+ [test_stress[4\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/minimize_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/minimize_window/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/minimize_window/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/navigate_to/navigate.py.ini b/tests/wpt/meta/webdriver/tests/classic/navigate_to/navigate.py.ini
new file mode 100644
index 00000000000..2464f4b2b4d
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/navigate_to/navigate.py.ini
@@ -0,0 +1,12 @@
+[navigate.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_seen_nodes[http\]]
+ expected: FAIL
+
+ [test_seen_nodes[https\]]
+ expected: FAIL
+
+ [test_seen_nodes[https coop\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/navigate_to/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/navigate_to/user_prompts.py.ini
new file mode 100644
index 00000000000..fcf10a0526c
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/navigate_to/user_prompts.py.ini
@@ -0,0 +1,73 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[beforeunload-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/create_alwaysMatch.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/create_alwaysMatch.py.ini
new file mode 100644
index 00000000000..c837e638bb0
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_session/create_alwaysMatch.py.ini
@@ -0,0 +1,21 @@
+[create_alwaysMatch.py]
+ [test_valid[timeouts-value12\]]
+ expected: FAIL
+
+ [test_valid[strictFileInteractability-True\]]
+ expected: FAIL
+
+ [test_valid[test:extension-False\]]
+ expected: FAIL
+
+ [test_valid[test:extension-abc\]]
+ expected: FAIL
+
+ [test_valid[test:extension-123\]]
+ expected: FAIL
+
+ [test_valid[test:extension-value22\]]
+ expected: FAIL
+
+ [test_valid[test:extension-value23\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/create_firstMatch.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/create_firstMatch.py.ini
new file mode 100644
index 00000000000..3752bebca7b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_session/create_firstMatch.py.ini
@@ -0,0 +1,21 @@
+[create_firstMatch.py]
+ [test_valid[timeouts-value12\]]
+ expected: FAIL
+
+ [test_valid[strictFileInteractability-True\]]
+ expected: FAIL
+
+ [test_valid[test:extension-False\]]
+ expected: FAIL
+
+ [test_valid[test:extension-abc\]]
+ expected: FAIL
+
+ [test_valid[test:extension-123\]]
+ expected: FAIL
+
+ [test_valid[test:extension-value22\]]
+ expected: FAIL
+
+ [test_valid[test:extension-value23\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/response.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/response.py.ini
new file mode 100644
index 00000000000..b5c5cede365
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_session/response.py.ini
@@ -0,0 +1,3 @@
+[response.py]
+ [test_capability_user_agent]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/unhandled_prompt_behavior.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/unhandled_prompt_behavior.py.ini
new file mode 100644
index 00000000000..ff2e1c72126
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_session/unhandled_prompt_behavior.py.ini
@@ -0,0 +1,24 @@
+[unhandled_prompt_behavior.py]
+ [test_unhandled_prompt_behavior_as_object_default[handler0-expected_capability0-True-True\]]
+ expected: FAIL
+
+ [test_unhandled_prompt_behavior_as_object_default[handler1-expected_capability1-True-False\]]
+ expected: FAIL
+
+ [test_unhandled_prompt_behavior_as_object_default[handler2-expected_capability2-False-True\]]
+ expected: FAIL
+
+ [test_beforeunload_prompts_always_automatically_accepted[accept\]]
+ expected: FAIL
+
+ [test_beforeunload_prompts_always_automatically_accepted[accept and notify\]]
+ expected: FAIL
+
+ [test_beforeunload_prompts_always_automatically_accepted[dismiss\]]
+ expected: FAIL
+
+ [test_beforeunload_prompts_always_automatically_accepted[dismiss and notify\]]
+ expected: FAIL
+
+ [test_beforeunload_prompts_always_automatically_accepted[ignore\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_session/websocket_url.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_session/websocket_url.py.ini
new file mode 100644
index 00000000000..76e42fd0ed0
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_session/websocket_url.py.ini
@@ -0,0 +1,3 @@
+[websocket_url.py]
+ [test_bidi_upgrade]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini
new file mode 100644
index 00000000000..7288018eebf
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new.py.ini
@@ -0,0 +1,6 @@
+[new.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini
new file mode 100644
index 00000000000..77be6174789
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new_tab.py.ini
@@ -0,0 +1,15 @@
+[new_tab.py]
+ [test_keeps_current_window_handle]
+ expected: ERROR
+
+ [test_opens_about_blank_in_new_tab]
+ expected: ERROR
+
+ [test_initial_selection_for_contenteditable]
+ expected: ERROR
+
+ [test_sets_no_window_name]
+ expected: ERROR
+
+ [test_sets_no_opener]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini
new file mode 100644
index 00000000000..5ea6fe581f7
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_window/new_window.py.ini
@@ -0,0 +1,12 @@
+[new_window.py]
+ [test_payload]
+ expected: FAIL
+
+ [test_keeps_current_window_handle]
+ expected: FAIL
+
+ [test_opens_about_blank_in_new_window]
+ expected: FAIL
+
+ [test_initial_selection_for_contenteditable]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/new_window/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/new_window/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/new_window/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/invalid.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/invalid.py.ini
new file mode 100644
index 00000000000..39649c5204a
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/invalid.py.ini
@@ -0,0 +1,91 @@
+[invalid.py]
+ expected: TIMEOUT
+ [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-none\]]
+ expected: FAIL
+
+ [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-key\]]
+ expected: FAIL
+
+ [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-pointer\]]
+ expected: FAIL
+
+ [test_input_source_action_sequence_actions_pause_duration_invalid_value[9007199254740992-wheel\]]
+ expected: FAIL
+
+ [test_pointer_action_up_down_button_invalid_value[9007199254740992-pointerDown\]]
+ expected: FAIL
+
+ [test_pointer_action_up_down_button_invalid_value[9007199254740992-pointerUp\]]
+ expected: FAIL
+
+ [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-width-pointerDown\]]
+ expected: FAIL
+
+ [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-width-pointerMove\]]
+ expected: FAIL
+
+ [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-width-pointerUp\]]
+ expected: FAIL
+
+ [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-height-pointerDown\]]
+ expected: FAIL
+
+ [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-height-pointerMove\]]
+ expected: FAIL
+
+ [test_pointer_action_common_properties_dimensions_invalid_value[9007199254740992-height-pointerUp\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_coordinate_invalid_type[None-x\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_coordinate_invalid_type[None-y\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_coordinate_invalid_value[-9007199254740992-x\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_coordinate_invalid_value[-9007199254740992-y\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_coordinate_invalid_value[9007199254740992-x\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_coordinate_invalid_value[9007199254740992-y\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_delta_invalid_type[None-x\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_delta_invalid_type[None-y\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_delta_invalid_value[-9007199254740992-x\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_delta_invalid_value[-9007199254740992-y\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_delta_invalid_value[9007199254740992-x\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_delta_invalid_value[9007199254740992-y\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_origin_pointer_not_supported]
+ expected: FAIL
+
+ [test_wheel_action_scroll_origin_element_invalid_value]
+ expected: FAIL
+
+ [test_wheel_action_scroll_missing_property[x\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_missing_property[y\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_missing_property[deltaX\]]
+ expected: FAIL
+
+ [test_wheel_action_scroll_missing_property[deltaY\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini
new file mode 100644
index 00000000000..0a9efbca289
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key.py.ini
@@ -0,0 +1,24 @@
+[key.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_key_down_closes_browsing_context]
+ expected: FAIL
+
+ [test_backspace_erases_keys]
+ expected: FAIL
+
+ [test_element_in_shadow_tree[outer-open\]]
+ expected: FAIL
+
+ [test_element_in_shadow_tree[outer-closed\]]
+ expected: FAIL
+
+ [test_element_in_shadow_tree[inner-open\]]
+ expected: FAIL
+
+ [test_element_in_shadow_tree[inner-closed\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_events.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_events.py.ini
new file mode 100644
index 00000000000..6dabfbb793f
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_events.py.ini
@@ -0,0 +1,273 @@
+[key_events.py]
+ [test_modifier_key_sends_correct_events[\\ue00a-ALT\]]
+ expected: FAIL
+
+ [test_modifier_key_sends_correct_events[\\ue009-CONTROL\]]
+ expected: FAIL
+
+ [test_modifier_key_sends_correct_events[\\ue03d-META\]]
+ expected: FAIL
+
+ [test_modifier_key_sends_correct_events[\\ue008-SHIFT\]]
+ expected: FAIL
+
+ [test_modifier_key_sends_correct_events[\\ue052-R_ALT\]]
+ expected: FAIL
+
+ [test_modifier_key_sends_correct_events[\\ue051-R_CONTROL\]]
+ expected: FAIL
+
+ [test_modifier_key_sends_correct_events[\\ue053-R_META\]]
+ expected: FAIL
+
+ [test_modifier_key_sends_correct_events[\\ue050-R_SHIFT\]]
+ expected: FAIL
+
+ [test_non_printable_key_sends_events[\\ue00c-ESCAPE\]]
+ expected: FAIL
+
+ [test_non_printable_key_sends_events[\\ue014-RIGHT\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[a-KeyA0\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[a-KeyA1\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events["-Quote\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[,-Comma\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[\\xe0-\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[\\u0416-\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[@-Digit2\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[\\u2603-\]]
+ expected: FAIL
+
+ [test_printable_key_sends_correct_events[\\uf6c2-\]]
+ expected: FAIL
+
+ [test_sequence_of_keydown_printable_keys_sends_events]
+ expected: FAIL
+
+ [test_sequence_of_keydown_printable_characters_sends_events]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[ADD-expected0\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[ALT-expected1\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[BACKSPACE-expected2\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[CANCEL-expected3\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[CLEAR-expected4\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[CONTROL-expected5\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[DECIMAL-expected6\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[DELETE-expected7\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[DIVIDE-expected8\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[DOWN-expected9\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[END-expected10\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[ENTER-expected11\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[EQUALS-expected12\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[ESCAPE-expected13\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F1-expected14\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F10-expected15\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F11-expected16\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F12-expected17\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F2-expected18\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F3-expected19\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F4-expected20\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F5-expected21\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F6-expected22\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F7-expected23\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F8-expected24\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[F9-expected25\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[HELP-expected26\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[HOME-expected27\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[INSERT-expected28\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[LEFT-expected29\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[META-expected30\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[MULTIPLY-expected31\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NULL-expected32\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD0-expected33\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD1-expected34\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD2-expected35\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD3-expected36\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD4-expected37\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD5-expected38\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD6-expected39\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD7-expected40\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD8-expected41\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[NUMPAD9-expected42\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[PAGE_DOWN-expected43\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[PAGE_UP-expected44\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[PAUSE-expected45\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[RETURN-expected46\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[RIGHT-expected47\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_ALT-expected48\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_ARROWDOWN-expected49\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_ARROWLEFT-expected50\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_ARROWRIGHT-expected51\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_ARROWUP-expected52\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_CONTROL-expected53\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_DELETE-expected54\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_END-expected55\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_HOME-expected56\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_INSERT-expected57\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_META-expected58\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_PAGEDOWN-expected59\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_PAGEUP-expected60\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[R_SHIFT-expected61\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[SEMICOLON-expected62\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[SEPARATOR-expected63\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[SHIFT-expected64\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[SPACE-expected65\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[SUBTRACT-expected66\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[TAB-expected67\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[UP-expected68\]]
+ expected: FAIL
+
+ [test_special_key_sends_keydown[ZENKAKUHANKAKU-expected69\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_modifiers.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_modifiers.py.ini
new file mode 100644
index 00000000000..70b4b687388
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_modifiers.py.ini
@@ -0,0 +1,12 @@
+[key_modifiers.py]
+ [test_shift_modifier_and_non_printable_keys[\\ue008\]]
+ expected: FAIL
+
+ [test_shift_modifier_and_non_printable_keys[\\ue050\]]
+ expected: FAIL
+
+ [test_shift_modifier_generates_capital_letters[\\ue008\]]
+ expected: FAIL
+
+ [test_shift_modifier_generates_capital_letters[\\ue050\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_shortcuts.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_shortcuts.py.ini
new file mode 100644
index 00000000000..43e9ac6cf32
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_shortcuts.py.ini
@@ -0,0 +1,3 @@
+[key_shortcuts.py]
+ [test_mod_a_mod_c_right_mod_v_pastes_text]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_special_keys.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_special_keys.py.ini
new file mode 100644
index 00000000000..9f97050ec49
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_special_keys.py.ini
@@ -0,0 +1,12 @@
+[key_special_keys.py]
+ [test_codepoint_keys_behave_correctly[\\U0001f604\]]
+ expected: FAIL
+
+ [test_codepoint_keys_behave_correctly[\\U0001f60d\]]
+ expected: FAIL
+
+ [test_codepoint_keys_behave_correctly[\\u0ba8\\u0bbf\]]
+ expected: FAIL
+
+ [test_codepoint_keys_behave_correctly[\\u1100\\u1161\\u11a8\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_tentative.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_tentative.py.ini
new file mode 100644
index 00000000000..a16bb76d7c7
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/key_tentative.py.ini
@@ -0,0 +1,6 @@
+[key_tentative.py]
+ [test_grapheme_cluster[\\u0e01\\u0e33\]]
+ expected: FAIL
+
+ [test_grapheme_cluster[\\U0001f937\\U0001f3fd\\u200d\\u2640\\ufe0f\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini
new file mode 100644
index 00000000000..38af76d3cf4
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/navigation.py.ini
@@ -0,0 +1,6 @@
+[navigation.py]
+ [test_key]
+ expected: FAIL
+
+ [test_pointer]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/none.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/none.py.ini
new file mode 100644
index 00000000000..1dad7888c51
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/none.py.ini
@@ -0,0 +1,6 @@
+[none.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/perform.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/perform.py.ini
new file mode 100644
index 00000000000..b4a8841b9ae
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/perform.py.ini
@@ -0,0 +1,9 @@
+[perform.py]
+ [test_input_source_action_sequence_actions_pause_duration_valid[wheel\]]
+ expected: FAIL
+
+ [test_input_source_action_sequence_actions_pause_duration_missing[wheel\]]
+ expected: FAIL
+
+ [test_input_source_action_sequence_pointer_parameters_not_processed[wheel\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_contextmenu.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_contextmenu.py.ini
new file mode 100644
index 00000000000..e0fb2381634
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_contextmenu.py.ini
@@ -0,0 +1,9 @@
+[pointer_contextmenu.py]
+ [test_control_click[\\ue009-ctrlKey\]]
+ expected: ERROR
+
+ [test_control_click[\\ue051-ctrlKey\]]
+ expected: ERROR
+
+ [test_release_control_click]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_dblclick.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_dblclick.py.ini
new file mode 100644
index 00000000000..523d8d29edb
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_dblclick.py.ini
@@ -0,0 +1,9 @@
+[pointer_dblclick.py]
+ [test_dblclick_at_coordinates[0\]]
+ expected: FAIL
+
+ [test_dblclick_at_coordinates[200\]]
+ expected: FAIL
+
+ [test_no_dblclick_when_mouse_moves]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini
new file mode 100644
index 00000000000..ebb9ef4dcc0
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_modifier_click.py.ini
@@ -0,0 +1,21 @@
+[pointer_modifier_click.py]
+ [test_modifier_click[\\ue00a-altKey\]]
+ expected: ERROR
+
+ [test_modifier_click[\\ue052-altKey\]]
+ expected: ERROR
+
+ [test_modifier_click[\\ue03d-metaKey\]]
+ expected: ERROR
+
+ [test_modifier_click[\\ue053-metaKey\]]
+ expected: ERROR
+
+ [test_modifier_click[\\ue008-shiftKey\]]
+ expected: ERROR
+
+ [test_modifier_click[\\ue050-shiftKey\]]
+ expected: ERROR
+
+ [test_many_modifiers_click]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse.py.ini
new file mode 100644
index 00000000000..4a163fe2fac
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse.py.ini
@@ -0,0 +1,64 @@
+[pointer_mouse.py]
+ expected: TIMEOUT
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: ERROR
+
+ [test_pointer_down_closes_browsing_context]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_click_at_coordinates]
+ expected: FAIL
+
+ [test_context_menu_at_coordinates]
+ expected: FAIL
+
+ [test_middle_click]
+ expected: FAIL
+
+ [test_click_element_center]
+ expected: FAIL
+
+ [test_click_element_in_shadow_tree[outer-open\]]
+ expected: FAIL
+
+ [test_click_element_in_shadow_tree[outer-closed\]]
+ expected: FAIL
+
+ [test_click_element_in_shadow_tree[inner-open\]]
+ expected: FAIL
+
+ [test_click_element_in_shadow_tree[inner-closed\]]
+ expected: FAIL
+
+ [test_click_navigation]
+ expected: FAIL
+
+ [test_move_to_position_in_viewport[x\]]
+ expected: FAIL
+
+ [test_move_to_position_in_viewport[y\]]
+ expected: FAIL
+
+ [test_move_to_fractional_position]
+ expected: FAIL
+
+ [test_move_to_origin_position_within_frame[viewport\]]
+ expected: FAIL
+
+ [test_move_to_origin_position_within_frame[pointer\]]
+ expected: FAIL
+
+ [test_move_to_origin_position_within_frame[element\]]
+ expected: FAIL
+
+ [test_invalid_element_origin]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini
new file mode 100644
index 00000000000..8657edd79e8
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_mouse_drag.py.ini
@@ -0,0 +1,63 @@
+[pointer_mouse_drag.py]
+ [test_drag_and_drop[20-0-0\]]
+ expected: ERROR
+
+ [test_drag_and_drop[20-0-300\]]
+ expected: ERROR
+
+ [test_drag_and_drop[20-0-800\]]
+ expected: ERROR
+
+ [test_drag_and_drop[0-15-0\]]
+ expected: ERROR
+
+ [test_drag_and_drop[0-15-300\]]
+ expected: ERROR
+
+ [test_drag_and_drop[0-15-800\]]
+ expected: ERROR
+
+ [test_drag_and_drop[10-15-0\]]
+ expected: ERROR
+
+ [test_drag_and_drop[10-15-300\]]
+ expected: ERROR
+
+ [test_drag_and_drop[10-15-800\]]
+ expected: ERROR
+
+ [test_drag_and_drop[-20-0-0\]]
+ expected: ERROR
+
+ [test_drag_and_drop[-20-0-300\]]
+ expected: ERROR
+
+ [test_drag_and_drop[-20-0-800\]]
+ expected: ERROR
+
+ [test_drag_and_drop[10--15-0\]]
+ expected: ERROR
+
+ [test_drag_and_drop[10--15-300\]]
+ expected: ERROR
+
+ [test_drag_and_drop[10--15-800\]]
+ expected: ERROR
+
+ [test_drag_and_drop[-10--15-0\]]
+ expected: ERROR
+
+ [test_drag_and_drop[-10--15-300\]]
+ expected: ERROR
+
+ [test_drag_and_drop[-10--15-800\]]
+ expected: ERROR
+
+ [test_drag_and_drop_with_draggable_element[0\]]
+ expected: ERROR
+
+ [test_drag_and_drop_with_draggable_element[300\]]
+ expected: ERROR
+
+ [test_drag_and_drop_with_draggable_element[800\]]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini
new file mode 100644
index 00000000000..112a4f9ddf4
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_origin.py.ini
@@ -0,0 +1,27 @@
+[pointer_origin.py]
+ [test_viewport_inside]
+ expected: ERROR
+
+ [test_pointer_inside]
+ expected: ERROR
+
+ [test_element_center_point]
+ expected: ERROR
+
+ [test_element_center_point_with_offset]
+ expected: ERROR
+
+ [test_element_in_view_center_point_partly_visible]
+ expected: ERROR
+
+ [test_element_larger_than_viewport]
+ expected: ERROR
+
+ [test_element_outside_of_view_port]
+ expected: ERROR
+
+ [test_viewport_outside]
+ expected: ERROR
+
+ [test_pointer_outside]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini
new file mode 100644
index 00000000000..106650cb70e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pause_dblclick.py.ini
@@ -0,0 +1,6 @@
+[pointer_pause_dblclick.py]
+ [test_dblclick_with_pause_after_second_pointerdown]
+ expected: FAIL
+
+ [test_no_dblclick]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pen.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pen.py.ini
new file mode 100644
index 00000000000..a3d52579f7d
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_pen.py.ini
@@ -0,0 +1,33 @@
+[pointer_pen.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_pointer_down_closes_browsing_context]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_pen_pointer_in_shadow_tree[outer-open\]]
+ expected: FAIL
+
+ [test_pen_pointer_in_shadow_tree[outer-closed\]]
+ expected: FAIL
+
+ [test_pen_pointer_in_shadow_tree[inner-open\]]
+ expected: FAIL
+
+ [test_pen_pointer_in_shadow_tree[inner-closed\]]
+ expected: FAIL
+
+ [test_pen_pointer_properties]
+ expected: FAIL
+
+ [test_params_actions_origin_outside_viewport[element\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_touch.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_touch.py.ini
new file mode 100644
index 00000000000..65101d138aa
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_touch.py.ini
@@ -0,0 +1,42 @@
+[pointer_touch.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_pointer_down_closes_browsing_context]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_touch_pointer_in_shadow_tree[outer-open\]]
+ expected: FAIL
+
+ [test_touch_pointer_in_shadow_tree[outer-closed\]]
+ expected: FAIL
+
+ [test_touch_pointer_in_shadow_tree[inner-open\]]
+ expected: FAIL
+
+ [test_touch_pointer_in_shadow_tree[inner-closed\]]
+ expected: FAIL
+
+ [test_touch_pointer_properties]
+ expected: FAIL
+
+ [test_touch_pointer_properties_angle_twist]
+ expected: FAIL
+
+ [test_touch_pointer_properties_tilt_twist]
+ expected: FAIL
+
+ [test_move_to_fractional_position]
+ expected: FAIL
+
+ [test_params_actions_origin_outside_viewport[element\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_tripleclick.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_tripleclick.py.ini
new file mode 100644
index 00000000000..7e0523a6116
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/pointer_tripleclick.py.ini
@@ -0,0 +1,3 @@
+[pointer_tripleclick.py]
+ [test_tripleclick_at_coordinates]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/sequence.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/sequence.py.ini
new file mode 100644
index 00000000000..54ee376545d
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/sequence.py.ini
@@ -0,0 +1,3 @@
+[sequence.py]
+ [test_perform_no_actions_send_no_events]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/user_prompts.py.ini
new file mode 100644
index 00000000000..ca5401f5012
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/user_prompts.py.ini
@@ -0,0 +1,58 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: ERROR
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: ERROR
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: ERROR
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: ERROR
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: ERROR
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: ERROR
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: ERROR
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: ERROR
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: ERROR
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: ERROR
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: ERROR
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: ERROR
+
+ [test_ignore[capabilities0-alert\]]
+ expected: ERROR
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: ERROR
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: ERROR
+
+ [test_default[alert-None\]]
+ expected: ERROR
+
+ [test_default[confirm-False\]]
+ expected: ERROR
+
+ [test_default[prompt-None\]]
+ expected: ERROR
+
+ [test_dismissed_beforeunload]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/perform_actions/wheel.py.ini b/tests/wpt/meta/webdriver/tests/classic/perform_actions/wheel.py.ini
new file mode 100644
index 00000000000..3f6abc70f3e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/perform_actions/wheel.py.ini
@@ -0,0 +1,39 @@
+[wheel.py]
+ [test_null_response_value]
+ expected: FAIL
+
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_params_actions_origin_outside_viewport[element\]]
+ expected: FAIL
+
+ [test_params_actions_origin_outside_viewport[viewport\]]
+ expected: FAIL
+
+ [test_scroll_not_scrollable]
+ expected: FAIL
+
+ [test_scroll_scrollable_overflow]
+ expected: FAIL
+
+ [test_scroll_iframe]
+ expected: FAIL
+
+ [test_scroll_shadow_tree[outer-open\]]
+ expected: FAIL
+
+ [test_scroll_shadow_tree[outer-closed\]]
+ expected: FAIL
+
+ [test_scroll_shadow_tree[inner-open\]]
+ expected: FAIL
+
+ [test_scroll_shadow_tree[inner-closed\]]
+ expected: FAIL
+
+ [test_scroll_with_key_pressed]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/permissions/set.py.ini b/tests/wpt/meta/webdriver/tests/classic/permissions/set.py.ini
new file mode 100644
index 00000000000..a97d40f6155
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/permissions/set.py.ini
@@ -0,0 +1,9 @@
+[set.py]
+ [test_set_to_state[granted\]]
+ expected: FAIL
+
+ [test_set_to_state[denied\]]
+ expected: FAIL
+
+ [test_set_to_state[prompt\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/print/background.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/background.py.ini
new file mode 100644
index 00000000000..0d71e219071
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/print/background.py.ini
@@ -0,0 +1,9 @@
+[background.py]
+ [test_background[None-iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P4DwQACfsD/Z8fLAAAAAAASUVORK5CYII=\]]
+ expected: FAIL
+
+ [test_background[True-iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NgYGD4DwABBAEAwS2OUAAAAABJRU5ErkJggg==\]]
+ expected: FAIL
+
+ [test_background[False-iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P4DwQACfsD/Z8fLAAAAAAASUVORK5CYII=\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/print/orientation.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/orientation.py.ini
new file mode 100644
index 00000000000..387ff60af8b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/print/orientation.py.ini
@@ -0,0 +1,9 @@
+[orientation.py]
+ [test_orientation[default\]]
+ expected: FAIL
+
+ [test_orientation[portrait\]]
+ expected: FAIL
+
+ [test_orientation[landscape\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/print/printcmd.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/printcmd.py.ini
new file mode 100644
index 00000000000..5d21a234610
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/print/printcmd.py.ini
@@ -0,0 +1,57 @@
+[printcmd.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_html_document]
+ expected: FAIL
+
+ [test_large_html_document]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges0-expected0\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges1-expected1\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges2-expected2\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges3-expected3\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges4-expected4\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges5-expected5\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges6-expected6\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges7-expected7\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges8-expected8\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges9-expected9\]]
+ expected: FAIL
+
+ [test_page_ranges_document[ranges10-expected10\]]
+ expected: FAIL
+
+ [test_page_ranges_invalid[options9\]]
+ expected: FAIL
+
+ [test_page_ranges_invalid[options10\]]
+ expected: FAIL
+
+ [test_page_ranges_invalid[options11\]]
+ expected: FAIL
+
+ [test_page_ranges_invalid[options12\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/print/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/print/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/print/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/refresh/refresh.py.ini b/tests/wpt/meta/webdriver/tests/classic/refresh/refresh.py.ini
new file mode 100644
index 00000000000..08528d08784
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/refresh/refresh.py.ini
@@ -0,0 +1,21 @@
+[refresh.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_seen_nodes[http\]]
+ expected: FAIL
+
+ [test_seen_nodes[https\]]
+ expected: FAIL
+
+ [test_seen_nodes[https coop\]]
+ expected: FAIL
+
+ [test_history_pushstate]
+ expected: FAIL
+
+ [test_refresh_switches_to_parent_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/refresh/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/refresh/user_prompts.py.ini
new file mode 100644
index 00000000000..fcf10a0526c
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/refresh/user_prompts.py.ini
@@ -0,0 +1,73 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-beforeunload-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-beforeunload\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[beforeunload-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/release_actions/release.py.ini b/tests/wpt/meta/webdriver/tests/classic/release_actions/release.py.ini
new file mode 100644
index 00000000000..7c5e73584b6
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/release_actions/release.py.ini
@@ -0,0 +1,6 @@
+[release.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence.py.ini b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence.py.ini
new file mode 100644
index 00000000000..6ba3814b563
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence.py.ini
@@ -0,0 +1,3 @@
+[sequence.py]
+ [test_release_char_sequence_sends_keyup_events_in_reverse]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence_tentative.py.ini b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence_tentative.py.ini
new file mode 100644
index 00000000000..aed5f673813
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/release_actions/sequence_tentative.py.ini
@@ -0,0 +1,6 @@
+[sequence_tentative.py]
+ [test_release_mouse_sequence_resets_dblclick_state[with release actions\]]
+ expected: FAIL
+
+ [test_release_mouse_sequence_resets_dblclick_state[without release actions\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/send_alert_text/send.py.ini b/tests/wpt/meta/webdriver/tests/classic/send_alert_text/send.py.ini
new file mode 100644
index 00000000000..fc3fe5245a3
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/send_alert_text/send.py.ini
@@ -0,0 +1,3 @@
+[send.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/webdriver/tests/classic/set_timeouts/set.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/set.py.ini
new file mode 100644
index 00000000000..bfc9d7723d9
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/set.py.ini
@@ -0,0 +1,2 @@
+[set.py]
+ expected: TIMEOUT
diff --git a/tests/wpt/meta/webdriver/tests/classic/set_timeouts/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/user_prompts.py.ini
new file mode 100644
index 00000000000..913351aaa55
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/set_timeouts/user_prompts.py.ini
@@ -0,0 +1,2 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734 \ No newline at end of file
diff --git a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/from_minimized_window.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/from_minimized_window.py.ini
new file mode 100644
index 00000000000..5d3e1ccc1b2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/from_minimized_window.py.ini
@@ -0,0 +1,3 @@
+[from_minimized_window.py]
+ [test_restore_from_minimized]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini
new file mode 100644
index 00000000000..6b28c2efdf8
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/set.py.ini
@@ -0,0 +1,39 @@
+[set.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_restore_from_fullscreen]
+ expected: FAIL
+
+ [test_restore_from_maximized]
+ expected: FAIL
+
+ [test_x_y_floats]
+ expected: FAIL
+
+ [test_set_to_available_size]
+ expected: ERROR
+
+ [test_set_smaller_than_minimum_browser_size]
+ expected: FAIL
+
+ [test_x_y]
+ expected: FAIL
+
+ [test_x_as_current]
+ expected: FAIL
+
+ [test_y_as_current]
+ expected: FAIL
+
+ [test_negative_x_y]
+ expected: ERROR
+
+ [test_set_to_screen_size]
+ expected: ERROR
+
+ [test_set_larger_than_screen_size]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/classic/set_window_rect/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/user_prompts.py.ini
new file mode 100644
index 00000000000..913351aaa55
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/set_window_rect/user_prompts.py.ini
@@ -0,0 +1,2 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734 \ No newline at end of file
diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini
new file mode 100644
index 00000000000..ee73fbf4ce8
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch.py.ini
@@ -0,0 +1,21 @@
+[switch.py]
+ [test_no_top_browsing_context[None\]]
+ expected: FAIL
+
+ [test_no_top_browsing_context[0\]]
+ expected: FAIL
+
+ [test_no_browsing_context[0\]]
+ expected: FAIL
+
+ [test_no_browsing_context[id2\]]
+ expected: FAIL
+
+ [test_no_browsing_context_when_already_top_level]
+ expected: FAIL
+
+ [test_frame_id_shadow_root]
+ expected: FAIL
+
+ [test_frame_id_null]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_number.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_number.py.ini
new file mode 100644
index 00000000000..408f2eb2568
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_number.py.ini
@@ -0,0 +1,15 @@
+[switch_number.py]
+ [test_frame_id_number_index_out_of_bounds[1\]]
+ expected: FAIL
+
+ [test_frame_id_number_index_out_of_bounds[65535\]]
+ expected: FAIL
+
+ [test_frame_id_number_index[0-foo\]]
+ expected: FAIL
+
+ [test_frame_id_number_index[1-bar\]]
+ expected: FAIL
+
+ [test_frame_id_number_index_nested]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_webelement.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_webelement.py.ini
new file mode 100644
index 00000000000..9932ab9a5d5
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_frame/switch_webelement.py.ini
@@ -0,0 +1,12 @@
+[switch_webelement.py]
+ [test_frame_id_webelement_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_frame_id_webelement_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_frame_id_webelement_frame[0-foo\]]
+ expected: FAIL
+
+ [test_frame_id_webelement_frame[1-bar\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_parent_frame/switch.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_parent_frame/switch.py.ini
new file mode 100644
index 00000000000..ffd3d06f212
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_parent_frame/switch.py.ini
@@ -0,0 +1,6 @@
+[switch.py]
+ [test_switch_from_iframe]
+ expected: FAIL
+
+ [test_switch_from_top_level]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_window/alerts.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/alerts.py.ini
new file mode 100644
index 00000000000..3e6ad0c8af9
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/alerts.py.ini
@@ -0,0 +1,3 @@
+[alerts.py]
+ [test_retain_tab_modal_status]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/switch_to_window/switch.py.ini b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/switch.py.ini
new file mode 100644
index 00000000000..9b0ec38199b
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/switch_to_window/switch.py.ini
@@ -0,0 +1,12 @@
+[switch.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_finds_exising_user_prompt_after_tab_switch[alert\]]
+ expected: FAIL
+
+ [test_finds_exising_user_prompt_after_tab_switch[confirm\]]
+ expected: FAIL
+
+ [test_finds_exising_user_prompt_after_tab_switch[prompt\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/iframe.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/iframe.py.ini
new file mode 100644
index 00000000000..dd77eca9d72
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/iframe.py.ini
@@ -0,0 +1,9 @@
+[iframe.py]
+ [test_frame_element]
+ expected: FAIL
+
+ [test_source_origin[same_origin\]]
+ expected: FAIL
+
+ [test_source_origin[cross_origin\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/screenshot.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/screenshot.py.ini
new file mode 100644
index 00000000000..319e4bf848f
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/screenshot.py.ini
@@ -0,0 +1,30 @@
+[screenshot.py]
+ [test_no_browsing_context]
+ expected: FAIL
+
+ [test_no_such_element_with_invalid_value]
+ expected: FAIL
+
+ [test_no_such_element_with_shadow_root]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_window_handle[closed\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[open\]]
+ expected: FAIL
+
+ [test_no_such_element_from_other_frame[closed\]]
+ expected: FAIL
+
+ [test_stale_element_reference[top_context\]]
+ expected: FAIL
+
+ [test_stale_element_reference[child_context\]]
+ expected: FAIL
+
+ [test_format_and_dimensions]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/take_element_screenshot/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/iframe.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/iframe.py.ini
new file mode 100644
index 00000000000..62f7ab5e4da
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/iframe.py.ini
@@ -0,0 +1,3 @@
+[iframe.py]
+ [test_always_captures_top_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini
new file mode 100644
index 00000000000..f2fac7a7fa1
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/screenshot.py.ini
@@ -0,0 +1,6 @@
+[screenshot.py]
+ [test_no_top_browsing_context]
+ expected: FAIL
+
+ [test_no_browsing_context]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/classic/take_screenshot/user_prompts.py.ini b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/user_prompts.py.ini
new file mode 100644
index 00000000000..53b6399fdd2
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/classic/take_screenshot/user_prompts.py.ini
@@ -0,0 +1,55 @@
+[user_prompts.py]
+ disabled: https://github.com/servo/servo/issues/35734
+ [test_accept[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-confirm-True\]]
+ expected: FAIL
+
+ [test_accept_and_notify[capabilities0-prompt-\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-alert-None\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-confirm-False\]]
+ expected: FAIL
+
+ [test_dismiss_and_notify[capabilities0-prompt-None\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-alert\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-confirm\]]
+ expected: FAIL
+
+ [test_ignore[capabilities0-prompt\]]
+ expected: FAIL
+
+ [test_default[alert-None\]]
+ expected: FAIL
+
+ [test_default[confirm-False\]]
+ expected: FAIL
+
+ [test_default[prompt-None\]]
+ expected: FAIL
diff --git a/tests/wpt/meta/webdriver/tests/interop/beforeunload_prompt.py.ini b/tests/wpt/meta/webdriver/tests/interop/beforeunload_prompt.py.ini
new file mode 100644
index 00000000000..8d9822802f0
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/interop/beforeunload_prompt.py.ini
@@ -0,0 +1,60 @@
+[beforeunload_prompt.py]
+ [test_accept[capabilities0-False\]]
+ expected: ERROR
+
+ [test_accept[capabilities0-True\]]
+ expected: ERROR
+
+ [test_accept_and_notify[capabilities0-False\]]
+ expected: ERROR
+
+ [test_accept_and_notify[capabilities0-True\]]
+ expected: ERROR
+
+ [test_dismiss[capabilities0-False\]]
+ expected: ERROR
+
+ [test_dismiss[capabilities0-True\]]
+ expected: ERROR
+
+ [test_dismiss_and_notify[capabilities0-False\]]
+ expected: ERROR
+
+ [test_dismiss_and_notify[capabilities0-True\]]
+ expected: ERROR
+
+ [test_ignore[capabilities0-False\]]
+ expected: ERROR
+
+ [test_ignore[capabilities0-True\]]
+ expected: ERROR
+
+ [test_accept[False\]]
+ expected: ERROR
+
+ [test_accept[True\]]
+ expected: ERROR
+
+ [test_accept_and_notify[False\]]
+ expected: ERROR
+
+ [test_accept_and_notify[True\]]
+ expected: ERROR
+
+ [test_dismiss[False\]]
+ expected: ERROR
+
+ [test_dismiss[True\]]
+ expected: ERROR
+
+ [test_dismiss_and_notify[False\]]
+ expected: ERROR
+
+ [test_dismiss_and_notify[True\]]
+ expected: ERROR
+
+ [test_ignore[False\]]
+ expected: ERROR
+
+ [test_ignore[True\]]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/interop/frames.py.ini b/tests/wpt/meta/webdriver/tests/interop/frames.py.ini
new file mode 100644
index 00000000000..21819720ff1
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/interop/frames.py.ini
@@ -0,0 +1,3 @@
+[frames.py]
+ [test_classic_switch_to_parent_no_browsing_context]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/interop/shared_id_node.py.ini b/tests/wpt/meta/webdriver/tests/interop/shared_id_node.py.ini
new file mode 100644
index 00000000000..07c51098229
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/interop/shared_id_node.py.ini
@@ -0,0 +1,18 @@
+[shared_id_node.py]
+ [test_web_element_reference_created_in_classic]
+ expected: ERROR
+
+ [test_web_element_reference_created_in_bidi]
+ expected: ERROR
+
+ [test_shadow_root_reference_created_in_classic[open\]]
+ expected: ERROR
+
+ [test_shadow_root_reference_created_in_classic[closed\]]
+ expected: ERROR
+
+ [test_shadow_root_reference_created_in_bidi[open\]]
+ expected: ERROR
+
+ [test_shadow_root_reference_created_in_bidi[closed\]]
+ expected: ERROR
diff --git a/tests/wpt/meta/webdriver/tests/interop/shared_id_window.py.ini b/tests/wpt/meta/webdriver/tests/interop/shared_id_window.py.ini
new file mode 100644
index 00000000000..7dc97d71d7e
--- /dev/null
+++ b/tests/wpt/meta/webdriver/tests/interop/shared_id_window.py.ini
@@ -0,0 +1,15 @@
+[shared_id_window.py]
+ [test_top_level_context_id_equals_window_handle]
+ expected: ERROR
+
+ [test_web_window_reference_created_in_classic]
+ expected: ERROR
+
+ [test_web_frame_reference_created_in_classic]
+ expected: ERROR
+
+ [test_web_window_reference_created_in_bidi]
+ expected: ERROR
+
+ [test_web_frame_reference_created_in_bidi]
+ expected: ERROR
diff --git a/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini b/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini
index 492ba730948..b63c174f353 100644
--- a/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini
+++ b/tests/wpt/meta/webidl/ecmascript-binding/global-object-implicit-this-value-cross-realm.html.ini
@@ -1,6 +1,3 @@
[global-object-implicit-this-value-cross-realm.html]
- [Cross-realm global object's operation throws when called on incompatible object]
- expected: FAIL
-
[Cross-realm global object's operation called on null / undefined]
expected: FAIL
diff --git a/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini b/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini
deleted file mode 100644
index c625c16f713..00000000000
--- a/tests/wpt/meta/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[explicitly-closed.tentative.window.html]
- expected: TIMEOUT
- [Close event on port2 is fired when port1 is explicitly closed]
- expected: TIMEOUT
-
- [Close event on port2 is fired when port1, which is in a different window, is explicitly closed.]
- expected: TIMEOUT
diff --git a/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini
new file mode 100644
index 00000000000..ce3fb065178
--- /dev/null
+++ b/tests/wpt/meta/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html.ini
@@ -0,0 +1,19 @@
+[depth_sensing_cpu_matchDepthViewIdentity.https.html]
+ expected: ERROR
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl]
+ expected: TIMEOUT
+
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `cpu-optimized` - webgl2]
+ expected: NOTRUN
diff --git a/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini
new file mode 100644
index 00000000000..54901a8468a
--- /dev/null
+++ b/tests/wpt/meta/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html.ini
@@ -0,0 +1,19 @@
+[depth_sensing_gpu_matchDepthViewIdentity.https.html]
+ expected: ERROR
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl]
+ expected: TIMEOUT
+
+ [Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized` - webgl2]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl]
+ expected: NOTRUN
+
+ [Ensures session can be created when matchDepthView=false, `gpu-optimized` - webgl2]
+ expected: NOTRUN
diff --git a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini b/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini
deleted file mode 100644
index 24daae4c2e7..00000000000
--- a/tests/wpt/meta/workers/WorkerGlobalScope-close.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[WorkerGlobalScope-close.html]
- [Test sending a message after closing.]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index d3a939eab57..a3f77769a9d 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -25,6 +25,13 @@
{}
]
],
+ "form_reset-crash.html": [
+ "b23cbf6aefdef8231e2cc4cb0e6416195d5bdf71",
+ [
+ null,
+ {}
+ ]
+ ],
"global-enumerate-crash.html": [
"a77e79b1465bf7555340dd5e9bf94a4c8caa85f2",
[
@@ -12737,7 +12744,7 @@
]
},
"FocusEvent.html": [
- "9e002c1088de060b5e7f94c4152bf9fb779c04cc",
+ "7fb7aebf2afbac7f68a16308b9cc5d4588b7022f",
[
null,
{}
@@ -13271,6 +13278,13 @@
{}
]
],
+ "focus_inter_documents.html": [
+ "5c759772367e844066d1df0081917c9e129d09ec",
+ [
+ null,
+ {}
+ ]
+ ],
"follow-hyperlink.html": [
"6ac9eaeb5814a663988ed8c664c113072e329dc5",
[
diff --git a/tests/wpt/mozilla/tests/mozilla/FocusEvent.html b/tests/wpt/mozilla/tests/mozilla/FocusEvent.html
index 9e002c1088d..7fb7aebf2af 100644
--- a/tests/wpt/mozilla/tests/mozilla/FocusEvent.html
+++ b/tests/wpt/mozilla/tests/mozilla/FocusEvent.html
@@ -48,13 +48,6 @@
]
},
- {
- element: document.body,
- expected_events: [
- {element: input3, event_name: "blur"},
- ]
- }
-
];
var idx = 0;
diff --git a/tests/wpt/mozilla/tests/mozilla/focus_inter_documents.html b/tests/wpt/mozilla/tests/mozilla/focus_inter_documents.html
new file mode 100644
index 00000000000..5c759772367
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/focus_inter_documents.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="UTF-8">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <iframe id="f1"></iframe>
+ <iframe id="f2"></iframe>
+ <input id="d0">
+ <script>
+
+ /** Wait for an `event` event to be fired on `element`. Resolves to a boolean
+ * value indicating whether the event was fired within a predetermined period. */
+ async function waitForEvent(element, event) {
+ let listener;
+ try {
+ return await new Promise(resolve => {
+ setTimeout(() => resolve(false), 1000);
+ listener = () => resolve(true);
+ element.addEventListener(event, listener);
+ });
+ } finally {
+ if (listener) {
+ element.removeEventListener(event, listener);
+ }
+ }
+ }
+
+ promise_test(async t => {
+ await new Promise(r => window.onload = r);
+
+ const d0 = document.getElementById("d0");
+
+ // This test requires the document to have focus as a starting condition.
+ if (!document.hasFocus() || document.activeElement !== d0) {
+ const p = new Promise(r => d0.onfocus = r);
+ d0.focus();
+ await p;
+ }
+
+ assert_true(document.hasFocus(), "Document has focus as starting condition.");
+ assert_equals(document.activeElement, d0, "`d0` has focus as starting condition.");
+ }, "Starting condition");
+
+ promise_test(async t => {
+ const d0 = document.getElementById("d0");
+ const f1 = document.getElementById("f1");
+ f1.contentDocument.body.innerHTML = '<input id=d1>';
+ const d1 = f1.contentDocument.getElementById("d1");
+
+ const p0 = waitForEvent(d1, 'focus');
+ const p1 = waitForEvent(f1, 'focus');
+ const p2 = waitForEvent(f1.contentWindow, 'focus');
+ const p3 = waitForEvent(d0, 'blur');
+
+ d1.focus();
+
+ assert_true(await p0, "`d1.focus` fires in time");
+ await p1; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit
+ assert_true(await p2, "`f1.contentWindow.focus` fires in time");
+ assert_true(await p3, "`d0.blur` fires in time");
+
+ assert_equals(document.activeElement, f1, "The top-level document's activeElement is `f1`");
+ assert_true(f1.contentDocument.hasFocus(), "f1's contentDocument has focus");
+ assert_equals(f1.contentDocument.activeElement, d1, "f1's contentDocument's activeElement is `d1`");
+ }, "Focusing an element in a nested browsing context also focuses the container");
+
+ promise_test(async t => {
+ const f1 = document.getElementById("f1");
+ const d1 = f1.contentDocument.getElementById("d1");
+
+ const f2 = document.getElementById("f2");
+ f2.contentDocument.body.innerHTML = '<input id=d2>';
+ const d2 = f2.contentDocument.getElementById("d2");
+
+ const p0 = waitForEvent(d1, 'blur');
+ const p1 = waitForEvent(f1, 'blur');
+ const p2 = waitForEvent(f1.contentWindow, 'blur');
+
+ d2.focus();
+
+ assert_true(await p0, "`d1.blur` fires in time");
+ await p1; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit
+ assert_true(await p2, "`f1.contentWindow.blur` fires in time");
+
+ // Wait for any ongoing execution of the focus update steps to complete
+ await new Promise(r => window.setTimeout(r, 0));
+
+ assert_equals(document.activeElement, f2, "The top-level document's activeElement is `f2`");
+ assert_true(f2.contentDocument.hasFocus(), "f2's contentDocument has focus");
+ assert_equals(f2.contentDocument.activeElement, d2, "f2's contentDocument's activeElement is `d2`");
+ assert_false(f1.contentDocument.hasFocus(), "f1's contentDocument does not have focus");
+ assert_equals(f1.contentDocument.activeElement, f1.contentDocument.body, "f1's contentDocument's activeElement is its body");
+ }, "Focusing an element in a different container also unfocuses the previously focused element and its container");
+
+ promise_test(async t => {
+ const d0 = document.getElementById("d0");
+
+ const f2 = document.getElementById("f2");
+ const d2 = f2.contentDocument.getElementById("d2");
+
+ const p0 = waitForEvent(d2, 'blur');
+ const p1 = waitForEvent(f2, 'blur');
+ const p2 = waitForEvent(f2.contentWindow, 'blur');
+ const p3 = waitForEvent(d0, 'focus');
+
+ d0.focus();
+
+ assert_true(await p0, "`d2.blur` fires in time");
+ await p1; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit
+ assert_true(await p2, "`f2.contentWindow.blur` fires in time");
+ assert_true(await p3, "`d0.focus` fires in time");
+
+ // Wait for any ongoing execution of the focus update steps to complete
+ await new Promise(r => window.setTimeout(r, 0));
+
+ assert_equals(document.activeElement, d0, "The top-level document's activeElement is `d0`");
+ assert_false(f2.contentDocument.hasFocus(), "f2's contentDocument does not have focus");
+ assert_equals(f2.contentDocument.activeElement, f2.contentDocument.body, "f2's contentDocument's activeElement is its body");
+ }, "Unfocusing a container also unfocuses any focused elements within");
+
+ promise_test(async t => {
+ const f1 = document.getElementById("f1");
+
+ const p0 = waitForEvent(f1, 'focus');
+ const p1 = waitForEvent(f1.contentWindow, 'focus');
+
+ f1.focus();
+
+ await p0; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit
+ assert_true(await p1, "`f1.contentWindow.focus` fires in time");
+
+ assert_equals(document.activeElement, f1, "The top-level document's activeElement is `f1`");
+ assert_true(f1.contentDocument.hasFocus(), "f1's contentDocument has focus");
+ }, "Focusing a container changes the contained document's 'has focus steps' result");
+
+ promise_test(async t => {
+ const f1 = document.getElementById("f1");
+
+ // `f1` should be focused because of the previous step
+ assert_equals(document.activeElement, f1, "The top-level document's activeElement is `f1`");
+
+ // Navigate the focused container
+ const pLoad = new Promise(resolve => window.subframeIsReady = resolve);
+ f1.srcdoc = "<script>window.parent.subframeIsReady();</" + "script>";
+ await pLoad;
+
+ // Allow some delay before the document finally receives focus
+ if (!f1.contentDocument.hasFocus()) {
+ await waitForEvent(f1.contentWindow, 'focus');
+ }
+
+ assert_true(f1.contentDocument.hasFocus(), "f1's contentDocument has focus");
+ }, "When a focused container navigates, the new document should receive focus");
+
+ promise_test(async t => {
+ const f2 = document.getElementById("f2");
+
+ const p0 = waitForEvent(f2, 'focus');
+ const p1 = waitForEvent(f2.contentWindow, 'focus');
+
+ f2.contentWindow.focus();
+
+ await p0; // FIXME: doesn't fire on Firefox, Blink, Edge, and WebKit
+ assert_true(await p1, "`f2.contentWindow.focus` fires in time");
+
+ assert_equals(document.activeElement, f2, "The top-level document's activeElement is `f2`");
+ assert_true(f2.contentDocument.hasFocus(), "f2's contentDocument has focus");
+ }, "Focusing the window of a nested browsing context also focuses the container");
+
+ promise_test(async t => {
+ const f2 = document.getElementById("f2");
+ const d2 = f2.contentDocument.getElementById("d2");
+
+ {
+ const p = waitForEvent(d2, 'focus');
+ f2.focus();
+ d2.focus();
+ await p;
+ }
+
+ const p0 = waitForEvent(d2, 'blur');
+ d2.blur();
+ assert_true(await p0, "`d2.blur` fires in time");
+
+ // FIXME: This passes on Firefox, Blink, and WebKit but is not spec-
+ // compliant. Per spec, the top-level document's viewport should be
+ // focused instead.
+ //
+ // <https://html.spec.whatwg.org/multipage/#get-the-focusable-area>
+ //
+ // > The unfocusing steps for an object `old focus target`` that is either a
+ // > focusable area or an element that is not a focusable area are as
+ // > follows: [...]
+ // >
+ // > 7. If `topDocument`'s browsing context has system focus, then run the
+ // > focusing steps for topDocument's viewport.
+
+ assert_equals(document.activeElement, f2, "The top-level document's activeElement is `f2`");
+ assert_equals(f2.contentDocument.activeElement, f2.contentDocument.body, "f2's contentDocument's activeElement is its body");
+ assert_true(f2.contentDocument.hasFocus(), "f2's contentDocument has focus");
+ }, "Blurring an element in a nested browsing context focuses its node document");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/mozilla/tests/mozilla/form_reset-crash.html b/tests/wpt/mozilla/tests/mozilla/form_reset-crash.html
new file mode 100644
index 00000000000..b23cbf6aefd
--- /dev/null
+++ b/tests/wpt/mozilla/tests/mozilla/form_reset-crash.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<form id="form">
+ <output><textarea></textarea></output>
+</form>
+<script>
+form.reset();
+</script>
diff --git a/tests/wpt/tests/.github/workflows/docker.yml b/tests/wpt/tests/.github/workflows/docker.yml
index 66794b69aba..5de0cc4bcb1 100644
--- a/tests/wpt/tests/.github/workflows/docker.yml
+++ b/tests/wpt/tests/.github/workflows/docker.yml
@@ -40,7 +40,7 @@ jobs:
latest
type=raw,value=${{ inputs.tag }}
- name: Build and push the Docker image
- uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0
+ uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0
with:
context: ./tools/docker
push: true
diff --git a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html
index 5f76d59eb35..ee5e27e35b6 100644
--- a/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html
+++ b/tests/wpt/tests/ai/language_detection/availability-detached-crash.https.html
@@ -2,12 +2,19 @@
<title>Assures no crash upon call of LanguageDetector.availability() on a detached document</title>
<link rel="author" href="mailto:christinesm@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/384233287">
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
<body>
<iframe src="about:blank"></iframe>
<script>
-const factory = frames[0].LanguageDetector;
-const detector = factory.create();
+const iframe = frames[0];
+await test_driver.bless('Create LanguageDetector', null, iframe);
+
+const factory = iframe.LanguageDetector;
+const detectorPromise = await factory.create();
document.getElementsByTagName("iframe")[0].remove();
-detector.availability();
+
+factory.availability();
+detectorPromise.then(detector => detector.detect());
</script>
</body>
diff --git a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html
index 3e90d36b5aa..ddcf82bec68 100644
--- a/tests/wpt/tests/ai/language_detection/detector-iframe.https.html
+++ b/tests/wpt/tests/ai/language_detection/detector-iframe.https.html
@@ -37,6 +37,9 @@ function load_iframe(src, permission_policy) {
});
}
+// TODO(crbug.com/414428433): Tests in this file intermittently crash.
+// Re-enable once potential causes in Permissions Policy implementation
+// and test setup are addressed.
promise_test(async t => {
const src = HTTPS_NOTSAMESITE_ORIGIN + IFRAME_PATH;
const iframe = await load_iframe(src, /*permission_policy=*/"");
diff --git a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js
index a1c67db9129..80cbfa485e3 100644
--- a/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js
+++ b/tests/wpt/tests/ai/language_detection/detector-locale.https.window.js
@@ -1,5 +1,8 @@
// META: title=Detect english
// META: global=window
+// META: timeout=long
+// META: script=resources/util.js
+// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: script=../resources/locale-util.js
@@ -45,7 +48,7 @@ promise_test(async t => {
async function getExpectedInputLanguages(expectedInputLanguages) {
- return (await LanguageDetector.create({expectedInputLanguages}))
+ return (await createLanguageDetector({expectedInputLanguages}))
.expectedInputLanguages;
}
@@ -63,14 +66,14 @@ function uniqueCount(array) {
promise_test(async t => {
for (const [languageSubtag, variations] of Object.entries(
valid_language_tags)) {
- if (await getAvailability(languageSubtag) === 'unavailable') {
+ if (await getAvailability([languageSubtag]) === 'unavailable') {
continue;
}
- await assert_valid_expected_input_languages(languageSubtag)
+ await assert_valid_expected_input_languages(languageSubtag);
for (const variation of variations) {
- await assert_valid_expected_input_languages(variation)
+ await assert_valid_expected_input_languages(variation);
}
const expectedInputLanguages = await getExpectedInputLanguages(variations);
@@ -94,10 +97,10 @@ function assert_rejects_invalid_expected_input_languages(
promise_test(async t => {
for (const languageTag of invalid_language_tags) {
assert_rejects_invalid_expected_input_languages(
- t, LanguageDetector.create, [languageTag]);
+ t, createLanguageDetector, [languageTag]);
}
assert_rejects_invalid_expected_input_languages(
- t, LanguageDetector.create, invalid_language_tags);
+ t, createLanguageDetector, invalid_language_tags);
}, 'LanguageDetector.create() throws RangeError for invalid language tags');
promise_test(async t => {
diff --git a/tests/wpt/tests/ai/language_detection/detector.https.window.js b/tests/wpt/tests/ai/language_detection/detector.https.window.js
index e85ea6d249b..b0255bc552b 100644
--- a/tests/wpt/tests/ai/language_detection/detector.https.window.js
+++ b/tests/wpt/tests/ai/language_detection/detector.https.window.js
@@ -1,19 +1,32 @@
// META: title=Detect english
// META: global=window
+// META: timeout=long
+// META: script=resources/util.js
+// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: script=../resources/locale-util.js
'use strict';
promise_test(async t => {
- // Language detection is available after call to `create()`.
- await LanguageDetector.create();
+ // Creating the language detector without user activation rejects with
+ // NotAllowedError.
+ const createPromise = LanguageDetector.create();
+ await promise_rejects_dom(t, 'NotAllowedError', createPromise);
+
+ // Creating the translator with user activation succeeds.
+ await createLanguageDetector();
+
+ // Creating it should have switched it to available.
const availability = await LanguageDetector.availability();
assert_equals(availability, 'available');
-}, 'Simple LanguageDetector.availability() call');
+
+ // Now that it is available, we should no longer need user activation.
+ await LanguageDetector.create();
+}, 'LanguageDetector.create() requires user activation when availability is "downloadable.');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const results = await detector.detect('Hello world!');
// must at least have the 'und' result.
@@ -62,30 +75,30 @@ promise_test(async t => {
throw error;
}
- await promise_rejects_exactly(t, error, LanguageDetector.create({monitor}));
+ await promise_rejects_exactly(t, error, createLanguageDetector({monitor}));
}, 'If monitor throws an error, LanguageDetector.create() rejects with that error');
promise_test(async t => {
- testMonitor(LanguageDetector.create);
+ testMonitor(createLanguageDetector);
}, 'LanguageDetector.create() notifies its monitor on downloadprogress');
promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const createPromise = LanguageDetector.create({signal: controller.signal});
+ const createPromise = createLanguageDetector({signal: controller.signal});
await promise_rejects_dom(t, 'AbortError', createPromise);
}, 'LanguageDetector.create() call with an aborted signal.');
promise_test(async t => {
await testAbortPromise(t, signal => {
- return LanguageDetector.create({signal});
+ return createLanguageDetector({signal});
});
-}, 'Aborting LanguageDetector.create().');
+}, 'Aborting createLanguageDetector().');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const text = 'Hello world!';
const promises = [detector.detect(text), detector.measureInputUsage(text)];
@@ -101,7 +114,7 @@ promise_test(async t => {
promise_test(async t => {
const controller = new AbortController();
- const detector = await LanguageDetector.create({signal: controller.signal});
+ const detector = await createLanguageDetector({signal: controller.signal});
const text = 'Hello world!';
const promises = [detector.detect(text), detector.measureInputUsage(text)];
@@ -120,7 +133,7 @@ promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const detectPromise =
detector.detect('Hello world!', {signal: controller.signal});
@@ -128,14 +141,14 @@ promise_test(async t => {
}, 'LanguageDetector.detect() call with an aborted signal.');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
await testAbortPromise(t, signal => {
return detector.detect('Hello world!', {signal});
});
}, 'Aborting LanguageDetector.detect().');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const text = 'Hello world!';
const largeText = text.repeat(10000);
@@ -157,7 +170,7 @@ promise_test(async t => {
const controller = new AbortController();
controller.abort();
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
const measureInputUsagePromise =
detector.measureInputUsage('hello', {signal: controller.signal});
@@ -165,17 +178,17 @@ promise_test(async t => {
}, 'LanguageDetector.measureInputUsage() call with an aborted signal.');
promise_test(async t => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
await testAbortPromise(t, signal => {
return detector.measureInputUsage('hello', {signal});
});
}, 'Aborting LanguageDetector.measureInputUsage().');
promise_test(async () => {
- const detector = await LanguageDetector.create();
+ const detector = await createLanguageDetector();
assert_equals(detector.expectedInputLanguages, null);
}, 'Creating LanguageDetector without expectedInputLanguages');
promise_test(async t => {
- await testCreateMonitorWithAbort(t, LanguageDetector.create);
+ await testCreateMonitorWithAbort(t, createLanguageDetector);
}, 'Progress events are not emitted after aborted.');
diff --git a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js
index 7ffa1362dd5..1dd248a9eca 100644
--- a/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js
+++ b/tests/wpt/tests/ai/language_detection/detector.optional.https.window.js
@@ -1,5 +1,8 @@
// META: title=Detect english
// META: global=window
+// META: timeout=long
+// META: script=resources/util.js
+// META: script=/resources/testdriver.js
// META: script=../resources/util.js
'use strict';
@@ -36,7 +39,7 @@ promise_test(async t => {
const expectedInputLanguages = Object.keys(testInput);
- const detector = await LanguageDetector.create({expectedInputLanguages});
+ const detector = await createLanguageDetector({expectedInputLanguages});
for (const [language, input] of Object.entries(testInput)) {
await assert_detects_correct_language(detector, input, language);
@@ -45,7 +48,7 @@ promise_test(async t => {
promise_test(async () => {
const expectedInputLanguages = ['en', 'es'];
- const detector = await LanguageDetector.create({expectedInputLanguages});
+ const detector = await createLanguageDetector({expectedInputLanguages});
assert_array_equals(detector.expectedInputLanguages, expectedInputLanguages);
assert_true(Object.isFrozen(detector.expectedInputLanguages));
}, 'Creating LanguageDetector with expectedInputLanguages');
diff --git a/tests/wpt/tests/ai/language_detection/resources/util.js b/tests/wpt/tests/ai/language_detection/resources/util.js
new file mode 100644
index 00000000000..7cb3e7c2e13
--- /dev/null
+++ b/tests/wpt/tests/ai/language_detection/resources/util.js
@@ -0,0 +1,4 @@
+async function createLanguageDetector(options = {}) {
+ await test_driver.bless();
+ return await LanguageDetector.create(options);
+}
diff --git a/tests/wpt/tests/audio-output/setSinkId.https.html b/tests/wpt/tests/audio-output/setSinkId.https.html
index be65f0ac81b..662596910ee 100644
--- a/tests/wpt/tests/audio-output/setSinkId.https.html
+++ b/tests/wpt/tests/audio-output/setSinkId.https.html
@@ -26,14 +26,8 @@ promise_test(async t => {
const list = await navigator.mediaDevices.enumerateDevices();
assert_greater_than(list.length, 0,
"media device list includes at least one device");
- const audioInputList = list.filter(({kind}) => kind == "audioinput");
const outputDevicesList = list.filter(({kind}) => kind == "audiooutput");
- // List of exposed microphone groupIds
- const exposedGroupIds = new Set(audioInputList.map(device => device.groupId));
-
for (const { deviceId, groupId } of outputDevicesList) {
- assert_true(exposedGroupIds.has(groupId),
- "audiooutput device groupId must match an exposed microphone");
assert_greater_than(deviceId.length, 0, "deviceId.length");
const p1 = audio.setSinkId(deviceId);
diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py
new file mode 100644
index 00000000000..3a332dd58b2
--- /dev/null
+++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prefetchCache.py
@@ -0,0 +1,18 @@
+def main(request, response):
+ headers = [(b"Content-Type", b"text/html")]
+ headers += [(b"Clear-Site-Data", b'"prefetchCache"')]
+ content = f'''
+ <script>
+ setTimeout(() => {{
+ if(window.opener) {{
+ window.opener.postMessage("message", "*");
+ }} else {{
+ window.parent.postMessage("message", "*");
+ }}
+ window.close();
+ }}, 1000);
+ </script>
+ <body>
+ {request.url}
+ </body>'''
+ return 200, headers, content
diff --git a/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py
new file mode 100644
index 00000000000..bf845cfb699
--- /dev/null
+++ b/tests/wpt/tests/clear-site-data/support/clear-site-data-prerenderCache.py
@@ -0,0 +1,18 @@
+def main(request, response):
+ headers = [(b"Content-Type", b"text/html")]
+ headers += [(b"Clear-Site-Data", b'"prerenderCache"')]
+ content = f'''
+ <script>
+ setTimeout(() => {{
+ if(window.opener) {{
+ window.opener.postMessage("message", "*");
+ }} else {{
+ window.parent.postMessage("message", "*");
+ }}
+ window.close();
+ }}, 1000);
+ </script>
+ <body>
+ {request.url}
+ </body>'''
+ return 200, headers, content
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
index 89d84b13d1b..f3bbe0ea560 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_already_expired.https.window.js
@@ -20,3 +20,22 @@ cookie_test(async t => {
{deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
'Deletion not observed after document.cookie sets already-expired cookie');
}, 'CookieStore setting already-expired cookie should not be observed');
+
+cookie_test(async t => {
+ const eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set({
+ name: 'cookie',
+ value: 'ALREADY-EXPIRED',
+ expires: new Date(new Date() - 10_000),
+ partitioned: true,
+ });
+ await cookieStore.set('alt-cookie', 'IGNORE');
+ assert_equals(
+ await getCookieString(),
+ 'alt-cookie=IGNORE',
+ 'Already-expired cookie not included in CookieStore');
+ await verifyCookieChangeEvent(
+ eventPromise,
+ {deleted: [], changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
+ 'Deletion not observed after document.cookie sets already-expired cookie');
+}, 'CookieStore setting already-expired partitioned cookie should not be observed');
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
index 82b0f2baa2b..1937ebdae35 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_document_cookie.https.window.js
@@ -78,6 +78,21 @@ cookie_test(async t => {
'Deletion not observed after document.cookie sets already-expired cookie');
}, 'document.cookie set already-expired cookie should not be observed by CookieStore');
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'DOCUMENT-cookie', value: 'VALUE'}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ // Overwrite the original cookie with a duplicate, this should not dispatch an event.
+ await setCookieStringDocument('DOCUMENT-cookie=VALUE; path=/');
+ await setCookieStringDocument('DOCUMENT-alt-cookie=IGNORE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'DOCUMENT-alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'document.cookie duplicate cookie should not be observed by CookieStore');
cookie_test(async t => {
let eventPromise = observeNextCookieChangeEvent();
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
index 8f5ef1cabbe..8517995acfe 100644
--- a/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_http_cookie_and_set_cookie_headers.https.window.js
@@ -62,6 +62,22 @@ cookie_test(async t => {
'Deletion not observed after HTTP sets already-expired cookie');
}, 'HTTP set already-expired cookie should not be observed by CookieStore');
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await setCookieStringHttp('HTTP-cookie=VALUE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'HTTP-cookie', value: 'VALUE'}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ // Overwrite the original cookie with a duplicate, this should not dispatch an event.
+ await setCookieStringHttp('HTTP-cookie=VALUE; path=/');
+ await setCookieStringHttp('HTTP-alt-cookie=IGNORE; path=/');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'HTTP-alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'HTTP duplicate cookie should not be observed by CookieStore');
+
cookie_test(async t => {
let eventPromise = observeNextCookieChangeEvent();
diff --git a/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js
new file mode 100644
index 00000000000..5f9c2927433
--- /dev/null
+++ b/tests/wpt/tests/cookie-store/change_eventhandler_for_no_change.https.window.js
@@ -0,0 +1,43 @@
+// META: title=Cookie Store API: Test that setting a duplicate cookie does not fire a second event.
+// META: script=resources/cookie-test-helpers.js
+
+'use strict';
+
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set('cookie', 'VALUE');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'cookie', value: 'VALUE'}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set('cookie', 'VALUE');
+ await cookieStore.set('alt-cookie', 'IGNORE');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'CookieStore duplicate cookie should not be observed');
+
+cookie_test(async t => {
+ let eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set({
+ name: 'cookie',
+ value: 'VALUE',
+ partitioned: true,
+ });
+ await verifyCookieChangeEvent(
+ eventPromise,
+ {changed: [{name: 'cookie', value: 'VALUE', partitioned: true}]},
+ 'Original cookie is observed.');
+
+ eventPromise = observeNextCookieChangeEvent();
+ await cookieStore.set({
+ name: 'cookie',
+ value: 'VALUE',
+ partitioned: true,
+ });
+ await cookieStore.set('alt-cookie', 'IGNORE');
+ await verifyCookieChangeEvent(
+ eventPromise, {changed: [{name: 'alt-cookie', value: 'IGNORE'}]},
+ 'Duplicate cookie is not observed.');
+}, 'CookieStore duplicate partitioned cookie should not be observed');
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html
new file mode 100644
index 00000000000..22c1fd03e38
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001-ref.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+ justify-self: center;
+}
+</style>
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html
new file mode 100644
index 00000000000..06c11e6cdb6
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-001.tentative.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>Align-items only applies to OOF elements of block elements when statically positioned if it would apply if not OOF.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121">
+<link rel="match" href="align-items-static-position-001-ref.tentative.html">
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+ align-items: center;
+ justify-items: center;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html
new file mode 100644
index 00000000000..6f53b041787
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002-ref.tentative.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<div class="container"><div class="inline">text
+ <div class="abs"></div>
+ <br>text
+</div></div>
+
diff --git a/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html
new file mode 100644
index 00000000000..f90004b5672
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-items-static-position-002.tentative.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>Align-items doesn't apply to OOF elements of inline elements when statically positioned because they would apply if not OOF.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12121">
+<link rel="match" href="align-items-static-position-002-ref.tentative.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+ align-items: center;
+ justify-items: center;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<div class="container"><div class="inline">text
+ <div class="abs"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html
new file mode 100644
index 00000000000..132bbb7360f
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003-ref.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 0px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 50px; left: -50px"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 0px; left: -50px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 50px; left: 50px;"></div>
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 12.5px; left: -25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px; left: -25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 12.5px; left: 25px;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html
new file mode 100644
index 00000000000..39f871f4c2b
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-003.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of inline elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-003-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.static-positioned-inline {
+ left: auto;
+ right: auto;
+}
+
+.static-positioned-block {
+ top: auto;
+ bottom: auto;
+}
+
+.positioned-inline {
+ left: 0;
+ right: 0;
+}
+
+.positioned-block {
+ top: 0;
+ bottom: 0;
+}
+
+.center {
+ justify-self: center;
+ align-self: center;
+}
+
+.end {
+ justify-self: end;
+ align-self: end;
+}
+
+.start {
+ justify-self: start;
+ align-self: start;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html
new file mode 100644
index 00000000000..68130ee1d7e
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004-ref.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.vertRL {
+ writing-mode: vertical-rl;
+}
+
+.vertLR {
+ writing-mode: vertical-lr;
+}
+</style>
+<!-- start aligned -->
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="top: 0px; right: 25px;"></div>
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: 0px; left: 25px;"></div>
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="top: 0px; right: 0px;"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: -50px; right: 50px"></div>
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="bottom: 0px; left: 50px;"></div>
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: -50px; right: 0px;"></div>
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="right: 12.5px; top: -25px;"></div>
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs" style="top: 25px; left: 12.5px;"></div>
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs" style="top: -25px; left: 25px;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html
new file mode 100644
index 00000000000..afba7215b11
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-004.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of inline elements when statically positioned with different writing modes.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-004-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.static-positioned-inline {
+ left: auto;
+ right: auto;
+}
+
+.static-positioned-block {
+ top: auto;
+ bottom: auto;
+}
+
+.positioned-inline {
+ left: 0;
+ right: 0;
+}
+
+.positioned-block {
+ top: 0;
+ bottom: 0;
+}
+
+.center {
+ justify-self: center;
+ align-self: center;
+}
+
+.end {
+ justify-self: end;
+ align-self: end;
+}
+
+.start {
+ justify-self: start;
+ align-self: start;
+}
+
+.vertRL {
+ writing-mode: vertical-rl;
+}
+
+.vertLR {
+ writing-mode: vertical-lr;
+}
+</style>
+<!-- start aligned -->
+<div class="container vertRL"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block start"></div>
+ <br>text
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block start"></div>
+ <br>text
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container vertLR"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block end"></div>
+ <br>text
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block end"></div>
+ <br>text
+</div></div>
+<br>
+<!-- center aligned -->
+<div class="container vertRL"><div class="inline">text
+ <div class="abs static-positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container vertLR"><div class="inline">text
+ <div class="abs static-positioned-inline positioned-block center"></div>
+ <br>text
+</div></div>
+<div class="container vertRL"><div class="inline">text
+ <div class="abs positioned-inline static-positioned-block center"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html
new file mode 100644
index 00000000000..947bd270448
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.container {
+ position: relative;
+ border: 1px solid;
+}
+
+.abs {
+ position: absolute;
+ background: purple;
+ opacity: 0.5;
+ bottom: 0px;
+}
+</style>
+<div class="container">
+ <span style="font: 20px Ahem;">hello
+ <span class="abs">hello</span>
+ <span style="vertical-align: top; font-size: 50px;">world</span>
+ </span>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html
new file mode 100644
index 00000000000..e148f0ebda3
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-005.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of inline elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-005-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.container {
+ position: relative;
+ border: 1px solid;
+}
+
+.abs {
+ position: absolute;
+ background: purple;
+ align-self: end;
+ opacity: 0.5;
+}
+</style>
+<div class="container">
+ <span style="font: 20px Ahem;">hello
+ <span class="abs">hello</span>
+ <span style="vertical-align: top; font-size: 50px;">world</span>
+ </span>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html
new file mode 100644
index 00000000000..5bbafc64845
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<style>
+.block {
+ width: 75px;
+ height: 75px;
+ z-index: -1;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="left: 30px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="block">
+ <div class="abs" style="top: -45px; left: 30px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="top: -45px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="top: -45px; left: 30px;"></div>
+</div></div>
+<br>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html
new file mode 100644
index 00000000000..253b2a52f61
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-006.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<title>Align-self:self-start/end applies to OOF elements of block elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-006-ref.html">
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.end {
+ justify-self: self-end;
+ align-self: self-end;
+}
+
+.start {
+ justify-self: self-start;
+ align-self: self-start;
+}
+</style>
+<!-- self-start aligned -->
+<div class="container"><div class="block">
+ <div class="abs start"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs start" style="direction: rtl;"></div>
+</div></div>
+<div class="container"><div class="block" style="direction: rtl;">
+ <div class="abs start" style="direction: ltr;"></div>
+</div></div>
+<br>
+<!-- self-end aligned -->
+<div class="container"><div class="block">
+ <div class="abs end"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs end" style="direction: rtl;"></div>
+</div></div>
+<div class="container"><div class="block" style="direction: rtl;">
+ <div class="abs end" style="direction: ltr;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html
new file mode 100644
index 00000000000..bc9b5f4f650
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="left: -50px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 0px;"></div>
+</div></div>
+<br>
+<!-- end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs" style="bottom: 50px; left: -50px"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: 0px;"></div>
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs" style="top: -25px; left: -50px;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html
new file mode 100644
index 00000000000..ebe872aaab9
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-007.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<title>Align-self:self-start/end applies to OOF elements of inline elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-007-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<style>
+.inline {
+ display: inline;
+ color: transparent;
+ font: 10px Ahem;
+ line-height: 25px;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+
+.end {
+ justify-self: self-end;
+ align-self: self-end;
+}
+
+.start {
+ justify-self: self-start;
+ align-self: self-start;
+}
+</style>
+<!-- self-start aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs start"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs start" style="direction: rtl;"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline" style="direction: rtl;">text
+ <div class="abs start" style="direction: ltr;"></div>
+ <br>text
+</div></div>
+<br>
+<!-- self-end aligned -->
+<div class="container"><div class="inline">text
+ <div class="abs end"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline">text
+ <div class="abs end" style="direction: rtl;"></div>
+ <br>text
+</div></div>
+<div class="container"><div class="inline" style="direction: rtl;">text
+ <div class="abs end" style="direction: ltr;"></div>
+ <br>text
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html
new file mode 100644
index 00000000000..79cf612b8f8
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008-ref.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- justify-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: end;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="left: 25px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: end;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: start;"></div>
+</div></div>
+<br>
+<!-- align-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="top: 25px;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: end;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: start;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html
new file mode 100644
index 00000000000..187974884b4
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-static-position-008.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<title>Align-self applies to OOF elements of block elements when statically positioned.</title>
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto">
+<link rel="help" href="https://drafts.csswg.org/css-position-3/#abspos-alignment">
+<link rel="help" href="https://issues.chromium.org/issues/409806799">
+<link rel="match" href="align-self-static-position-008-ref.html">
+<style>
+.block {
+ display: block;
+ width: 75%;
+ height: 75%;
+ border: 5px dotted blue;
+}
+
+.container {
+ border: 1px solid;
+ position: relative;
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ margin-left: 50px;
+ margin-bottom: 50px;
+}
+
+.abs {
+ width: 50px;
+ height: 50px;
+ position: absolute;
+ background: purple;
+}
+</style>
+<!-- justify-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: auto;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: normal;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: right;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: left;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: flex-start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: flex-end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: anchor-center;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: first baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: last baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: legacy;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="justify-self: stretch;"></div>
+</div></div>
+<br>
+<!-- align-self -->
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: auto;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: normal;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: right;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: left;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: flex-start;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: flex-end;"></div>
+</div></div>
+<br>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: anchor-center;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: first baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: last baseline;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: legacy;"></div>
+</div></div>
+<div class="container"><div class="block">
+ <div class="abs" style="align-self: stretch;"></div>
+</div></div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html
new file mode 100644
index 00000000000..4eaa9d2f3a6
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins-aspect-ratio.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 10px auto 10px 50px;
+ margin: auto 0 auto 0;
+ align-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ min-width: 100px;
+ height: 100%;
+ aspect-ratio: 1;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html
new file mode 100644
index 00000000000..9d1b6454c84
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/align-self-stretch-auto-margins.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 10px 50px 10px 50px;
+ margin: auto 0 auto 0;
+ align-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ width: 100px;
+ height: 100px;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html
new file mode 100644
index 00000000000..c50b32f089b
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins-aspect-ratio.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 50px 10px auto 10px;
+ margin: 0 auto 0 auto;
+ justify-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ width: 100%;
+ min-height: 100px;
+ aspect-ratio: 1;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html
new file mode 100644
index 00000000000..7d7b4bfc857
--- /dev/null
+++ b/tests/wpt/tests/css/css-align/abspos/justify-self-stretch-auto-margins.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/11195#issuecomment-2824879710">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+.container {
+ position: relative;
+ width: 200px;
+ height: 200px;
+ top: -50px;
+ left: -50px;
+}
+.abspos {
+ position: absolute;
+ inset: 50px 10px 50px 10px;
+ margin: 0 auto 0 auto;
+ justify-self: stretch;
+ background: green;
+}
+.abspos::before {
+ content: '';
+ width: 100px;
+ height: 100px;
+ display: block;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="container">
+ <div class="abspos"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html
new file mode 100644
index 00000000000..5b45527fd9c
--- /dev/null
+++ b/tests/wpt/tests/css/css-animations/crashtests/chrome-bug-405795970.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/405795970">
+<style>
+ @keyframes --anim {
+ from {
+ width: calc(10px * sibling-index());
+ }
+ to {
+ width: calc(50px);
+ }
+ }
+ #target {
+ animation: --anim 2s;
+ }
+</style>
+<p>Pass if no crash</p>
+<div id="target"></div>
diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html
index ad2d17f2ef0..c38adea9a68 100644
--- a/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html
+++ b/tests/wpt/tests/css/css-box/parsing/margin-trim-computed.html
@@ -27,8 +27,13 @@ test_computed_value("margin-trim", "inline-start block-start", "block-start inli
test_computed_value("margin-trim", "inline-end block-start", "block-start inline-end");
test_computed_value("margin-trim", "inline-end block-end", "block-end inline-end");
test_computed_value("margin-trim", "block-start block-end inline-start", "block-start inline-start block-end");
-test_computed_value("margin-trim", "inline-start block-start inline-end block-end", "block-start inline-start block-end inline-end");
-test_computed_value("margin-trim", "inline-start inline-end block-start", "block-start inline-start inline-end");
+
+test_computed_value("margin-trim", "block-start inline-start block-end inline-end", "block inline");
+test_computed_value("margin-trim", "block-start block-end inline-end inline-start", "block inline");
+test_computed_value("margin-trim", "block-start block-end inline-start inline-end", "block inline");
+test_computed_value("margin-trim", "inline-start block-end block-start inline-end", "block inline");
+test_computed_value("margin-trim", "inline-start inline-end block-start block-end", "block inline");
+test_computed_value("margin-trim", "inline-end block-end inline-start block-start", "block inline");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-box/parsing/margin-trim.html b/tests/wpt/tests/css/css-box/parsing/margin-trim.html
index 0d92f80b9b9..e8679f9cbf3 100644
--- a/tests/wpt/tests/css/css-box/parsing/margin-trim.html
+++ b/tests/wpt/tests/css/css-box/parsing/margin-trim.html
@@ -21,6 +21,9 @@ test_valid_value("margin-trim", "block-end");
test_valid_value("margin-trim", "inline-start");
test_valid_value("margin-trim", "inline-end");
+test_valid_value("margin-trim", "block inline");
+test_valid_value("margin-trim", "inline block");
+
// Serialize values into either block or inline
test_valid_value("margin-trim", "block-start block-end", "block");
test_valid_value("margin-trim", "inline-start inline-end", "inline");
@@ -29,10 +32,15 @@ test_valid_value("margin-trim", "inline-end inline-start", "inline");
test_valid_value("margin-trim", "inline-start block-start");
test_valid_value("margin-trim", "inline-end block-start block-end");
-test_valid_value("margin-trim", "block-start inline-start block-end inline-end");
-test_valid_value("margin-trim", "inline-end block-end inline-start block-start");
-test_invalid_value("margin-trim", "block inline");
+// Serialize 4 values into "block inline"
+test_valid_value("margin-trim", "block-start inline-start block-end inline-end", "block inline");
+test_valid_value("margin-trim", "block-start block-end inline-end inline-start", "block inline");
+test_valid_value("margin-trim", "block-start block-end inline-start inline-end", "block inline");
+test_valid_value("margin-trim", "inline-start block-end block-start inline-end", "block inline");
+test_valid_value("margin-trim", "inline-start inline-end block-start block-end", "block inline");
+test_valid_value("margin-trim", "inline-end block-end inline-start block-start", "block inline");
+
test_invalid_value("margin-trim", "block block");
test_invalid_value("margin-trim", "inline inline");
test_invalid_value("margin-trim", "block inline-start inline-end");
diff --git a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html
index 0c949e9ea7d..408264b58df 100644
--- a/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html
+++ b/tests/wpt/tests/css/css-easing/linear-timing-functions-syntax.html
@@ -26,6 +26,7 @@ test_valid_value("animation-timing-function", "linear(0, 0.5 25% 75%, 1 100% 100
test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 0.998, 1 100% 100%)");
test_valid_value("animation-timing-function", "linear(0, 0 40%, 1, 0.5, 1)");
test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 1.004, 0.998, 1 100% 100%)");
+test_valid_value("animation-timing-function", "linear(calc(0/0), 1)", "linear(0 0%, 1 100%)");
test_invalid_value("animation-timing-function", "linear()");
test_invalid_value("animation-timing-function", "linear(0)");
diff --git a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html
index 4e8b21e4413..e8465ff7a33 100644
--- a/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html
+++ b/tests/wpt/tests/css/css-easing/step-timing-functions-syntax.html
@@ -29,6 +29,7 @@ test_invalid_value("animation-timing-function", "steps(0, jump-start)");
test_invalid_value("animation-timing-function", "steps(0, jump-end)");
test_invalid_value("animation-timing-function", "steps(0, jump-both)");
test_invalid_value("animation-timing-function", "steps(1, jump-none)");
+test_invalid_value("animation-timing-function", "steps(calc(0/0), jump-none)");
</script>
</body>
diff --git a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html
index a3a0a88ba68..32c9c4c5efe 100644
--- a/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html
+++ b/tests/wpt/tests/css/css-fonts/parsing/font-palette-values-invalid.html
@@ -140,13 +140,18 @@
@font-palette-values --A {
override-colors: 0 color-mix(in lch, red, color-mix(in lch, currentcolor, black));
}
+
+/* 24 */
+@font-palette-values --A {
+ base-palette: sibling-index();
+}
</style>
</head>
<body>
<script>
let rules = document.getElementById("style").sheet.cssRules;
test(function() {
- assert_equals(rules.length, 24);
+ assert_equals(rules.length, 25);
});
test(function() {
@@ -343,6 +348,13 @@ test(function() {
assert_equals(text.indexOf("override-colors"), -1);
assert_equals(rule.overrideColors, "");
});
+
+test(function() {
+ let text = rules[24].cssText;
+ let rule = rules[24];
+ assert_equals(text.indexOf("base-palette"), -1);
+ assert_equals(rule.basePalette, "");
+}, "sibling-index() is invalid in base-palette descriptor");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html
index 7a5844d5600..08c20142449 100644
--- a/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html
+++ b/tests/wpt/tests/css/css-fonts/test_font_feature_values_parsing.html
@@ -81,6 +81,7 @@ var testrules = [
{ rule: _("@styleset { ok-1: 1; }"), serializationSame: true },
{ rule: _("@annotation { ok-1: 3; }"), serializationSame: true },
{ rule: _("@stylistic { blah: 3; }"), serializationSame: true },
+ { rule: _("@stylistic { blah: sibling-index(); }"), serializationNoValueDefn: true },
{ rule: makeRule("bongo", "\n@styleset\n { blah: 3; super-blah: 4 5;\n more-blah: 5 6 7;\n }"), serializationSame: true },
{ rule: makeRule("bongo", "\n@styleset\n {\n blah:\n 3\n;\n super-blah:\n 4\n 5\n;\n more-blah:\n 5 6\n 7;\n }"), serializationSame: true },
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html
new file mode 100644
index 00000000000..834c96ccd39
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001-ref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 62px;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 130px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+</style>
+
+<div class="container">
+ <div class="items"></div>
+ <div class="items"></div>
+ <div class="items"></div>
+</div>
+<div class="column-gap" style="left:62px;"></div>
+<div class="column-gap" style="left:132px;"></div>
+<div class="row-gap"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html
new file mode 100644
index 00000000000..c3752156c7d
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-001.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-001-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-count: 3;
+ column-width: 60px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html
new file mode 100644
index 00000000000..d132f0ca677
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002-ref.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 120px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 40px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 142px;
+ width: 10px;
+ background: blue;
+ top: 60px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="row-gap"></div>
+ <div class="spanner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html
new file mode 100644
index 00000000000..0b632fa94ac
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-002.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap and a spanner.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-002-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html
new file mode 100644
index 00000000000..cd26da24389
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003-ref.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ height: 200px;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ height: 200px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 200px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html
new file mode 100644
index 00000000000..2f2473fd046
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-003.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted basic case.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-003-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ column-count: 3;
+ column-width: 60px;
+ column-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 200px;
+ margin: 0px;
+ }
+</style>
+
+<div id="container">
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html
new file mode 100644
index 00000000000..002b1f2b594
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004-ref.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ }
+
+ .container1 {
+ width: 200px;
+ height: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 72px;
+ left: 2px;
+ width: 200px;
+ height: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 4px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 65px;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 130px;
+ width: 4px;
+ background: blue;
+ top: 2px;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="column-gap" style="left:65px;"></div>
+ <div class="column-gap" style="left:135px;"></div>
+ <div class="row-gap"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html
new file mode 100644
index 00000000000..0dcbeef4df8
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-004.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with smaller width than gap and column-wrap.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-004-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-count: 3;
+ column-width: 60px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 4px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 4px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html
new file mode 100644
index 00000000000..6543021c979
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005-ref.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ display: flex;
+ border: 1px solid #ccc;
+ height: 50px;
+ width: 210px;
+ column-gap: 10px;
+ }
+
+ .outer-items {
+ background: rgb(96 139 168 / 0.2);
+ height 50px;
+ width: 100px;
+ }
+
+ .inner {
+ display: flex;
+ height: 50px;
+ column-gap: 10px;
+ width: 100px;
+ }
+
+ .inner-items {
+ height: 50px;
+ width: 45px;
+ background: black;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 50px;
+ top: 1px;
+ left: 101px;
+ width: 10px;
+ }
+
+ .row-gap {
+ position: absolute;
+ background: purple;
+ height: 10px;
+ top: 21px;
+ left: 111px;
+ width: 100px;
+ }
+</style>
+<div class="outer">
+ <div class="outer-items"></div>
+ <div class="outer-items" id="nested">
+ <div class="inner">
+ <div class="inner-items"></div>
+ <div class="inner-items"></div>
+ </div>
+ </div>
+</div>
+<div class="column-gap" style="background: blue;"></div>
+<div class="column-gap" style="background: gold; left: 156px"></div>
+<div class="row-gap"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html
new file mode 100644
index 00000000000..daa65e904e7
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-005.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with nested multicol with column wrap.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-005-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer-container {
+ column-count: 2;
+ column-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ border: 1px solid #ccc;
+ width: 210px;
+ height: 50px;
+ }
+
+ .nested-container {
+ column-count: 2;
+ column-gap: 10px;
+ width: 100px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: gold;
+ row-gap: 10px;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: purple;
+ column-wrap: wrap;
+ column-fill: auto;
+ column-height: 20px;
+ }
+
+ .column1 {
+ background: rgb(96 139 168 / 0.2);
+ width: 100px;
+ height: 50px
+ }
+
+ .nested-column {
+ background: black;
+ width: 45px;
+ height: 20px;
+ }
+</style>
+
+<div class="outer-container">
+ <div class="column1">
+ </div>
+ <div class="column2">
+ <div class="nested-container">
+ <div class="nested-column"></div>
+ <div class="nested-column"></div>
+ <div class="nested-column"></div>
+ <div class="nested-column"></div>
+ </div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html
new file mode 100644
index 00000000000..4cb56d207fe
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ .outer-container {
+ columns: 3;
+ column-fill: auto;
+ height: 100px;
+ width: 600px;
+ gap: 10px;
+ background: yellow;
+ }
+
+ .nested-container {
+ columns: 2;
+ box-decoration-break: clone;
+ padding: 10px;
+ gap: 10px;
+ background: cyan;
+ }
+
+ .inner-column {
+ height: 250px;
+ background: hotpink;
+ width: 80px;
+ }
+
+ #col-gap1 {
+ position: absolute;
+ height: 80px;
+ width: 1px;
+ background: green;
+ top: 18px;
+ left: 104px;
+ }
+
+ #col-gap2 {
+ position: absolute;
+ width: 1px;
+ background: green;
+ top: 18px;
+ left: 307px;
+ height: 45px;
+ }
+</style>
+<div class="outer-container">
+ <div class="nested-container">
+ <div class="inner-column"></div>
+ </div>
+</div>
+<div id="col-gap1"></div>
+<div id="col-gap2"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html
new file mode 100644
index 00000000000..64b3b007ab5
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-006.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-006-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ .outer-container {
+ columns: 3;
+ column-fill: auto;
+ height: 100px;
+ width: 600px;
+ gap: 10px;
+ background: yellow;
+ }
+
+ .nested-container {
+ columns: 2;
+ box-decoration-break: clone;
+ padding: 10px;
+ column-rule: solid;
+ column-rule-color: green;
+ column-rule-width: 1px;
+ background: cyan;
+ gap: 10px;
+ }
+
+ .inner-column {
+ height: 250px;
+ background: hotpink;
+ width: 80px;
+ }
+</style>
+<div class="outer-container">
+ <div class="nested-container">
+ <div class="inner-column"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html
new file mode 100644
index 00000000000..09973ddc690
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007-ref.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #outer {
+ width: 620px;
+ height: 200px;
+ background: yellow;
+ }
+
+ .inner1 {
+ border-top: 2px solid;
+ border-left: 2px solid;
+ border-right: 2px solid;
+ background: cyan;
+ height: 198px;
+ width: 296px;
+ }
+
+ .inner2 {
+ border-bottom: 2px solid;
+ border-left: 2px solid;
+ border-right: 2px solid;
+ position: absolute;
+ left: 320px;
+ top: 0px;
+ height: 130px;
+ width: 296px;
+ background: cyan
+ }
+
+ .inner-flex {
+ display: flex;
+ column-gap: 20px;
+ }
+
+ .inner-items {
+ background: hotpink;
+ width: 85.333px;
+ }
+
+ .column-gap1 {
+ width: 10px;
+ background: blue;
+ position: absolute;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ width: 10px;
+ background: blue;
+ position: absolute;
+ top: 40px;
+ }
+
+ .spanner {
+ background: grey;
+ opacity: 0.5;
+ height: 18px;
+ width: 296px;
+ }
+
+ .row-gap1 {
+ height: 10px;
+ background: green;
+ position: relative;
+ width: 296px;
+ top: 105px;
+ }
+
+ .row-gap2 {
+ height: 10px;
+ background: green;
+ position: absolute;
+ width: 296px;
+ top: 105px;
+ }
+
+ .column-gap3 {
+ background: blue;
+ height: 130px;
+ position: absolute;
+ width: 10px;
+ top: 0px;
+ }
+</style>
+
+<div id="outer">
+ <div class="inner1">
+ <div class="inner-flex">
+ <div class="inner-items" style="height:20px;"></div>
+ <div class="inner-items" style="height:20px" ;></div>
+ <div class="inner-items" style="height:20px;"></div>
+ </div>
+ <div class="inner-flex" style="position: absolute; left:2px; top:40px">
+ <div class="inner-items" style="height:100px;"></div>
+ <div class="inner-items" style="height:100px" ;></div>
+ <div class="inner-items" style="height:100px;"></div>
+ </div>
+ <div class="inner-flex" style="position: absolute; left:2px; top:160px">
+ <div class="inner-items" style="height:40px;"></div>
+ <div class="inner-items" style="height:40px" ;></div>
+ <div class="inner-items" style="height:40px;"></div>
+ </div>
+ <div class="spanner"></div>
+ <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px)"></div>
+ <div class="column-gap1" style="height: 20px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)">
+ </div>
+ <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px)"></div>
+ <div class="column-gap2" style="height: 160px; left:calc(2px + 85.333px + 5px + 10px + 5px + 85.333px + 5px)">
+ </div>
+ <div class="row-gap1"></div>
+ </div>
+ <div class="inner2">
+ <div class="inner-flex">
+ <div class="inner-items" style="height:100px"></div>
+ <div class="inner-items" style="height:100px"></div>
+ <div class="inner-items" style="height:100px"></div>
+ </div>
+ <div class="inner-flex" style="position: absolute; top:120px;">
+ <div class="inner-items" style="height:10px"></div>
+ <div class="inner-items" style="height:10px"></div>
+ <div class="inner-items" style="height:10px"></div>
+ </div>
+ <div class="column-gap3" style="left:calc(85.333px + 5px);"></div>
+ <div class="column-gap3" style="left:calc(85.333px + 5px + 10px + 5px + 85.333px + 5px);"></div>
+ <div class="row-gap2"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html
new file mode 100644
index 00000000000..1f23ed7f7ca
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-007.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with nested fragmented multicol.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-007-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ #outer {
+ width: 620px;
+ columns: 2;
+ column-fill: auto;
+ gap: 20px;
+ height: 200px;
+ background: yellow;
+ }
+
+ #inner {
+ columns: 3;
+ border: 2px solid;
+ gap: 20px;
+ column-height: 100px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ column-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: green;
+ row-rule-width: 10px;
+ column-wrap: wrap;
+ background: cyan;
+ }
+</style>
+
+<div id="outer">
+ <div id="inner">
+ <div style="height:60px; background:hotpink;"></div>
+ <div style="column-span:all; background: grey; opacity: 0.5; height:18px"></div>
+ <div style="height:750px; background:hotpink;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html
new file mode 100644
index 00000000000..d49c2f50f19
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008-ref.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 200px;
+ left: 2px;
+ top: 120px;
+ display: flex;
+ column-gap: 10px;
+ }
+
+ .row-gap-items {
+ width: 60px;
+ background: gold;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 40px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 60px;
+ width: 10px;
+ background: blue;
+ top: 60px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+
+ .column-gap3 {
+ position: absolute;
+ height: 72px;
+ width: 10px;
+ background: blue;
+ top: 130px;
+ }
+</style>
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="row-gap">
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ </div>
+ <div class="spanner"></div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="column-gap3" style="left:62px;"></div>
+ <div class="column-gap3" style="left:132px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html
new file mode 100644
index 00000000000..ed299b5d9f6
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-008.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 0px outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-008-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: 0px;
+ row-rule-outset: 0px;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html
new file mode 100644
index 00000000000..124bf7eaeb1
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009-ref.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 130px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 204px;
+ left: 0px;
+ top: 120px;
+ display: flex;
+ column-gap: 6px;
+ }
+
+ .row-gap-items {
+ width: 64px;
+ background: gold;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 44px;
+ width: 10px;
+ background: blue;
+ top: 0px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 64px;
+ width: 10px;
+ background: blue;
+ top: 58px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+
+ .column-gap3 {
+ position: absolute;
+ height: 76px;
+ width: 10px;
+ background: blue;
+ top: 128px;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="spanner"></div>
+ <div class="column-gap3" style="left:62px;"></div>
+ <div class="column-gap3" style="left:132px;"></div>
+ <div class="row-gap">
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html
new file mode 100644
index 00000000000..b00c6a70f8a
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-009.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 2px outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-009-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: 2px;
+ row-rule-outset: 2px;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html
new file mode 100644
index 00000000000..9582ab4103d
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010-ref.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container3 {
+ position: absolute;
+ top: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items3 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 10px;
+ width: 204px;
+ left: 4px;
+ top: 120px;
+ display: flex;
+ column-gap: 14px;
+ }
+
+ .row-gap-items {
+ width: 56px;
+ background: gold;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 36px;
+ width: 10px;
+ background: blue;
+ top: 4px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 56px;
+ width: 10px;
+ background: blue;
+ top: 62px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+
+ .column-gap3 {
+ position: absolute;
+ height: 68px;
+ width: 10px;
+ background: blue;
+ top: 132px;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="container3">
+ <div class="items3"></div>
+ <div class="items3"></div>
+ <div class="items3"></div>
+ </div>
+ <div class="row-gap">
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ <div class="row-gap-items"></div>
+ </div>
+ <div class="column-gap1" style="left:62px;"></div>
+ <div class="column-gap1" style="left:132px;"></div>
+ <div class="column-gap2" style="left:62px;"></div>
+ <div class="column-gap2" style="left:132px;"></div>
+ <div class="spanner"></div>
+ <div class="column-gap3" style="left:62px;"></div>
+ <div class="column-gap3" style="left:132px;"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html
new file mode 100644
index 00000000000..61bb4a9b933
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-010.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with -2px outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-010-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 10px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: -2px;
+ row-rule-outset: -2px;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html
new file mode 100644
index 00000000000..3387918d399
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011-ref.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container3 {
+ position: absolute;
+ top: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items3 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 2px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 124px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 40px;
+ width: 2px;
+ background: blue;
+ top: 2px;
+ }
+
+ .column-gap2 {
+ position: absolute;
+ height: 142px;
+ width: 2px;
+ background: blue;
+ top: 60px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="container3">
+ <div class="items3"></div>
+ <div class="items3"></div>
+ <div class="items3"></div>
+ </div>
+ <div class="column-gap1" style="left:66px;"></div>
+ <div class="column-gap1" style="left:136px;"></div>
+ <div class="column-gap2" style="left:66px;"></div>
+ <div class="column-gap2" style="left:136px;"></div>
+ <div class="row-gap"></div>
+ <div class="spanner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html
new file mode 100644
index 00000000000..cf588ded41e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-011.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 100% outset and rule-break intersection.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-011-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 2px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 2px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: intersection;
+ column-rule-break: intersection;
+ column-rule-outset: 100%;
+ row-rule-outset: 100%;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html
new file mode 100644
index 00000000000..9fb5e85e920
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012-ref.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .outer {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ }
+
+ .container1 {
+ position: absolute;
+ top: 2px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items1 {
+ background: rgb(96 139 168 / 0.2);
+ height: 40px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container2 {
+ position: absolute;
+ top: 60px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items2 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .container3 {
+ position: absolute;
+ top: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items3 {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 2px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 124px;
+ }
+
+ .column-gap1 {
+ position: absolute;
+ height: 200px;
+ width: 2px;
+ background: blue;
+ top: 2px;
+ }
+
+ .spanner {
+ position: absolute;
+ background: cyan;
+ width: 200px;
+ height: 18px;
+ top: 42px;
+ left: 2px;
+ opacity: 0.5;
+ }
+</style>
+<div class="outer">
+ <div class="container1">
+ <div class="items1"></div>
+ <div class="items1"></div>
+ <div class="items1"></div>
+ </div>
+ <div class="container2">
+ <div class="items2"></div>
+ <div class="items2"></div>
+ <div class="items2"></div>
+ </div>
+ <div class="container3">
+ <div class="items3"></div>
+ <div class="items3"></div>
+ <div class="items3"></div>
+ </div>
+ <div class="column-gap1" style="left:66px;"></div>
+ <div class="column-gap1" style="left:136px;"></div>
+ <div class="row-gap"></div>
+ <div class="spanner"></div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html
new file mode 100644
index 00000000000..078b810cf8e
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-012.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with 2px width and rule-break none.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-012-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 200px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 2px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 2px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ row-rule-break: none;
+ column-rule-break: none;
+ column-wrap: wrap;
+ column-width: 60px;
+ column-count: 3;
+ column-fill: auto;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+
+ h2 {
+ column-span: all;
+ background-color: cyan;
+ color: #fff;
+ margin: 0px;
+ opacity: 0.5;
+ height: 18px;
+ }
+</style>
+<div class="container">
+ <p></p>
+ <p></p>
+ <h2></h2>
+
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html
new file mode 100644
index 00000000000..8e426d8ed32
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013-ref.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .mc {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ width: 100px;
+ height: 100px;
+ columns: 2;
+ column-fill: auto;
+ column-gap: 10px;
+ }
+
+ .fake-column-gaps {
+ position: absolute;
+ top: 4px;
+ left: 45px;
+ display: flex;
+ height: 92px;
+ column-gap: 45px;
+ }
+
+ .column-gap {
+ width: 10px;
+ background: gold;
+ }
+</style>
+
+<div class="fake-column-gaps">
+ <div class="column-gap"></div>
+ <div class="column-gap"></div>
+ <div class="column-gap"></div>
+</div>
+<div class="mc">
+ <div style="height: 400px; background: cyan;">
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html
new file mode 100644
index 00000000000..d4170084f06
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-013.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-013-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .mc {
+ position: absolute;
+ top: 0px;
+ width: 100px;
+ height: 100px;
+ columns: 2;
+ column-fill: auto;
+ column-gap: 10px;
+ column-rule-color: gold;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-outset: -4px;
+ }
+</style>
+
+<div class="mc">
+ <div style="height: 400px; background: cyan;">
+ </div>
+</div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html
new file mode 100644
index 00000000000..9d9674bd476
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014-ref.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-gap: 10px;
+ display: flex;
+ }
+
+ .items {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .last-item {
+ position: absolute;
+ left: 2px;
+ top: 72px;
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ width: 60px;
+ }
+
+ .row-gap {
+ position: absolute;
+ height: 2px;
+ width: 200px;
+ background: gold;
+ left: 2px;
+ top: 66px;
+ }
+
+ .column-gap {
+ position: absolute;
+ height: 60px;
+ width: 10px;
+ background: blue;
+ top: 2px;
+ }
+</style>
+
+<div class="container">
+ <div class="items"></div>
+ <div class="items"></div>
+ <div class="items"></div>
+</div>
+<div class="last-item"></div>
+<div class="column-gap" style="left:62px;"></div>
+<div class="column-gap" style="left:132px;"></div>
+<div class="column-gap" style="left:62px; top: 72px;"></div>
+<div class="column-gap" style="left:132px; top: 72px;"></div>
+<div class="row-gap"></div>
diff --git a/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html
new file mode 100644
index 00000000000..1dcd393d99a
--- /dev/null
+++ b/tests/wpt/tests/css/css-gaps/tentative/multicol/multicol-gap-decorations-014.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>
+ CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap, rule-break-intersection, and fewer
+ columns in last row.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
+<link rel="match" href="multicol-gap-decorations-014-ref.html">
+<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
+<style>
+ body {
+ margin: 0px;
+ }
+
+ .container {
+ border: 2px solid rgb(96 139 168);
+ width: 200px;
+ height: 130px;
+ column-count: 3;
+ column-width: 60px;
+ column-height: 60px;
+ column-gap: 10px;
+ row-gap: 10px;
+ column-rule-width: 10px;
+ column-rule-style: solid;
+ column-rule-color: blue;
+ row-rule-width: 2px;
+ row-rule-style: solid;
+ row-rule-color: gold;
+ column-wrap: wrap;
+ column-fill: auto;
+ column-rule-break: intersection;
+ column-rule-outset: 0;
+ }
+
+ p {
+ background: rgb(96 139 168 / 0.2);
+ height: 60px;
+ margin: 0px;
+ }
+</style>
+
+<div class="container">
+ <p></p>
+ <p></p>
+ <p></p>
+ <p></p>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html
new file mode 100644
index 00000000000..2d5b401b8d2
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-016.tentative.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero.">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="display: grid; grid-template-rows: min-content;">
+ <canvas width="100" height="100" style="background: green; block-size: 100%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html
new file mode 100644
index 00000000000..575fa8c7817
--- /dev/null
+++ b/tests/wpt/tests/css/css-grid/grid-items/replaced-element-017.tentative.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero.">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="display: grid; grid-template-rows: min-content;">
+ <canvas width="200" height="200" style="background: green; max-block-size: 50%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html
new file mode 100644
index 00000000000..8b3068be6da
--- /dev/null
+++ b/tests/wpt/tests/css/css-overflow/scroll-button-display-none.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow Test: focused ::scroll-button() does not crash after becoming display none</title>
+<link rel="help" href="http://crbug.com/402673873">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<style>
+ #scroller::scroll-button(left) {
+ content: "";
+ background-color: red;
+ height: 100px;
+ width: 100px;
+ top: 0;
+ left: 0;
+ position: absolute;
+ }
+
+ #scroller.hide::scroll-button(left) {
+ display: none;
+ }
+
+ #scroller {
+ width: 300px;
+ height: 300px;
+ overflow: auto;
+ }
+
+ #filler {
+ height: 20000x;
+ }
+</style>
+<div id="scroller">
+ <div id="filler"></div>
+</div>
+<script>
+ promise_test(async t => {
+ await new test_driver.Actions()
+ .pointerMove(15, 15)
+ .pointerDown()
+ .pointerUp()
+ .send();
+ scroller.className = "hide";
+ document.documentElement.offsetTop;
+ await new test_driver.Actions()
+ .pointerMove(15, 15)
+ .pointerDown()
+ .pointerUp()
+ .send();
+ assert_true(true);
+ });
+</script>
diff --git a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html
index a116ead01b7..71c5f6573d6 100644
--- a/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html
+++ b/tests/wpt/tests/css/css-overscroll-behavior/overscroll-behavior-root.html
@@ -33,6 +33,10 @@ promise_test(async function() {
Math.round(bounds.top + bounds.height / 2), 0, -100)
.send();
+ // Await two animation frames to give a chance to scroll.
+ await new Promise(resolve => requestAnimationFrame(resolve));
+ await new Promise(resolve => requestAnimationFrame(resolve));
+
assert_equals(window.scrollY, originalScrollPos, "overscroll-behavior should work on the root");
});
</script>
diff --git a/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html
new file mode 100644
index 00000000000..c0dc8e20eee
--- /dev/null
+++ b/tests/wpt/tests/css/css-shadow-parts/host-part-nesting.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<title>CSS Shadow Parts - :host::part() in nesting</title>
+<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/#part">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector">
+<link rel="help" href="https://crbug.com/326526716">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="host"></div>
+<script>
+test(function() {
+ let host = document.getElementById("host");
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>
+ :host {
+ &::part(mypart) {
+ color: lime;
+ }
+ }
+ </style>
+ <div part="mypart">This text should be green.</div>
+ `;
+
+ let part = host.shadowRoot.querySelector("[part]");
+
+ assert_equals(
+ window.getComputedStyle(part).color,
+ "rgb(0, 255, 0)",
+ ":host::part() works in nesting",
+ );
+}, ":host::part works in nesting");
+</script>
diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html
new file mode 100644
index 00000000000..feff03bbe2e
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-029.tentative.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="A replaced element with a percentage block-size doesn't compress the min-content contribution on its block axis to zero.">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="inline-size: min-content">
+ <canvas width="100" height="100"
+ style="writing-mode:vertical-rl; background: green; block-size: 100%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html
new file mode 100644
index 00000000000..5a6b103c22e
--- /dev/null
+++ b/tests/wpt/tests/css/css-sizing/intrinsic-percent-replaced-030.tentative.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#min-content-zero">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1308929">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12133">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="A replaced element with a percentage max-block-size doesn't compress the min-content contribution on its block axis to zero.">
+
+<p>Test passes if there is a filled green square.</p>
+<div style="inline-size: min-content">
+ <canvas width="200" height="200"
+ style="writing-mode:vertical-rl; background: green; max-block-size: 50%"></canvas>
+</div>
diff --git a/tests/wpt/tests/css/css-tables/colspan-zero-crash.html b/tests/wpt/tests/css/css-tables/colspan-zero-crash.html
new file mode 100644
index 00000000000..a50586a5bfa
--- /dev/null
+++ b/tests/wpt/tests/css/css-tables/colspan-zero-crash.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="help" href="https://github.com/servo/servo/issues/36699">
+<link rel="author" href="mailto:fwang@igalia.com" title="Frédéric Wang">
+<span id="span"></span>
+<script>
+ let th = document.createElement("th");
+ span.replaceWith(th);
+ th.colSpan = 0;
+</script>
+
diff --git a/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html
new file mode 100644
index 00000000000..1afdae2be9d
--- /dev/null
+++ b/tests/wpt/tests/css/css-view-transitions/scoped/run_in_parallel.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <!-- TODO update link -->
+ <link rel="help" href="https://www.w3.org/TR/css-view-transitions-2/">
+ <title>Scope view transitions run in parallel</title>
+</head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style type="text/css">
+ .block {
+ background-color: blue;
+ position: relative;
+ height: 100px;
+ width: 100px;
+ margin: 50px;
+ }
+
+ #target1 {
+ view-transition-name: a;
+ }
+
+ #target2 {
+ view-transition-name: b;
+ }
+
+ ::view-transition-group(*),
+ ::view-transition-image-pair(*),
+ ::view-transition-old(*) {
+ animation: unset;
+ }
+
+ ::view-transition-old(*) {
+ opacity: 0;
+ }
+
+ @keyframes stylize {
+ from {
+ opacity: 0.5;
+ }
+ to {
+ opacity: 1.0;
+ }
+ }
+ ::view-transition-new(*) {
+ animation: stylize 1s paused;
+ }
+
+</style>
+<body>
+ <div id="target1" class="block"></div>
+ <div id="target2" class="block"></div>
+</body>
+<script type="text/javascript">
+
+ async function run_parallel_scoped_view_transition_test(
+ transition_update_callback,
+ message) {
+ promise_test(async t => {
+ const vt1 = target1.startViewTransition(() => {});
+ const vt2 = target2.startViewTransition(() => {});
+ await Promise.all([vt1.ready, vt2.ready]);
+
+ let list = document.getAnimations().map(a => {
+ return `${a.effect.pseudoElement}:${a.animationName}`;
+ });
+ let expected = [
+ '::view-transition-new(a):stylize',
+ '::view-transition-new(b):stylize'
+ ];
+ assert_array_equals(list, expected, 'Before callback');
+ assert_equals(
+ getComputedStyle(target1, "::view-transition-new(a)")
+ .getPropertyValue("opacity"),
+ "0.5");
+ assert_equals(
+ getComputedStyle(target2, "::view-transition-new(b)")
+ .getPropertyValue("opacity"),
+ "0.5");
+
+ transition_update_callback(vt1);
+ await vt1.finished.then(
+ () => {},
+ () => {
+ // The only case where the finished promise should not be resolved is
+ // when the DOM update callback returns a rejected promise.
+ assert_unreached('Finished promise should have been resolved');
+ });
+
+ list = document.getAnimations().map(a => {
+ return `${a.effect.pseudoElement}:${a.animationName}`;
+ });
+ assert_array_equals(list, [`::view-transition-new(b):stylize`],
+ 'After callback');
+ assert_equals(
+ getComputedStyle(target2, "::view-transition-new(b)")
+ .getPropertyValue("opacity"),
+ "0.5");
+ }, message);
+ }
+
+ run_parallel_scoped_view_transition_test(
+ (vt) => {
+ vt.skipTransition();
+ },
+ 'Concurrent transition keeps running after transition skipped');
+
+ run_parallel_scoped_view_transition_test(
+ () => {
+ document.getAnimations().filter(a => {
+ return a.effect.target.id == 'target1';
+ }).forEach(a => {
+ a.finish();
+ });
+ }, 'Concurrent transition keeps running after transition finished');
+
+ run_parallel_scoped_view_transition_test(
+ () => {
+ document.getAnimations().filter(a => {
+ return a.effect.target.id == 'target1';
+ }).forEach(a => {
+ a.cancel();
+ });
+ }, 'Concurrent transition keeps running after transition canceled');
+</script>
+</html>
diff --git a/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html
new file mode 100644
index 00000000000..c5b52346fc0
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/reference/table-cell-align-006-ref.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Writing Modes reference: text-align in orthogonal table cell</title>
+
+<meta name="flags" content="ahem" />
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+
+<style>
+table {
+ font: 20px/1 Ahem;
+ border: 1px solid gray;
+ display: inline-table;
+ margin: 1em;
+}
+
+td {
+ padding: 0;
+ color: green;
+ vertical-align: top;
+}
+
+td div {
+ position: relative;
+}
+
+.t {
+ top: 0;
+}
+.m {
+ top: 2em;
+}
+.b {
+ top: 4em;
+}
+</style>
+
+<div>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=t>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=b>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=t>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=t>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=b>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=b>X</div></td>
+ <td><div class=t>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+<table>
+ <tr>
+ <td>X<br>X<br>X<br>X<br>X</td>
+ <td><div class=b>X</div></td>
+ <td><div class=m>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=t>X</div></td>
+ <td><div class=b>X</div></td>
+ <td>X<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table>
+ <tr><td>XXXXX</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;X&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;X</td></tr>
+</table>
+<table>
+ <tr><td>XXXXX</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;X&nbsp;&nbsp;</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>&nbsp;&nbsp;&nbsp;&nbsp;X</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>
+ <tr><td>X&nbsp;&nbsp;&nbsp;X</td></tr>
+</table>
+</div>
diff --git a/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html
new file mode 100644
index 00000000000..a8d33f281fd
--- /dev/null
+++ b/tests/wpt/tests/css/css-writing-modes/table-cell-align-006.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Writing Modes test: text-align in orthogonal table cell</title>
+
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#line-mappings">
+<meta assert="text-align values respect line-relative mappings of the table cell">
+<link rel="match" href="reference/table-cell-align-006-ref.html">
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+
+<meta name="flags" content="ahem" />
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+
+<style>
+table {
+ font: 20px/1 Ahem;
+ border: 1px solid gray;
+ display: inline-table;
+ margin: 1em;
+}
+
+td {
+ padding: 0;
+ color: green;
+}
+
+table.vrl td {
+ writing-mode: vertical-rl;
+}
+
+table.slr td {
+ writing-mode: sideways-lr;
+}
+
+table.h {
+ writing-mode: vertical-lr;
+}
+
+table.h td {
+ writing-mode: initial;
+}
+
+/* If text-align works correctly on the cells, their green Ahem glyphs
+ should cover the red part of each background. */
+.left {
+ text-align: left;
+ background: linear-gradient(to bottom, red 20%, transparent 20%);
+}
+.slr .left {
+ background: linear-gradient(to top, red 20%, transparent 20%);
+}
+.center {
+ text-align: center;
+ background: linear-gradient(to bottom, transparent 40%, red 40%, red 60%, transparent 60%);
+}
+.right {
+ text-align: right;
+ background: linear-gradient(to bottom, transparent 80%, red 80%);
+}
+.slr .right {
+ background: linear-gradient(to top, transparent 80%, red 80%);
+}
+.start,
+.slr .start:dir(rtl)
+ {
+ text-align: start;
+ background: linear-gradient(to bottom, red 20%, transparent 20%);
+}
+.start:dir(rtl),
+.slr .start {
+ background: linear-gradient(to top, red 20%, transparent 20%);
+}
+.end,
+.slr .end:dir(rtl)
+ {
+ text-align: end;
+ background: linear-gradient(to bottom, transparent 80%, red 80%);
+}
+.end:dir(rtl),
+.slr .end
+ {
+ background: linear-gradient(to top, transparent 80%, red 80%);
+}
+.justify {
+ text-align-last: justify;
+ background: linear-gradient(to bottom, red 20%, transparent 20% 80%, red 80% );
+}
+
+.h .left {
+ background: linear-gradient(to right, red 20%, transparent 20%);
+}
+.h .center {
+ background: linear-gradient(to right, transparent 40%, red 40%, red 60%, transparent 60%);
+}
+.h .right {
+ background: linear-gradient(to right, transparent 80%, red 80%);
+}
+.h .start {
+ background: linear-gradient(to right, red 20%, transparent 20%);
+}
+.h .start:dir(rtl) {
+ background: linear-gradient(to left, red 20%, transparent 20%);
+}
+.h .end {
+ background: linear-gradient(to right, transparent 80%, red 80%);
+}
+.h .end:dir(rtl) {
+ background: linear-gradient(to left, transparent 80%, red 80%);
+}
+.h .justify {
+ background: linear-gradient(to right, red 20%, transparent 20% 80%, red 80% );
+}
+</style>
+
+</div>
+<table class=vrl>
+ <tr>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+<table class=vrl>
+ <tr dir=rtl>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table class=slr>
+ <tr>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+<table class=slr>
+ <tr dir=rtl>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+</div>
+
+<div>
+<table class=h>
+ <tr>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+<table class=h>
+ <tr dir=rtl>
+ <td>XXXXX</td>
+ <td class=left>X</td>
+ <td class=center>X</td>
+ <td class=right>X</td>
+ <td class=start>X</td>
+ <td class=end>X</td>
+ <td class=justify>X X</td>
+ </tr>
+</table>
+</div>
diff --git a/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html
new file mode 100644
index 00000000000..961794728d3
--- /dev/null
+++ b/tests/wpt/tests/dom/events/non-cancelable-when-passive/generic-events-stay-cancelable.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+async_test((t) => {
+ const et = new EventTarget();
+ et.addEventListener('test', t.step_func_done((e) => {
+ assert_true(e.cancelable);
+ }), {passive: true});
+ et.dispatchEvent(new Event('test', {cancelable: true}));
+}, "A generic event with only passive listeners remains cancelable");
+</script>
diff --git a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html
index c3b704bf188..6c294e464a5 100644
--- a/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html
+++ b/tests/wpt/tests/domparsing/XMLSerializer-serializeToString.html
@@ -81,6 +81,25 @@ test(function() {
}, 'Check if inconsistent xmlns="..." is dropped.');
test(function() {
+ const root1 = parse('<package></package>');
+ root1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
+ const manifest1 = root1.appendChild(root1.ownerDocument.createElement('manifest'));
+ manifest1.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
+ assert_equals(serialize(root1), '<package><manifest/></package>');
+
+ const root2 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>');
+ const manifest2 = root2.appendChild(root2.ownerDocument.createElement('manifest'));
+ manifest2.setAttribute('xmlns', 'http://www.idpf.org/2007/opf');
+ assert_equals(serialize(root2),
+ '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>');
+
+ const root3 = parse('<package xmlns="http://www.idpf.org/2007/opf"></package>');
+ const manifest3 = root3.appendChild(root3.ownerDocument.createElement('manifest'));
+ assert_equals(serialize(root3),
+ '<package xmlns="http://www.idpf.org/2007/opf"><manifest xmlns=""/></package>');
+}, 'Drop inconsistent xmlns="..." by matching on local name');
+
+test(function() {
let root = parse('<r xmlns:xx="uri"></r>');
root.setAttributeNS('uri', 'name', 'v');
assert_equals(serialize(root), '<r xmlns:xx="uri" xx:name="v"/>');
diff --git a/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html
new file mode 100644
index 00000000000..5195b9f04b5
--- /dev/null
+++ b/tests/wpt/tests/domparsing/xml-parse-serialize-roundtrip.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/327273585">
+<link rel=help href="https://issues.chromium.org/issues/41101979">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+function runTest(xmlString, testName) {
+ test(() => {
+ const xmlDoc = (new DOMParser()).parseFromString(xmlString, 'text/xml');
+ const result = (new XMLSerializer()).serializeToString(xmlDoc);
+ assert_equals(result, xmlString);
+ }, `DOMParser and XMLSerializer should round trip with CDATA sections: ${testName}`);
+}
+
+runTest(
+ `<root><![CDATA[
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
+]]></root>`,
+ 'large CDATA');
+
+runTest(
+ '<root><htmlDefn><![CDATA[<div><![CDATA[ Just Rubbish Data $#$^#^$ ]]]]><![CDATA[></div><div></div>]]></htmlDefn></root>',
+ 'multiple CDATAs');
+</script>
diff --git a/tests/wpt/tests/editing/include/editor-test-utils.js b/tests/wpt/tests/editing/include/editor-test-utils.js
index 9c5600af77b..f0c4f583992 100644
--- a/tests/wpt/tests/editing/include/editor-test-utils.js
+++ b/tests/wpt/tests/editing/include/editor-test-utils.js
@@ -568,5 +568,8 @@ class EditorTestUtils {
}) - (${EditorTestUtils.getNodeDescription(range.endContainer)}, ${range.endOffset})`;
}
+ static waitForRender() {
+ return new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
+ }
}
diff --git a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html
index 39e8b46e69b..cac621ad3cd 100644
--- a/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html
+++ b/tests/wpt/tests/editing/other/selection-change-not-fired-if-selection-set-to-root.html
@@ -3,6 +3,7 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="../include/editor-test-utils.js"></script>
<body>
<div contenteditable="true" id="target">
@@ -11,13 +12,13 @@
// Selectionchange event should not get fired if the selection is already set to the beginning of the root
promise_test(async () => {
let selectionChangeCount = 0;
- document.getElementById("target").focus();
- await new Promise(resolve => step_timeout(resolve, 50));
+ const target = document.getElementById("target");
+ await new test_driver.click(target);
+ await EditorTestUtils.waitForRender();
document.addEventListener("selectionchange", () => ++selectionChangeCount);
- test_driver.send_keys(target, "\uE003");
- // Waits a short time to allow any events to be processed.
- await new Promise(resolve => step_timeout(resolve, 50));
+ await new test_driver.send_keys(target, "\uE003");
+ await EditorTestUtils.waitForRender();
assert_equals(selectionChangeCount, 0, "Selectionchange event should not get fired");
- }, "Selectionchange event not get fired when the selection is already set to the beginning of the root ");
+ }, "Selectionchange event should not get fired when the selection is already set to the beginning of the root ");
</script>
</body> \ No newline at end of file
diff --git a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
index e472fccdc4d..ee0cdd84efa 100644
--- a/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
+++ b/tests/wpt/tests/fledge/tentative/generate-bid-browser-signals.https.window.js
@@ -11,7 +11,9 @@
// META: variant=?17-20
// META: variant=?21-24
// META: variant=?25-28
-// META: variant=?29-last
+// META: variant=?29-32
+// META: variant=?33-36
+// META: variant=?37-last
"use strict";
@@ -35,7 +37,21 @@ subsetTest(promise_test, async test => {
'bidCount': 0,
'multiBidLimit': 1,
'prevWinsMs': [],
- 'forDebuggingOnlySampling': false
+ 'forDebuggingOnlySampling': false,
+ 'viewCounts': {
+ 'pastHour': 0,
+ 'pastDay': 0,
+ 'pastWeek': 0,
+ 'past30Days': 0,
+ 'past90Days': 0
+ },
+ 'clickCounts': {
+ 'pastHour': 0,
+ 'pastDay': 0,
+ 'pastWeek': 0,
+ 'past30Days': 0,
+ 'past90Days': 0
+ }
};
let biddingLogicURL = createBiddingScriptURL({
generateBid:
@@ -48,6 +64,17 @@ subsetTest(promise_test, async test => {
expectedBrowserSignals.forDebuggingOnlyInCooldownOrLockout =
browserSignals.forDebuggingOnlyInCooldownOrLockout;
+ // Don't check exact values of view/click reports.
+ function zeroCounts(object) {
+ object.pastHour = 0;
+ object.pastDay = 0;
+ object.pastWeek = 0;
+ object.past30Days = 0;
+ object.past90Days = 0;
+ }
+ zeroCounts(browserSignals.viewCounts);
+ zeroCounts(browserSignals.clickCounts);
+
// Remove deprecated field, if present.
delete browserSignals.prevWins;
@@ -947,3 +974,253 @@ subsetTest(promise_test, async test => {
}
});
}, 'browserSignals.wasmHelper.');
+
+
+// Generates 0 or 1 clicks, dependent on `produceAttributionSrc` &
+// `produceUserAction`, and `numViews` views for `igOwner`, provided by
+// `viewClickProvider`.
+async function generateViewsAndClicks(
+ test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc,
+ produceUserAction) {
+ let iframe = await createIframe(test, viewClickProvider);
+ let script = `
+ // We use a wrapper iframe here so the original remains in communication.
+ let frame = document.createElement('iframe');
+ document.body.appendChild(frame);
+ let frameDocument = frame.contentDocument;
+ let a = frameDocument.createElement('a');
+ a.href = '${RESOURCE_PATH}/record-click.py?' +
+ 'eligible_origin=${igOwner}&num_views=${numViews}';
+ if (${produceAttributionSrc}) {
+ a.attributionSrc = '';
+ }
+ a.target = '_self';
+ a.appendChild(frameDocument.createTextNode('Click me'));
+ frameDocument.body.appendChild(a);
+
+ if (${produceUserAction}) {
+ // Note: test_driver.click() seems to not work well with Chrome's
+ // content_shell; while .bless() does... unreliably.
+ // headless_shell/chrome path seems to work reliably. User activation
+ // is used sparingly to work around content_shell flakiness.
+ await test_driver.bless('User-initiated click', () => { a.click() });
+ } else {
+ a.click();
+ }
+ `;
+
+ await runInFrame(test, iframe, script);
+}
+
+// Keep running a basic auction with an interest group in
+// `interestGroupOverrides` until it succeeds; joining and leaving the
+// IG every time to bypass caching which is permitted to provide stale
+// view/click counts.
+async function keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides) {
+ while (true) {
+ await joinInterestGroup(test, uuid, interestGroupOverrides);
+ let result = await runBasicFledgeAuction(test, uuid);
+ if (result !== null) { // Got a winner.
+ break;
+ }
+ await leaveInterestGroup(interestGroupOverrides);
+ }
+}
+
+// Like keepTryingAuctionUntilWinBypassCaching but for auctions with
+// cross-origin interest group, owned by `igOwner`.
+async function crossOriginKeepTryingAuctionUntilWinBypassCaching(
+ test, uuid, igOwner, interestGroupOverrides) {
+ while (true) {
+ await joinCrossOriginInterestGroup(
+ test, uuid, igOwner, interestGroupOverrides);
+ const auctionConfigOverrides = {interestGroupBuyers: [igOwner]};
+ let result =
+ await runBasicFledgeAuction(test, uuid, auctionConfigOverrides);
+ if (result !== null) { // Got a winner.
+ break;
+ }
+ await leaveCrossOriginInterestGroup(
+ test, uuid, igOwner, interestGroupOverrides);
+ }
+}
+
+// Generates `numViews` views and 0 or 1 clicks based on `produceAttributionSrc`
+// and `produceUserAction`, by `viewClickProvider` available to `igOwner`, then
+// creates an interest group for `igOwner` with given
+// `viewAndClickCountsProviders`, and runs an auction
+// to make sure the events are eventually available.
+async function testClickiness(
+ test, igOwner, viewClickProvider, numViews, produceAttributionSrc,
+ produceUserAction, viewAndClickCountsProviders = undefined) {
+ const uuid = generateUuid(test);
+
+ await generateViewsAndClicks(
+ test, uuid, viewClickProvider, igOwner, numViews, produceAttributionSrc,
+ produceUserAction);
+
+ // For clicks to be recorded, both attributionsrc attribution must exist
+ // and a user action must be used. If we don't expect clicks, we can expect
+ // that the number is exactly 0 since re-running the test won't break that.
+ //
+ // This is relying on all tests using Ad-Auction-Record-Event using distinct
+ // `viewClickProvider`s.
+ let clicksBadTest =
+ produceAttributionSrc && produceUserAction ? '< 1' : ' !== 0';
+
+ let viewsBadTest = (numViews > 0) ? `< ${numViews}` : ' !== 0';
+
+ // Join an IG to read view/click info back. We use a UUID for a name to make
+ // sure nothing old is cached, since view/clicks are permitted to be a bit
+ // stale.
+ let interestGroupOverrides = {
+ owner: igOwner,
+ name: uuid,
+ biddingLogicURL: createBiddingScriptURL({
+ origin: igOwner,
+ generateBid: `
+ // We should see at least one click and numViews views the test injects.
+ if (browserSignals.clickCounts.pastHour ${clicksBadTest} ||
+ browserSignals.clickCounts.pastDay ${clicksBadTest} ||
+ browserSignals.clickCounts.pastWeek ${clicksBadTest} ||
+ browserSignals.clickCounts.past30Days ${clicksBadTest} ||
+ browserSignals.clickCounts.past90Days ${clicksBadTest} ||
+ browserSignals.viewCounts.pastHour ${viewsBadTest} ||
+ browserSignals.viewCounts.pastDay ${viewsBadTest} ||
+ browserSignals.viewCounts.pastWeek ${viewsBadTest} ||
+ browserSignals.viewCounts.past30Days ${viewsBadTest} ||
+ browserSignals.viewCounts.past90Days ${viewsBadTest}) {
+ return -1;
+ }
+ `
+ })
+ };
+
+ if (viewAndClickCountsProviders) {
+ interestGroupOverrides.viewAndClickCountsProviders =
+ viewAndClickCountsProviders;
+ }
+
+ await crossOriginKeepTryingAuctionUntilWinBypassCaching(
+ test, uuid, igOwner, interestGroupOverrides);
+}
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN5;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN6;
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 2,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true, [VIEW_CLICK_PROVIDER]);
+}, 'browserSignals for clickiness.');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN5;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN5;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 4,
+ /*produceAttributionSrc=*/ false,
+ /*produceUserAction=*/ false);
+}, 'IG owner is default clickiness provider if nothing is specified');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN4;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN4;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 6,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true, []);
+}, 'IG owner is default clickiness provider if empty list provided');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN3;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN3;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 0,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true, []);
+}, 'browserSignals for clickiness --- just a click');
+
+subsetTest(promise_test, async test => {
+ const IG_OWNER = OTHER_ORIGIN2;
+ const VIEW_CLICK_PROVIDER = OTHER_ORIGIN2;
+
+ await testClickiness(
+ test, IG_OWNER, VIEW_CLICK_PROVIDER, /*numViews=*/ 1,
+ /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ false, [VIEW_CLICK_PROVIDER]);
+}, 'browserSignals for clickiness --- no click report w/o user action');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ const IG_OWNER = window.location.origin;
+ const VIEW_CLICK_PROVIDER1 = OTHER_ORIGIN1;
+ const VIEW_CLICK_PROVIDER2 = window.location.origin;
+
+ // From provider 1 have click, no views.
+ // From provider 2 have views, no clicks;
+ await generateViewsAndClicks(
+ test, uuid, VIEW_CLICK_PROVIDER1, IG_OWNER,
+ /*numViews=*/ 0, /*produceAttributionSrc=*/ true,
+ /*produceUserAction=*/ true);
+ await generateViewsAndClicks(
+ test, uuid, VIEW_CLICK_PROVIDER2, IG_OWNER,
+ /*numViews=*/ 2, /*produceAttributionSrc=*/ false,
+ /*produceUserAction=*/ false);
+
+ // Create an IG that subscribes only to provider 2 --- it should only see
+ // the views.
+ let interestGroupOverrides = {
+ name: uuid,
+ viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER2],
+ biddingLogicURL: createBiddingScriptURL({
+ generateBid: `
+ if (browserSignals.clickCounts.pastHour !== 0 ||
+ browserSignals.viewCounts.pastHour < 2) {
+ throw JSON.stringify(browserSignals);
+ }
+ `
+ })
+ };
+
+ await keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides);
+
+ // Now see that subscribing only to 1 provides only the click.
+ interestGroupOverrides = {
+ name: uuid,
+ viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1],
+ biddingLogicURL: createBiddingScriptURL({
+ generateBid: `
+ if (browserSignals.clickCounts.pastHour < 1 ||
+ browserSignals.viewCounts.pastHour !== 0) {
+ throw JSON.stringify(browserSignals);
+ }
+ `
+ })
+ };
+
+ await keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides);
+
+ // Now subscribe to both.
+ interestGroupOverrides = {
+ name: uuid,
+ viewAndClickCountsProviders: [VIEW_CLICK_PROVIDER1, VIEW_CLICK_PROVIDER2],
+ biddingLogicURL: createBiddingScriptURL({
+ generateBid: `
+ if (browserSignals.clickCounts.pastHour < 1 ||
+ browserSignals.viewCounts.pastHour < 2) {
+ throw JSON.stringify(browserSignals);
+ }
+ `
+ })
+ };
+
+ await keepTryingAuctionUntilWinBypassCaching(
+ test, uuid, interestGroupOverrides);
+}, 'browserSignals for clickiness --- viewAndClickCountsProviders works.');
diff --git a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
index 0a18ea40d3d..49ebfd1c596 100644
--- a/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
+++ b/tests/wpt/tests/fledge/tentative/resources/fledge-util.sub.js
@@ -695,6 +695,16 @@ async function joinCrossOriginInterestGroup(test, uuid, origin, interestGroupOve
`await joinInterestGroup(test_instance, "${uuid}", ${interestGroup})`);
}
+// Leaves a cross-origin interest group, by running a leave in an iframe.
+async function leaveCrossOriginInterestGroup(test, uuid, origin, interestGroupOverrides = {}) {
+ let interestGroup = JSON.stringify(
+ createInterestGroupForOrigin(uuid, origin, interestGroupOverrides));
+
+ let iframe = await createIframe(test, origin, 'join-ad-interest-group');
+ await runInFrame(test, iframe,
+ `await leaveInterestGroup(${interestGroup})`);
+}
+
// Joins an interest group in a top-level window, which has the same origin
// as the joined interest group.
async function joinInterestGroupInTopLevelWindow(
diff --git a/tests/wpt/tests/fledge/tentative/resources/record-click.py b/tests/wpt/tests/fledge/tentative/resources/record-click.py
new file mode 100644
index 00000000000..b4e76873d9b
--- /dev/null
+++ b/tests/wpt/tests/fledge/tentative/resources/record-click.py
@@ -0,0 +1,21 @@
+# This responds with a page reporting a click event to the origin provided in
+# the `eligible_origin` query param. The pages loads `num_views` copies of
+# record-view.py as images in a clickiness-eligible way; with them reporting
+# view events.
+def main(request, response):
+ eligible_origin = request.GET.get(b"eligible_origin")
+ num_views = int(request.GET.get(b"num_views"))
+ response.status = (200, b"OK")
+ response.headers.set(b"Content-Type", b"text/html")
+ response.headers.set(
+ b"Ad-Auction-Record-Event",
+ b"type=\"click\", eligible-origins=(\"%s\")" % eligible_origin)
+
+ result = b"<!DOCTYPE html>"
+ img_template = b"<img src=\"record-view.py?i=%d&eligible_origin=%s\"" + \
+ b" attributionsrc>"
+ for i in range(0, num_views):
+ view = img_template % (i, eligible_origin)
+ result = result + view
+ return result.decode("utf-8")
+
diff --git a/tests/wpt/tests/fledge/tentative/resources/record-view.py b/tests/wpt/tests/fledge/tentative/resources/record-view.py
new file mode 100644
index 00000000000..d423b2d9c72
--- /dev/null
+++ b/tests/wpt/tests/fledge/tentative/resources/record-view.py
@@ -0,0 +1,19 @@
+# This responds with an image reporting a view event to the origin provided in
+# the `eligible_origin` query param.
+def main(request, response):
+ eligible_origin = request.GET.get(b"eligible_origin")
+ response.status = (200, b"OK")
+ response.headers.set(b"Content-Type", b"image/png")
+ response.headers.set(
+ b"Ad-Auction-Record-Event",
+ b"type=\"view\", eligible-origins=(\"%s\")" % eligible_origin)
+ png = b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" + \
+ b"\x49\x48\x44\x52\x00\x00\x00\x05\x00\x00\x00\x05" + \
+ b"\x08\x06\x00\x00\x00\x8d\x6f\x26\xe5\x00\x00\x00" + \
+ b"\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e" + \
+ b"\xc4\x01\x95\x2b\x0e\x1b\x00\x00\x00\x15\x49\x44" + \
+ b"\x41\x54\x08\x99\x63\x64\xf8\xcf\xf0\x9f\x01\x0d" + \
+ b"\x30\xa1\x0b\x50\x41\x10\x00\xcd\xaa\x02\x08\x0f" + \
+ b"\x23\x6b\x59\x00\x00\x00\x00\x49\x45\x4e\x44\xae" + \
+ b"\x42\x60\x82"
+ return png
diff --git a/tests/wpt/tests/focus/focus-element-crash.html b/tests/wpt/tests/focus/focus-element-crash.html
new file mode 100644
index 00000000000..27df1c0b130
--- /dev/null
+++ b/tests/wpt/tests/focus/focus-element-crash.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<meta name="assert" content="focus element adopted or remounted shouldn't crash.">
+
+<body>
+
+<!--focus element remounted test case-->
+<audio onloadstart="select.focus()" src=""></audio>
+<iframe id="iframe"></iframe>
+<table id="table">
+ <td>
+ <select id="select" onblur=";"></select>
+ </td>
+</table>
+<script>
+ window.addEventListener("load", _ => iframe.appendChild(table));
+</script>
+
+<!--focus element adopted test case-->
+<input id="username" type="text" placeholder="username">
+<input id="password" type="text" placeholder="password">
+</body>
+<script>
+ let search = document.getElementById("search");
+ let username = document.getElementById("username");
+ username.focus();
+ window.onload = () => document.adoptNode(username);
+ username.addEventListener("blur", function (e) {
+ document.body.append(`event:${e.type} fire.`)
+ });
+</script>
+</html>
diff --git a/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml
new file mode 100644
index 00000000000..319b5b8e04c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/fill-and-stroke-styles/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: canvas-createconicgradient
+ files:
+ - 2d.gradient.conic.*
diff --git a/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml
new file mode 100644
index 00000000000..5d9106c1cd6
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/element/manual/fill-and-stroke-styles/WEB_FEATURES.yml
@@ -0,0 +1,5 @@
+features:
+- name: canvas-createconicgradient
+ files:
+ - conic-gradient.html
+ - conic-gradient-rotation.html
diff --git a/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml
new file mode 100644
index 00000000000..319b5b8e04c
--- /dev/null
+++ b/tests/wpt/tests/html/canvas/offscreen/fill-and-stroke-styles/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: canvas-createconicgradient
+ files:
+ - 2d.gradient.conic.*
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md
deleted file mode 100644
index b3c24c3f82d..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Because this test suite is run as a virtual suite and it's quite deep in the
-folders, we have to use abbreviations for the test names to not run over 200
-characters, which is problematic on Windows.
-
-* unspecified -> "u"
-* unsafe-none -> "un"
-* same-origin -> "so"
-* same-origin-allow-popups -> "soap"
-* restrict-properties -> omitted
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html
deleted file mode 100644
index 1c315b35d7f..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-closed.https.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<title> Check openee.closed access is allowed for COOP: restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script>
-<script>
-
-testAccessProperty(
- "closed",
- w => w.closed,
- expectReport = false,
- use_restrict_properties = true
-);
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html
deleted file mode 100644
index 7a96f4f5762..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-openee-rp-ro.https.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!doctype html>
-<title>
- COOP reports are sent to the openee when the openee used COOP-RO:
- restrict-properties and its same-origin opener tries to access it.
-</title>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script>
-<script>
-
-const directory = "/html/cross-origin-opener-policy";
-const same_origin = get_host_info().HTTPS_ORIGIN;
-
-promise_test(async t => {
- const report_token = token();
- const openee_token = token();
- const opener_token = token(); // The current test window.
-
- const opener_url = location.href;
-
- const reportTo = reportToHeaders(report_token);
- const openee_url = same_origin + executor_path + reportTo.header +
- reportTo.coopReportOnlyRestrictPropertiesHeader +
- `&uuid=${openee_token}`;
-
- const openee = window.open(openee_url);
- t.add_cleanup(() => send(openee_token, "window.close()"))
-
- // 1. Make sure the new document to be loaded.
- send(openee_token, `
- send("${opener_token}", "Ready");
- `);
- let reply = await receive(opener_token);
- assert_equals(reply, "Ready");
-
- // 2. Try to access the openee. A report is sent, because of COOP-RO:
- // restrict-properties.
- tryAccess(openee);
-
- // 3. Check a report is sent to the openee.
- let report =
- await receiveReport(report_token, "access-to-coop-page-from-opener");
- assert_equals(report.type, "coop");
- assert_equals(report.url, openee_url.replace(/"/g, '%22'));
- assert_equals(report.body.disposition, "reporting");
- assert_equals(report.body.effectivePolicy, "restrict-properties");
- assert_equals(report.body.property, "blur");
- assert_source_location_missing(report);
- assert_equals(report.body.openerURL, opener_url);
- assert_equals(report.body.openeeURL, undefined);
- assert_equals(report.body.otherDocumentURL, undefined);
- assert_equals(report.body.referrer, opener_url);
- assert_equals(report.body.initialPopupURL, undefined);
-}, "access-reporting-openee-rp-ro");
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html
deleted file mode 100644
index 9e1e85b16a5..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-opener-rp-ro.https.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!doctype html>
-<title>
- COOP reports are sent to the opener when the opener used COOP-RO:
- restrict-properties and its same-origin openee tries to access it.
-</title>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script>
-<script>
-
-const directory = "/html/cross-origin-opener-policy";
-const same_origin = get_host_info().HTTPS_ORIGIN;
-
-promise_test(async t => {
- // The test window.
- const this_window_token = token();
-
- // The "opener" window. This has COOP and a reporter.
- const opener_report_token= token();
- const opener_token = token();
- const opener_reportTo = reportToHeaders(opener_report_token);
- const opener_url = same_origin + executor_path + opener_reportTo.header +
- opener_reportTo.coopReportOnlyRestrictPropertiesHeader +
- `&uuid=${opener_token}`;
-
- // The "openee" window. This is same origin with the "opener".
- const openee_report_token= token();
- const openee_token = token();
- const openee_url = same_origin + executor_path + `&uuid=${openee_token}`;
-
- // 1. Create the opener window.
- let opener_window_proxy = window.open(opener_url);
- t.add_cleanup(() => send(opener_token, "window.close()"));
-
- // 2. The opener opens its openee.
- send(opener_token, `
- openee = window.open("${openee_url}");
- send("${this_window_token}", "ACK 1");
- `);
- assert_equals("ACK 1", await receive(this_window_token));
- t.add_cleanup(() => send(openee_token, "window.close()"));
-
- // 3. The openee tries to access its opener.
- send(openee_token, addScriptAndTriggerOnload(
- directory + "/reporting/resources/try-access.js",
- "tryAccess(opener);")
- );
-
- // 4. Check a report sent to the opener.
- let report =
- await receiveReport(opener_report_token, "access-to-coop-page-from-openee");
- assert_equals(report.type, "coop");
- assert_equals(report.url, opener_url.replace(/"/g, '%22'));
- assert_equals(report.body.disposition, "reporting");
- assert_equals(report.body.effectivePolicy, "restrict-properties");
- assert_equals(report.body.property, "blur");
- assert_source_location_missing(report);
- assert_equals(report.body.openerURL, undefined);
- assert_equals(report.body.openeeURL, openee_url);
- assert_equals(report.body.otherDocumentURL, undefined);
- assert_equals(report.body.referrer, undefined);
- assert_equals(report.body.initialPopupURL, openee_url);
-}, "access-reporting-opener-rp-ro");
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html
deleted file mode 100644
index 5bc718e2a89..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/access-reporting-post-message.https.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype html>
-<title> Check openee.postMessage() access is allowed for COOP: restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/test-access-property.js"></script>
-<script>
-
-testAccessProperty(
- "postMessage",
- w => w.postMessage("message", "*"),
- expectReport = false,
- use_restrict_properties = true
-);
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html
deleted file mode 100644
index e5c87751748..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-promise_test(async t => {
- const popup_token = token();
- const second_popup_token = token();
- const reply_token = token();
-
- const unsafe_none_url = getExecutorPath(
- popup_token,
- SAME_ORIGIN.origin,
- { coop: "unsafe-none"});
-
- const restrict_properties_url = getExecutorPath(
- second_popup_token,
- SAME_ORIGIN.origin,
- { coop: "restrict-properties"});
-
- // We open popup and then ping it, it will respond after loading.
- const popup = window.open(unsafe_none_url);
- send(popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- // Make sure the popup will be closed once the test has run, keeping a clean
- // state.
- t.add_cleanup(() => {
- send(popup_token, `close()`);
- });
-
- // Now navigate this popup to a restrict-properties page.
- send(popup_token, `document.location = '${restrict_properties_url}'`);
- send(second_popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- // Navigate again to the original page.
- send(second_popup_token, `document.location = '${unsafe_none_url}'`);
- send(popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- // Give some time for things to settle across processes etc. before
- // proceeding with verifications.
- await new Promise(resolve => { t.step_timeout(resolve, 500); });
-
- // Verify that we have full access to the popup.
- assert_false(popup.closed, 'Popup is closed from opener?');
- assert_true(await getPopupHasOpener(popup_token) === "true",
- 'Popup has nulled opener?');
- assert_true(canAccessProperty(popup, "document"),
- 'Main page has dom access to the popup?');
- assert_true(canAccessProperty(popup, "frames"),
- 'Main page has cross origin access to the popup?');
-
-}, "COOP: restrict-properties has no impact in a navigation chain between " +
- "multiple unsafe-none pages.");
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers
deleted file mode 100644
index 073ce7adfbd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/coop-rp-in-navigation-chain.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js
deleted file mode 100644
index 1247400a4e3..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js
+++ /dev/null
@@ -1,144 +0,0 @@
-// META: script=/common/get-host-info.sub.js
-// META: script=/common/utils.js
-// META: script=/common/dispatcher/dispatcher.js
-
-const executor_path = '/common/dispatcher/executor.html?pipe=';
-const cross_origin = get_host_info().OTHER_ORIGIN;
-const same_origin = get_host_info().ORIGIN;
-const coep_require_corp_header =
- '|header(Cross-Origin-Embedder-Policy,require-corp)';
-const corp_cross_origin_header =
- '|header(Cross-Origin-Resource-Policy,cross-origin)';
-const coop_restrict_properties_header =
- '|header(Cross-Origin-Opener-Policy,restrict-properties)';
-
-function iframePopupAboutBlankTest(
- origin, {expectedCrossOriginIsolated}, description) {
- promise_test(async t => {
- assert_true(crossOriginIsolated, 'Is main frame crossOriginIsolated?');
- assert_true(
- 'SharedArrayBuffer' in globalThis,
- 'Is SharedArrayBuffer defined in main frame?');
-
- const reply_token = token();
- const iframe_token = token();
-
- const iframe = document.createElement('iframe');
- iframe.src = origin + executor_path + coep_require_corp_header +
- corp_cross_origin_header + `&uuid=${iframe_token}`;
- document.body.appendChild(iframe);
-
- send(iframe_token, `send('${reply_token}', 'Iframe loaded');`);
- assert_equals(await receive(reply_token), 'Iframe loaded');
-
- send(iframe_token, `
- window.popup = window.open();
- send('${reply_token}', popup === null);
- `);
- assert_equals(await receive(reply_token), 'false', 'Is popup handle null?');
-
- send(
- iframe_token,
- `send('${reply_token}', popup.window.crossOriginIsolated);`);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is popup crossOriginIsolated?');
-
- send(iframe_token, `
- send('${reply_token}', 'SharedArrayBuffer' in popup.window.globalThis);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is SharedArrayBuffer defined in popup?');
-
- // Test whether the popup's subframe is crossOriginIsolated
- const popup_iframe_token = token();
- const popup_iframe_src = origin + executor_path + coep_require_corp_header +
- corp_cross_origin_header + `&uuid=${popup_iframe_token}`;
- send(iframe_token, `
- const iframe = window.popup.document.createElement('iframe');
- iframe.src = '${popup_iframe_src}';
- popup.document.body.appendChild(iframe);
- `);
-
- send(popup_iframe_token, `
- send('${reply_token}', 'Iframe in popup loaded');
- `);
- assert_equals(await receive(reply_token), 'Iframe in popup loaded');
-
- send(popup_iframe_token, `
- send('${reply_token}', crossOriginIsolated);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is iframe in popup crossOriginIsolated?');
-
- send(popup_iframe_token, `
- send('${reply_token}', 'SharedArrayBuffer' in globalThis);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is SharedArrayBuffer defined in iframe in popup?');
-
- // Test whether a nested iframe is crossOriginIsolated
- const popup_nested_iframe_token = token();
- const popup_nested_iframe_src = origin + executor_path +
- coep_require_corp_header + corp_cross_origin_header +
- `&uuid=${popup_nested_iframe_token}`;
- send(iframe_token, `
- blank_iframe = popup.document.createElement('iframe');
- blank_iframe.src = '';
- popup.document.body.appendChild(blank_iframe);
- nested_iframe =
- blank_iframe.contentDocument.createElement('iframe');
- nested_iframe.src = '${popup_nested_iframe_src}';
- blank_iframe.contentDocument.body.appendChild(nested_iframe);
- `);
-
- send(popup_nested_iframe_token, `
- send('${reply_token}', 'Nested iframe in popup loaded');
- `);
- assert_equals(await receive(reply_token), 'Nested iframe in popup loaded');
-
- send(popup_nested_iframe_token, `
- send('${reply_token}', crossOriginIsolated);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is nested iframe in popup crossOriginIsolated?');
-
- send(popup_nested_iframe_token, `
- send('${reply_token}', 'SharedArrayBuffer' in globalThis);
- `);
- assert_equals(
- await receive(reply_token), `${expectedCrossOriginIsolated}`,
- 'Is SharedArrayBuffer defined in nested iframe in popup?');
-
- // Navigate the popup out of the initial empty document, with COOP:RP and
- // COEP: require-corp. Expect to be crossOriginIsolated.
- const popup_token = token();
- const popup_src = origin + executor_path + coop_restrict_properties_header +
- coep_require_corp_header + `&uuid=${popup_token}`;
- send(iframe_token, `popup.window.location = '${popup_src}';`);
-
- send(popup_token, `send('${reply_token}', 'Popup loaded');`);
- assert_equals(await receive(reply_token), 'Popup loaded');
-
- send(popup_token, `send('${reply_token}', crossOriginIsolated);`);
- assert_equals(
- await receive(reply_token), 'true',
- 'Is popup crossOriginIsolated after navigation?');
-
- send(popup_token, `
- send('${reply_token}', 'SharedArrayBuffer' in globalThis);
- `);
- assert_equals(
- await receive(reply_token), 'true',
- 'Is SharedArrayBuffer defined in popup after navigation?');
- }, description);
-}
-
-iframePopupAboutBlankTest(
- cross_origin, {expectedCrossOriginIsolated: false}, 'Cross-origin iframe');
-iframePopupAboutBlankTest(
- same_origin, {expectedCrossOriginIsolated: true}, 'Same-origin iframe');
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers
deleted file mode 100644
index 19d0dbe4e18..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-about-blank.https.window.js.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
-Cross-Origin-Embedder-Policy: require-corp
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html
deleted file mode 100644
index 8cf2679e190..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-1">
-<meta name="variant" content="?2-2">
-<meta name="variant" content="?3-3">
-<meta name="variant" content="?4-4">
-<meta name="variant" content="?5-5">
-<meta name="variant" content="?6-6">
-<meta name="variant" content="?7-7">
-<meta name="variant" content="?8-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-// This document has COOP: restrict-properties. The popup has COOP: same-origin.
-// Opening from an iframe should not be different from opening from the main
-// frame and the opener should be severed.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: same-origin via an iframe, ` +
- `with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'same-origin' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-so.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html
deleted file mode 100644
index f3af3ca7db1..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-2">
-<meta name="variant" content="?3-4">
-<meta name="variant" content="?5-6">
-<meta name="variant" content="?7-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-
-// This document has COOP: restrict-properties. The popup has COOP:
-// same-origin-allow-popups. Opening from an iframe should not be different from
-// opening from the main frame and the opener should be severed.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "severed"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "severed"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: same-origin-allow-popups ` +
- `via an iframe, with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'same-origin-allow-popups' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-soap.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html
deleted file mode 100644
index 560dfd90511..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-2">
-<meta name="variant" content="?3-4">
-<meta name="variant" content="?5-6">
-<meta name="variant" content="?7-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-// This document has COOP: restrict-properties. The popup has COOP: unsafe-none.
-// Opening from an iframe should not be different from opening from the main
-// frame and the opener should be severed.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: unsafe-none via an iframe, ` +
- `with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'unsafe-none' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup-to-un.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html
deleted file mode 100644
index 17840724d9e..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<meta name="variant" content="?1-2">
-<meta name="variant" content="?3-4">
-<meta name="variant" content="?5-6">
-<meta name="variant" content="?7-8">
-<meta name="variant" content="?9-last">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/common/dispatcher/dispatcher.js></script>
-<script src=/common/get-host-info.sub.js></script>
-<script src=/common/subset-tests.js></script>
-<script src=/common/utils.js></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/iframe-test.js"></script>
-
-<body>
-<script>
-
-// This document has COOP: restrict-properties. The popup has COOP:
-// restrict-properties. Opening from an iframe should not be different from
-// opening from the main frame and the opener should be restricted if
-// cross-origin.
-[
- {
- "title": "same origin iframe, same origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "preserved"
- },
- {
- "title": "same site iframe, same origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_ORIGIN,
- "opener": "preserved"
- },
- {
- "title": "cross origin iframe, same origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_ORIGIN,
- "opener": "preserved"
- },
- {
- "title": "same origin iframe, same site popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, same site popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, same site popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": SAME_SITE,
- "opener": "restricted"
- },
- {
- "title": "same origin iframe, cross origin popup",
- "iframeOrigin": SAME_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "same site iframe, cross origin popup",
- "iframeOrigin": SAME_SITE,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- },
- {
- "title": "cross origin iframe, cross origin popup",
- "iframeOrigin": CROSS_ORIGIN,
- "popupOrigin": CROSS_ORIGIN,
- "opener": "restricted"
- }
-].forEach(variant => {
- subsetTest(
- iframe_test,
- `COOP: restrict-properties to popup COOP: restrict-properties via an ` +
- `iframe, with ${variant.title}`,
- variant.iframeOrigin,
- variant.popupOrigin,
- { coop: 'restrict-properties' },
- variant.opener);
-});
-</script>
-</body>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/iframe-popup.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html
deleted file mode 100644
index 10929847ee6..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/named_targeting.https.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-
-<script>
-
-async function createCoopRestrictPropertiesPopup(popupToken, name) {
- const url = SAME_ORIGIN.origin + '/common/dispatcher/executor.html' +
- `?uuid=${popupToken}` +
- '&pipe=|header(Cross-Origin-Opener-Policy, restrict-properties)';
- const popup = window.open(url, name);
- add_completion_callback(() => popup.close());
-
- // Wait for the popup to be loaded.
- const replyToken = token();
- send(popupToken, `send('${replyToken}', 'Done loading')`);
- assert_equals(await receive(replyToken), 'Done loading');
-
- return popup;
-}
-
-promise_test(async t => {
- // Start by opening a first COOP: restrict-properties popup. No name is set to
- // begin with.
- const popupToken1 = token();
- const popup1 = await createCoopRestrictPropertiesPopup(popupToken1, '');
-
- // Once the popup is live, explicitly set a name.
- const name = token();
- send(popupToken1, `window.name = '${name}'`);
-
- // To make sure this name has been propagated to other processes, send a dummy
- // message from the popup to the main page, and wait for it to be received.
- // It should be delivered after the name change is replicated.
- const message_waiter = new Promise(resolve => {
- onmessage = (event) => {
- if (event.data == 'Waited enough') { resolve(); }
- }
- });
- send(popupToken1, `opener.postMessage('Waited enough', '*')`);
- await message_waiter;
-
- // Finally, call window.open with the same name. This should not resolve
- // across browsing context groups, and create a brand new popup.
- const popupToken2 = token();
- const popup2 = await createCoopRestrictPropertiesPopup(popupToken2, name);
- assert_not_equals(popup1, popup2,
- 'Named targeting resolved across isolation boundaries');
-
-}, 'Verify that named targeting does not work across isolation boundaries.');
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html
deleted file mode 100644
index e5313a6e222..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "severed",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "severed",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "severed",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers
deleted file mode 100644
index 46ad58d83bf..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-so.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: same-origin
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html
deleted file mode 100644
index 595a10a84bb..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers
deleted file mode 100644
index d83ed86fb9b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-soap.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html
deleted file mode 100644
index 595a10a84bb..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-u.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html
deleted file mode 100644
index 595a10a84bb..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_ORIGIN
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": SAME_SITE
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted",
- "origin": CROSS_ORIGIN
- }
-].forEach(variant => {
- popup_test(`${variant.origin.name} ${variant.title}`, variant.origin,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers
deleted file mode 100644
index 073ce7adfbd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-un.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html
deleted file mode 100644
index a84d52584e9..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with empty coop",
- "coop": "",
- "opener": "restricted"
- },
- {
- "title": "popup with coop unsafe-none",
- "coop": "unsafe-none",
- "opener": "restricted"
- },
- {
- "title": "popup with coop same-origin",
- "coop": "same-origin",
- "opener": "severed"
- },
- {
- "title": "popup with coop same-origin-allow-popups",
- "coop": "same-origin-allow-popups",
- "opener": "severed"
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted"
- }
-].forEach(variant => {
- popup_test(`Cross-origin ${variant.title}`, CROSS_ORIGIN,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-cross-origin.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html
deleted file mode 100644
index c0020fa23a4..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with empty coop",
- "coop": "",
- "opener": "restricted"
- },
- {
- "title": "popup with coop unsafe-none",
- "coop": "unsafe-none",
- "opener": "restricted"
- },
- {
- "title": "popup with coop same-origin",
- "coop": "same-origin",
- "opener": "severed"
- },
- {
- "title": "popup with coop same-origin-allow-popups",
- "coop": "same-origin-allow-popups",
- "opener": "severed"
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "preserved"
- }
-].forEach(variant => {
- popup_test(`Same-origin ${variant.title}`, SAME_ORIGIN,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-origin.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html
deleted file mode 100644
index 7d115ac7e63..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../../resources/common.js"></script>
-<script src="../../resources/popup-test.js"></script>
-<script>
-
-[
- {
- "title": "popup with empty coop",
- "coop": "",
- "opener": "restricted"
- },
- {
- "title": "popup with coop unsafe-none",
- "coop": "unsafe-none",
- "opener": "restricted"
- },
- {
- "title": "popup with coop same-origin",
- "coop": "same-origin",
- "opener": "severed"
- },
- {
- "title": "popup with coop same-origin-allow-popups",
- "coop": "same-origin-allow-popups",
- "opener": "severed"
- },
- {
- "title": "popup with coop restrict-properties",
- "coop": "restrict-properties",
- "opener": "restricted"
- }
-].forEach(variant => {
- popup_test(`Same-site ${variant.title}`, SAME_SITE,
- { coop: variant.coop }, variant.opener);
-});
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers
deleted file mode 100644
index d5c99062d2b..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/popup-with-same-site.https.html.headers
+++ /dev/null
@@ -1 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html
deleted file mode 100644
index 9bc171a269c..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!doctype html>
-<title>
- Verify that we consider browsing context group reuse for COOP reporting.
-</title>
-<meta name="timeout" content="long">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/try-access.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=f1e361ab5854f2dcfe0224b19bc53199&report_only_id=b6fe666b74547291d52d72790adde05c"></script>
-<script>
-
-const same_origin = get_host_info().HTTPS_ORIGIN;
-const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
-
-promise_test(async test => {
- // To receive reports use the same hard-coded value as the one passed in the
- // headers and to "reporting-common.js".
- const report_token = "b6fe666b74547291d52d72790adde05c";
- const reportTo = reportToHeaders(report_token);
-
- // 1. Open a popup without any COOP. It should be in a
- // different virtual browsing context group.
- const opener_token = token(); // For this window.
- const initial_openee_token = token();
- const initial_openee_url = cross_origin + executor_path +
- `&uuid=${initial_openee_token}`;
- let openee = window.open(initial_openee_url);
-
- // 2. Navigate the openee to a COOP-RO: restrict-properties page. If the
- // policy was enforced, it would live in the same browsing context group as
- // this page. The virtual browsing context group should similarly be equal.
- // Note: We omit the reporting endpoint header, because it is not possible to
- // easily escape it. Since it is not necessary in this test, we skip it.
- const final_openee_token = token();
- const final_openee_url = same_origin + executor_path +
- reportTo.coopReportOnlyRestrictPropertiesHeader +
- `&uuid=${final_openee_token}`;
-
- send(initial_openee_token, `location.href = '${final_openee_url}';`);
- test.add_cleanup(() => send(final_openee_token, "window.close()"));
-
- // Wait for the final openee to load.
- send(final_openee_token,
- `send("${opener_token}", "Ready");
- `);
- assert_equals(await receive(opener_token), "Ready");
-
- // 3. Try to access the openee from the opener. No report should be sent.
- tryAccess(openee);
-
- let report =
- await receiveReport(report_token, "access-from-coop-page-to-openee")
- assert_equals(report, "timeout");
-
-}, "access-reporting-browsing-context-group-reuse");
-
-</script>
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers
deleted file mode 100644
index 33abadd83dd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-bcg-reuse.https.html.sub.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=f1e361ab5854f2dcfe0224b19bc53199", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=b6fe666b74547291d52d72790adde05c"
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html
deleted file mode 100644
index b89030f218f..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>Opening a restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=fb054dadb3a9ec17b5cd5c0152d2a7dd&report_only_id=c265b07fbb3bffa2cd2a5179d686ced2"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP unsafe-none, which mismatches with the
- // current document (opener) COOP report-only (restrict-properties) values.
- [
- SAME_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP unsafe-none, which mismatches with the
- // current document (opener) COOP report-only (restrict-properties) values.
- [
- CROSS_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a same-origin popup with COOP restrict-properties, which matches with
- // the current document (opener) COOP report-only (restrict-properties) value.
- [
- SAME_ORIGIN,
- "restrict-properties",
- "",
- "",
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers
deleted file mode 100644
index 07ecad96f24..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp-ro.https.html.sub.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy-Report-Only: restrict-properties; report-to="coop-report-only-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fb054dadb3a9ec17b5cd5c0152d2a7dd", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=c265b07fbb3bffa2cd2a5179d686ced2"
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html
deleted file mode 100644
index 6b31f7e0098..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>Opening a restrict-properties</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script
- src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js?pipe=sub&report_id=ed5a8be35e4e21c2ba960e6574e0a32c&report_only_id=fa22ddc676642edae42c75defb82ba2e"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP unsafe-none, which mismatches
- // with the current document (opener) COOP (restrict-properties) values.
- [
- SAME_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP unsafe-none, which mismatches
- // with the current document (opener) COOP (restrict-properties) values.
- [
- CROSS_ORIGIN,
- "unsafe-none",
- "",
- "",
- "",
- []
- ],
-
- // Open a same-origin popup with COOP restrict-properties, which matches with
- // the current document (opener) COOP (restrict-properties) value.
- [
- SAME_ORIGIN,
- "restrict-properties",
- "",
- "",
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers
deleted file mode 100644
index a61e2919c8a..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-from-rp.https.html.sub.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: restrict-properties; report-to="coop-report-endpoint"
-Reporting-Endpoints: coop-report-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=ed5a8be35e4e21c2ba960e6574e0a32c", coop-report-only-endpoint="https://{{host}}:{{ports[https][0]}}/reporting/resources/report.py?reportID=fa22ddc676642edae42c75defb82ba2e"
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html
deleted file mode 100644
index c47e59cd8f1..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>reporting same origin with report-to</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- SAME_ORIGIN,
- "",
- "",
- `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`,
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- CROSS_ORIGIN,
- "",
- "",
- `restrict-properties; report-to="${popupReportOnlyEndpoint.name}"`,
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers
deleted file mode 100644
index 16903320bb5..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp-ro.https.html.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
-Referrer-Policy: origin
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html
deleted file mode 100644
index ff60e8c5afd..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!doctype html>
-<meta name=timeout content=long>
-<title>reporting same origin with report-to</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="/common/utils.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/html/cross-origin-opener-policy/resources/common.js"></script>
-<script src="/html/cross-origin-opener-policy/reporting/resources/reporting-common.js"></script>
-
-<script>
-
-let tests = [
- // popup origin, popup COOP, popup COEP, popup COOP report-only, popup COEP report-only, expected reports
-
- // Open a same-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- SAME_ORIGIN,
- `restrict-properties; report-to="${popupReportEndpoint.name}"`,
- "",
- "",
- "",
- []
- ],
-
- // Open a cross-origin popup with COOP report-only restrict-properties, which
- // mismatches with the current document (opener) COOP (unsafe-none).
- [
- CROSS_ORIGIN,
- `restrict-properties; report-to="${popupReportEndpoint.name}"`,
- "",
- "",
- "",
- []
- ],
-];
-
-runNavigationReportingTests(document.title, tests);
-
-</script>
-
diff --git a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers b/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers
deleted file mode 100644
index 16903320bb5..00000000000
--- a/tests/wpt/tests/html/cross-origin-opener-policy/tentative/restrict-properties/reporting-to-rp.https.html.headers
+++ /dev/null
@@ -1,2 +0,0 @@
-Cross-Origin-Opener-Policy: unsafe-none
-Referrer-Policy: origin
diff --git a/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml
new file mode 100644
index 00000000000..4700eca4a12
--- /dev/null
+++ b/tests/wpt/tests/html/editing/editing-0/writing-suggestions/WEB_FEATURES.yml
@@ -0,0 +1,3 @@
+features:
+- name: writingsuggestions
+ files: "**"
diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html
index b177f47b757..5042557212e 100644
--- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html
+++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types-ref.html
@@ -1,8 +1,8 @@
<!doctype html>
<html>
<body>
-<div style="width: 1em; color: white; background-color: black;">
- <marquee loop="1" behavior="alternate">m</marquee>
+<div style="vertical-align: text-bottom; display: inline-block;">
+ <div style="width: 10px; height: 10px; background-color: green;"></div>
</div>
</body>
</html>
diff --git a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html
index 57f49850321..f16c58bb85d 100644
--- a/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html
+++ b/tests/wpt/tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-with-trusted-types.html
@@ -1,12 +1,12 @@
<!doctype html>
<html>
<head>
-<meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
-<link rel="match" href="marquee-with-trusted-types-ref.html">
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types-for 'script'">
+ <link rel="match" href="marquee-with-trusted-types-ref.html">
</head>
<body>
-<div style="width: 1em; color: white; background-color: black;">
- <marquee loop="1" behavior="alternate">m</marquee>
-</div>
+<marquee scrollamount="0">
+ <div style="width: 10px; height: 10px; background-color: green;"></div>
+</marquee>
</body>
</html>
diff --git a/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-hit-test-during-load-event-crash.html b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-hit-test-during-load-event-crash.html
new file mode 100644
index 00000000000..f668fc51573
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/embedded-content/the-iframe-element/iframe-hit-test-during-load-event-crash.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<div style="visibility: hidden;">
+ <iframe id="iframe"></iframe>
+</div>
+<script>
+ window.addEventListener("load", _ =>
+ iframe.contentDocument.elementFromPoint(0, 0)
+ );
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html
new file mode 100644
index 00000000000..57ea51e367c
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance-ref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<link rel=stylesheet href="resources/customizable-select-in-page.css">
+<link rel=stylesheet href="../customizable-select/resources/customizable-select-styles.css">
+<script src="resources/customizable-select-in-page.js"></script>
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-option selected">select multiple</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+</div>
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-option selected">select size=4</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+</div>
+
+<div class="customizable-select-in-page disabled" size=4>
+ <div class="customizable-select-option selected">select disabled</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+ <div class=customizable-select-option>disabled</div>
+</div>
+
+<!-- TODO(crbug.com/407801061): Fix padding and remove this div. -->
+<div style="position: absolute; top: 150px">
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-option selected">with disabled option</div>
+ <div class=customizable-select-option>two</div>
+ <div class=customizable-select-option>three</div>
+ <div class="customizable-select-option disabled">disabled</div>
+</div>
+
+<div class=customizable-select-in-page size=4>
+ <div class=customizable-select-legend>optgroup</div>
+ <div class=customizable-select-option>option in optgroup</div>
+ <div class=customizable-select-option>option out of optgroup</div>
+</div>
+
+<div class=customizable-select-in-page size=4>
+ <div class="customizable-select-legend disabled">disabled optgroup</div>
+ <div class="customizable-select-option disabled">option in optgroup</div>
+ <div class=customizable-select-option>option out of optgroup</div>
+</div>
+
+<script>
+updateCustomizableSelectInPageSize();
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html
new file mode 100644
index 00000000000..b3bf75eb0ff
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-appearance.tentative.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/357649033">
+<link rel=match href="customizable-select-in-page-appearance-ref.html">
+
+<style>
+select {
+ appearance: base-select;
+}
+</style>
+
+<select multiple>
+ <option selected>select multiple</option>
+ <option>two</option>
+ <option>three</option>
+</select>
+
+<select size=4>
+ <option selected>select size=4</option>
+ <option>two</option>
+ <option>three</option>
+</select>
+
+<select size=4 disabled>
+ <option selected>select disabled</option>
+ <option>two</option>
+ <option>three</option>
+ <option disabled>disabled</option>
+</select>
+
+<!-- TODO(crbug.com/407801061): Fix padding and remove this div. -->
+<div style="position: absolute; top: 150px">
+
+<select size=4>
+ <option selected>with disabled option</option>
+ <option>two</option>
+ <option>three</option>
+ <option disabled>disabled</option>
+</select>
+
+<select size=4>
+ <optgroup>
+ <legend>optgroup</legend>
+ <option>option in optgroup</option>
+ </optgroup>
+ <option>option out of optgroup</option>
+</select>
+
+<select size=4>
+ <optgroup disabled>
+ <legend>disabled optgroup</legend>
+ <option>option in optgroup</option>
+ </optgroup>
+ <option>option out of optgroup</option>
+</select>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html
new file mode 100644
index 00000000000..24e6e39ea48
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-keyboard-behavior.tentative.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/357649033">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+
+<style>
+select {
+ appearance: base-select;
+}
+</style>
+
+<button id=beforemultiple>button before multiple</button>
+<select multiple>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<button id=beforesize>button before size=4</button>
+<select size=4>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<script>
+const tabKey = '\uE004';
+const enterKey = '\uE007';
+const spaceKey = '\uE00D';
+const arrowUp = '\uE013';
+const arrowDown = '\uE015';
+function pressKey(keyCode) {
+ return (new test_driver.Actions()
+ .keyDown(keyCode)
+ .keyUp(keyCode))
+ .send();
+}
+
+promise_test(async () => {
+ const select = document.querySelector('select[multiple]');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ beforemultiple.focus();
+ await pressKey(tabKey);
+ assert_equals(document.activeElement, optionOne,
+ 'The first option should get focus when keyboard focusing into a select.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionOne,
+ 'Focus should not be moved after pressing space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after the first space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should be selected after the first space.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after arrow down.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Disabled option should not be focusable.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second space.');
+ assert_equals(select.selectedOptions.length, 2,
+ 'Two options should be selected after second space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after second space.');
+ assert_equals(select.selectedOptions[1], optionTwo,
+ 'Second option should be selected after second space.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after third space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after third space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after third space.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after first enter.');
+ assert_equals(select.selectedOptions.length, 2,
+ 'Two options should be selected after first enter.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after first enter.');
+ assert_equals(select.selectedOptions[1], optionTwo,
+ 'Second option should be selected after first enter.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second enter.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after second enter.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after second enter.');
+
+ await pressKey(arrowUp);
+ assert_equals(document.activeElement, optionOne,
+ 'First option should be focused after arrow up.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after arrow up.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should stay selected after arrow up.');
+}, 'Keyboard behavior for base appearance <select multiple>');
+
+promise_test(async () => {
+ const select = document.querySelector('select[size]');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ beforesize.focus();
+ await pressKey(tabKey);
+ assert_equals(document.activeElement, optionOne,
+ 'The first option should get focus when keyboard focusing into a select.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionOne,
+ 'Focus should not be moved after pressing space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after the first space.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'First option should be selected after the first space.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after arrow down.');
+
+ await pressKey(arrowDown);
+ assert_equals(document.activeElement, optionTwo,
+ 'Disabled option should not be focusable.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second space.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One options should be selected after second space.');
+ assert_equals(select.selectedOptions[0], optionTwo,
+ 'Second option should be selected after second space.');
+
+ await pressKey(spaceKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after third space.');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected after third space.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after first enter.');
+ assert_equals(select.selectedOptions.length, 1,
+ 'One option should be selected after first enter.');
+ assert_equals(select.selectedOptions[0], optionTwo,
+ 'Second option should be selected after first enter.');
+
+ await pressKey(enterKey);
+ assert_equals(document.activeElement, optionTwo,
+ 'Second option should be focused after second enter.');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected after second enter.');
+
+ await pressKey(arrowUp);
+ assert_equals(document.activeElement, optionOne,
+ 'First option should be focused after arrow up.');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected after arrow up.');
+}, 'Keyboard behavior for base appearance <select size=4>');
+
+promise_test(async () => {
+ document.body.focus();
+
+ const selectMultiple = document.querySelector('select[multiple]');
+ selectMultiple.focus();
+ assert_not_equals(document.activeElement, selectMultiple, '<select multiple>');
+
+ const selectSize = document.querySelector('select[size]');
+ selectSize.focus();
+ assert_not_equals(document.activeElement, selectSize, '<select size=4>');
+}, 'Base appearance in-page selects should not be focusable.');
+
+// TODO(crbug.com/357649033): Test tab key while focused on an option after deciding behavior.
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html
new file mode 100644
index 00000000000..d5b93693cf7
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/customizable-select-in-page-mouse-behavior.tentative.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://issues.chromium.org/issues/357649033">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+
+<style>
+select {
+ appearance: base-select;
+}
+</style>
+
+<select multiple>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<select size=4>
+ <option class=one>one</option>
+ <option class=two>two</option>
+ <option class=disabled disabled>disabled</option>
+</select>
+
+<script>
+function click(element) {
+ return (new test_driver.Actions()
+ .pointerMove(1, 1, {origin: element})
+ .pointerDown()
+ .pointerUp())
+ .send();
+}
+
+function touch(element) {
+ return (new test_driver.Actions()
+ .addPointer('finger', 'touch')
+ .pointerMove(1, 1, {origin: element, sourceName: 'finger'})
+ .pointerDown({sourceName: 'finger'})
+ .pointerUp({sourceName: 'finger'}))
+ .send();
+}
+
+['mouse', 'touch'].forEach(inputType => {
+ const activate = inputType == 'touch' ? touch : click;
+
+ promise_test(async () => {
+ const select = document.querySelector('select[multiple]');
+ select.value = null;
+ select.removeAttribute('disabled');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ const disabledOption = select.querySelector('.disabled');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ await activate(optionOne);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after first click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should be selected after first click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 2,
+ 'There should be two selected options after second click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should stay selected after second click.');
+ assert_equals(select.selectedOptions[1], optionTwo,
+ 'Option two should be seleted after second click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after third click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should stay selected after third click.');
+
+ await activate(disabledOption);
+ assert_equals(select.selectedOptions.length, 1,
+ 'Disabled option should not be checkable.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Disabled option should not be checkable.');
+
+ select.setAttribute('disabled', '');
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 1,
+ 'Disabled select should not have checkable options.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Disabled select should not have checkable options.');
+ }, `${inputType}: input behavior for base appearance <select multiple>`);
+
+ promise_test(async () => {
+ const select = document.querySelector('select[size]');
+ select.value = null;
+ select.removeAttribute('disabled');
+ const optionOne = select.querySelector('.one');
+ const optionTwo = select.querySelector('.two');
+ const disabledOption = select.querySelector('.disabled');
+ assert_equals(select.selectedOptions.length, 0,
+ 'No options should be selected at the start of the test.');
+
+ await activate(optionOne);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after first click.');
+ assert_equals(select.selectedOptions[0], optionOne,
+ 'Option one should be selected after first click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 1,
+ 'There should be one selected option after second click.');
+ assert_equals(select.selectedOptions[0], optionTwo,
+ 'Option two should be selected after second click.');
+
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 0,
+ 'There should be no selected options after third click.');
+
+ await activate(disabledOption);
+ assert_equals(select.selectedOptions.length, 0,
+ 'Disabled option should not be checkable.');
+
+ select.setAttribute('disabled', '');
+ await activate(optionTwo);
+ assert_equals(select.selectedOptions.length, 0,
+ 'Disabled select should not have checkable options.');
+ }, `${inputType}: input behavior for base appearance <select size=4>`);
+});
+</script>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css
new file mode 100644
index 00000000000..deb080b4756
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.css
@@ -0,0 +1,14 @@
+.customizable-select-in-page {
+ display: inline-block;
+ border: 1px solid;
+ overflow-inline: hidden;
+ overflow-block: scroll;
+}
+
+.customizable-select-in-page.disabled {
+ color: color-mix(in lab, currentColor 50%, transparent);
+}
+
+.customizable-select-in-page:not(.disabled) .customizable-select-legend.disabled {
+ color: color-mix(in lab, currentColor 50%, transparent);
+}
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js
new file mode 100644
index 00000000000..13230943321
--- /dev/null
+++ b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select-in-page/resources/customizable-select-in-page.js
@@ -0,0 +1,13 @@
+function updateCustomizableSelectInPageSize() {
+ document.querySelectorAll('.customizable-select-in-page').forEach(select => {
+ const size = Number(select.getAttribute('size'));
+ if (size) {
+ let optionHeight = 0;
+ select.querySelectorAll('.customizable-select-option').forEach(option => {
+ const rect = option.getBoundingClientRect();
+ optionHeight = Math.max(optionHeight, rect.height);
+ });
+ select.style.height = (optionHeight * size) + 'px';
+ }
+ });
+}
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html
deleted file mode 100644
index 45a74da7559..00000000000
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance-ref.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<select multiple>
- <option>one</option>
- <option>two div button</option>
-</select>
-
-<select multiple size=2>
- <option>one</option>
- <option>two</option>
- <option>three</option>
- <option>four</option>
-</select>
-
-<select multiple>
- <option selected>option</option>
-</select>
diff --git a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html b/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html
deleted file mode 100644
index 48673b446bc..00000000000
--- a/tests/wpt/tests/html/semantics/forms/the-select-element/customizable-select/select-multiple-base-appearance.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html class=reftest-wait>
-<link rel=author href="mailto:jarhar@chromium.org">
-<link rel=match href="select-multiple-base-appearance-ref.html">
-
-<style>
-select, ::picker(select) {
- appearance: base-select;
-}
-</style>
-
-<select multiple>
- <option>one</option>
- <option>
- two
- <div>div</div>
- <button>button</button>
- </option>
-</select>
-
-<select multiple size=2>
- <option>one</option>
- <option>two</option>
- <option>three</option>
- <option>four</option>
-</select>
-
-<select id=needsmultiple>
- <option selected>option</option>
-</select>
-
-<script>
-requestAnimationFrame(() => {
- document.getElementById('needsmultiple').setAttribute('multiple', '');
- requestAnimationFrame(() => {
- document.documentElement.classList.remove('reftest-wait');
- });
-});
-</script>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
index 1e000866099..5afb407640b 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-focusability.html
@@ -48,11 +48,9 @@
}
}
- async_test((t) => {
- window.onload = async () => {
- await assert_focus_order([before,within1,after1,dialog2,within2,after2,
- within3,after3,dialog4,within4,after4]);
- t.done();
- };
+ promise_test(async () => {
+ await new Promise(resolve => window.onload = resolve);
+ await assert_focus_order([before,within1,after1,dialog2,within2,after2,
+ within3,after3,dialog4,within4,after4]);
}, "The dialog element itself should not be keyboard focusable.");
</script>
diff --git a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
index 9a9c87167d5..6555f1b43bd 100644
--- a/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
+++ b/tests/wpt/tests/html/semantics/interactive-elements/the-dialog-element/dialog-requestclose.html
@@ -35,14 +35,8 @@ function openDialog(openMethod) {
assert_true(dialog.matches(':open'));
assert_equals(dialog.matches(':modal'),openMethod === 'modal');
}
-function getSignal(t) {
- const controller = new AbortController();
- const signal = controller.signal;
- t.add_cleanup(() => controller.abort());
- return signal;
-}
-async function setup(t,closedby) {
+function setup(t,closedby) {
t.add_cleanup(() => {
dialog.close();
dialog.removeAttribute('closedby');
@@ -52,16 +46,14 @@ async function setup(t,closedby) {
if (closedby) {
dialog.setAttribute('closedby',closedby);
}
- // Be sure any pending close events (from prior test cleanups) get fired.
- await waitForRender();
- return getSignal(t);
+ return t.get_signal();
}
['modeless','modal','open'].forEach(openMethod => {
[null,'any','closedrequest','none'].forEach(closedby => {
const testDescription = `for ${openMethod} dialog with closedby=${closedby}`;
promise_test(async (t) => {
- await setup(t,closedby);
+ setup(t,closedby);
openDialog(openMethod);
dialog.requestClose();
assert_false(dialog.open);
@@ -69,25 +61,35 @@ async function setup(t,closedby) {
},`requestClose basic behavior ${testDescription}`);
promise_test(async (t) => {
- const signal = await setup(t,closedby);
+ const signal = setup(t,closedby);
let events = [];
+ const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers();
dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
- dialog.addEventListener('close',() => events.push('close'),{signal});
+ dialog.addEventListener('close',() => {
+ events.push('close');
+ hasClosed();
+ },{signal});
openDialog(openMethod);
assert_array_equals(events,[]);
dialog.requestClose();
assert_false(dialog.open);
assert_false(dialog.matches(':open'));
assert_array_equals(events,['cancel'],'close is scheduled');
- await waitForRender();
+ await untilFullyClosed;
assert_array_equals(events,['cancel','close']);
},`requestClose fires both cancel and close ${testDescription}`);
promise_test(async (t) => {
- const signal = await setup(t,'none');
+ const signal = setup(t,'none');
let events = [];
+ const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers();
+ const { promise: untilFullyClosedAgain, resolve: hasClosedAgain } = Promise.withResolvers();
+ const closeResolvers = [hasClosed, hasClosedAgain];
dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
- dialog.addEventListener('close',() => events.push('close'),{signal});
+ dialog.addEventListener('close',() => {
+ events.push('close');
+ closeResolvers.shift()();
+ },{signal});
openDialog(openMethod);
dialog.setAttribute('closedby',closedby);
assert_array_equals(events,[]);
@@ -95,6 +97,7 @@ async function setup(t,closedby) {
assert_false(dialog.open,'Adding closedby after dialog is open');
assert_false(dialog.matches(':open'));
assert_array_equals(events,['cancel']);
+ await untilFullyClosed;
events=[];
openDialog(openMethod);
dialog.removeAttribute('closedby');
@@ -102,11 +105,13 @@ async function setup(t,closedby) {
dialog.requestClose();
assert_false(dialog.open,'Removing closedby after dialog is open');
assert_array_equals(events,['cancel']);
+ await untilFullyClosedAgain;
+ assert_array_equals(events,['cancel', 'close']);
},`closedby has no effect on dialog.requestClose() ${testDescription}`);
if (closedby != "none") {
promise_test(async (t) => {
- const signal = await setup(t,closedby);
+ const signal = setup(t,closedby);
let shouldPreventDefault = true;
dialog.addEventListener('cancel',(e) => {
if (shouldPreventDefault) {
@@ -124,7 +129,7 @@ async function setup(t,closedby) {
},`requestClose can be cancelled ${testDescription}`);
promise_test(async (t) => {
- const signal = await setup(t,closedby);
+ const signal = setup(t,closedby);
dialog.addEventListener('cancel',(e) => e.preventDefault(),{signal});
openDialog(openMethod);
// No user activation here.
@@ -136,7 +141,7 @@ async function setup(t,closedby) {
},`requestClose avoids abuse prevention logic ${testDescription}`);
promise_test(async (t) => {
- await setup(t,closedby);
+ setup(t,closedby);
openDialog(openMethod);
assert_equals(dialog.returnValue,'','Return value starts out empty');
const returnValue = 'The return value';
@@ -153,7 +158,7 @@ async function setup(t,closedby) {
},`requestClose(returnValue) passes along the return value ${testDescription}`);
promise_test(async (t) => {
- await setup(t,closedby);
+ setup(t,closedby);
dialog.addEventListener('cancel',(e) => e.preventDefault(),{once:true});
openDialog(openMethod);
dialog.returnValue = 'foo';
@@ -168,23 +173,27 @@ async function setup(t,closedby) {
});
promise_test(async (t) => {
- await setup(t);
+ setup(t);
dialog.open = true;
dialog.requestClose();
assert_false(dialog.open);
},`requestClose basic behavior when dialog is open via attribute`);
promise_test(async (t) => {
- const signal = await setup(t);
+ const signal = setup(t);
let events = [];
+ const { promise: untilFullyClosed, resolve: hasClosed } = Promise.withResolvers();
dialog.addEventListener('cancel',() => events.push('cancel'),{signal});
- dialog.addEventListener('close',() => events.push('close'),{signal});
+ dialog.addEventListener('close',() => {
+ events.push('close')
+ hasClosed();
+ },{signal});
dialog.open = true;
assert_array_equals(events,[]);
dialog.requestClose();
assert_false(dialog.open);
assert_array_equals(events,['cancel'],'close is scheduled');
- await waitForRender();
+ await untilFullyClosed;
assert_array_equals(events,['cancel','close']);
},`requestClose fires cancel and close when dialog is open via attribute`);
diff --git a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html
index a4a425b9c1f..2a1ac80e65a 100644
--- a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html
+++ b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/col-span-limits.html
@@ -39,12 +39,21 @@ These two must look the same, each having 2 cells in one row:
</table>
<br>
<table id=table3>
- <col span=1001>
+ <col id="colspan-3" span=1001>
<tr>
<td colspan=1000><div class="square"></div></td>
<td><div class="square"></div></td>
</tr>
</table>
+<table>
+ <tr>
+ <td id="colspan-limit-test1" colspan=5></td>
+ <td id="colspan-limit-test2" colspan=0></td>
+ <td id="colspan-limit-test3" colspan=1000></td>
+ <td id="colspan-limit-test4" colspan=1001></td>
+ <td id="colspan-limit-test5" colspan=5555555></td>
+ </tr>
+</table>
</main>
<script>
@@ -56,4 +65,48 @@ test(() => {
assert_equals(table2.offsetWidth, 51, "table2 width");
assert_equals(table3.offsetWidth, 51, "table3 width");
}, "col span of 1001 must be treated as 1000");
+
+test(() => {
+ let td = document.createElement("td");
+ td.colSpan = 5;
+ assert_equals(td.colSpan, 5);
+
+ td.colSpan = 0;
+ assert_equals(td.colSpan, 1);
+
+ td.colSpan = 1000;
+ assert_equals(td.colSpan, 1000);
+
+ td.colSpan = 1001;
+ assert_equals(td.colSpan, 1000);
+
+ td.colSpan = 555555;
+ assert_equals(td.colSpan, 1000);
+}, "colspan must be clamped to [1, 1000] when set via script");
+
+test(() => {
+ assert_equals(document.getElementById("colspan-limit-test1").colSpan, 5);
+ assert_equals(document.getElementById("colspan-limit-test2").colSpan, 1);
+ assert_equals(document.getElementById("colspan-limit-test3").colSpan, 1000);
+ assert_equals(document.getElementById("colspan-limit-test4").colSpan, 1000);
+ assert_equals(document.getElementById("colspan-limit-test5").colSpan, 1000);
+}, "colspan must be clamped to [1, 1000] when parsing attributes");
+
+test(() => {
+ let column = document.getElementById("colspan-3");
+ column.span = 5;
+ assert_equals(column.span, 5);
+
+ column.span = 0;
+ assert_equals(column.span, 1);
+
+ column.span = 1000;
+ assert_equals(column.span, 1000);
+
+ column.span = 1001;
+ assert_equals(column.span, 1000);
+
+ column.span = 555555;
+ assert_equals(column.span, 1000);
+}, "column span must be clamped to [1, 1000] when set via script");
</script>
diff --git a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html
index cdfa61bbcdc..798639b3875 100644
--- a/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html
+++ b/tests/wpt/tests/html/semantics/tabular-data/processing-model-1/span-limits.html
@@ -29,6 +29,17 @@
<!-- We'll add another 65534 rows later -->
</table>
+<table>
+ <tr>
+ <td id="rowspan-limit-test1" rowspan=5></td>
+ <td id="rowspan-limit-test2" rowspan=0></td>
+ <td id="rowspan-limit-test3" rowspan=1000></td>
+ <td id="rowspan-limit-test4" rowspan=65534></td>
+ <td id="rowspan-limit-test5" rowspan=65535></td>
+ <td id="rowspan-limit-test6" rowspan=5555555></td>
+ </tr>
+</table>
+
<script>
var $ = document.querySelector.bind(document);
@@ -63,4 +74,34 @@ test(() => {
assert_equals($("#d1").getBoundingClientRect().bottom,
$("#d2").getBoundingClientRect().bottom);
}, "rowspan of 65535 must be treated as 65534");
+
+test(() => {
+ let td = document.createElement("td");
+ td.rowSpan = 5;
+ assert_equals(td.rowSpan, 5);
+
+ td.rowSpan = 0;
+ assert_equals(td.rowSpan, 0);
+
+ td.rowSpan = 1000;
+ assert_equals(td.rowSpan, 1000);
+
+ td.rowSpan = 65534;
+ assert_equals(td.rowSpan, 65534);
+
+ td.rowSpan = 65535;
+ assert_equals(td.rowSpan, 65534);
+
+ td.rowSpan = 555555;
+ assert_equals(td.rowSpan, 65534);
+}, "rowspan must be clamped to [0, 65534] when set via script");
+
+test(() => {
+ assert_equals(document.getElementById("rowspan-limit-test1").rowSpan, 5);
+ assert_equals(document.getElementById("rowspan-limit-test2").rowSpan, 0);
+ assert_equals(document.getElementById("rowspan-limit-test3").rowSpan, 1000);
+ assert_equals(document.getElementById("rowspan-limit-test4").rowSpan, 65534);
+ assert_equals(document.getElementById("rowspan-limit-test5").rowSpan, 65534);
+ assert_equals(document.getElementById("rowspan-limit-test6").rowSpan, 65534);
+}, "rowspan must be clamped to [0, 65534] when parsing attributes");
</script>
diff --git a/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html
new file mode 100644
index 00000000000..b2366285a41
--- /dev/null
+++ b/tests/wpt/tests/html/syntax/serializing-html-fragments/serializing-cdata-in-html-document.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>Serializing CDATA in an HTML document</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(t => {
+ const doc = new DOMParser().parseFromString('<svg xmlns="http://www.w3.org/2000/svg"><![CDATA[<img>]]></svg>', 'application/xml');
+ const el = document.adoptNode(doc.documentElement);
+ assert_equals(el.outerHTML, '<svg xmlns="http://www.w3.org/2000/svg">&lt;img&gt;</svg>');
+});
+</script>
diff --git a/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml
new file mode 100644
index 00000000000..a1af3e21a48
--- /dev/null
+++ b/tests/wpt/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/WEB_FEATURES.yml
@@ -0,0 +1,4 @@
+features:
+- name: pdf-viewer
+ files:
+ - plugins-and-mimetypes.html
diff --git a/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini
new file mode 100644
index 00000000000..7de34991442
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/metadata/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html.ini
@@ -0,0 +1,3 @@
+[set_geolocation_override.https.html]
+ expected:
+ if product != "chrome": ERROR
diff --git a/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html
new file mode 100644
index 00000000000..5cbcf546423
--- /dev/null
+++ b/tests/wpt/tests/infrastructure/testdriver/bidi/emulation/set_geolocation_override.https.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>TestDriver bidi.emulation.set_geolocation_override method</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js?feature=bidi"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<script>
+ promise_setup(async () => {
+ // Ensure permission is granted before proceeding.
+ await test_driver.bidi.permissions.set_permission({
+ descriptor: {name: "geolocation"},
+ state: "granted",
+ });
+
+ // Ensure any previously set geolocation emulations are cleared.
+ await test_driver.bidi.emulation.set_geolocation_override(
+ {coordinates: null});
+ });
+
+ /** Get the current geolocation or error */
+ function get_current_geolocation() {
+ return new Promise(
+ resolve => window.navigator.geolocation.getCurrentPosition(
+ position => resolve(position.coords.toJSON()),
+ error => resolve({code: error.code, message: error.message}),
+ // Fail fast if geolocation is not available.
+ {timeout: 500}
+ ))
+ }
+
+ /** Asserts that relevant coordinate properties match */
+ function assert_coordinates_match(actual, expected) {
+ for (const key in expected) {
+ assert_equals(actual[key], expected[key],
+ `"${key}" should match the expected value ${expected[key]}`);
+ }
+ }
+
+ const SOME_COORDINATES = {
+ latitude: 52.51,
+ longitude: 13.39,
+ accuracy: 0.5,
+ altitude: 34,
+ altitudeAccuracy: 0.75,
+ heading: 180,
+ speed: 2.77
+ };
+
+ promise_test(async (t) => {
+ // Get the initial geolocation (might be error).
+ const initial_coords = await get_current_geolocation();
+
+ // Set the geolocation override
+ await test_driver.bidi.emulation.set_geolocation_override({
+ coordinates: SOME_COORDINATES
+ });
+
+ // Get the geolocation after setting the override.
+ const coords = await get_current_geolocation();
+ // Assert the coordinates match the override.
+ assert_coordinates_match(coords, SOME_COORDINATES);
+
+ // Clear the geolocation override.
+ await test_driver.bidi.emulation.set_geolocation_override(
+ {coordinates: null});
+ // Assert coordinates are set to the original value.
+ assert_coordinates_match(await get_current_geolocation(), initial_coords);
+ }, "emulate geolocation and clear override");
+</script>
diff --git a/tests/wpt/tests/interfaces/fedcm.idl b/tests/wpt/tests/interfaces/fedcm.idl
index 215f375432e..5ce2d260f11 100644
--- a/tests/wpt/tests/interfaces/fedcm.idl
+++ b/tests/wpt/tests/interfaces/fedcm.idl
@@ -84,8 +84,10 @@ dictionary IdentityProviderAPIConfig {
dictionary IdentityProviderAccount {
required USVString id;
- required USVString name;
- required USVString email;
+ USVString name;
+ USVString email;
+ USVString tel;
+ USVString username;
USVString given_name;
USVString picture;
sequence<USVString> approved_clients;
diff --git a/tests/wpt/tests/interfaces/image-capture.idl b/tests/wpt/tests/interfaces/image-capture.idl
index 21e03d4db82..26cc7fab5cd 100644
--- a/tests/wpt/tests/interfaces/image-capture.idl
+++ b/tests/wpt/tests/interfaces/image-capture.idl
@@ -3,7 +3,7 @@
// (https://github.com/w3c/webref)
// Source: MediaStream Image Capture (https://w3c.github.io/mediacapture-image/)
-[Exposed=Window]
+[Exposed=Window, SecureContext]
interface ImageCapture {
constructor(MediaStreamTrack videoTrack);
Promise<Blob> takePhoto(optional PhotoSettings photoSettings = {});
diff --git a/tests/wpt/tests/interfaces/mediastream-recording.idl b/tests/wpt/tests/interfaces/mediastream-recording.idl
index 496bfcf2e27..68c891cdc91 100644
--- a/tests/wpt/tests/interfaces/mediastream-recording.idl
+++ b/tests/wpt/tests/interfaces/mediastream-recording.idl
@@ -56,7 +56,7 @@ interface BlobEvent : Event {
readonly attribute DOMHighResTimeStamp timecode;
};
-dictionary BlobEventInit {
+dictionary BlobEventInit : EventInit {
required Blob data;
DOMHighResTimeStamp timecode;
};
diff --git a/tests/wpt/tests/interfaces/turtledove.idl b/tests/wpt/tests/interfaces/turtledove.idl
index b9f50d47885..7f11cdc3790 100644
--- a/tests/wpt/tests/interfaces/turtledove.idl
+++ b/tests/wpt/tests/interfaces/turtledove.idl
@@ -206,6 +206,7 @@ partial interface Navigator {
[Exposed=InterestGroupScriptRunnerGlobalScope]
interface InterestGroupScriptRunnerGlobalScope {
readonly attribute PrivateAggregation? privateAggregation;
+ readonly attribute ProtectedAudienceUtilities protectedAudience;
};
dictionary PASignalValue {
@@ -220,6 +221,12 @@ dictionary PAExtendedHistogramContribution {
bigint filteringId = 0;
};
+[Exposed=InterestGroupScriptRunnerGlobalScope]
+interface ProtectedAudienceUtilities {
+ Uint8Array encodeUtf8(USVString input);
+ USVString decodeUtf8(Uint8Array bytes);
+};
+
[Exposed=InterestGroupBiddingAndScoringScriptRunnerGlobalScope]
interface ForDebuggingOnly {
undefined reportAdAuctionWin(USVString url);
diff --git a/tests/wpt/tests/interfaces/webcodecs.idl b/tests/wpt/tests/interfaces/webcodecs.idl
index 274ef96578a..3d4db1ed49d 100644
--- a/tests/wpt/tests/interfaces/webcodecs.idl
+++ b/tests/wpt/tests/interfaces/webcodecs.idl
@@ -141,7 +141,7 @@ dictionary AudioDecoderConfig {
required DOMString codec;
[EnforceRange] required unsigned long sampleRate;
[EnforceRange] required unsigned long numberOfChannels;
- BufferSource description;
+ AllowSharedBufferSource description;
};
dictionary VideoDecoderConfig {
diff --git a/tests/wpt/tests/interfaces/WebCryptoAPI.idl b/tests/wpt/tests/interfaces/webcrypto.idl
index ff7a89cd0d5..ff7a89cd0d5 100644
--- a/tests/wpt/tests/interfaces/WebCryptoAPI.idl
+++ b/tests/wpt/tests/interfaces/webcrypto.idl
diff --git a/tests/wpt/tests/interfaces/webgpu.idl b/tests/wpt/tests/interfaces/webgpu.idl
index de1f7c1e52b..4fec46a2557 100644
--- a/tests/wpt/tests/interfaces/webgpu.idl
+++ b/tests/wpt/tests/interfaces/webgpu.idl
@@ -109,6 +109,7 @@ dictionary GPUDeviceDescriptor
};
enum GPUFeatureName {
+ "core-features-and-limits",
"depth-clip-control",
"depth32float-stencil8",
"texture-compression-bc",
diff --git a/tests/wpt/tests/interfaces/webnn.idl b/tests/wpt/tests/interfaces/webnn.idl
index 57f2a4a9890..37fcc32501e 100644
--- a/tests/wpt/tests/interfaces/webnn.idl
+++ b/tests/wpt/tests/interfaces/webnn.idl
@@ -36,6 +36,8 @@ interface MLContext {
undefined dispatch(MLGraph graph, MLNamedTensors inputs, MLNamedTensors outputs);
Promise<MLTensor> createTensor(MLTensorDescriptor descriptor);
+ Promise<MLTensor> createConstantTensor(
+ MLOperandDescriptor descriptor, AllowSharedBufferSource inputData);
Promise<ArrayBuffer> readTensor(MLTensor tensor);
Promise<undefined> readTensor(MLTensor tensor, AllowSharedBufferSource outputData);
@@ -133,6 +135,7 @@ interface MLTensor {
readonly attribute FrozenArray<unsigned long> shape;
readonly attribute boolean readable;
readonly attribute boolean writable;
+ readonly attribute boolean constant;
undefined destroy();
};
@@ -154,6 +157,9 @@ interface MLGraphBuilder {
// Create a scalar operand from the specified number of the specified type.
MLOperand constant(MLOperandDataType type, MLNumber value);
+ // Create an operand from a specified constant tensor.
+ MLOperand constant(MLTensor tensor);
+
// Compile the graph up to the specified output operands asynchronously.
Promise<MLGraph> build(MLNamedOperands outputs);
};
diff --git a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl
index 9befd640646..7ddbec7cc97 100644
--- a/tests/wpt/tests/interfaces/webxr-depth-sensing.idl
+++ b/tests/wpt/tests/interfaces/webxr-depth-sensing.idl
@@ -34,6 +34,10 @@ partial interface XRSession {
readonly attribute XRDepthUsage depthUsage;
readonly attribute XRDepthDataFormat depthDataFormat;
readonly attribute XRDepthType? depthType;
+ readonly attribute boolean? depthActive;
+
+ undefined pauseDepthSensing();
+ undefined resumeDepthSensing();
};
[SecureContext, Exposed=Window]
@@ -43,9 +47,10 @@ interface XRDepthInformation {
[SameObject] readonly attribute XRRigidTransform normDepthBufferFromNormView;
readonly attribute float rawValueToMeters;
- readonly attribute XRView? view;
};
+XRDepthInformation includes XRViewGeometry;
+
[Exposed=Window]
interface XRCPUDepthInformation : XRDepthInformation {
[SameObject] readonly attribute ArrayBuffer data;
diff --git a/tests/wpt/tests/interfaces/webxr.idl b/tests/wpt/tests/interfaces/webxr.idl
index 1098000d6c2..874994086a2 100644
--- a/tests/wpt/tests/interfaces/webxr.idl
+++ b/tests/wpt/tests/interfaces/webxr.idl
@@ -118,6 +118,11 @@ interface XRBoundedReferenceSpace : XRReferenceSpace {
readonly attribute FrozenArray<DOMPointReadOnly> boundsGeometry;
};
+[SecureContext, Exposed=Window] interface mixin XRViewGeometry {
+ readonly attribute Float32Array projectionMatrix;
+ [SameObject] readonly attribute XRRigidTransform transform;
+};
+
enum XREye {
"none",
"left",
@@ -126,13 +131,13 @@ enum XREye {
[SecureContext, Exposed=Window] interface XRView {
readonly attribute XREye eye;
- readonly attribute Float32Array projectionMatrix;
- [SameObject] readonly attribute XRRigidTransform transform;
readonly attribute double? recommendedViewportScale;
undefined requestViewportScale(double? scale);
};
+XRView includes XRViewGeometry;
+
[SecureContext, Exposed=Window] interface XRViewport {
readonly attribute long x;
readonly attribute long y;
diff --git a/tests/wpt/tests/interfaces/writing-assistance-apis.idl b/tests/wpt/tests/interfaces/writing-assistance-apis.idl
new file mode 100644
index 00000000000..916daee754e
--- /dev/null
+++ b/tests/wpt/tests/interfaces/writing-assistance-apis.idl
@@ -0,0 +1,193 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Writing Assistance APIs (https://webmachinelearning.github.io/writing-assistance-apis/)
+
+[Exposed=Window, SecureContext]
+interface Summarizer {
+ static Promise<Summarizer> create(optional SummarizerCreateOptions options = {});
+ static Promise<Availability> availability(optional SummarizerCreateCoreOptions options = {});
+
+ Promise<DOMString> summarize(
+ DOMString input,
+ optional SummarizerSummarizeOptions options = {}
+ );
+ ReadableStream summarizeStreaming(
+ DOMString input,
+ optional SummarizerSummarizeOptions options = {}
+ );
+
+ readonly attribute DOMString sharedContext;
+ readonly attribute SummarizerType type;
+ readonly attribute SummarizerFormat format;
+ readonly attribute SummarizerLength length;
+
+ readonly attribute FrozenArray<DOMString>? expectedInputLanguages;
+ readonly attribute FrozenArray<DOMString>? expectedContextLanguages;
+ readonly attribute DOMString? outputLanguage;
+
+ Promise<double> measureInputUsage(
+ DOMString input,
+ optional SummarizerSummarizeOptions options = {}
+ );
+ readonly attribute unrestricted double inputQuota;
+};
+Summarizer includes DestroyableModel;
+
+dictionary SummarizerCreateCoreOptions {
+ SummarizerType type = "key-points";
+ SummarizerFormat format = "markdown";
+ SummarizerLength length = "short";
+
+ sequence<DOMString> expectedInputLanguages;
+ sequence<DOMString> expectedContextLanguages;
+ DOMString outputLanguage;
+};
+
+dictionary SummarizerCreateOptions : SummarizerCreateCoreOptions {
+ AbortSignal signal;
+ CreateMonitorCallback monitor;
+
+ DOMString sharedContext;
+};
+
+dictionary SummarizerSummarizeOptions {
+ AbortSignal signal;
+ DOMString context;
+};
+
+enum SummarizerType { "tl;dr", "teaser", "key-points", "headline" };
+enum SummarizerFormat { "plain-text", "markdown" };
+enum SummarizerLength { "short", "medium", "long" };
+
+[Exposed=Window, SecureContext]
+interface Writer {
+ static Promise<Writer> create(optional WriterCreateOptions options = {});
+ static Promise<Availability> availability(optional WriterCreateCoreOptions options = {});
+
+ Promise<DOMString> write(
+ DOMString input,
+ optional WriterWriteOptions options = {}
+ );
+ ReadableStream writeStreaming(
+ DOMString input,
+ optional WriterWriteOptions options = {}
+ );
+
+ readonly attribute DOMString sharedContext;
+ readonly attribute WriterTone tone;
+ readonly attribute WriterFormat format;
+ readonly attribute WriterLength length;
+
+ readonly attribute FrozenArray<DOMString>? expectedInputLanguages;
+ readonly attribute FrozenArray<DOMString>? expectedContextLanguages;
+ readonly attribute DOMString? outputLanguage;
+
+ Promise<double> measureInputUsage(
+ DOMString input,
+ optional WriterWriteOptions options = {}
+ );
+ readonly attribute unrestricted double inputQuota;
+};
+Writer includes DestroyableModel;
+
+dictionary WriterCreateCoreOptions {
+ WriterTone tone = "neutral";
+ WriterFormat format = "markdown";
+ WriterLength length = "short";
+
+ sequence<DOMString> expectedInputLanguages;
+ sequence<DOMString> expectedContextLanguages;
+ DOMString outputLanguage;
+};
+
+dictionary WriterCreateOptions : WriterCreateCoreOptions {
+ AbortSignal signal;
+ CreateMonitorCallback monitor;
+
+ DOMString sharedContext;
+};
+
+dictionary WriterWriteOptions {
+ DOMString context;
+ AbortSignal signal;
+};
+
+enum WriterTone { "formal", "neutral", "casual" };
+enum WriterFormat { "plain-text", "markdown" };
+enum WriterLength { "short", "medium", "long" };
+
+[Exposed=Window, SecureContext]
+interface Rewriter {
+ static Promise<Rewriter> create(optional RewriterCreateOptions options = {});
+ static Promise<Availability> availability(optional RewriterCreateCoreOptions options = {});
+
+ Promise<DOMString> rewrite(
+ DOMString input,
+ optional RewriterRewriteOptions options = {}
+ );
+ ReadableStream rewriteStreaming(
+ DOMString input,
+ optional RewriterRewriteOptions options = {}
+ );
+
+ readonly attribute DOMString sharedContext;
+ readonly attribute RewriterTone tone;
+ readonly attribute RewriterFormat format;
+ readonly attribute RewriterLength length;
+
+ readonly attribute FrozenArray<DOMString>? expectedInputLanguages;
+ readonly attribute FrozenArray<DOMString>? expectedContextLanguages;
+ readonly attribute DOMString? outputLanguage;
+
+ Promise<double> measureInputUsage(
+ DOMString input,
+ optional RewriterRewriteOptions options = {}
+ );
+ readonly attribute unrestricted double inputQuota;
+};
+Rewriter includes DestroyableModel;
+
+dictionary RewriterCreateCoreOptions {
+ RewriterTone tone = "as-is";
+ RewriterFormat format = "as-is";
+ RewriterLength length = "as-is";
+
+ sequence<DOMString> expectedInputLanguages;
+ sequence<DOMString> expectedContextLanguages;
+ DOMString outputLanguage;
+};
+
+dictionary RewriterCreateOptions : RewriterCreateCoreOptions {
+ AbortSignal signal;
+ CreateMonitorCallback monitor;
+
+ DOMString sharedContext;
+};
+
+dictionary RewriterRewriteOptions {
+ DOMString context;
+ AbortSignal signal;
+};
+
+enum RewriterTone { "as-is", "more-formal", "more-casual" };
+enum RewriterFormat { "as-is", "plain-text", "markdown" };
+enum RewriterLength { "as-is", "shorter", "longer" };
+
+[Exposed=Window, SecureContext]
+interface CreateMonitor : EventTarget {
+ attribute EventHandler ondownloadprogress;
+};
+
+callback CreateMonitorCallback = undefined (CreateMonitor monitor);
+
+enum Availability {
+ "unavailable",
+ "downloadable",
+ "downloading",
+ "available"
+};
+
+interface mixin DestroyableModel {
+ undefined destroy();
+};
diff --git a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html
index 714355f5c1c..467cf5d50c7 100644
--- a/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html
+++ b/tests/wpt/tests/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html
@@ -9,8 +9,8 @@
<script src=permission-helper.js></script>
</head>
<body>
- <iframe allow="camera 'src';microphone 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe>
-<iframe allow="camera 'src';microphone 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe>
+ <iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=same src="/mediacapture-streams/iframe-enumerate.html"></iframe>
+<iframe allow="camera 'src';microphone 'src';speaker-selection 'src'" id=cross src="https://{{hosts[][www1]}}:{{ports[https][0]}}/mediacapture-streams/iframe-enumerate.html"></iframe>
<script>
let deviceList;
diff --git a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html
index 856f2ce37ce..1af16659326 100644
--- a/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html
+++ b/tests/wpt/tests/pointerevents/pointerevent_pointerout_no_pointer_movement.html
@@ -1,85 +1,62 @@
<!doctype html>
-<html>
-<head>
-<title>The pointerout event should not be fired if the pointer doesn't move</title>
+<title>
+ Layout change under a stationary pointer fires boundary events and no pointermove event
+</title>
<meta name="viewport" content="width=device-width">
-<link rel="help" href="https://github.com/w3c/pointerevents/issues/457">
+<link rel="help"
+ href="https://w3c.github.io/pointerevents/#boundary-events-caused-by-layout-changes">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
+<script src="pointerevent_support.js"></script>
<style>
-#target{
- width:100px;
- height:100px;
- background-color:red;
-}
-
-#overlay{
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- background-color: rgba(0,0,0,0.2);
- z-index: 1000;
- text-align: center;
- display:none;
-}
+ div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 50px;
+ height: 50px;
+ }
+
+ #overlay {
+ z-index: 1000;
+ display: none;
+ }
</style>
-</head>
-<body>
-<h1>The pointerout event should not be fired if the pointer doesn't move</h1>
-<h4>
- Test Description: This test checks if the pointerout event dispatched unexpectedly.
- <ol>
- <li>Click on the black rectangle.
- <li>Don't move mouse after clicking.
- </ol>
-</h4>
-<p>
<div id="target"></div>
<div id="overlay"></div>
-<div id="log"></div>
<script>
-function waitForAnimationFrame() {
- return new Promise(resolve => {
- requestAnimationFrame(() => {
- requestAnimationFrame(resolve);
- });
- });
-}
+ "use strict";
-promise_test(async () => {
const target = document.getElementById("target");
+ const overlay = document.getElementById("overlay");
- let out_event_count = 0;
- target.addEventListener("pointerout", function() {
- out_event_count++;
- });
+ let logging_active = false;
+ let num_pointermoves = 0;
- // Wait for the click event on target element and update display style on
- // overlay element.
- const promise = new Promise(resolve => {
- target.addEventListener("click", async function() {
- const overlay = document.getElementById("overlay");
- overlay.style.display= 'block';
- await waitForAnimationFrame();
+ target.addEventListener("click", () => logging_active = true);
+ target.addEventListener("pointermove", () => {
+ if (logging_active) num_pointermoves++;
+ });
- overlay.style.display= 'none'
- await waitForAnimationFrame();
+ promise_test(async t => {
+ await test_driver.click(target);
- resolve();
- }, { once: true });
- });
+ let pointerout_promise = getEvent("pointerout", target);
+ overlay.style.display = "block";
+ await pointerout_promise;
- // Click target.
- test_driver.click(target);
- await promise;
+ let pointerover_promise = getEvent("pointerover", target);
+ overlay.style.display = "none";
+ await waitForAnimationFrames(2);
+ // Why does Chrome time out at the next line w/o the redundant wait above?
+ // Does chrome require something to request a main frame in order to detect
+ // the new pointer target after the style update to generate the event?
+ // https://crbug.com/413595088
+ await pointerover_promise;
- assert_equals(out_event_count, 0, "The pointerout event should not be fired");
-}, "The pointerout event should not be fired if the pointer doesn't move");
+ assert_equals(num_pointermoves, 0, "no pointermove events are expected");
+ }, "Layout change under a stationary pointer fires boundary events and no pointermove event");
</script>
-</body>
-</html>
diff --git a/tests/wpt/tests/resources/chromium/webxr-test.js b/tests/wpt/tests/resources/chromium/webxr-test.js
index 0885b559e63..ce2503b1bbc 100644
--- a/tests/wpt/tests/resources/chromium/webxr-test.js
+++ b/tests/wpt/tests/resources/chromium/webxr-test.js
@@ -757,30 +757,34 @@ class MockRuntime {
const viewport_size = 20;
return [{
eye: vrMojom.XREye.kLeft,
- fieldOfView: {
- upDegrees: 48.316,
- downDegrees: 50.099,
- leftDegrees: 50.899,
- rightDegrees: 35.197
+ geometry: {
+ fieldOfView: {
+ upDegrees: 48.316,
+ downDegrees: 50.099,
+ leftDegrees: 50.899,
+ rightDegrees: 35.197
+ },
+ mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
+ position: [-0.032, 0, 0],
+ orientation: [0, 0, 0, 1]
+ }))
},
- mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
- position: [-0.032, 0, 0],
- orientation: [0, 0, 0, 1]
- })),
viewport: { x: 0, y: 0, width: viewport_size, height: viewport_size }
},
{
eye: vrMojom.XREye.kRight,
- fieldOfView: {
- upDegrees: 48.316,
- downDegrees: 50.099,
- leftDegrees: 50.899,
- rightDegrees: 35.197
+ geometry: {
+ fieldOfView: {
+ upDegrees: 48.316,
+ downDegrees: 50.099,
+ leftDegrees: 50.899,
+ rightDegrees: 35.197
+ },
+ mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
+ position: [0.032, 0, 0],
+ orientation: [0, 0, 0, 1]
+ }))
},
- mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform({
- position: [0.032, 0, 0],
- orientation: [0, 0, 0, 1]
- })),
viewport: { x: viewport_size, y: 0, width: viewport_size, height: viewport_size }
}];
}
@@ -835,13 +839,15 @@ class MockRuntime {
return {
eye: viewEye,
- fieldOfView: fov,
- mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset)),
+ geometry: {
+ fieldOfView: fov,
+ mojoFromView: this._getMojoFromViewerWithOffset(composeGFXTransform(fakeXRViewInit.viewOffset))
+ },
viewport: {
x: xOffset,
- y: 0,
- width: fakeXRViewInit.resolution.width,
- height: fakeXRViewInit.resolution.height
+ y: 0,
+ width: fakeXRViewInit.resolution.width,
+ height: fakeXRViewInit.resolution.height
},
isFirstPersonObserver: fakeXRViewInit.isFirstPersonObserver ? true : false,
viewOffset: composeGFXTransform(fakeXRViewInit.viewOffset)
@@ -915,12 +921,12 @@ class MockRuntime {
let frame_views = this.primaryViews_;
for (let i = 0; i < this.primaryViews_.length; i++) {
- this.primaryViews_[i].mojoFromView =
+ this.primaryViews_[i].geometry.mojoFromView =
this._getMojoFromViewerWithOffset(this.primaryViews_[i].viewOffset);
}
if (this.enabledFeatures_.includes(xrSessionMojom.XRSessionFeature.SECONDARY_VIEWS)) {
for (let i = 0; i < this.secondaryViews_.length; i++) {
- this.secondaryViews_[i].mojoFromView =
+ this.secondaryViews_[i].geometry.mojoFromView =
this._getMojoFromViewerWithOffset(this.secondaryViews_[i].viewOffset);
}
diff --git a/tests/wpt/tests/resources/testdriver.js b/tests/wpt/tests/resources/testdriver.js
index f127e2b2c8d..6e8410b7ea4 100644
--- a/tests/wpt/tests/resources/testdriver.js
+++ b/tests/wpt/tests/resources/testdriver.js
@@ -254,12 +254,57 @@
}
},
/**
- * `log <https://w3c.github.io/webdriver-bidi/#module-log>`_ module.
+ * `emulation <https://www.w3.org/TR/webdriver-bidi/#module-emulation>`_ module.
+ */
+ emulation: {
+ /**
+ * Overrides the geolocation coordinates for the specified
+ * browsing contexts.
+ * Matches the `emulation.setGeolocationOverride
+ * <https://w3c.github.io/webdriver-bidi/#command-emulation-setGeolocationOverride>`_
+ * WebDriver BiDi command.
+ *
+ * @example
+ * await test_driver.bidi.emulation.set_geolocation_override({
+ * coordinates: {
+ * latitude: 52.51,
+ * longitude: 13.39,
+ * accuracy: 0.5,
+ * altitude: 34,
+ * altitudeAccuracy: 0.75,
+ * heading: 180,
+ * speed: 2.77
+ * }
+ * });
+ *
+ * @param {object} params - Parameters for the command.
+ * @param {null|object} params.coordinates - The optional
+ * geolocation coordinates to set. Matches the
+ * `emulation.GeolocationCoordinates <https://w3c.github.io/webdriver-bidi/#type-emulation-GeolocationCoordinates>`_
+ * value. If null or omitted, the emulation will be removed.
+ * @param {null|Array.<(Context)>} [params.contexts] The
+ * optional contexts parameter specifies which browsing contexts
+ * to set the geolocation override on. It should be either an
+ * array of Context objects (window or browsing context id), or
+ * null. If null or omitted, the override will be set on the
+ * current browsing context.
+ * @returns {Promise<void>} Resolves when the geolocation
+ * override is successfully set.
+ */
+ set_geolocation_override: function (params) {
+ // Ensure the bidi feature is enabled before calling the internal method
+ assertBidiIsEnabled();
+ return window.test_driver_internal.bidi.emulation.set_geolocation_override(
+ params);
+ },
+ },
+ /**
+ * `log <https://www.w3.org/TR/webdriver-bidi/#module-log>`_ module.
*/
log: {
entry_added: {
/**
- * @typedef {object} LogEntryAdded `log.entryAdded <https://w3c.github.io/webdriver-bidi/#event-log-entryAdded>`_ event.
+ * @typedef {object} LogEntryAdded `log.entryAdded <https://www.w3.org/TR/webdriver-bidi/#event-log-entryAdded>`_ event.
*/
/**
@@ -1576,6 +1621,12 @@
}
}
},
+ emulation: {
+ set_geolocation_override: function (params) {
+ throw new Error(
+ "bidi.emulation.set_geolocation_override is not implemented by testdriver-vendor.js");
+ }
+ },
log: {
entry_added: {
async subscribe() {
diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html
index f741cc634d7..323d984c989 100644
--- a/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html
+++ b/tests/wpt/tests/scroll-animations/scroll-timelines/animation-with-transform.html
@@ -21,7 +21,7 @@
}
#scroller {
- overflow: auto;
+ overflow: hidden;
height: 100px;
width: 100px;
will-change: transform; /* force compositing */
diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html
index ed8e8337a65..28973d2d185 100644
--- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html
+++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline-cancel-one.html
@@ -22,7 +22,7 @@
}
#scroller {
- overflow: auto;
+ overflow: hidden;
height: 100px;
width: 100px;
will-change: transform; /* force compositing */
diff --git a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html
index de50599fbaf..45ba3f99ccd 100644
--- a/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html
+++ b/tests/wpt/tests/scroll-animations/scroll-timelines/two-animations-attach-to-same-scroll-timeline.html
@@ -22,7 +22,7 @@ drive two animations">
}
#scroller {
- overflow: auto;
+ overflow: hidden;
height: 100px;
width: 100px;
will-change: transform; /* force compositing */
diff --git a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html
index d75f30e664e..cdd2e0be40c 100644
--- a/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html
+++ b/tests/wpt/tests/scroll-animations/view-timelines/fieldset-source.html
@@ -87,7 +87,7 @@
parseFloat(getComputedStyle(fieldset).borderBottom);
// Validate the start and end offsets for each view timeline.
- anims.forEach(async (anim) => {
+ for (let anim of anims) {
assert_equals(anim.timeline.source.id, 'fieldset');
assert_equals(anim.timeline.subject.tagName, 'INPUT');
const bounds = anim.effect.target.getBoundingClientRect();
@@ -96,13 +96,13 @@
const expectedEndOffset = bounds.bottom - fieldsetContentTop;
assert_approx_equals(
parseFloat(anim.timeline.startOffset),
- expectedStartOffset, 0.1,
+ expectedStartOffset, 0.5,
`Unexpected start offset for ${anim.effect.target.id}`);
assert_approx_equals(
parseFloat(anim.timeline.endOffset),
- expectedEndOffset, 0.1,
+ expectedEndOffset, 0.5,
`Unexpected end offset for ${anim.effect.target.id}`);
- });
+ };
}, 'Fieldset is a valid source for a view timeline');
}
diff --git a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
index a4a5f372838..5ab144b05ed 100644
--- a/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
+++ b/tests/wpt/tests/shadow-dom/reference-target/tentative/form.html
@@ -9,6 +9,13 @@
</head>
<body>
+ <div>
+ <template shadowrootmode="open">
+ <!-- This button shouldn't link to the real form in fancy-form-1 as it's in a different tree scope -->
+ <button id="button-in-shadow" form="fancy-form-1"></button>
+ </template>
+ </div>
+
<button id="reset-button-1" type="reset" form="fancy-form-1"></button>
<fancy-form-1 id="fancy-form-1">
<template shadowrootmode="open" shadowrootreferencetarget="real-form">
@@ -44,6 +51,9 @@
input.value = "new value";
const resetButton = document.getElementById(resetButtonId);
+ assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements.");
+ assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
assert_equals(input.value, "new value", "The input value should be updated to the new value.");
resetButton.click();
assert_equals(input.value, "default value", "The input value should be reset to the default value.");
@@ -56,5 +66,107 @@
document.getElementById('reset-button-3').setAttribute('form', "fancy-form-3");
testFormWithReferenceTarget('fancy-form-3', 'reset-button-3', "Reference target works with setAttribute('form')");
</script>
+
+ <form-associated-custom-button id="custom-button" form="fancy-form-4"></form-associated-custom-button>
+ <fancy-form-4 id="fancy-form-4">
+ <template shadowrootmode="open" shadowrootreferencetarget="real-form">
+ <form id="real-form">
+ <input type="text" value="default value">
+ <!-- The internal button of the custom button below shouldn't be associated with real-form -->
+ <form-associated-custom-button id="custom-button-in-shadow"></form-associated-custom-button>
+ </form>
+ </template>
+ </fancy-form-4>
+ <script>
+ class FormAssociatedCustomButton extends HTMLElement {
+ static formAssociated = true;
+ constructor() {
+ super();
+ this.internals_ = this.attachInternals();
+ const shadow = this.attachShadow({ mode: 'open' });
+ shadow.innerHTML = `<button>fancy button</button>`;
+ }
+ }
+ window.customElements.define("form-associated-custom-button", FormAssociatedCustomButton);
+ test(function () {
+ const customElement = document.getElementById("custom-button");
+ const fancyForm = document.getElementById("fancy-form-4");
+ const realForm = fancyForm.shadowRoot.getElementById("real-form");
+ const customElementInShadow = fancyForm.shadowRoot.getElementById("custom-button-in-shadow");
+ const input = realForm.firstElementChild;
+
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
+ assert_equals(realForm.elements[2], customElementInShadow, "The 3rd element should be the custom element inside the real form.");
+
+ // Swap the input and the custom element in real-form.
+ realForm.moveBefore(customElementInShadow, input);
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ assert_equals(realForm.elements[0], customElement, "The first element should be the form-associated custom element.");
+ assert_equals(realForm.elements[1], customElementInShadow, "The 2nd element should be the custom element inside the real form.");
+ assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form.");
+
+ // Swap the referencing element and the fancy form
+ customElement.parentNode.moveBefore(fancyForm, customElement);
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ assert_equals(realForm.elements[0], customElementInShadow, "The first element should be the custom element inside the real form.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
+ assert_equals(realForm.elements[2], customElement, "The 3rd element should be the form-associated custom element.");
+ }, "Reference target works with form-associated custom element.");
+ </script>
+
+ <button id="reset-button-5" type="reset" form="fancy-form-5"></button>
+ <fancy-form-5 id="fancy-form-5">
+ <template shadowrootmode="open" shadowrootreferencetarget="nested-element">
+ <nested-element id="nested-element">
+ <template shadowrootmode="open" shadowrootreferencetarget="real-form">
+ <form id="real-form">
+ <input type="text" value="default value">
+ </form>
+ </template>
+ </nested-element>
+ <button id="button-in-shadow" form="nested-element"></button>
+ <div>
+ <template shadowrootmode="open">
+ <!-- This button shouldn't link to the real form in nested-element as it's in a different tree scope -->
+ <button id="button-in-different-shadow" form="nested-element"></button>
+ </template>
+ </div>
+ </template>
+ </fancy-form-5>
+ <script>
+ test(function () {
+ const fancyForm = document.getElementById("fancy-form-5");
+ const nestedElement = fancyForm.shadowRoot.getElementById("nested-element");
+ const buttonInShadow = fancyForm.shadowRoot.getElementById("button-in-shadow");
+ const realForm = nestedElement.shadowRoot.getElementById("real-form");
+ const input = realForm.firstElementChild;
+
+ input.value = "new value";
+ const resetButton = document.getElementById("reset-button-5");
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements.");
+ // The elements in .elements property should be in tree order (preorder, depth-first).
+ assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element.");
+ assert_equals(realForm.elements[1], input, "The 2nd element should be the input inside the real form.");
+ assert_equals(realForm.elements[2], buttonInShadow, "The 3rd element should be the button in the shadow dom.");
+ assert_equals(input.value, "new value", "The input value should be updated to the new value.");
+ resetButton.click();
+ assert_equals(input.value, "default value", "The input value should be reset to the default value.");
+
+ // Remove the button that's using reference target in the 1st level shadow.
+ buttonInShadow.remove();
+ assert_equals(realForm.elements.length, 2, "The .elements property should have 2 elements after removing the button.");
+
+ // Add a new button using reference target in the 1st level shadow.
+ const newButtonInShadow = document.createElement("button");
+ newButtonInShadow.setAttribute("form", "nested-element");
+ nestedElement.parentNode.insertBefore(newButtonInShadow, nestedElement);
+ assert_equals(realForm.elements.length, 3, "The .elements property should have 3 elements after a new button is inserted.");
+ assert_equals(realForm.elements[0], resetButton, "The first element should be the referencing element.");
+ assert_equals(realForm.elements[1], newButtonInShadow, "The 2nd element should be the button in the shadow dom.");
+ assert_equals(realForm.elements[2], input, "The 3rd element should be the input inside the real form.");
+ }, "Reference target works with nested shadow trees.");
+ </script>
</body>
</html>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html
deleted file mode 100644
index c5796e48b76..00000000000
--- a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/common/dispatcher/dispatcher.js"></script>
-<script src="/common/utils.js"></script>
-<script src="../resources/utils.js"></script>
-<script src="resources/utils.sub.js"></script>
-<script>
- setup(() => assertSpeculationRulesIsSupported());
-
- promise_test(async t => {
- let agent = await spawnWindow(t, { protocol: 'https' });
- let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
- await agent.forceSinglePrefetch(nextUrl);
-
- // Open new window with url to clear cache data through Clear-Site-Data header.
- // Ensure that the cache is cleared before the navigation.
- const gotMessage = new Promise(resolve => {
- window.addEventListener('message', e => {
- resolve(e.data);
- }, {
- once: true
- });
- });
- let cache_helper = "cache_helper=" + token() + "&";
- window.open("../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all"); await gotMessage;
- await gotMessage;
-
- await agent.navigate(nextUrl);
- // Because Clear-Site-Data response header is sent, prefetches are expected
- // to be evicted.
- // The navigation to nextURL is not expected to use the prefetch cache.
- assert_not_prefetched(await agent.getRequestHeaders());
- }, "clear-site-data cache headers should prevent it from being fetched");
-</script>
diff --git a/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html
new file mode 100644
index 00000000000..48f6264e852
--- /dev/null
+++ b/tests/wpt/tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.tentative.https.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<!--
+This file is marked as "tentative" until:
+* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and
+ https://github.com/WICG/nav-speculation/issues/357 is added to the specification.
+-->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/common/utils.js"></script>
+<script src="../resources/utils.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script>
+ setup(() => assertSpeculationRulesIsSupported());
+
+ // Test that Clear-Site-Data header value "prefetchCache" clears prefetch cache
+ promise_test(async t => {
+ let agent = await spawnWindow(t, { protocol: 'https' });
+ let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
+ await agent.forceSinglePrefetch(nextUrl);
+
+ // Open new window with url to clear cache data through Clear-Site-Data header.
+ // Ensure that the cache is cleared before the navigation.
+ const gotMessage = new Promise(resolve => {
+ window.addEventListener('message', e => {
+ resolve(e.data);
+ }, {
+ once: true
+ });
+ });
+ window.open("/../../clear-site-data/support/clear-site-data-prefetchCache.py");
+ await gotMessage;
+
+ await agent.navigate(nextUrl);
+ // Because Clear-Site-Data response header is sent, prefetches are expected
+ // to be evicted.
+ // The navigation to nextURL is not expected to use the prefetch cache.
+ assert_not_prefetched(await agent.getRequestHeaders());
+ }, "clear-site-data prefetchCache headers should prevent it from being fetched");
+
+ // Test that Clear-Site-Data header value "cache" clears prefetch cache
+ promise_test(async t => {
+ let agent = await spawnWindow(t, { protocol: 'https' });
+ let nextUrl = agent.getExecutorURL({protocol: 'https', page: 2 });
+ await agent.forceSinglePrefetch(nextUrl);
+
+ // Open new window with url to clear cache data through Clear-Site-Data header.
+ // Ensure that the cache is cleared before the navigation.
+ const gotMessage = new Promise(resolve => {
+ window.addEventListener('message', e => {
+ resolve(e.data);
+ }, {
+ once: true
+ });
+ });
+ let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
+ window.open("/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
+ await gotMessage;
+
+ await agent.navigate(nextUrl);
+ // Because Clear-Site-Data response header is sent, prefetches are expected
+ // to be evicted.
+ // The navigation to nextURL is not expected to use the prefetch cache.
+ assert_not_prefetched(await agent.getRequestHeaders());
+ }, "clear-site-data cache headers should prevent it from being fetched");
+</script>
diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html
index 34b77f8bc47..db52e758750 100644
--- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.https.html
+++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-different-origins.tentative.https.html
@@ -1,4 +1,9 @@
<!DOCTYPE html>
+<!--
+This file is marked as "tentative" until:
+* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and
+ https://github.com/WICG/nav-speculation/issues/357 is added to the specification.
+-->
<title>clear-site-data-cache cancels prerenders</title>
<meta name="timeout" content="long">
<body>
@@ -40,8 +45,7 @@ promise_test(async t => {
once: true
});
});
- let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
- window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
+ window.open(differentOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py");
await gotMessage;
// Because Clear-Site-Data response header is sent on a different origin than
diff --git a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html
index cb253d45eaa..23d862c5130 100644
--- a/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.https.html
+++ b/tests/wpt/tests/speculation-rules/prerender/cancel-prerendering-after-clear-site-data-cache-same-origin.tentative.https.html
@@ -1,4 +1,9 @@
<!DOCTYPE html>
+<!--
+This file is marked as "tentative" until:
+* The feature flag ClearSiteDataPrefetchPrerenderCache is enabled and
+ https://github.com/WICG/nav-speculation/issues/357 is added to the specification.
+-->
<title>clear-site-data-cache cancels prerenders</title>
<meta name="timeout" content="long">
<body>
@@ -13,6 +18,41 @@
<script>
setup(() => assertSpeculationRulesIsSupported());
+// Test that Clear-Site-Data header value "prerenderCache" clears prerender cache
+promise_test(async t => {
+
+ const rcHelper = new RemoteContextHelper();
+ const referrerRC = await rcHelper.addWindow({
+ origin: 'HTTPS_ORIGIN'
+ }, {
+ features: 'noopener'
+ });
+ const prerenderedRC = await addPrerenderRC(referrerRC, {
+ origin: 'HTTPS_ORIGIN'
+ });
+
+ const sameOrigin = get_host_info().HTTPS_ORIGIN;
+
+ // Open new window with url to clear cache data through Clear-Site-Data header.
+ // Ensure that the cache is cleared before the navigation.
+ const gotMessage = new Promise(resolve => {
+ window.addEventListener('message', e => {
+ resolve(e.data);
+ }, {
+ once: true
+ });
+ });
+ window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-prerenderCache.py");
+ await gotMessage;
+
+ // Because Clear-Site-Data response header is sent, the existing prerender
+ // is expected to be canceled.
+ // And the navigation is expected to create another page instead of activation.
+ referrerRC.navigateTo(prerenderedRC.url);
+ assert_equals(await getActivationStart(prerenderedRC), 0);
+}, "clear-site-data prerenderCache headers should prevent it from being activated");
+
+// Test that Clear-Site-Data header value "cache" clears prerender cache
promise_test(async t => {
const rcHelper = new RemoteContextHelper();
@@ -37,7 +77,7 @@ promise_test(async t => {
});
});
let cache_helper = "cache_helper=" + self.crypto.randomUUID() + "&";
- new_window = window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
+ window.open(sameOrigin + "/../../clear-site-data/support/clear-site-data-cache.py?" + cache_helper + "response=single_html&cache&clear_first=all");
await gotMessage;
// Because Clear-Site-Data response header is sent, the existing prerender
@@ -45,7 +85,7 @@ promise_test(async t => {
// And the navigation is expected to create another page instead of activation.
referrerRC.navigateTo(prerenderedRC.url);
assert_equals(await getActivationStart(prerenderedRC), 0);
-});
+}, "clear-site-data cache headers should prevent it from being activated");
</script>
</body>
</html>
diff --git a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
index b2ba5cd4c27..cf10f7f2e83 100644
--- a/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
+++ b/tests/wpt/tests/streams/readable-streams/crashtests/garbage-collection.any.js
@@ -4,12 +4,64 @@
// See https://crbug.com/335506658 for details.
promise_test(async () => {
- let closed = new ReadableStream({
- pull(controller) {
- controller.enqueue('is there anybody in there?');
- }
- }).getReader().closed;
- // 3 GCs are actually required to trigger the bug at time of writing.
- for (let i = 0; i < 5; ++i)
- await garbageCollect();
+ const closed = new ReadableStream({
+ pull(controller) {
+ controller.enqueue('is there anybody in there?');
+ }
+ }).getReader().closed;
+ // 3 GCs are actually required to trigger the bug at time of writing.
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
}, 'Garbage-collecting a stream along with its reader should not crash');
+
+
+// See https://crbug.com/390646657 for details.
+promise_test(async () => {
+ const written = new WritableStream({
+ write(chunk) {
+ return new Promise(resolve => {});
+ }
+ }).getWriter().write('just nod if you can hear me');
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer with a pending write should not crash');
+
+
+promise_test(async () => {
+ const closed = new WritableStream({
+ write(chunk) { }
+ }).getWriter().closed;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer should not crash with closed promise is retained');
+
+promise_test(async () => {
+ const ready = new WritableStream({
+ write(chunk) { }
+ }, {highWaterMark: 0}).getWriter().ready;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream writer should not crash when backpressure is being applied');
+
+promise_test(async () => {
+ let reader = new ReadableStream({
+ pull() { }
+ }).getReader();
+ const promise = reader.read();
+ reader = null;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream with a pending read should not crash');
+
+promise_test(async () => {
+ let reader = new ReadableStream({
+ type: "bytes",
+ pull() { return new Promise(resolve => {}); }
+ }).getReader({mode: "byob"});
+ const promise = reader.read(new Uint8Array(42));
+ reader = null;
+ for (let i = 0; i < 5; ++i)
+ await garbageCollect();
+}, 'Garbage-collecting a stream with a pending BYOB read should not crash');
+
+
diff --git a/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html
new file mode 100644
index 00000000000..b083538a8b8
--- /dev/null
+++ b/tests/wpt/tests/svg/embedded/attr-image-fetchpriority.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Fetch Priority - SVG Image element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<svg>
+<image id=image1 fetchpriority="high"/>
+<image id=image2 fetchpriority="low"/>
+<image id=image3 fetchpriority="auto"/>
+<image id=image4 fetchpriority="xyz"/>
+<image id=image5 />
+</svg>
+
+<script>
+ test(() => {
+ assert_equals(image1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the image element");
+ assert_equals(image2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the image element");
+ assert_equals(image3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the image element");
+ assert_equals(image4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the image element");
+ assert_equals(image5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the image element");
+ }, "fetchpriority attribute on <image> elements should reflect valid IDL values");
+
+ test(() => {
+ const image = document.createElementNS("http://www.w3.org/2000/svg", "image");
+ assert_equals(image.fetchPriority, "auto");
+ }, "default fetchpriority attribute on <image> elements should be 'auto'");
+</script>
diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html
new file mode 100644
index 00000000000..25765c5b93e
--- /dev/null
+++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-01.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tabbing through Non-Rendered SVG elements</title>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<svg xmlns="http://www.w3.org/2000/svg">
+ <text tabindex='1' id="start" x="10" y="10">start</text>
+ <g x="30" y="10" style="display: none;">
+ <text tabindex='2' id="middle" x="30" y="10">middle</text>
+ </g>
+ <text tabindex='3' id="end" x="50" y="10">end</text>
+</svg>
+
+<script>
+ promise_test(async t => {
+ const start = document.getElementById('start');
+ const end = document.getElementById('end');
+
+ start.focus();
+ assert_equals(document.activeElement, start, "Start element should be focused initially");
+
+ // Simulate pressing the Tab key
+ await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab
+
+ // Verify that the focus moved to the end element and middle element is skipped
+ assert_equals(document.activeElement, end, "End element should be focused after pressing Tab");
+ }, "Hidden SVG Tab focus test");
+</script>
diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html
new file mode 100644
index 00000000000..fd9fd34275d
--- /dev/null
+++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-02.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tabbing through Non-Rendered SVG elements</title>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<svg xmlns="http://www.w3.org/2000/svg">
+ <a href="#void" id="start">
+ <text tabindex='-1' x="10" y="10">start</text>
+ </a>
+ <g x="30" y="10" style="display: none;">
+ <a href="#void" id="middle">
+ <text tabindex='-1' x="30" y="10">middle</text>
+ </a>
+ </g>
+ <a href="#void" id="end">
+ <text tabindex='-1' x="50" y="10">end</text>
+ </a>
+</svg>
+
+<script>
+ promise_test(async t => {
+ const start = document.getElementById('start');
+ const end = document.getElementById('end');
+
+ start.focus();
+ assert_equals(document.activeElement, start, "Start element should be focused initially");
+
+ // Simulate pressing the Tab key
+ await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab
+
+ // Verify that the focus moved to the end element and middle element is skipped
+ assert_equals(document.activeElement, end, "End element should be focused after pressing Tab");
+ }, "Hidden SVG Tab focus test");
+</script>
diff --git a/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html
new file mode 100644
index 00000000000..097cff57b5a
--- /dev/null
+++ b/tests/wpt/tests/svg/interact/focus-inside-hidden-svg-containers-03.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tabbing through Non-Rendered SVG elements</title>
+<link rel="author" title="Divyansh Mangal" href="mailto:dmangal@microsoft.com">
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#interact-Focus">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<svg xmlns="http://www.w3.org/2000/svg">
+ <text tabindex='1' id="start" x="10" y="10">start</text>
+ <defs>
+ <text tabindex='2' id="middle" x="30" y="10">middle</text>
+ </defs>
+ <text tabindex='3' id="end" x="50" y="10">end</text>
+</svg>
+
+<script>
+ promise_test(async t => {
+ const start = document.getElementById('start');
+ const end = document.getElementById('end');
+
+ start.focus();
+ assert_equals(document.activeElement, start, "Start element should be focused initially");
+
+ // Simulate pressing the Tab key
+ await test_driver.send_keys(start, '\uE004'); // '\uE004' is the WebDriver key code for Tab
+
+ // Verify that the focus moved to the end element and middle element is skipped
+ assert_equals(document.activeElement, end, "End element should be focused after pressing Tab");
+ }, "Hidden SVG Tab focus test");
+</script>
diff --git a/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html
new file mode 100644
index 00000000000..2f73e1e59a8
--- /dev/null
+++ b/tests/wpt/tests/svg/scripted/attr-script-fetchpriority.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Fetch Priority - SVG Script element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<svg>
+<script id=script1 href="resources/script.js" fetchpriority="high"></script>
+<script id=script2 href="resources/script.js" fetchpriority="low"></script>
+<script id=script3 href="resources/script.js" fetchpriority="auto"></script>
+<script id=script4 href="resources/script.js" fetchpriority="xyz"></script>
+<script id=script5 href="resources/script.js"></script>
+</svg>
+
+<script>
+ test(() => {
+ assert_equals(script1.fetchPriority, "high", "high fetchPriority is a valid IDL value on the script element");
+ assert_equals(script2.fetchPriority, "low", "low fetchPriority is a valid IDL value on the script element");
+ assert_equals(script3.fetchPriority, "auto", "auto fetchPriority is a valid IDL value on the script element");
+ assert_equals(script4.fetchPriority, "auto", "invalid fetchPriority reflects as 'auto' IDL attribute on the script element");
+ assert_equals(script5.fetchPriority, "auto", "missing fetchPriority reflects as 'auto' IDL attribute on the script element");
+ }, "fetchpriority attribute on SVG <script> elements should reflect valid IDL values");
+
+ test(() => {
+ const script = document.createElementNS("http://www.w3.org/2000/svg", "script");
+ assert_equals(script.fetchPriority, "auto");
+ }, "default fetchpriority attribute on SVG <script> elements should be 'auto'");
+</script>
diff --git a/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html
new file mode 100644
index 00000000000..9fe97b12d77
--- /dev/null
+++ b/tests/wpt/tests/svg/styling/cx-sibling-index-crash.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<title>SVG Test: sibling-index() as cx property value should not crash</title>
+<link rel="help" href="https://crbug.com/407890255">
+<style>circle { cx: sibling-index(); }</style>
+<p>Pass if loading this page does not crash</p>
diff --git a/tests/wpt/tests/tools/ci/requirements_tc.txt b/tests/wpt/tests/tools/ci/requirements_tc.txt
index cb4ba194778..ada75c2f761 100644
--- a/tests/wpt/tests/tools/ci/requirements_tc.txt
+++ b/tests/wpt/tests/tools/ci/requirements_tc.txt
@@ -1,4 +1,4 @@
pygithub==2.6.1
pyyaml==6.0.1
requests==2.32.3
-taskcluster==83.5.6
+taskcluster==83.5.8
diff --git a/tests/wpt/tests/tools/requirements_tests.txt b/tests/wpt/tests/tools/requirements_tests.txt
index 833fdb3b876..ca00b8f1f98 100644
--- a/tests/wpt/tests/tools/requirements_tests.txt
+++ b/tests/wpt/tests/tools/requirements_tests.txt
@@ -2,5 +2,5 @@ httpx[http2]==0.27.2
json-e==4.7.0
jsonschema==4.17.3
pyyaml==6.0.1
-taskcluster==83.5.6
+taskcluster==83.5.8
mozterm==1.0.0
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
index 71187ee76d7..9925a4b511d 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/asyncactions.py
@@ -87,6 +87,34 @@ class BidiBluetoothSimulatePreconnectedPeripheralAction:
return await self.protocol.bidi_bluetooth.simulate_preconnected_peripheral(
context, address, name, manufacturer_data, known_service_uuids)
+
+class BidiEmulationSetGeolocationOverrideAction:
+ name = "bidi.emulation.set_geolocation_override"
+
+ def __init__(self, logger, protocol):
+ do_delayed_imports()
+ self.logger = logger
+ self.protocol = protocol
+
+ async def __call__(self, payload):
+ coordinates = payload['coordinates']
+ contexts = []
+ for context in payload["contexts"]:
+ # Context can be either a browsing context id, or a BiDi serialized window. In the latter case, the
+ # value is extracted from the serialized object.
+ if isinstance(context, str):
+ contexts.append(context)
+ elif isinstance(context, webdriver.bidi.protocol.BidiWindow):
+ contexts.append(context.browsing_context)
+ else:
+ raise ValueError("Unexpected context type: %s" % context)
+ if len(contexts) == 0:
+ raise ValueError("At least one context must be provided")
+
+ return await self.protocol.bidi_emulation.set_geolocation_override(
+ coordinates, contexts)
+
+
class BidiSessionSubscribeAction:
name = "bidi.session.subscribe"
@@ -133,5 +161,6 @@ async_actions = [
BidiBluetoothHandleRequestDevicePrompt,
BidiBluetoothSimulateAdapterAction,
BidiBluetoothSimulatePreconnectedPeripheralAction,
+ BidiEmulationSetGeolocationOverrideAction,
BidiPermissionsSetPermissionAction,
BidiSessionSubscribeAction]
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index 123c89c98b2..87403c2944d 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -39,6 +39,7 @@ from .protocol import (BaseProtocolPart,
VirtualSensorProtocolPart,
BidiBluetoothProtocolPart,
BidiBrowsingContextProtocolPart,
+ BidiEmulationProtocolPart,
BidiEventsProtocolPart,
BidiPermissionsProtocolPart,
BidiScriptProtocolPart,
@@ -263,6 +264,19 @@ class WebDriverBidiScriptProtocolPart(BidiScriptProtocolPart):
await_promise=True)
+class WebDriverBidiEmulationProtocolPart(BidiEmulationProtocolPart):
+ def __init__(self, parent):
+ super().__init__(parent)
+ self.webdriver = None
+
+ def setup(self):
+ self.webdriver = self.parent.webdriver
+
+ async def set_geolocation_override(self, coordinates, contexts):
+ return await self.webdriver.bidi_session.emulation.set_geolocation_override(
+ coordinates=coordinates, contexts=contexts)
+
+
class WebDriverBidiPermissionsProtocolPart(BidiPermissionsProtocolPart):
def __init__(self, parent):
super().__init__(parent)
@@ -810,6 +824,7 @@ class WebDriverBidiProtocol(WebDriverProtocol):
enable_bidi = True
implements = [WebDriverBidiBluetoothProtocolPart,
WebDriverBidiBrowsingContextProtocolPart,
+ WebDriverBidiEmulationProtocolPart,
WebDriverBidiEventsProtocolPart,
WebDriverBidiPermissionsProtocolPart,
WebDriverBidiScriptProtocolPart,
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
index 7630fe1f358..833dff45636 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/executors/protocol.py
@@ -445,6 +445,18 @@ class BidiPermissionsProtocolPart(ProtocolPart):
pass
+class BidiEmulationProtocolPart(ProtocolPart):
+ """Protocol part for emulation"""
+ __metaclass__ = ABCMeta
+ name = "bidi_emulation"
+
+ @abstractmethod
+ async def set_geolocation_override(self,
+ coordinates: Optional[Mapping[str, Any]],
+ contexts: List[str]) -> None:
+ pass
+
+
class BidiScriptProtocolPart(ProtocolPart):
"""Protocol part for executing BiDi scripts"""
__metaclass__ = ABCMeta
diff --git a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
index d83ba4192eb..ab8b04ba3cd 100644
--- a/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
+++ b/tests/wpt/tests/tools/wptrunner/wptrunner/testdriver-extra.js
@@ -261,6 +261,17 @@
'bluetooth.requestDevicePromptUpdated', on_event);
};
+ window.test_driver_internal.bidi.emulation.set_geolocation_override =
+ function (params) {
+ return create_action("bidi.emulation.set_geolocation_override", {
+ // Default to the current window.
+ contexts: [window],
+ // Default to no coordinates.
+ coordinates: null,
+ ...(params ?? {})
+ });
+ }
+
window.test_driver_internal.bidi.log.entry_added.subscribe =
function (params) {
return subscribe({
diff --git a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html
index 852e49fa7fe..e6c9d8b4e16 100644
--- a/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html
+++ b/tests/wpt/tests/viewport-segments/viewport-segments-segments-property.https.html
@@ -15,8 +15,14 @@ promise_test(async (t) => {
await test_driver.clear_display_features();
});
- // When the viewport is not divided the segments property should be null.
- assert_equals(viewport.segments, null);
+ // When the viewport is not divided the segments property should return an
+ // array with one segment, the size of the viewport.
+ assert_equals(viewport.segments.length, 1);
+ let segment = viewport.segments[0];
+ assert_equals(segment.x, 0);
+ assert_equals(segment.y, 0);
+ assert_equals(segment.width, window.innerWidth);
+ assert_equals(segment.height, window.innerHeight);
// iframes do not receive segments information.
assert_equals(window.frames[0].viewport.segments, null);
@@ -88,7 +94,11 @@ promise_test(async (t) => {
});
await test_driver.clear_display_features();
assert_true(await promise);
- assert_equals(viewport.segments, null);
+ segment = viewport.segments[0];
+ assert_equals(segment.x, 0);
+ assert_equals(segment.y, 0);
+ assert_equals(segment.width, window.innerWidth);
+ assert_equals(segment.height, window.innerHeight);
// iframes do not receive segments information.
assert_equals(window.frames[0].viewport.segments, null);
diff --git a/tests/wpt/tests/viewport/viewport-segments.html b/tests/wpt/tests/viewport/viewport-segments.html
index 64f0eb9caef..cd24f2bd230 100644
--- a/tests/wpt/tests/viewport/viewport-segments.html
+++ b/tests/wpt/tests/viewport/viewport-segments.html
@@ -9,6 +9,9 @@
test(() => {
assert_true('segments' in viewport, "`segments` must be a property of viewport.");
- assert_equals(viewport.segments, null, "For a viewport not segmented, no segments must be exposed.");
+ assert_equals(viewport.segments[0].innerWidth, viewport.innerWidth,
+ "For a viewport not segmented, there should only one segment with the viewport size.");
+ assert_equals(viewport.segments[0].innerHeight, viewport.innerHeight,
+ "For a viewport not segmented, there should only one segment with the viewport size.");
});
</script>
diff --git a/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html
new file mode 100644
index 00000000000..812a7952738
--- /dev/null
+++ b/tests/wpt/tests/web-animations/crashtests/sibling-index-offset-crash.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/414645284">
+<div id="target"></div>
+<script>
+ target.animate([
+ { offset: "calc(20% * sibling-index())" },
+ ], 2000);
+</script>
diff --git a/tests/wpt/tests/web-animations/resources/keyframe-tests.js b/tests/wpt/tests/web-animations/resources/keyframe-tests.js
index 2bcce1ecf47..34a84f45b20 100644
--- a/tests/wpt/tests/web-animations/resources/keyframe-tests.js
+++ b/tests/wpt/tests/web-animations/resources/keyframe-tests.js
@@ -541,11 +541,6 @@ const gKeyframesTests = [
output: [keyframe(offset(0.5), { left: '10px' })],
},
{
- desc: 'a single keyframe sequence with a complex calc() offset',
- input: [{ offset: 'calc(0.5 + 0.25 * sign(100em - 1px))', left: '10px' }],
- output: [keyframe(offset(0.75), { left: '10px' })],
- },
- {
desc: 'a one property keyframe sequence with some omitted offsets',
input: [{ offset: 0.00, left: '10px' },
{ offset: 0.25, left: '20px' },
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
index fdb9e8b3ca7..8322829ebaf 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_closed/user_prompt_closed.py
@@ -318,7 +318,7 @@ async def test_iframe(
event = await wait_for_future_safe(on_prompt_closed)
assert event == {
- "context": new_tab["context"],
+ "context": frame["context"],
"accepted": True,
"type": "alert",
}
diff --git a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
index c24128004f7..a9051f662c8 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/browsing_context/user_prompt_opened/user_prompt_opened.py
@@ -197,7 +197,7 @@ async def test_iframe(
event = await wait_for_future_safe(on_entry)
assert event == {
- "context": new_tab["context"],
+ "context": frame["context"],
"type": "alert",
"handler": "dismiss",
"message": "in iframe",
diff --git a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
index 79241287fbc..e804848e0be 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py
@@ -114,6 +114,18 @@ async def test_params_coordinates_latitude_invalid_type(bidi_session, top_contex
)
+@pytest.mark.parametrize("value", [-90.1, 90.1])
+async def test_params_coordinates_latitude_invalid_value(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=value,
+ longitude=10,
+ ),
+ )
+
+
async def test_params_coordinates_longitude_missing(bidi_session, top_context):
with pytest.raises(error.InvalidArgumentException):
await bidi_session.emulation.set_geolocation_override(
@@ -136,6 +148,18 @@ async def test_params_coordinates_longitude_invalid_type(bidi_session, top_conte
)
+@pytest.mark.parametrize("value", [-180.5, 180.5])
+async def test_params_coordinates_longitude_invalid_value(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=value,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [False, "foo", [], {}])
async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_context, value):
with pytest.raises(error.InvalidArgumentException):
@@ -149,6 +173,18 @@ async def test_params_coordinates_accuracy_invalid_type(bidi_session, top_contex
)
+async def test_params_coordinates_accuracy_invalid_value(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ accuracy=-1,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [False, "foo", [], {}])
async def test_params_coordinates_altitude_invalid_type(bidi_session, top_context, value):
with pytest.raises(error.InvalidArgumentException):
@@ -176,6 +212,19 @@ async def test_params_coordinates_altitude_accuracy_invalid_type(bidi_session, t
)
+async def test_params_coordinates_altitude_accuracy_invalid_value(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ altitude=10,
+ altitude_accuracy=-1,
+ ),
+ )
+
+
async def test_params_coordinates_altitude_accuracy_without_altitude(bidi_session, top_context):
with pytest.raises(error.InvalidArgumentException):
await bidi_session.emulation.set_geolocation_override(
@@ -201,6 +250,19 @@ async def test_params_coordinates_heading_invalid_type(bidi_session, top_context
)
+@pytest.mark.parametrize("value", [-0.5, 360, 360.5])
+async def test_params_coordinates_heading_invalid_value(bidi_session, top_context, value):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ heading=value,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [False, "foo", [], {}])
async def test_params_coordinates_speed_invalid_type(bidi_session, top_context, value):
with pytest.raises(error.InvalidArgumentException):
@@ -214,6 +276,18 @@ async def test_params_coordinates_speed_invalid_type(bidi_session, top_context,
)
+async def test_params_coordinates_speed_invalid_value(bidi_session, top_context):
+ with pytest.raises(error.InvalidArgumentException):
+ await bidi_session.emulation.set_geolocation_override(
+ contexts=[top_context["context"]],
+ coordinates=CoordinatesOptions(
+ latitude=10,
+ longitude=10,
+ speed=-1.5,
+ ),
+ )
+
+
@pytest.mark.parametrize("value", [True, "foo", 42, {}])
async def test_params_user_contexts_invalid_type(bidi_session, value):
with pytest.raises(error.InvalidArgumentException):
diff --git a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py
index 9483a707eab..e8119d29d9e 100644
--- a/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py
+++ b/tests/wpt/tests/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py
@@ -396,7 +396,7 @@ async def test_page_with_cached_script_javascript(
@pytest.mark.asyncio
-async def tst_page_with_cached_javascript_module(
+async def test_page_with_cached_javascript_module(
bidi_session,
url,
inline,
diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js b/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js
index 612003d58ea..12bfa0bd73e 100644
--- a/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js
+++ b/tests/wpt/tests/webmessaging/message-channels/close-event/explicitly-closed.tentative.window.js
@@ -33,3 +33,13 @@ promise_test(async t => {
});
await closeEventPromise;
}, 'Close event on port2 is fired when port1, which is in a different window, is explicitly closed.')
+
+promise_test(async t => {
+ const rc = await addWindow();
+ const waitForPort = expectMessagePortFromWindowWithoutStartingIt(window);
+ await createMessageChannelAndSendPortFollowedByClose(rc);
+ const port = await waitForPort;
+ const closeEventPromise = createCloseEventPromise(port);
+ port.start();
+ await closeEventPromise;
+}, 'Close event on port2 is fired when port1, in a different window, is closed during the transfer of port2.')
diff --git a/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js b/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js
index cb9ea9fe981..48744ac1c5b 100644
--- a/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js
+++ b/tests/wpt/tests/webmessaging/message-channels/close-event/resources/helper.js
@@ -22,6 +22,44 @@ function expectMessagePortFromWindow(window) {
}
/**
+ * Create a new promise that resolves when the window receives
+ * the MessagePort and does not start it.
+ *
+ * @param {Window} window - The window to wait for the MessagePort.
+ * @returns {Promise<MessagePort>} A promise you should await to ensure the
+ * window
+ * receives the MessagePort.
+ */
+function expectMessagePortFromWindowWithoutStartingIt(window) {
+ return new Promise(resolve => {
+ window.onmessage = e => {
+ try {
+ assert_true(e.ports[0] instanceof window.MessagePort);
+ resolve(e.ports[0]);
+ } catch (e) {
+ reject(e);
+ }
+ };
+ });
+}
+
+/**
+ * Create a new MessageChannel and transfers one of the ports to
+ * the window which opened the window with a remote context provided
+ * as an argument, and immediately closes the entangled port.
+ *
+ * @param {RemoteContextWrapper} remoteContextWrapper
+ */
+async function createMessageChannelAndSendPortFollowedByClose(remoteContextWrapper) {
+ await remoteContextWrapper.executeScript(() => {
+ const {port1, port2} = new MessageChannel();
+ port1.start();
+ window.opener.postMessage({}, '*', [port2]);
+ port1.close();
+ });
+}
+
+/**
* Create a new MessageChannel and transfers one of the ports to
* the window which opened the window with a remote context provided
* as an argument.
diff --git a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js
index fcf144200f6..de6a5761df4 100644
--- a/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/abs.https.any.js
@@ -14,11 +14,8 @@
// MLOperand abs(MLOperand input);
-const getAbsPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 0, float16: 0};
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
+const getAbsPrecisionTolerance = () => {
+ return {metricType: 'ULP', value: 0};
};
const absTests = [
@@ -538,6 +535,62 @@ const absTests = [
}
}
}
+ },
+
+ // int8 tests
+ {
+ 'name': 'abs int8 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'absInput': {
+ 'data': [
+ // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127]
+ // abs(-128) would overflow when data type is int8
+ -127, 0, 126, 127
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'abs',
+ 'arguments': [{'input': 'absInput'}],
+ 'outputs': 'absOutput'
+ }],
+ 'expectedOutputs': {
+ 'absOutput': {
+ 'data': [127, 0, 126, 127],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'abs int32 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'absInput': {
+ 'data': [
+ // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647]
+ // abs(-2147483648) would overflow when data type is int32
+ -2147483647, 0, 2147483646, 2147483647
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'abs',
+ 'arguments': [{'input': 'absInput'}],
+ 'outputs': 'absOutput'
+ }],
+ 'expectedOutputs': {
+ 'absOutput': {
+ 'data': [2147483647, 0, 2147483646, 2147483647],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js
index 0208e2ec605..d4192172046 100644
--- a/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/concat.https.any.js
@@ -22,50 +22,6 @@ const getConcatPrecisionTolerance = (graphResources) => {
return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
};
-const buildAndExecuteGraphWithConcat =
- async (context, builder, graphResources) => {
- const graphInputs = graphResources.inputs;
- const operator = graphResources.operators[0];
-
- const inputOperands = [];
- const inputNameArray =
- operator.arguments[0][Object.keys(operator.arguments[0])[0]];
- for (const inputName of inputNameArray) {
- const operand =
- createOperand(context, builder, inputName, graphInputs[inputName]);
- inputOperands.push(operand);
- }
-
- let outputOperand = builder[operator.name](
- inputOperands,
- operator.arguments[1][Object.keys(operator.arguments[1])[0]]);
- const outputOperandName = Object.keys(graphResources.expectedOutputs)[0];
- const expectedDescriptor =
- graphResources.expectedOutputs[outputOperandName].descriptor;
- if (!context.opSupportLimits().output.dataTypes.includes(
- expectedDescriptor.dataType)) {
- const compatibleType = findCompatibleType(
- expectedDescriptor.dataType,
- context.opSupportLimits().output.dataTypes);
- outputOperand = builder.cast(outputOperand, compatibleType);
- expectedDescriptor.castedType = compatibleType;
- }
-
- assertDescriptorsEquals(outputOperand, expectedDescriptor);
-
- const namedOutputOperand = {};
- namedOutputOperand[outputOperandName] = outputOperand;
-
- // Compile the constructed graph.
- const graph = await builder.build(namedOutputOperand);
-
- // Execute the compiled graph.
- const result = await computeGraph(
- context, graph, graphInputs, graphResources.expectedOutputs);
-
- return {result, namedOutputOperand};
-};
-
const concatTests = [
{
'name': 'concat two float32 1D constant tensors of same shape along axis 0',
@@ -2428,7 +2384,7 @@ const concatTests = [
if (navigator.ml) {
concatTests.forEach((test) => {
webnn_conformance_test(
- buildAndExecuteGraphWithConcat, getConcatPrecisionTolerance, test);
+ buildAndExecuteGraph, getConcatPrecisionTolerance, test);
});
} else {
test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
diff --git a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js
index c03afc52516..8bc10475453 100644
--- a/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/neg.https.any.js
@@ -14,11 +14,8 @@
// MLOperand neg(MLOperand input);
-const getNegPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 0, float16: 0};
- const expectedDataType =
- getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
- return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
+const getNegPrecisionTolerance = () => {
+ return {metricType: 'ULP', value: 0};
};
const negTests = [
@@ -551,6 +548,62 @@ const negTests = [
}
}
}
+ },
+
+ // int8 tests
+ {
+ 'name': 'neg int8 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'negInput': {
+ 'data': [
+ // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127]
+ // neg(-128) would overflow when data type is int8
+ -127, 0, 126, 127
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'neg',
+ 'arguments': [{'input': 'negInput'}],
+ 'outputs': 'negOutput'
+ }],
+ 'expectedOutputs': {
+ 'negOutput': {
+ 'data': [127, 0, -126, -127],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'neg int32 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'negInput': {
+ 'data': [
+ // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647]
+ // neg(-2147483648) would overflow when data type is int32
+ -2147483647, 0, 2147483646, 2147483647
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'neg',
+ 'arguments': [{'input': 'negInput'}],
+ 'outputs': 'negOutput'
+ }],
+ 'expectedOutputs': {
+ 'negOutput': {
+ 'data': [2147483647, 0, -2147483646, -2147483647],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
index 8f6f2246b04..3b59c3bb49d 100644
--- a/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/qdq_subgraph.https.any.js
@@ -558,6 +558,372 @@ const subgraphTests = [
}
}
},
+ {
+ 'name': 'quantized tanh',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 0.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ 0.19882695376873016, 0.41167140007019043, 0.07934240251779556,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'tanh',
+ 'arguments': [{'input': 'dequantizedInput'}],
+ 'outputs': 'tanhOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'tanhOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedtanhOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedtanhOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.5921568870544434, 0.0470588281750679, 0.32156863808631897,
+ 0.19607844948768616, 0.38823533058166504, 0.0784313753247261,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized sigmoid',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 0.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ 0.19882695376873016, 0.41167140007019043, 0.07934240251779556,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.00390625],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.00390625],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [-128],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'sigmoid',
+ 'arguments': [{'input': 'dequantizedInput'}],
+ 'outputs': 'sigmoidOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'sigmoidOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedsigmoidOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedsigmoidOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.6640625, 0.51171875, 0.58203125,
+ 0.55078125, 0.6015625, 0.51953125,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized leaky relu',
+ 'graph': {
+ 'inputs': {
+ 'input': {
+ 'data': [
+ 1.6811466217041016, 0.0479511022567749, 0.33355462551116943,
+ -0.1988269537687301, -0.0041167140007019, -0.0634240251779556,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [0],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'input'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'quantizedInput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInput'},
+ {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInput'
+ },
+ {
+ 'name': 'leakyRelu',
+ 'arguments': [
+ {'input': 'dequantizedInput'},
+ {'options': {'alpha': 5.799162942273234}}
+ ],
+ 'outputs': 'leakyReluOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'leakyReluOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedleakyReluOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedleakyReluOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 0.49803924560546875, 0.0470588281750679, 0.3333333432674408,
+ -0.501960813999176, -0.02352941408753395, -0.364705890417099,
+ ],
+ 'descriptor': {shape: [2, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
+ {
+ 'name': 'quantized concat',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ -0.990639865398407, -0.576785683631897, -0.32276400923728943,
+ -0.44735023379325867, -0.11028251051902771, -0.5945112705230713,
+ ],
+ 'descriptor': {shape: [3, 2], dataType: 'float32'},
+ 'constant': false
+ },
+ 'inputAScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputAZeroPoint': {
+ 'data': [127],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'inputB': {
+ 'data': [
+ 2, 27, 38,
+ ],
+ 'descriptor': {shape: [3, 1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'inputBScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'inputBZeroPoint': {
+ 'data': [127],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ 'outputScale': {
+ 'data': [0.003921568859368563],
+ 'descriptor': {shape: [1], dataType: 'float32'},
+ 'constant': true
+ },
+ 'outputZeroPoint': {
+ 'data': [127],
+ 'descriptor': {shape: [1], dataType: 'int8'},
+ 'constant': true
+ },
+ },
+ 'operators': [
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'inputA'},
+ {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'}
+ ],
+ 'outputs': 'quantizedInputA'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedInputA'},
+ {'scale': 'inputAScale', 'zeroPoint': 'inputAZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInputA'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'inputB'},
+ {'scale': 'inputBScale', 'zeroPoint': 'inputBZeroPoint'}
+ ],
+ 'outputs': 'dequantizedInputB'
+ },
+ {
+ 'name': 'concat',
+ 'arguments': [
+ {
+ 'inputs': ['dequantizedInputA', 'dequantizedInputB']
+ },
+ {'axis': 1}
+ ],
+ 'outputs': 'concatOutput'
+ },
+ {
+ 'name': 'quantizeLinear',
+ 'arguments': [
+ {'input': 'concatOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'quantizedConcatOutput'
+ },
+ {
+ 'name': 'dequantizeLinear',
+ 'arguments': [
+ {'input': 'quantizedConcatOutput'},
+ {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'}
+ ],
+ 'outputs': 'output'
+ }
+ ],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ -0.9921569228172302, -0.5764706134796143, -0.4901961088180542,
+ -0.32156863808631897, -0.44705885648727417, -0.3921568989753723,
+ -0.1098039299249649, -0.5960784554481506, -0.3490196168422699,
+ ],
+ 'descriptor': {shape: [3, 3], dataType: 'float32'}
+ }
+ }
+ }
+ },
];
if (navigator.ml) {
diff --git a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
index 16cc2a3fa67..63ef9fa9ff0 100644
--- a/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/relu.https.any.js
@@ -581,7 +581,61 @@ const reluTests = [
}
}
}
- }
+ },
+
+ // int8 tests
+ {
+ 'name': 'relu int8 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ // int8 range: [/* -(2**7) */ -128, /* 2**7 - 1 */ 127]
+ -128, 0, 126, 127
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [0, 0, 126, 127],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'relu int32 4D tensor',
+ 'graph': {
+ 'inputs': {
+ 'reluInput': {
+ 'data': [
+ // int32 range: [/* -(2**31) */ -2147483648, /* 2**31 - 1 */ 2147483647]
+ -2147483648, 0, 2147483646, 2147483647
+ ],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'relu',
+ 'arguments': [{'input': 'reluInput'}],
+ 'outputs': 'reluOutput'
+ }],
+ 'expectedOutputs': {
+ 'reluOutput': {
+ 'data': [0, 0, 2147483646, 2147483647],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'int32'}
+ }
+ }
+ }
+ },
];
if (navigator.ml) {
diff --git a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js
index 2f2fadf7282..85b15f5a000 100644
--- a/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js
+++ b/tests/wpt/tests/webnn/conformance_tests/sub.https.any.js
@@ -14,7 +14,16 @@
const getSubPrecisionTolerance = (graphResources) => {
- const toleranceValueDict = {float32: 1, float16: 1};
+ const toleranceValueDict = {
+ float32: 1,
+ float16: 1,
+ int8: 0,
+ uint8: 0,
+ int32: 0,
+ uint32: 0,
+ int64: 0,
+ uint64: 0
+ };
const expectedDataType =
getExpectedDataTypeOfSingleOutput(graphResources.expectedOutputs);
return {metricType: 'ULP', value: toleranceValueDict[expectedDataType]};
@@ -916,6 +925,208 @@ const subTests = [
}
}
}
+ },
+
+ // int8 tests
+ {
+ 'name': 'sub int8 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74,
+ 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'}
+ },
+ 'inputB': {
+ 'data': [
+ -49, 40, 7, 76, -81, 59, 11, 48, 65, 27, 30, -38,
+ -49, -78, 16, 35, -28, 28, 35, -3, -57, -21, 27, 32
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ // the range of int8 result: [-128, 127]
+ 'data': [
+ 122, -26, -76, -128, 6, -61, -94, -33, -127, 5, 52, -36,
+ 127, 126, -35, -120, 117, -6, 45, 100, 109, 110, -47, 67
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int8'}
+ }
+ }
+ }
+ },
+
+ // uint8 tests
+ {
+ 'name': 'sub uint8 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [1, 10, 100, 255],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'}
+ },
+ 'inputB': {
+ // b should be lesser than or equal to a, otherwise the result would
+ // overflow when testing uint8 data type
+ 'data': [1, 8, 88, 254],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [0, 2, 12, 1],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint8'}
+ }
+ }
+ }
+ },
+
+ // int32 tests
+ {
+ 'name': 'sub int32 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74,
+ 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'}
+ },
+ 'inputB': {
+ 'data': [
+ -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38,
+ -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36,
+ 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int32'}
+ }
+ }
+ }
+ },
+
+ // uint32 tests
+ {
+ 'name': 'sub uint32 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [1, 10, 100, 1024],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'}
+ },
+ 'inputB': {
+ // b should be lesser than or equal to a, otherwise the result would
+ // overflow when testing uint32 data type
+ 'data': [1, 8, 88, 1000],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [0, 2, 12, 24],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint32'}
+ }
+ }
+ }
+ },
+
+ // int64 tests
+ {
+ 'name': 'sub int64 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [
+ 73, 14, -69, -52, -75, -2, -83, 15, -62, 32, 82, -74,
+ 78, 48, -19, -85, 89, 22, 80, 97, 52, 89, -20, 99
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'}
+ },
+ 'inputB': {
+ 'data': [
+ -49, 40, 7, 89, -81, 59, 11, 48, 85, 27, 30, -38,
+ -83, -86, 16, 46, -28, 28, 35, -77, -57, -58, 27, 32
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [
+ 122, -26, -76, -141, 6, -61, -94, -33, -147, 5, 52, -36,
+ 161, 134, -35, -131, 117, -6, 45, 174, 109, 147, -47, 67
+ ],
+ 'descriptor': {shape: [2, 2, 2, 3], dataType: 'int64'}
+ }
+ }
+ }
+ },
+
+ // uint64 tests
+ {
+ 'name': 'sub uint64 4D tensors',
+ 'graph': {
+ 'inputs': {
+ 'inputA': {
+ 'data': [1, 10, 100, 1024],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'}
+ },
+ 'inputB': {
+ // b should be lesser than or equal to a, otherwise the result would
+ // overflow when testing uint64 data type
+ 'data': [1, 8, 88, 1000],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'}
+ }
+ },
+ 'operators': [{
+ 'name': 'sub',
+ 'arguments': [{'a': 'inputA'}, {'b': 'inputB'}],
+ 'outputs': 'output'
+ }],
+ 'expectedOutputs': {
+ 'output': {
+ 'data': [0, 2, 12, 24],
+ 'descriptor': {shape: [1, 2, 2, 1], dataType: 'uint64'}
+ }
+ }
+ }
}
];
diff --git a/tests/wpt/tests/webnn/resources/utils.js b/tests/wpt/tests/webnn/resources/utils.js
index d19cb7cf760..50d7911a918 100644
--- a/tests/wpt/tests/webnn/resources/utils.js
+++ b/tests/wpt/tests/webnn/resources/utils.js
@@ -10,7 +10,7 @@ const operatorToleranceDict = {
leakyRelu: {float32: 1, float16: 2},
linear: {float32: 2, float16: 2},
prelu: {float32: 1, float16: 1},
- relu: {float32: 0, float16: 0},
+ relu: {float32: 0, float16: 0, int8: 0, int32: 0},
reshape: {float32: 0, float16: 0},
sigmoid: {float32: 34, float16: 10},
softplus: {float32: 18, float16: 18},
@@ -703,6 +703,10 @@ function validateContextSupportsGraph(context, graph) {
assert(
typeof inputName === 'string',
`the inputs' item of ${operatorName} should be a string.`);
+ if (!graph.inputs[inputName]) {
+ // intermediate input
+ continue;
+ }
validateInputOrConstantDataType(
inputName, operatorSupportLimits, 'inputs');
}
@@ -788,7 +792,21 @@ const buildAndExecuteGraph = async (context, builder, graphResources) => {
for (const argument of operator.arguments) {
for (const argumentName in argument) {
if (argumentName !== 'options') {
- if (graphInputs.hasOwnProperty(argument[argumentName])) {
+ if (operator.name === 'concat' && argumentName === 'inputs') {
+ const concatInputs = [];
+ for (const inputName of argument[argumentName]) {
+ if (graphInputs.hasOwnProperty(inputName)) {
+ const operandName = inputName;
+ const operand = createOperand(
+ context, builder, operandName, graphInputs[operandName]);
+ concatInputs.push(operand);
+ } else if (intermediateOperands.hasOwnProperty(inputName)) {
+ concatInputs.push(intermediateOperands[inputName]);
+ }
+ // concatInputs.push(intermediateOperands[inputName]);
+ }
+ argumentArray.push(concatInputs);
+ } else if (graphInputs.hasOwnProperty(argument[argumentName])) {
const operandName = argument[argumentName];
const operand = createOperand(
context, builder, operandName, graphInputs[operandName]);
diff --git a/tests/wpt/tests/webrtc-stats/supported-stats.https.html b/tests/wpt/tests/webrtc-stats/supported-stats.https.html
index 677736f3cd8..81aef5f94b9 100644
--- a/tests/wpt/tests/webrtc-stats/supported-stats.https.html
+++ b/tests/wpt/tests/webrtc-stats/supported-stats.https.html
@@ -69,6 +69,7 @@ function isPropertyTestable(type, property) {
],
'inbound-rtp': [
'fecSsrc', // requires FlexFEC to be negotiated.
+ 'fecBytesReceived', // requires FlexFEC to be negotiated.
],
'media-source': [
'echoReturnLoss', // requires gUM with an audio input device.
diff --git a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html
index aa66bfbb2bf..bc7831361ab 100644
--- a/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html
+++ b/tests/wpt/tests/webrtc/RTCConfiguration-iceServers.html
@@ -301,4 +301,28 @@
}] }));
}, `with empty urls should throw SyntaxError`);
+ test(() => {
+ const pc = new RTCPeerConnection({ iceServers: [{
+ urls: 'stun:stun1.example.net'
+ }] });
+ let config = pc.getConfiguration();
+ assert_equals(config.iceServers.length, 1);
+ pc.setConfiguration({});
+ config = pc.getConfiguration();
+ assert_equals(config.iceServers.length, 0);
+ }, `setConfiguration(config) - without iceServers removes ice servers`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [...Array(32)].map((_, i) => ({
+ urls: `stun:stun${i+1}.example.net`
+ })) });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 32);
+
+ for (let i = 0; i < 32; i++) {
+ const server = iceServers[i];
+ assert_array_equals(server.urls, [`stun:stun${i+1}.example.net`]);
+ }
+ }, `with 32 ice servers must succeed`);
</script>
diff --git a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html
index 3fd83a76fe2..62df4293067 100644
--- a/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html
+++ b/tests/wpt/tests/webrtc/RTCPeerConnection-addTransceiver.https.html
@@ -319,18 +319,21 @@
of 16 characters. If one of the RIDs does not meet these requirements,
throw a TypeError.
*/
+
+["video", "audio"].forEach(kind => {
+
test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_idl_attribute(pc, 'addTransceiver');
assert_throws_js(TypeError, () =>
- pc.addTransceiver('video', {
+ pc.addTransceiver(kind, {
sendEncodings: [{
rid: '@Invalid!'
}]
}));
- }, 'addTransceiver() with rid containing invalid non-alphanumeric characters should throw TypeError');
+ }, `addTransceiver("${kind}") with rid containing invalid non-alphanumeric characters should throw TypeError`);
test(t => {
const pc = new RTCPeerConnection();
@@ -338,22 +341,41 @@
assert_idl_attribute(pc, 'addTransceiver');
assert_throws_js(TypeError, () =>
- pc.addTransceiver('audio', {
+ pc.addTransceiver(kind, {
sendEncodings: [{
rid: 'a'.repeat(17)
}]
}));
- }, 'addTransceiver() with rid longer than 16 characters should throw TypeError');
+ }, `addTransceiver("${kind}") with rid longer than 16 characters should throw TypeError`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ assert_idl_attribute(pc, 'addTransceiver');
+
+ assert_throws_js(TypeError, () =>
+ pc.addTransceiver(kind, {
+ sendEncodings: [{rid: 'a'}, {rid: 'a'}]
+ }));
+ }, `addTransceiver("${kind}") with duplicate rids should throw TypeError`);
test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
- pc.addTransceiver('audio', {
+ pc.addTransceiver(kind, {
sendEncodings: [{
rid: 'foo'
}]
});
- }, `addTransceiver() with valid rid value should succeed`);
+ }, `addTransceiver("${kind}") with valid rid value should succeed`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ pc.addTransceiver('video', {
+ sendEncodings: [{rid: 'a'}, {rid: 'b'}]
+ });
+ }, `addTransceiver("${kind}") with multiple rid values should succeed`);
test(t => {
const pc = new RTCPeerConnection();
@@ -369,7 +391,8 @@
rid: 'foo'
}]
});
- }, `addTransceiver() with valid sendEncodings should succeed`);
+ }, `addTransceiver("${kind}") with valid sendEncodings should succeed`);
+});
/*
TODO
diff --git a/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html
new file mode 100644
index 00000000000..f3256106e90
--- /dev/null
+++ b/tests/wpt/tests/webxr/depth-sensing/cpu/depth_sensing_cpu_matchDepthViewIdentity.https.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/webxr_util.js"></script>
+<script src="../../resources/webxr_math_utils.js"></script>
+<script src="../../resources/webxr_test_constants.js"></script>
+<script src="../../resources/webxr_test_asserts.js"></script>
+<script src="../../resources/webxr_test_constants_fake_depth.js"></script>
+<script src="../matchDepthViewValues.js"></script>
+
+<script>
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ depthSensingData: DEPTH_SENSING_DATA,
+};
+
+function matchDepthViewFalsePlaceholderTest(session) {
+ // Currently we just assert that we are able to get a session when
+ // matchDepthView is false. If we got to this point, we have a session.
+ return Promise.resolve();
+}
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `cpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/true),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['cpu-optimized'],
+ dataFormatPreference: [],
+ },
+ });
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `cpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/true),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['cpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: true,
+ },
+ });
+
+xr_session_promise_test("Ensures session can be created when matchDepthView=false, `cpu-optimized`",
+ matchDepthViewFalsePlaceholderTest,
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['cpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: false,
+ },
+ });
+
+</script>
diff --git a/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html
new file mode 100644
index 00000000000..1813ddd449e
--- /dev/null
+++ b/tests/wpt/tests/webxr/depth-sensing/gpu/depth_sensing_gpu_matchDepthViewIdentity.https.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/webxr_util.js"></script>
+<script src="../../resources/webxr_math_utils.js"></script>
+<script src="../../resources/webxr_test_constants.js"></script>
+<script src="../../resources/webxr_test_asserts.js"></script>
+<script src="../../resources/webxr_test_constants_fake_depth.js"></script>
+<script src="../matchDepthViewValues.js"></script>
+
+<script>
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ depthSensingData: DEPTH_SENSING_DATA,
+};
+
+function matchDepthViewFalsePlaceholderTest(session) {
+ // Currently we just assert that we are able to get a session when
+ // matchDepthView is false. If we got to this point, we have a session.
+ return Promise.resolve();
+}
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView is unset, `gpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/false),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['gpu-optimized'],
+ dataFormatPreference: [],
+ },
+ });
+
+xr_session_promise_test("Ensures XRViewGeometry values are identity when matchDepthView=true, `gpu-optimized`",
+ depthViewGeometryTestGenerator(/*isCpuOptimized=*/false),
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['gpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: true,
+ },
+ });
+
+xr_session_promise_test("Ensures session can be created when matchDepthView=false, `gpu-optimized`",
+ matchDepthViewFalsePlaceholderTest,
+ fakeDeviceInitParams,
+ 'immersive-ar', {
+ requiredFeatures: ['depth-sensing'],
+ depthSensing: {
+ usagePreference: ['gpu-optimized'],
+ dataFormatPreference: [],
+ matchDepthView: false,
+ },
+ });
+
+</script>
diff --git a/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js
new file mode 100644
index 00000000000..597f9734d3f
--- /dev/null
+++ b/tests/wpt/tests/webxr/depth-sensing/matchDepthViewValues.js
@@ -0,0 +1,31 @@
+'use strict';
+
+// import * as XrConstants from 'resources/webxr_test_constants.js'
+// import * as XrAsserts from 'resources/webxr_test_asserts.js'
+
+// TODO: Expand the WebXrTestApi to specify a viewGeometry that this can validate
+// as well.
+const depthViewGeometryTestGenerator = function(isCpuOptimized) {
+ return (session, controller, t, sessionObjects) => {
+
+ return session.requestReferenceSpace('viewer').then((viewerSpace) => new Promise((resolve) => {
+
+ const glBinding = new XRWebGLBinding(session, sessionObjects.gl);
+
+ const rafCb = function(time, frame) {
+ const pose = frame.getViewerPose(viewerSpace);
+ for(const view of pose.views) {
+ const depthInformation = isCpuOptimized ? frame.getDepthInformation(view)
+ : glBinding.getDepthInformation(view);
+ t.step(()=> {
+ assert_matrix_approx_equals(IDENTITY_MATRIX, depthInformation.projectionMatrix);
+ assert_transform_approx_equals(IDENTITY_TRANSFORM, depthInformation.transform);
+ });
+ }
+ resolve();
+ }
+
+ session.requestAnimationFrame(rafCb);
+ })); // Promise
+ }; // Test Func
+}; // Generator Func
diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
index 37602dbc1f6..435cfbe0d5c 100644
--- a/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
+++ b/tests/wpt/webgl/meta/conformance/textures/misc/texture-upload-size.html.ini
@@ -13,6 +13,3 @@
[WebGL test #588]
expected: FAIL
-
- [WebGL test #52]
- expected: FAIL