aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock4
-rw-r--r--README.md9
-rw-r--r--components/bluetooth/lib.rs2
-rw-r--r--components/config/Cargo.toml2
-rw-r--r--components/devtools/protocol.rs5
-rw-r--r--components/layout_2020/display_list.rs145
-rw-r--r--components/net/http_cache.rs11
-rw-r--r--components/net/http_loader.rs3
-rw-r--r--components/net/resource_thread.rs17
-rw-r--r--components/net_traits/lib.rs5
-rw-r--r--components/profile/heartbeats.rs5
-rw-r--r--components/profile/time.rs7
-rw-r--r--components/script/dom/audiotrack.rs15
-rw-r--r--components/script/dom/audiotracklist.rs5
-rw-r--r--components/script/dom/bindings/interface.rs85
-rw-r--r--components/script/dom/bindings/trace.rs9
-rw-r--r--components/script/dom/create.rs19
-rw-r--r--components/script/dom/customelementregistry.rs48
-rw-r--r--components/script/dom/dedicatedworkerglobalscope.rs3
-rw-r--r--components/script/dom/document.rs60
-rw-r--r--components/script/dom/domimplementation.rs8
-rw-r--r--components/script/dom/globalscope.rs30
-rw-r--r--components/script/dom/headers.rs130
-rwxr-xr-xcomponents/script/dom/htmlbuttonelement.rs10
-rw-r--r--components/script/dom/htmlelement.rs70
-rwxr-xr-xcomponents/script/dom/htmlinputelement.rs41
-rw-r--r--components/script/dom/htmllabelelement.rs50
-rw-r--r--components/script/dom/htmlmediaelement.rs1
-rw-r--r--components/script/dom/htmlmeterelement.rs8
-rw-r--r--components/script/dom/htmloptionelement.rs38
-rw-r--r--components/script/dom/htmloutputelement.rs6
-rw-r--r--components/script/dom/htmlprogresselement.rs8
-rw-r--r--components/script/dom/htmlscriptelement.rs270
-rwxr-xr-xcomponents/script/dom/htmlselectelement.rs6
-rwxr-xr-xcomponents/script/dom/htmltextareaelement.rs6
-rw-r--r--components/script/dom/htmltrackelement.rs1
-rw-r--r--components/script/dom/macros.rs15
-rw-r--r--components/script/dom/nodelist.rs38
-rw-r--r--components/script/dom/promise.rs2
-rw-r--r--components/script/dom/texttrack.rs20
-rw-r--r--components/script/dom/texttracklist.rs4
-rw-r--r--components/script/dom/videotrack.rs15
-rw-r--r--components/script/dom/videotracklist.rs5
-rw-r--r--components/script/dom/webgl_validations/tex_image_2d.rs21
-rw-r--r--components/script/dom/webidls/CustomElementRegistry.webidl2
-rw-r--r--components/script/dom/webidls/Document.webidl5
-rw-r--r--components/script/dom/webidls/HTMLInputElement.webidl2
-rw-r--r--components/script/dom/webidls/HTMLOptionElement.webidl4
-rw-r--r--components/script/dom/webidls/HTMLScriptElement.webidl2
-rw-r--r--components/script/dom/worker.rs15
-rw-r--r--components/script/dom/xr.rs16
-rw-r--r--components/script/dom/xrsession.rs37
-rw-r--r--components/script/lib.rs2
-rw-r--r--components/script/script_module.rs1430
-rw-r--r--components/script/script_runtime.rs20
-rw-r--r--components/script_plugins/lib.rs4
-rw-r--r--components/style/properties/longhands/border.mako.rs2
-rw-r--r--components/style/properties/shorthands/border.mako.rs2
-rw-r--r--etc/taskcluster/decision_task.py31
-rw-r--r--etc/taskcluster/decisionlib.py1
-rw-r--r--etc/taskcluster/docker/build.dockerfile3
-rw-r--r--python/servo/bootstrap_commands.py3
-rw-r--r--python/servo/build_commands.py10
-rw-r--r--python/servo/command_base.py75
-rw-r--r--python/servo/devenv_commands.py6
-rw-r--r--python/servo/post_build_commands.py7
-rw-r--r--python/servo/testing_commands.py13
-rw-r--r--rust-toolchain2
-rw-r--r--tests/wpt/include.ini6
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json2900
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/has-instance.html.ini5
-rw-r--r--tests/wpt/metadata/css/css-align/animation/column-gap-composition.html.ini61
-rw-r--r--tests/wpt/metadata/css/css-align/animation/row-gap-composition.html.ini61
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini169
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini64
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-default.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-computed-style.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-content-images.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-image-document.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-computed-style.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-content-images.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-image-document.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini46
-rw-r--r--tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini94
-rw-r--r--tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini46
-rw-r--r--tests/wpt/metadata/css/css-ui/animation/caret-color-composition.html.ini31
-rw-r--r--tests/wpt/metadata/css/css-ui/animation/outline-offset-composition.html.ini61
-rw-r--r--tests/wpt/metadata/css/css-ui/animation/outline-width-composition.html.ini79
-rw-r--r--tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini4
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini4
-rw-r--r--tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini4
-rw-r--r--tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini973
-rw-r--r--tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini973
-rw-r--r--tests/wpt/metadata/css/cssom/getComputedStyle-insets-nobox.html.ini2
-rw-r--r--tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini757
-rw-r--r--tests/wpt/metadata/css/cssom/getComputedStyle-insets-static.html.ini2
-rw-r--r--tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini757
-rw-r--r--tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini757
-rw-r--r--tests/wpt/metadata/custom-elements/Document-createElement.html.ini7
-rw-r--r--tests/wpt/metadata/custom-elements/Document-createElementNS.html.ini4
-rw-r--r--tests/wpt/metadata/custom-elements/builtin-coverage.html.ini216
-rw-r--r--tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini12
-rw-r--r--tests/wpt/metadata/custom-elements/upgrading.html.ini6
-rw-r--r--tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini3
-rw-r--r--tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini3
-rw-r--r--tests/wpt/metadata/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html.ini2
-rw-r--r--tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.any.js.ini23
-rw-r--r--tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini13
-rw-r--r--tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-headers.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-init-002.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini35
-rw-r--r--tests/wpt/metadata/fetch/h1-parsing/resources-with-0x00-in-header.window.js.ini4
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini (renamed from tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini)2
-rw-r--r--tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html.ini4
-rw-r--r--tests/wpt/metadata/html/dom/idlharness.https.html.ini54
-rw-r--r--tests/wpt/metadata/html/dom/reflection-misc.html.ini114
-rw-r--r--tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini5
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-link-element/link-type-attribute.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini25
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini25
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini13
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini13
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini19
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-button-element/button-menu-historical.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/clone.html.ini56
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/cloning-steps.html.ini14
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini26
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini28
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-option-element/option-element-constructor.html.ini35
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini9
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-1.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-2.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini1
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/crossorigin.html.ini32
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/currentScript-null.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-2.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-3.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/errorhandling.html.ini18
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/execorder.html.ini21
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-1.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-2.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/imports.html.ini15
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inactive-context-import.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-star-export-request.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini26
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini27
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/nomodule-attribute.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini19
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini19
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini10
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini19
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/script-for-event.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/slow-cycle.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/specifier-error.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-reflect.html.ini32
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini7
-rw-r--r--tests/wpt/metadata/webmessaging/with-ports/017.html.ini5
-rw-r--r--tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html.ini5
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json2
-rw-r--r--tests/wpt/mozilla/tests/mozilla/interfaces.html1
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/README.md6
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/animation/column-gap-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-align/animation/row-gap-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html133
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html133
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html133
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/margin-bottom-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/margin-left-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/margin-right-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/margin-top-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/padding-bottom-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/padding-left-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/padding-right-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-box/animation/padding-top-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-default.html64
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html64
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited.html66
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-computed-style.html57
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-content-images.html90
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html63
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-image-document.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html77
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-image-document.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-default-ref.html62
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html87
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html62
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpgbin0 -> 3535 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul.jpgbin0 -> 3711 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpgbin0 -> 2195 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur.jpgbin0 -> 2394 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpgbin0 -> 2194 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr.jpgbin0 -> 2396 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpgbin0 -> 1517 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol.jpgbin0 -> 2395 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpgbin0 -> 2261 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu.jpgbin0 -> 2395 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpgbin0 -> 2259 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru.jpgbin0 -> 2394 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpgbin0 -> 2271 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl.jpgbin0 -> 2395 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpgbin0 -> 2266 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo.jpgbin0 -> 2395 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpgbin0 -> 2195 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u.jpgbin0 -> 2395 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/intrinsic-width-change-column-count.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2-ref.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2.tentative.html59
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-ref.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top.tentative.html54
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018-ref.html61
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-002-manual.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-003-manual.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011-ref.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011.html69
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001a.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002-ref.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002a.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002.html49
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003-ref.html6
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003.html8
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001-ref.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002-ref.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003-ref.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004-ref.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005-ref.html45
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004.html22
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005.html22
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002-ref.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003-ref.html10
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001-ref.html48
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002-ref.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001-ref.html11
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002-ref.html11
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform-ref.html10
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-noruby.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-opaqueruby.html22
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-transparentruby.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001-ref.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/support/ruby-common.css18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-insertion.js42
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-removal.js14
-rw-r--r--tests/wpt/web-platform-tests/css/css-shadow-parts/style-sharing.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/animation/shape-margin-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html189
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/height-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-sizing/animation/width-composition.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html53
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html84
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html52
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/animation/caret-color-composition.html53
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/animation/outline-offset-composition.html65
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui/animation/outline-width-composition.html85
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht5
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html52
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html80
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html66
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html120
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html80
-rw-r--r--tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html103
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py2
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html18
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/upgrading.html50
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html29
-rw-r--r--tests/wpt/web-platform-tests/domxpath/booleans.html52
-rw-r--r--tests/wpt/web-platform-tests/domxpath/fn-concat.html15
-rw-r--r--tests/wpt/web-platform-tests/domxpath/fn-contains.html15
-rw-r--r--tests/wpt/web-platform-tests/domxpath/fn-starts-with.html15
-rw-r--r--tests/wpt/web-platform-tests/domxpath/fn-substring-after.html15
-rw-r--r--tests/wpt/web-platform-tests/domxpath/fn-substring-before.html15
-rw-r--r--tests/wpt/web-platform-tests/domxpath/fn-substring.html15
-rw-r--r--tests/wpt/web-platform-tests/domxpath/fn-translate.html15
-rw-r--r--tests/wpt/web-platform-tests/domxpath/helpers.js14
-rw-r--r--tests/wpt/web-platform-tests/domxpath/lexical-structure.html29
-rw-r--r--tests/wpt/web-platform-tests/domxpath/numbers.html39
-rw-r--r--tests/wpt/web-platform-tests/fetch/h1-parsing/resources-with-0x00-in-header.window.js31
-rw-r--r--tests/wpt/web-platform-tests/fetch/h1-parsing/resources/README.md6
-rw-r--r--tests/wpt/web-platform-tests/fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asisbin0 -> 546 bytes
-rw-r--r--tests/wpt/web-platform-tests/fetch/h1-parsing/resources/document-with-0x00-in-header.py4
-rw-r--r--tests/wpt/web-platform-tests/fetch/h1-parsing/resources/script-with-0x00-in-header.py4
-rw-r--r--tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html2
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html33
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html9
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html4
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html25
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute.html9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html20
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html76
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js139
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html5
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini6
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webaudio.idl68
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc.idl2
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html57
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/buffered-flag.html14
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/observe-layout-shift.html111
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/recent-input.html58
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html6
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html6
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/toJSON.html61
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist1
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html49
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html44
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/move-element-and-scroll.tentative.html40
-rw-r--r--tests/wpt/web-platform-tests/loading/lazyload/remove-element-and-scroll.tentative.html36
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js4
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js4
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js4
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js4
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js3
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js3
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-piped.js135
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js337
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js117
-rw-r--r--tests/wpt/web-platform-tests/portals/predecessor-fires-unload.html37
-rw-r--r--tests/wpt/web-platform-tests/portals/resources/predecessor-fires-unload-watch-unload.html24
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js17
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/webxr-test.js24
-rw-r--r--tests/wpt/web-platform-tests/tools/requirements_mypy.txt2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py7
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py17
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py21
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py17
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py20
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py76
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py10
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py14
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py242
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py48
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py24
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py15
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py11
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py5
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js8
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js2
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js34
-rw-r--r--tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js585
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html32
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html2
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html14
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html23
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html11
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html31
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html35
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCDataChannel-close.html75
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCError.html4
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-close.html18
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html18
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html29
-rw-r--r--tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js32
-rw-r--r--tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants_fake_world.js75
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html13
-rw-r--r--tests/wpt/web-platform-tests/xhr/resources/parse-headers.py4
529 files changed, 20773 insertions, 2724 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 74c26708e59..15991d2b9ff 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6450,7 +6450,7 @@ dependencies = [
[[package]]
name = "webxr"
version = "0.0.1"
-source = "git+https://github.com/servo/webxr#b79870164f518d90268aaaac1fb83059b83dceda"
+source = "git+https://github.com/servo/webxr#c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1"
dependencies = [
"bindgen",
"euclid",
@@ -6471,7 +6471,7 @@ dependencies = [
[[package]]
name = "webxr-api"
version = "0.0.1"
-source = "git+https://github.com/servo/webxr#b79870164f518d90268aaaac1fb83059b83dceda"
+source = "git+https://github.com/servo/webxr#c6abf4c60d165ffc978ad2ebd6bcddc3c21698e1"
dependencies = [
"euclid",
"ipc-channel",
diff --git a/README.md b/README.md
index 98687f13fe8..164d7ca555f 100644
--- a/README.md
+++ b/README.md
@@ -227,6 +227,15 @@ settings for the installer are fine).
7. Install Visual Studio Community 2017 (https://www.visualstudio.com/vs/community/). You MUST add "Visual C++" to the
list of installed components as well as the "Windows Universal C runtime." They are not on by default. Visual Studio 2017 MUST installed to the default location or mach.bat will not find it.
+Note that version is hard to download online and is easier to install via [Chocolatey](https://chocolatey.org/install#installing-chocolatey) with:
+```
+choco install -y visualstudio2017community --package-parameters="'--add Microsoft.VisualStudio.Component.Git'"
+Update-SessionEnvironment #refreshing env due to Git install
+
+#--- UWP Workload and installing Windows Template Studio ---
+choco install -y visualstudio2017-workload-nativedesktop
+```
+
##### [Optional] Install LLVM for faster link times
You may experience much faster builds on Windows by following these steps. (Related Rust issue: https://github.com/rust-lang/rust/issues/37543)
diff --git a/components/bluetooth/lib.rs b/components/bluetooth/lib.rs
index 19d6db743e4..5c54860d9e3 100644
--- a/components/bluetooth/lib.rs
+++ b/components/bluetooth/lib.rs
@@ -288,7 +288,7 @@ impl BluetoothManager {
self.adapter = BluetoothAdapter::init_mock().ok();
match test::test(self, data_set_name) {
Ok(_) => return Ok(()),
- Err(error) => Err(BluetoothError::Type(error.description().to_owned())),
+ Err(error) => Err(BluetoothError::Type(error.to_string())),
}
}
diff --git a/components/config/Cargo.toml b/components/config/Cargo.toml
index 774c1b0f7bf..f930b60a5d3 100644
--- a/components/config/Cargo.toml
+++ b/components/config/Cargo.toml
@@ -30,5 +30,5 @@ servo_config_plugins = { path = "../config_plugins" }
[dev-dependencies]
std_test_override = { path = "../std_test_override" }
-[target.'cfg(not(any(target_os = "android", feature = "uwp")))'.dependencies]
+[target.'cfg(not(target_os = "android"))'.dependencies]
dirs = "1.0"
diff --git a/components/devtools/protocol.rs b/components/devtools/protocol.rs
index bfc547f6b75..29fbaa2beeb 100644
--- a/components/devtools/protocol.rs
+++ b/components/devtools/protocol.rs
@@ -8,7 +8,6 @@
use serde::Serialize;
use serde_json::{self, Value};
-use std::error::Error;
use std::io::{Read, Write};
use std::net::TcpStream;
@@ -62,7 +61,7 @@ impl JsonPacketStream for TcpStream {
Ok(0) => return Ok(None), // EOF
Ok(1) => buf[0],
Ok(_) => unreachable!(),
- Err(e) => return Err(e.description().to_owned()),
+ Err(e) => return Err(e.to_string()),
};
match byte {
b':' => {
@@ -79,7 +78,7 @@ impl JsonPacketStream for TcpStream {
debug!("{}", packet);
return match serde_json::from_str(&packet) {
Ok(json) => Ok(Some(json)),
- Err(err) => Err(err.description().to_owned()),
+ Err(err) => Err(err.to_string()),
};
},
c => buffer.push(c),
diff --git a/components/layout_2020/display_list.rs b/components/layout_2020/display_list.rs
index f39a2f23b18..6bd6c60a663 100644
--- a/components/layout_2020/display_list.rs
+++ b/components/layout_2020/display_list.rs
@@ -5,15 +5,21 @@
use crate::fragments::{BoxFragment, Fragment};
use crate::geom::physical::{Rect, Vec2};
use embedder_traits::Cursor;
-use euclid::{Point2D, SideOffsets2D};
+use euclid::{Point2D, SideOffsets2D, Size2D};
use gfx::text::glyph::GlyphStore;
use std::sync::Arc;
+use style::dom::OpaqueNode;
use style::properties::ComputedValues;
-use style::values::computed::{BorderStyle, Length};
-use webrender_api::{self as wr, units, CommonItemProperties, PrimitiveFlags};
+use style::values::computed::{BorderStyle, Length, LengthPercentage};
+use style::values::specified::ui::CursorKind;
+use webrender_api::{self as wr, units};
+
+// `webrender_api::display_item::ItemTag` is private
+type ItemTag = (u64, u16);
+type HitInfo = Option<ItemTag>;
pub struct DisplayListBuilder {
- pipeline_id: wr::PipelineId,
+ current_space_and_clip: wr::SpaceAndClipInfo,
pub wr: wr::DisplayListBuilder,
pub is_contentful: bool,
}
@@ -21,11 +27,33 @@ pub struct DisplayListBuilder {
impl DisplayListBuilder {
pub fn new(pipeline_id: wr::PipelineId, viewport_size: wr::units::LayoutSize) -> Self {
Self {
- pipeline_id,
+ current_space_and_clip: wr::SpaceAndClipInfo::root_scroll(pipeline_id),
is_contentful: false,
wr: wr::DisplayListBuilder::new(pipeline_id, viewport_size),
}
}
+
+ fn common_properties(
+ &self,
+ clip_rect: units::LayoutRect,
+ hit_info: HitInfo,
+ ) -> wr::CommonItemProperties {
+ wr::CommonItemProperties {
+ clip_rect,
+ clip_id: self.current_space_and_clip.clip_id,
+ spatial_id: self.current_space_and_clip.spatial_id,
+ hit_info,
+ // TODO(gw): Make use of the WR backface visibility functionality.
+ flags: wr::PrimitiveFlags::default(),
+ }
+ }
+
+ fn clipping_and_scrolling_scope<R>(&mut self, f: impl FnOnce(&mut Self) -> R) -> R {
+ let previous = self.current_space_and_clip;
+ let result = f(self);
+ self.current_space_and_clip = previous;
+ result
+ }
}
/// Contentful paint, for the purpose of
@@ -60,19 +88,12 @@ impl Fragment {
.translate(&containing_block.top_left);
let mut baseline_origin = rect.top_left.clone();
baseline_origin.y += t.ascent;
- let cursor = cursor(&t.parent_style, Cursor::Text);
- let common = CommonItemProperties {
- clip_rect: rect.clone().into(),
- clip_id: wr::ClipId::root(builder.pipeline_id),
- spatial_id: wr::SpatialId::root_scroll_node(builder.pipeline_id),
- hit_info: cursor.map(|cursor| (t.tag.0 as u64, cursor as u16)),
- // TODO(gw): Make use of the WR backface visibility functionality.
- flags: PrimitiveFlags::default(),
- };
let glyphs = glyphs(&t.glyphs, baseline_origin);
if glyphs.is_empty() {
return;
}
+ let hit_info = hit_info(&t.parent_style, t.tag, Cursor::Text);
+ let common = builder.common_properties(rect.clone().into(), hit_info);
let color = t.parent_style.clone_color();
builder
.wr
@@ -85,14 +106,8 @@ impl Fragment {
.rect
.to_physical(i.style.writing_mode, containing_block)
.translate(&containing_block.top_left);
- let common = CommonItemProperties {
- clip_rect: rect.clone().into(),
- clip_id: wr::ClipId::root(builder.pipeline_id),
- spatial_id: wr::SpatialId::root_scroll_node(builder.pipeline_id),
- hit_info: None,
- // TODO(gw): Make use of the WR backface visibility functionality.
- flags: PrimitiveFlags::default(),
- };
+ let hit_info = None;
+ let common = builder.common_properties(rect.clone().into(), hit_info);
builder.wr.push_image(
&common,
rect.into(),
@@ -122,18 +137,11 @@ impl BoxFragment {
.to_physical(self.style.writing_mode, containing_block)
.translate(&containing_block.top_left)
.into();
- let cursor = cursor(&self.style, Cursor::Default);
- let common = CommonItemProperties {
- clip_rect: border_rect,
- clip_id: wr::ClipId::root(builder.pipeline_id),
- spatial_id: wr::SpatialId::root_scroll_node(builder.pipeline_id),
- hit_info: cursor.map(|cursor| (self.tag.0 as u64, cursor as u16)),
- // TODO(gw): Make use of the WR backface visibility functionality.
- flags: PrimitiveFlags::default(),
- };
+ let hit_info = hit_info(&self.style, self.tag, Cursor::Default);
+ let border_radius = self.border_radius(&border_rect);
- self.background_display_items(builder, &common);
- self.border_display_items(builder, &common, border_rect);
+ self.background_display_items(builder, hit_info, border_rect, &border_radius);
+ self.border_display_items(builder, hit_info, border_rect, border_radius);
let content_rect = self
.content_rect
.to_physical(self.style.writing_mode, containing_block)
@@ -143,24 +151,61 @@ impl BoxFragment {
}
}
+ fn border_radius(&self, border_rect: &units::LayoutRect) -> wr::BorderRadius {
+ let resolve = |radius: &LengthPercentage, box_size: f32| {
+ radius.percentage_relative_to(Length::new(box_size)).px()
+ };
+ let corner = |corner: &style::values::computed::BorderCornerRadius| {
+ Size2D::new(
+ resolve(&corner.0.width.0, border_rect.size.width),
+ resolve(&corner.0.height.0, border_rect.size.height),
+ )
+ };
+ let b = self.style.get_border();
+ wr::BorderRadius {
+ top_left: corner(&b.border_top_left_radius),
+ top_right: corner(&b.border_top_right_radius),
+ bottom_right: corner(&b.border_bottom_right_radius),
+ bottom_left: corner(&b.border_bottom_left_radius),
+ }
+ }
+
fn background_display_items(
&self,
builder: &mut DisplayListBuilder,
- common: &CommonItemProperties,
+ hit_info: HitInfo,
+ border_rect: units::LayoutRect,
+ border_radius: &wr::BorderRadius,
) {
let background_color = self
.style
.resolve_color(self.style.clone_background_color());
- if background_color.alpha > 0 || common.hit_info.is_some() {
- builder.wr.push_rect(common, rgba(background_color))
+ if background_color.alpha > 0 || hit_info.is_some() {
+ builder.clipping_and_scrolling_scope(|builder| {
+ if !border_radius.is_zero() {
+ builder.current_space_and_clip.clip_id = builder.wr.define_clip(
+ &builder.current_space_and_clip,
+ border_rect,
+ Some(wr::ComplexClipRegion {
+ rect: border_rect,
+ radii: *border_radius,
+ mode: wr::ClipMode::Clip,
+ }),
+ None,
+ );
+ }
+ let common = builder.common_properties(border_rect, hit_info);
+ builder.wr.push_rect(&common, rgba(background_color))
+ });
}
}
fn border_display_items(
&self,
builder: &mut DisplayListBuilder,
- common: &CommonItemProperties,
+ hit_info: HitInfo,
border_rect: units::LayoutRect,
+ radius: wr::BorderRadius,
) {
let b = self.style.get_border();
let widths = SideOffsets2D::new(
@@ -187,15 +232,18 @@ impl BoxFragment {
BorderStyle::Outset => wr::BorderStyle::Outset,
},
};
+ let common = builder.common_properties(border_rect, hit_info);
let details = wr::BorderDetails::Normal(wr::NormalBorder {
top: side(b.border_top_style, b.border_top_color),
right: side(b.border_right_style, b.border_right_color),
bottom: side(b.border_bottom_style, b.border_bottom_color),
left: side(b.border_left_style, b.border_left_color),
- radius: wr::BorderRadius::zero(),
+ radius,
do_aa: true,
});
- builder.wr.push_border(common, border_rect, widths, details)
+ builder
+ .wr
+ .push_border(&common, border_rect, widths, details)
}
}
@@ -233,16 +281,21 @@ fn glyphs(glyph_runs: &[Arc<GlyphStore>], mut origin: Vec2<Length>) -> Vec<wr::G
glyphs
}
-fn cursor(values: &ComputedValues, default: Cursor) -> Option<Cursor> {
+fn hit_info(style: &ComputedValues, tag: OpaqueNode, auto_cursor: Cursor) -> HitInfo {
use style::computed_values::pointer_events::T as PointerEvents;
- use style::values::specified::ui::CursorKind;
- let inherited_ui = values.get_inherited_ui();
+ let inherited_ui = style.get_inherited_ui();
if inherited_ui.pointer_events == PointerEvents::None {
- return None;
+ None
+ } else {
+ let cursor = cursor(inherited_ui.cursor.keyword, auto_cursor);
+ Some((tag.0 as u64, cursor as u16))
}
- Some(match inherited_ui.cursor.keyword {
- CursorKind::Auto => default,
+}
+
+fn cursor(kind: CursorKind, auto_cursor: Cursor) -> Cursor {
+ match kind {
+ CursorKind::Auto => auto_cursor,
CursorKind::None => Cursor::None,
CursorKind::Default => Cursor::Default,
CursorKind::Pointer => Cursor::Pointer,
@@ -278,5 +331,5 @@ fn cursor(values: &ComputedValues, default: Cursor) -> Option<Cursor> {
CursorKind::AllScroll => Cursor::AllScroll,
CursorKind::ZoomIn => Cursor::ZoomIn,
CursorKind::ZoomOut => Cursor::ZoomOut,
- })
+ }
}
diff --git a/components/net/http_cache.rs b/components/net/http_cache.rs
index e47b4e81951..592ad7a99aa 100644
--- a/components/net/http_cache.rs
+++ b/components/net/http_cache.rs
@@ -230,12 +230,15 @@ fn get_response_expiry(response: &Response) -> Duration {
let max_heuristic = Duration::hours(24) - age;
let heuristic_freshness = if let Some(last_modified) =
// If the response has a Last-Modified header field,
- // caches are encouraged to use a heuristic expiration value
- // that is no more than some fraction of the interval since that time.
- response.headers.typed_get::<LastModified>() {
+ // caches are encouraged to use a heuristic expiration value
+ // that is no more than some fraction of the interval since that time.
+ response.headers.typed_get::<LastModified>()
+ {
let current = time::now().to_timespec();
let last_modified: SystemTime = last_modified.into();
- let last_modified = last_modified.duration_since(SystemTime::UNIX_EPOCH).unwrap();
+ let last_modified = last_modified
+ .duration_since(SystemTime::UNIX_EPOCH)
+ .unwrap();
let last_modified = Timespec::new(last_modified.as_secs() as i64, 0);
// A typical setting of this fraction might be 10%.
let raw_heuristic_calc = (current - last_modified) / 10;
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs
index 18e4e696f80..7868556adfe 100644
--- a/components/net/http_loader.rs
+++ b/components/net/http_loader.rs
@@ -44,7 +44,6 @@ use net_traits::{
use servo_arc::Arc;
use servo_url::{ImmutableOrigin, ServoUrl};
use std::collections::{HashMap, HashSet};
-use std::error::Error;
use std::iter::FromIterator;
use std::mem;
use std::ops::Deref;
@@ -622,7 +621,7 @@ pub fn http_fetch(
HeaderValue::to_str(v)
.map(|l| {
ServoUrl::parse_with_base(response.actual_response().url(), &l)
- .map_err(|err| err.description().into())
+ .map_err(|err| err.to_string())
})
.ok()
});
diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs
index c948055bc55..f85d623fe4f 100644
--- a/components/net/resource_thread.rs
+++ b/components/net/resource_thread.rs
@@ -40,7 +40,6 @@ use servo_arc::Arc as ServoArc;
use servo_url::ServoUrl;
use std::borrow::{Cow, ToOwned};
use std::collections::HashMap;
-use std::error::Error;
use std::fs::{self, File};
use std::io::prelude::*;
use std::ops::Deref;
@@ -361,7 +360,7 @@ where
let mut file = match File::open(&path) {
Err(why) => {
- warn!("couldn't open {}: {}", display, Error::description(&why));
+ warn!("couldn't open {}: {}", display, why);
return;
},
Ok(file) => file,
@@ -369,11 +368,7 @@ where
let mut string_buffer: String = String::new();
match file.read_to_string(&mut string_buffer) {
- Err(why) => panic!(
- "couldn't read from {}: {}",
- display,
- Error::description(&why)
- ),
+ Err(why) => panic!("couldn't read from {}: {}", display, why),
Ok(_) => println!("successfully read from {}", display),
}
@@ -396,16 +391,12 @@ where
let display = path.display();
let mut file = match File::create(&path) {
- Err(why) => panic!("couldn't create {}: {}", display, Error::description(&why)),
+ Err(why) => panic!("couldn't create {}: {}", display, why),
Ok(file) => file,
};
match file.write_all(json_encoded.as_bytes()) {
- Err(why) => panic!(
- "couldn't write to {}: {}",
- display,
- Error::description(&why)
- ),
+ Err(why) => panic!("couldn't write to {}: {}", display, why),
Ok(_) => println!("successfully wrote to {}", display),
}
}
diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs
index a25a804ce01..f7b291e420f 100644
--- a/components/net_traits/lib.rs
+++ b/components/net_traits/lib.rs
@@ -31,7 +31,6 @@ use ipc_channel::Error as IpcError;
use mime::Mime;
use msg::constellation_msg::HistoryStateId;
use servo_url::ServoUrl;
-use std::error::Error;
use time::precise_time_ns;
use webrender_api::ImageKey;
@@ -699,11 +698,11 @@ pub enum NetworkError {
impl NetworkError {
pub fn from_hyper_error(error: &HyperError) -> Self {
- NetworkError::Internal(error.description().to_owned())
+ NetworkError::Internal(error.to_string())
}
pub fn from_http_error(error: &HttpError) -> Self {
- NetworkError::Internal(error.description().to_owned())
+ NetworkError::Internal(error.to_string())
}
}
diff --git a/components/profile/heartbeats.rs b/components/profile/heartbeats.rs
index ac29d12bbb3..5a09ea4f9e6 100644
--- a/components/profile/heartbeats.rs
+++ b/components/profile/heartbeats.rs
@@ -7,7 +7,6 @@ use heartbeats_simple::HeartbeatPow as Heartbeat;
use profile_traits::time::ProfilerCategory;
use std::collections::HashMap;
use std::env::var_os;
-use std::error::Error;
use std::fs::File;
use std::path::Path;
@@ -85,7 +84,7 @@ fn open_heartbeat_log<P: AsRef<Path>>(name: P) -> Option<File> {
match File::create(name) {
Ok(f) => Some(f),
Err(e) => {
- warn!("Failed to open heartbeat log: {}", Error::description(&e));
+ warn!("Failed to open heartbeat log: {}", e);
None
},
}
@@ -138,7 +137,7 @@ fn maybe_create_heartbeat(
fn log_heartbeat_records(hb: &mut Heartbeat) {
match hb.log_to_buffer_index() {
Ok(_) => (),
- Err(e) => warn!("Failed to write heartbeat log: {}", Error::description(&e)),
+ Err(e) => warn!("Failed to write heartbeat log: {}", e),
}
}
diff --git a/components/profile/time.rs b/components/profile/time.rs
index 3dac5663799..cea75b54b44 100644
--- a/components/profile/time.rs
+++ b/components/profile/time.rs
@@ -19,7 +19,6 @@ use servo_config::opts::OutputOptions;
use std::borrow::ToOwned;
use std::cmp::Ordering;
use std::collections::{BTreeMap, HashMap};
-use std::error::Error;
use std::fs::File;
use std::io::{self, Write};
use std::path::Path;
@@ -397,11 +396,7 @@ impl Profiler {
Some(OutputOptions::FileName(ref filename)) => {
let path = Path::new(&filename);
let mut file = match File::create(&path) {
- Err(e) => panic!(
- "Couldn't create {}: {}",
- path.display(),
- Error::description(&e)
- ),
+ Err(e) => panic!("Couldn't create {}: {}", path.display(), e),
Ok(file) => file,
};
write!(
diff --git a/components/script/dom/audiotrack.rs b/components/script/dom/audiotrack.rs
index b66ea5bf4cc..af237bc8b1a 100644
--- a/components/script/dom/audiotrack.rs
+++ b/components/script/dom/audiotrack.rs
@@ -3,6 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::dom::audiotracklist::AudioTrackList;
+use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::AudioTrackBinding::{self, AudioTrackMethods};
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
@@ -19,7 +20,7 @@ pub struct AudioTrack {
label: DOMString,
language: DOMString,
enabled: Cell<bool>,
- track_list: Option<Dom<AudioTrackList>>,
+ track_list: DomRefCell<Option<Dom<AudioTrackList>>>,
}
impl AudioTrack {
@@ -37,7 +38,7 @@ impl AudioTrack {
label: label.into(),
language: language.into(),
enabled: Cell::new(false),
- track_list: track_list.map(|t| Dom::from_ref(t)),
+ track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))),
}
}
@@ -73,6 +74,14 @@ impl AudioTrack {
pub fn set_enabled(&self, value: bool) {
self.enabled.set(value);
}
+
+ pub fn add_track_list(&self, track_list: &AudioTrackList) {
+ *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list));
+ }
+
+ pub fn remove_track_list(&self) {
+ *self.track_list.borrow_mut() = None;
+ }
}
impl AudioTrackMethods for AudioTrack {
@@ -103,7 +112,7 @@ impl AudioTrackMethods for AudioTrack {
// https://html.spec.whatwg.org/multipage/#dom-audiotrack-enabled
fn SetEnabled(&self, value: bool) {
- if let Some(list) = self.track_list.as_ref() {
+ if let Some(list) = self.track_list.borrow().as_ref() {
if let Some(idx) = list.find(self) {
list.set_enabled(idx, value);
}
diff --git a/components/script/dom/audiotracklist.rs b/components/script/dom/audiotracklist.rs
index e26f23cb2a8..5191221b7d9 100644
--- a/components/script/dom/audiotracklist.rs
+++ b/components/script/dom/audiotracklist.rs
@@ -104,9 +104,14 @@ impl AudioTrackList {
pub fn add(&self, track: &AudioTrack) {
self.tracks.borrow_mut().push(Dom::from_ref(track));
+ track.add_track_list(self);
}
pub fn clear(&self) {
+ self.tracks
+ .borrow()
+ .iter()
+ .for_each(|t| t.remove_track_list());
self.tracks.borrow_mut().clear();
}
}
diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs
index 2514efcf063..2097769cb31 100644
--- a/components/script/dom/bindings/interface.rs
+++ b/components/script/dom/bindings/interface.rs
@@ -9,16 +9,13 @@ use crate::dom::bindings::codegen::PrototypeList;
use crate::dom::bindings::constant::{define_constants, ConstantSpec};
use crate::dom::bindings::conversions::{get_dom_class, DOM_OBJECT_SLOT};
use crate::dom::bindings::guard::Guard;
-use crate::dom::bindings::utils::{
- get_proto_or_iface_array, ProtoOrIfaceArray, DOM_PROTOTYPE_SLOT,
-};
+use crate::dom::bindings::utils::{ProtoOrIfaceArray, DOM_PROTOTYPE_SLOT};
use crate::script_runtime::JSContext as SafeJSContext;
use js::error::throw_type_error;
use js::glue::UncheckedUnwrapObject;
+use js::jsapi::GetWellKnownSymbol;
use js::jsapi::HandleObject as RawHandleObject;
-use js::jsapi::MutableHandleValue as RawMutableHandleValue;
use js::jsapi::{jsid, Class, ClassOps};
-use js::jsapi::{GetNonCCWObjectGlobal, GetWellKnownSymbol};
use js::jsapi::{JSAutoRealm, JSClass, JSContext, JSFunctionSpec, JSObject, JSFUN_CONSTRUCTOR};
use js::jsapi::{JSPropertySpec, JSString, JSTracer, JS_AtomizeAndPinString};
use js::jsapi::{JS_GetFunctionObject, JS_NewFunction, JS_NewGlobalObject};
@@ -28,10 +25,10 @@ use js::jsapi::{ObjectOps, OnNewGlobalHookOption, SymbolCode};
use js::jsapi::{TrueHandleValue, Value};
use js::jsapi::{JSPROP_PERMANENT, JSPROP_READONLY, JSPROP_RESOLVING};
use js::jsval::{JSVal, PrivateValue};
+use js::rust::wrappers::JS_FireOnNewGlobalObject;
use js::rust::wrappers::RUST_SYMBOL_TO_JSID;
use js::rust::wrappers::{JS_DefineProperty, JS_DefineProperty5};
use js::rust::wrappers::{JS_DefineProperty3, JS_DefineProperty4, JS_DefinePropertyById5};
-use js::rust::wrappers::{JS_FireOnNewGlobalObject, JS_GetPrototype};
use js::rust::wrappers::{JS_LinkConstructorAndPrototype, JS_NewObjectWithUniqueType};
use js::rust::{define_methods, define_properties, get_object_class};
use js::rust::{HandleObject, HandleValue, MutableHandleObject, RealmOptions};
@@ -102,7 +99,7 @@ impl InterfaceConstructorBehavior {
finalize: None,
call: Some(invalid_constructor),
construct: Some(invalid_constructor),
- hasInstance: Some(has_instance_hook),
+ hasInstance: None, // heycam/webidl#356
trace: None,
})
}
@@ -119,7 +116,7 @@ impl InterfaceConstructorBehavior {
finalize: None,
call: Some(non_new_constructor),
construct: Some(hook),
- hasInstance: Some(has_instance_hook),
+ hasInstance: None, // heycam/webidl#356
trace: None,
})
}
@@ -428,78 +425,6 @@ unsafe extern "C" fn fun_to_string_hook(
ret
}
-/// Hook for instanceof on interface objects.
-unsafe extern "C" fn has_instance_hook(
- cx: *mut JSContext,
- obj: RawHandleObject,
- value: RawMutableHandleValue,
- rval: *mut bool,
-) -> bool {
- let cx = SafeJSContext::from_ptr(cx);
- let obj_raw = HandleObject::from_raw(obj);
- let val_raw = HandleValue::from_raw(value.handle());
- match has_instance(cx, obj_raw, val_raw) {
- Ok(result) => {
- *rval = result;
- true
- },
- Err(()) => false,
- }
-}
-
-/// Return whether a value is an instance of a given prototype.
-/// <http://heycam.github.io/webidl/#es-interface-hasinstance>
-fn has_instance(
- cx: SafeJSContext,
- interface_object: HandleObject,
- value: HandleValue,
-) -> Result<bool, ()> {
- if !value.is_object() {
- // Step 1.
- return Ok(false);
- }
-
- rooted!(in(*cx) let mut value_out = value.to_object());
- rooted!(in(*cx) let mut value = value.to_object());
-
- unsafe {
- let js_class = get_object_class(interface_object.get());
- let object_class = &*(js_class as *const NonCallbackInterfaceObjectClass);
-
- if let Ok(dom_class) = get_dom_class(UncheckedUnwrapObject(
- value.get(),
- /* stopAtWindowProxy = */ 0,
- )) {
- if dom_class.interface_chain[object_class.proto_depth as usize] == object_class.proto_id
- {
- // Step 4.
- return Ok(true);
- }
- }
-
- // Step 2.
- let global = GetNonCCWObjectGlobal(interface_object.get());
- assert!(!global.is_null());
- let proto_or_iface_array = get_proto_or_iface_array(global);
- rooted!(in(*cx) let prototype = (*proto_or_iface_array)[object_class.proto_id as usize]);
- assert!(!prototype.is_null());
- // Step 3 only concern legacy callback interface objects (i.e. NodeFilter).
-
- while JS_GetPrototype(*cx, value.handle(), value_out.handle_mut()) {
- *value = *value_out;
- if value.is_null() {
- // Step 5.2.
- return Ok(false);
- } else if value.get() as *const _ == prototype.get() {
- // Step 5.3.
- return Ok(true);
- }
- }
- }
- // JS_GetPrototype threw an exception.
- Err(())
-}
-
fn create_unscopable_object(cx: SafeJSContext, names: &[&[u8]], mut rval: MutableHandleObject) {
assert!(!names.is_empty());
assert!(rval.is_null());
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index 217e66837bb..d2e1876b9d8 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -311,6 +311,15 @@ unsafe impl<T: JSTraceable> JSTraceable for VecDeque<T> {
}
}
+unsafe impl<T: JSTraceable + Eq + Hash> JSTraceable for indexmap::IndexSet<T> {
+ #[inline]
+ unsafe fn trace(&self, trc: *mut JSTracer) {
+ for e in self.iter() {
+ e.trace(trc);
+ }
+ }
+}
+
unsafe impl<A, B, C, D> JSTraceable for (A, B, C, D)
where
A: JSTraceable,
diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs
index e992a8707dd..c45e4286992 100644
--- a/components/script/dom/create.rs
+++ b/components/script/dom/create.rs
@@ -189,14 +189,21 @@ fn create_html_element(
}
}
- // Steps 7.1-7.2
+ // Steps 7.1-7.3
let result = create_native_html_element(name.clone(), prefix, document, creator);
+ match is {
+ Some(is) => {
+ result.set_is(is);
+ result.set_custom_element_state(CustomElementState::Undefined);
+ },
+ None => {
+ if is_valid_custom_element_name(&*name.local) {
+ result.set_custom_element_state(CustomElementState::Undefined);
+ }
+ },
+ };
- // Step 7.3
- if is_valid_custom_element_name(&*name.local) || is.is_some() {
- result.set_custom_element_state(CustomElementState::Undefined);
- }
-
+ // Step 8
result
}
diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs
index 7b4229835e2..392cf49cce5 100644
--- a/components/script/dom/customelementregistry.rs
+++ b/components/script/dom/customelementregistry.rs
@@ -448,6 +448,17 @@ impl CustomElementRegistryMethods for CustomElementRegistry {
// Step 6
promise
}
+ /// https://html.spec.whatwg.org/multipage/#dom-customelementregistry-upgrade
+ fn Upgrade(&self, node: &Node) {
+ // Spec says to make a list first and then iterate the list, but
+ // try-to-upgrade only queues upgrade reactions and doesn't itself
+ // modify the tree, so that's not an observable distinction.
+ node.traverse_preorder(ShadowIncluding::Yes).for_each(|n| {
+ if let Some(element) = n.downcast::<Element>() {
+ try_upgrade_element(element);
+ }
+ });
+ }
}
#[derive(Clone, JSTraceable, MallocSizeOf)]
@@ -581,7 +592,9 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen
return;
}
- // Step 3
+ // Step 3 happens later to save having to undo it in an exception
+
+ // Step 4
for attr in element.attrs().iter() {
let local_name = attr.local_name().clone();
let value = DOMString::from(&**attr.value());
@@ -593,7 +606,7 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen
);
}
- // Step 4
+ // Step 5
if element.is_connected() {
ScriptThread::enqueue_callback_reaction(
element,
@@ -602,44 +615,51 @@ pub fn upgrade_element(definition: Rc<CustomElementDefinition>, element: &Elemen
);
}
- // Step 5
+ // Step 6
definition
.construction_stack
.borrow_mut()
.push(ConstructionStackEntry::Element(DomRoot::from_ref(element)));
- // Step 7
+ // Steps 7-8, successful case
let result = run_upgrade_constructor(&definition.constructor, element);
+ // "regardless of whether the above steps threw an exception" step
definition.construction_stack.borrow_mut().pop();
- // Step 7 exception handling
+ // Step 8 exception handling
if let Err(error) = result {
- // Step 7.1
+ // Step 8.exception.1
element.set_custom_element_state(CustomElementState::Failed);
- // Step 7.2
+ // Step 8.exception.2 isn't needed since step 3 hasn't happened yet
+
+ // Step 8.exception.3
element.clear_reaction_queue();
- // Step 7.3
+ // Step 8.exception.4
let global = GlobalScope::current().expect("No current global");
let cx = global.get_cx();
unsafe {
throw_dom_exception(cx, &global, error);
report_pending_exception(*cx, true);
}
+
return;
}
- // Step 8
+ // TODO Step 9: "If element is a form-associated custom element..."
+
+ // Step 10
+
element.set_custom_element_state(CustomElementState::Custom);
- // Step 9
+ // Step 3
element.set_custom_element_definition(definition);
}
/// <https://html.spec.whatwg.org/multipage/#concept-upgrade-an-element>
-/// Steps 7.1-7.2
+/// Steps 8.1-8.3
#[allow(unsafe_code)]
fn run_upgrade_constructor(
constructor: &Rc<CustomElementConstructor>,
@@ -654,10 +674,12 @@ fn run_upgrade_constructor(
}
rooted!(in(*cx) let mut construct_result = ptr::null_mut::<JSObject>());
{
+ // Step 8.1 TODO when shadow DOM exists
+
// Go into the constructor's compartment
let _ac = JSAutoRealm::new(*cx, constructor.callback());
let args = HandleValueArray::new();
- // Step 7.1
+ // Step 8.2
if unsafe {
!Construct1(
*cx,
@@ -668,7 +690,7 @@ fn run_upgrade_constructor(
} {
return Err(Error::JSFailed);
}
- // Step 7.2
+ // Step 8.3
let mut same = false;
rooted!(in(*cx) let construct_result_val = ObjectValue(construct_result.get()));
if unsafe {
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs
index 567d4fa6861..ad0e7445f0f 100644
--- a/components/script/dom/dedicatedworkerglobalscope.rs
+++ b/components/script/dom/dedicatedworkerglobalscope.rs
@@ -538,9 +538,8 @@ impl DedicatedWorkerGlobalScope {
let worker = self.worker.borrow().as_ref().unwrap().clone();
let global_scope = self.upcast::<GlobalScope>();
let pipeline_id = global_scope.pipeline_id();
- let origin = global_scope.origin().immutable().ascii_serialization();
let task = Box::new(task!(post_worker_message: move || {
- Worker::handle_message(worker, origin, data);
+ Worker::handle_message(worker, data);
}));
self.parent_sender
.send(CommonScriptMsg::Task(
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 94c9c8603c4..572c18dc129 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -11,7 +11,6 @@ use crate::dom::bindings::callback::ExceptionHandling;
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::BeforeUnloadEventBinding::BeforeUnloadEventBinding::BeforeUnloadEventMethods;
use crate::dom::bindings::codegen::Bindings::DocumentBinding;
-use crate::dom::bindings::codegen::Bindings::DocumentBinding::ElementCreationOptions;
use crate::dom::bindings::codegen::Bindings::DocumentBinding::{
DocumentMethods, DocumentReadyState,
};
@@ -25,7 +24,7 @@ use crate::dom::bindings::codegen::Bindings::TouchBinding::TouchMethods;
use crate::dom::bindings::codegen::Bindings::WindowBinding::{
FrameRequestCallback, ScrollBehavior, WindowMethods,
};
-use crate::dom::bindings::codegen::UnionTypes::NodeOrString;
+use crate::dom::bindings::codegen::UnionTypes::{NodeOrString, StringOrElementCreationOptions};
use crate::dom::bindings::error::{Error, ErrorResult, Fallible};
use crate::dom::bindings::inheritance::{Castable, ElementTypeId, HTMLElementTypeId, NodeTypeId};
use crate::dom::bindings::num::Finite;
@@ -371,6 +370,8 @@ pub struct Document {
page_showing: Cell<bool>,
/// Whether the document is salvageable.
salvageable: Cell<bool>,
+ /// Whether the document was aborted with an active parser
+ active_parser_was_aborted: Cell<bool>,
/// Whether the unload event has already been fired.
fired_unload: Cell<bool>,
/// List of responsive images
@@ -2265,6 +2266,7 @@ impl Document {
// Step 3.
if let Some(parser) = self.get_current_parser() {
+ self.active_parser_was_aborted.set(true);
parser.abort();
self.salvageable.set(false);
}
@@ -2813,6 +2815,7 @@ impl Document {
throw_on_dynamic_markup_insertion_counter: Cell::new(0),
page_showing: Cell::new(false),
salvageable: Cell::new(true),
+ active_parser_was_aborted: Cell::new(false),
fired_unload: Cell::new(false),
responsive_images: Default::default(),
redirect_count: Cell::new(0),
@@ -3622,7 +3625,7 @@ impl DocumentMethods for Document {
fn CreateElement(
&self,
mut local_name: DOMString,
- options: &ElementCreationOptions,
+ options: StringOrElementCreationOptions,
) -> Fallible<DomRoot<Element>> {
if xml_name_type(&local_name) == InvalidXMLName {
debug!("Not a valid element name");
@@ -3643,7 +3646,12 @@ impl DocumentMethods for Document {
};
let name = QualName::new(None, ns, LocalName::from(local_name));
- let is = options.is.as_ref().map(|is| LocalName::from(&**is));
+ let is = match options {
+ StringOrElementCreationOptions::String(_) => None,
+ StringOrElementCreationOptions::ElementCreationOptions(options) => {
+ options.is.as_ref().map(|is| LocalName::from(&**is))
+ },
+ };
Ok(Element::create(
name,
is,
@@ -3658,11 +3666,16 @@ impl DocumentMethods for Document {
&self,
namespace: Option<DOMString>,
qualified_name: DOMString,
- options: &ElementCreationOptions,
+ options: StringOrElementCreationOptions,
) -> Fallible<DomRoot<Element>> {
let (namespace, prefix, local_name) = validate_and_extract(namespace, &qualified_name)?;
let name = QualName::new(prefix, namespace, local_name);
- let is = options.is.as_ref().map(|is| LocalName::from(&**is));
+ let is = match options {
+ StringOrElementCreationOptions::String(_) => None,
+ StringOrElementCreationOptions::ElementCreationOptions(options) => {
+ options.is.as_ref().map(|is| LocalName::from(&**is))
+ },
+ };
Ok(Element::create(
name,
is,
@@ -4449,18 +4462,25 @@ impl DocumentMethods for Document {
return Ok(DomRoot::from_ref(self));
}
+ // Step 7
+ if self.active_parser_was_aborted.get() {
+ return Ok(DomRoot::from_ref(self));
+ }
+
// TODO: prompt to unload.
// TODO: set unload_event_start and unload_event_end
window_from_node(self).set_navigation_start();
- // Step 7
+ // Step 8
// TODO: https://github.com/servo/servo/issues/21937
if self.has_browsing_context() {
+ // spec says "stop document loading",
+ // which is a process that does more than just abort
self.abort();
}
- // Step 8
+ // Step 9
for node in self
.upcast::<Node>()
.traverse_preorder(ShadowIncluding::Yes)
@@ -4468,16 +4488,16 @@ impl DocumentMethods for Document {
node.upcast::<EventTarget>().remove_all_listeners();
}
- // Step 9
+ // Step 10
if self.window.Document() == DomRoot::from_ref(self) {
self.window.upcast::<EventTarget>().remove_all_listeners();
}
- // Step 10
+ // Step 11
// TODO: https://github.com/servo/servo/issues/21936
Node::replace_all(None, self.upcast::<Node>());
- // Step 11
+ // Step 12
if self.is_fully_active() {
let mut new_url = entry_responsible_document.url();
if entry_responsible_document != DomRoot::from_ref(self) {
@@ -4487,13 +4507,13 @@ impl DocumentMethods for Document {
self.set_url(new_url);
}
- // Step 12
+ // Step 13
// TODO: https://github.com/servo/servo/issues/21938
- // Step 13
+ // Step 14
self.set_quirks_mode(QuirksMode::NoQuirks);
- // Step 14
+ // Step 15
let resource_threads = self
.window
.upcast::<GlobalScope>()
@@ -4503,13 +4523,13 @@ impl DocumentMethods for Document {
DocumentLoader::new_with_threads(resource_threads, Some(self.url()));
ServoParser::parse_html_script_input(self, self.url());
- // Step 15
- self.ready_state.set(DocumentReadyState::Loading);
-
// Step 16
- // Handled when creating the parser in step 14
+ self.ready_state.set(DocumentReadyState::Loading);
// Step 17
+ // Handled when creating the parser in step 15
+
+ // Step 18
Ok(DomRoot::from_ref(self))
}
@@ -4541,8 +4561,8 @@ impl DocumentMethods for Document {
return Err(Error::InvalidState);
}
- if !self.is_active() {
- // Step 3.
+ // Step 3 - what specifies the is_active() part here?
+ if !self.is_active() || self.active_parser_was_aborted.get() {
return Ok(());
}
diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs
index e86e7472a95..d12b18168f8 100644
--- a/components/script/dom/domimplementation.rs
+++ b/components/script/dom/domimplementation.rs
@@ -9,6 +9,7 @@ use crate::dom::bindings::codegen::Bindings::DocumentBinding::{
DocumentMethods, ElementCreationOptions,
};
use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
+use crate::dom::bindings::codegen::UnionTypes::StringOrElementCreationOptions;
use crate::dom::bindings::error::Fallible;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
@@ -105,10 +106,13 @@ impl DOMImplementationMethods for DOMImplementation {
let maybe_elem = if qname.is_empty() {
None
} else {
- let options = ElementCreationOptions { is: None };
+ let options =
+ StringOrElementCreationOptions::ElementCreationOptions(ElementCreationOptions {
+ is: None,
+ });
match doc
.upcast::<Document>()
- .CreateElementNS(maybe_namespace, qname, &options)
+ .CreateElementNS(maybe_namespace, qname, options)
{
Err(error) => return Err(error),
Ok(elem) => Some(elem),
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index f6937427eda..04f8d948a24 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -24,6 +24,7 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable, EventStatus};
use crate::dom::eventsource::EventSource;
use crate::dom::eventtarget::EventTarget;
use crate::dom::file::File;
+use crate::dom::htmlscriptelement::ScriptId;
use crate::dom::messageevent::MessageEvent;
use crate::dom::messageport::MessagePort;
use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope;
@@ -32,6 +33,7 @@ use crate::dom::window::Window;
use crate::dom::workerglobalscope::WorkerGlobalScope;
use crate::dom::workletglobalscope::WorkletGlobalScope;
use crate::microtask::{Microtask, MicrotaskQueue};
+use crate::script_module::ModuleTree;
use crate::script_runtime::{CommonScriptMsg, JSContext as SafeJSContext, ScriptChan, ScriptPort};
use crate::script_thread::{MainThreadScriptChan, ScriptThread};
use crate::task::TaskCanceller;
@@ -119,6 +121,14 @@ pub struct GlobalScope {
/// Timers used by the Console API.
console_timers: DomRefCell<HashMap<DOMString, u64>>,
+ /// module map is used when importing JavaScript modules
+ /// https://html.spec.whatwg.org/multipage/#concept-settings-object-module-map
+ #[ignore_malloc_size_of = "mozjs"]
+ module_map: DomRefCell<HashMap<ServoUrl, Rc<ModuleTree>>>,
+
+ #[ignore_malloc_size_of = "mozjs"]
+ inline_module_map: DomRefCell<HashMap<ScriptId, Rc<ModuleTree>>>,
+
/// For providing instructions to an optional devtools server.
#[ignore_malloc_size_of = "channels are hard"]
devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>,
@@ -391,6 +401,8 @@ impl GlobalScope {
pipeline_id,
devtools_wants_updates: Default::default(),
console_timers: DomRefCell::new(Default::default()),
+ module_map: DomRefCell::new(Default::default()),
+ inline_module_map: DomRefCell::new(Default::default()),
devtools_chan,
mem_profiler_chan,
time_profiler_chan,
@@ -1357,6 +1369,24 @@ impl GlobalScope {
&self.consumed_rejections
}
+ pub fn set_module_map(&self, url: ServoUrl, module: ModuleTree) {
+ self.module_map.borrow_mut().insert(url, Rc::new(module));
+ }
+
+ pub fn get_module_map(&self) -> &DomRefCell<HashMap<ServoUrl, Rc<ModuleTree>>> {
+ &self.module_map
+ }
+
+ pub fn set_inline_module_map(&self, script_id: ScriptId, module: ModuleTree) {
+ self.inline_module_map
+ .borrow_mut()
+ .insert(script_id, Rc::new(module));
+ }
+
+ pub fn get_inline_module_map(&self) -> &DomRefCell<HashMap<ScriptId, Rc<ModuleTree>>> {
+ &self.inline_module_map
+ }
+
#[allow(unsafe_code)]
pub fn get_cx(&self) -> SafeJSContext {
unsafe { SafeJSContext::from_ptr(Runtime::get()) }
diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs
index 61c6fc1f98e..a75b0292d6f 100644
--- a/components/script/dom/headers.rs
+++ b/components/script/dom/headers.rs
@@ -100,10 +100,20 @@ impl HeadersMethods for Headers {
combined_value.push(b',');
}
combined_value.extend(valid_value.iter().cloned());
- self.header_list.borrow_mut().insert(
- HeaderName::from_str(&valid_name).unwrap(),
- HeaderValue::from_bytes(&combined_value).unwrap(),
- );
+ match HeaderValue::from_bytes(&combined_value) {
+ Ok(value) => {
+ self.header_list
+ .borrow_mut()
+ .insert(HeaderName::from_str(&valid_name).unwrap(), value);
+ },
+ Err(_) => {
+ // can't add the header, but we don't need to panic the browser over it
+ warn!(
+ "Servo thinks \"{:?}\" is a valid HTTP header value but HeaderValue doesn't.",
+ combined_value
+ );
+ },
+ };
Ok(())
}
@@ -197,7 +207,7 @@ impl Headers {
for (name, value) in h.header_list.borrow().iter() {
self.Append(
ByteString::new(Vec::from(name.as_str())),
- ByteString::new(Vec::from(value.to_str().unwrap().as_bytes())),
+ ByteString::new(Vec::from(value.as_bytes())),
)?;
}
Ok(())
@@ -267,13 +277,13 @@ impl Headers {
.map_or(vec![], |v| v.as_bytes().to_owned())
}
- pub fn sort_header_list(&self) -> Vec<(String, String)> {
+ pub fn sort_header_list(&self) -> Vec<(String, Vec<u8>)> {
let borrowed_header_list = self.header_list.borrow();
let headers_iter = borrowed_header_list.iter();
let mut header_vec = vec![];
for (name, value) in headers_iter {
let name = name.as_str().to_owned();
- let value = value.to_str().unwrap().to_owned();
+ let value = value.as_bytes().to_vec();
let name_value = (name, value);
header_vec.push(name_value);
}
@@ -293,7 +303,7 @@ impl Iterable for Headers {
fn get_value_at_index(&self, n: u32) -> ByteString {
let sorted_header_vec = self.sort_header_list();
let value = sorted_header_vec[n as usize].1.clone();
- ByteString::new(value.into_bytes().to_vec())
+ ByteString::new(value)
}
fn get_key_at_index(&self, n: u32) -> ByteString {
@@ -345,40 +355,19 @@ pub fn is_forbidden_header_name(name: &str) -> bool {
}
// There is some unresolved confusion over the definition of a name and a value.
-// The fetch spec [1] defines a name as "a case-insensitive byte
-// sequence that matches the field-name token production. The token
-// productions are viewable in [2]." A field-name is defined as a
-// token, which is defined in [3].
-// ISSUE 1:
-// It defines a value as "a byte sequence that matches the field-content token production."
-// To note, there is a difference between field-content and
-// field-value (which is made up of field-content and obs-fold). The
-// current definition does not allow for obs-fold (which are white
-// space and newlines) in values. So perhaps a value should be defined
-// as "a byte sequence that matches the field-value token production."
-// However, this would then allow values made up entirely of white space and newlines.
-// RELATED ISSUE 2:
-// According to a previously filed Errata ID: 4189 in [4], "the
-// specified field-value rule does not allow single field-vchar
-// surrounded by whitespace anywhere". They provided a fix for the
-// field-content production, but ISSUE 1 has still not been resolved.
-// The production definitions likely need to be re-written.
-// [1] https://fetch.spec.whatwg.org/#concept-header-value
-// [2] https://tools.ietf.org/html/rfc7230#section-3.2
-// [3] https://tools.ietf.org/html/rfc7230#section-3.2.6
-// [4] https://www.rfc-editor.org/errata_search.php?rfc=7230
//
-// As of December 2019 WHATWG, isn't even using grammar productions for value;
+// As of December 2019, WHATWG has no formal grammar production for value;
// https://fetch.spec.whatg.org/#concept-header-value just says not to have
-// newlines, nulls, or leading/trailing whitespace.
+// newlines, nulls, or leading/trailing whitespace. It even allows
+// octets that aren't a valid UTF-8 encoding, and WPT tests reflect this.
+// The HeaderValue class does not fully reflect this, so headers
+// containing bytes with values 1..31 or 127 can't be created, failing
+// WPT tests but probably not affecting anything important on the real Internet.
fn validate_name_and_value(name: ByteString, value: ByteString) -> Fallible<(String, Vec<u8>)> {
let valid_name = validate_name(name)?;
-
- // this is probably out of date
- if !is_field_content(&value) {
- return Err(Error::Type("Value is not valid".to_string()));
+ if !is_legal_header_value(&value) {
+ return Err(Error::Type("Header value is not valid".to_string()));
}
-
Ok((valid_name, value.into()))
}
@@ -431,47 +420,40 @@ fn is_field_name(name: &ByteString) -> bool {
is_token(&*name)
}
-// https://tools.ietf.org/html/rfc7230#section-3.2
-// http://www.rfc-editor.org/errata_search.php?rfc=7230
-// Errata ID: 4189
-// field-content = field-vchar [ 1*( SP / HTAB / field-vchar )
-// field-vchar ]
-fn is_field_content(value: &ByteString) -> bool {
+// https://fetch.spec.whatg.org/#concept-header-value
+fn is_legal_header_value(value: &ByteString) -> bool {
let value_len = value.len();
-
if value_len == 0 {
- return false;
- }
- if !is_field_vchar(value[0]) {
- return false;
- }
-
- if value_len > 2 {
- for &ch in &value[1..value_len - 1] {
- if !is_field_vchar(ch) && !is_space(ch) && !is_htab(ch) {
- return false;
- }
+ return true;
+ }
+ match value[0] {
+ b' ' | b'\t' => return false,
+ _ => {},
+ };
+ match value[value_len - 1] {
+ b' ' | b'\t' => return false,
+ _ => {},
+ };
+ for &ch in &value[..] {
+ match ch {
+ b'\0' | b'\n' | b'\r' => return false,
+ _ => {},
}
}
-
- if !is_field_vchar(value[value_len - 1]) {
- return false;
- }
-
- return true;
-}
-
-fn is_space(x: u8) -> bool {
- x == b' '
-}
-
-fn is_htab(x: u8) -> bool {
- x == b'\t'
-}
-
-// https://tools.ietf.org/html/rfc7230#section-3.2
-fn is_field_vchar(x: u8) -> bool {
- is_vchar(x) || is_obs_text(x)
+ true
+ // If accepting non-UTF8 header values causes breakage,
+ // removing the above "true" and uncommenting the below code
+ // would ameliorate it while still accepting most reasonable headers:
+ //match str::from_utf8(value) {
+ // Ok(_) => true,
+ // Err(_) => {
+ // warn!(
+ // "Rejecting spec-legal but non-UTF8 header value: {:?}",
+ // value
+ // );
+ // false
+ // },
+ // }
}
// https://tools.ietf.org/html/rfc5234#appendix-B.1
diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs
index 1406ceb870b..b7c7da1e9bf 100755
--- a/components/script/dom/htmlbuttonelement.rs
+++ b/components/script/dom/htmlbuttonelement.rs
@@ -34,7 +34,6 @@ enum ButtonType {
Submit,
Reset,
Button,
- Menu,
}
#[dom_struct]
@@ -42,6 +41,7 @@ pub struct HTMLButtonElement {
htmlelement: HTMLElement,
button_type: Cell<ButtonType>,
form_owner: MutNullableDom<HTMLFormElement>,
+ labels_node_list: MutNullableDom<NodeList>,
}
impl HTMLButtonElement {
@@ -59,6 +59,7 @@ impl HTMLButtonElement {
),
button_type: Cell::new(ButtonType::Submit),
form_owner: Default::default(),
+ labels_node_list: Default::default(),
}
}
@@ -97,7 +98,7 @@ impl HTMLButtonElementMethods for HTMLButtonElement {
}
// https://html.spec.whatwg.org/multipage/#dom-button-type
- make_enumerated_getter!(Type, "type", "submit", "reset" | "button" | "menu");
+ make_enumerated_getter!(Type, "type", "submit", "reset" | "button");
// https://html.spec.whatwg.org/multipage/#dom-button-type
make_setter!(SetType, "type");
@@ -150,9 +151,7 @@ impl HTMLButtonElementMethods for HTMLButtonElement {
make_setter!(SetValue, "value");
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- fn Labels(&self) -> DomRoot<NodeList> {
- self.upcast::<HTMLElement>().labels()
- }
+ make_labels_getter!(Labels, labels_node_list);
}
impl HTMLButtonElement {
@@ -216,7 +215,6 @@ impl VirtualMethods for HTMLButtonElement {
let value = match &**attr.value() {
"reset" => ButtonType::Reset,
"button" => ButtonType::Button,
- "menu" => ButtonType::Menu,
_ => ButtonType::Submit,
};
self.button_type.set(value);
diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs
index 7bec738f382..c5b7e6d0251 100644
--- a/components/script/dom/htmlelement.rs
+++ b/components/script/dom/htmlelement.rs
@@ -4,10 +4,10 @@
use crate::dom::activation::{synthetic_click_activation, ActivationSource};
use crate::dom::attr::Attr;
-use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
use crate::dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use crate::dom::bindings::codegen::Bindings::HTMLElementBinding;
use crate::dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods;
+use crate::dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods;
use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeBinding::NodeMethods;
use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use crate::dom::bindings::error::{Error, ErrorResult};
@@ -29,7 +29,6 @@ use crate::dom::htmlinputelement::{HTMLInputElement, InputType};
use crate::dom::htmllabelelement::HTMLLabelElement;
use crate::dom::node::{document_from_node, window_from_node};
use crate::dom::node::{BindContext, Node, NodeFlags, ShadowIncluding};
-use crate::dom::nodelist::NodeList;
use crate::dom::text::Text;
use crate::dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct;
@@ -677,43 +676,48 @@ impl HTMLElement {
}
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- pub fn labels(&self) -> DomRoot<NodeList> {
- debug_assert!(self.is_labelable_element());
-
+ // This gets the nth label in tree order.
+ pub fn label_at(&self, index: u32) -> Option<DomRoot<Node>> {
let element = self.upcast::<Element>();
- let window = window_from_node(element);
-
- // Traverse ancestors for implicitly associated <label> elements
- // https://html.spec.whatwg.org/multipage/#the-label-element:attr-label-for-4
- let ancestors = self
- .upcast::<Node>()
- .ancestors()
- .filter_map(DomRoot::downcast::<HTMLElement>)
- // If we reach a labelable element, we have a guarantee no ancestors above it
- // will be a label for this HTMLElement
- .take_while(|elem| !elem.is_labelable_element())
- .filter_map(DomRoot::downcast::<HTMLLabelElement>)
- .filter(|elem| !elem.upcast::<Element>().has_attribute(&local_name!("for")))
- .filter(|elem| elem.first_labelable_descendant().as_deref() == Some(self))
- .map(DomRoot::upcast::<Node>);
- let id = element.Id();
- let id = match &id as &str {
- "" => return NodeList::new_simple_list(&window, ancestors),
- id => id,
- };
-
- // Traverse entire tree for <label> elements with `for` attribute matching `id`
+ // Traverse entire tree for <label> elements that have
+ // this as their control.
+ // There is room for performance optimization, as we don't need
+ // the actual result of GetControl, only whether the result
+ // would match self.
+ // (Even more room for performance optimization: do what
+ // nodelist ChildrenList does and keep a mutation-aware cursor
+ // around; this may be hard since labels need to keep working
+ // even as they get detached into a subtree and reattached to
+ // a document.)
let root_element = element.root_element();
let root_node = root_element.upcast::<Node>();
- let children = root_node
+ root_node
.traverse_preorder(ShadowIncluding::No)
- .filter_map(DomRoot::downcast::<Element>)
- .filter(|elem| elem.is::<HTMLLabelElement>())
- .filter(|elem| elem.get_string_attribute(&local_name!("for")) == id)
- .map(DomRoot::upcast::<Node>);
+ .filter_map(DomRoot::downcast::<HTMLLabelElement>)
+ .filter(|elem| match elem.GetControl() {
+ Some(control) => &*control == self,
+ _ => false,
+ })
+ .nth(index as usize)
+ .map(|n| DomRoot::from_ref(n.upcast::<Node>()))
+ }
- NodeList::new_simple_list(&window, children.chain(ancestors))
+ // https://html.spec.whatwg.org/multipage/#dom-lfe-labels
+ // This counts the labels of the element, to support NodeList::Length
+ pub fn labels_count(&self) -> u32 {
+ // see label_at comments about performance
+ let element = self.upcast::<Element>();
+ let root_element = element.root_element();
+ let root_node = root_element.upcast::<Node>();
+ root_node
+ .traverse_preorder(ShadowIncluding::No)
+ .filter_map(DomRoot::downcast::<HTMLLabelElement>)
+ .filter(|elem| match elem.GetControl() {
+ Some(control) => &*control == self,
+ _ => false,
+ })
+ .count() as u32
}
}
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs
index 9018f05813a..90058f303a9 100755
--- a/components/script/dom/htmlinputelement.rs
+++ b/components/script/dom/htmlinputelement.rs
@@ -35,7 +35,7 @@ use crate::dom::htmlformelement::{ResetFrom, SubmittedFrom};
use crate::dom::keyboardevent::KeyboardEvent;
use crate::dom::mouseevent::MouseEvent;
use crate::dom::node::{document_from_node, window_from_node};
-use crate::dom::node::{BindContext, Node, NodeDamage, UnbindContext};
+use crate::dom::node::{BindContext, CloneChildrenFlag, Node, NodeDamage, UnbindContext};
use crate::dom::nodelist::NodeList;
use crate::dom::textcontrol::{TextControlElement, TextControlSelection};
use crate::dom::validation::Validatable;
@@ -46,7 +46,6 @@ use crate::textinput::KeyReaction::{
};
use crate::textinput::Lines::Single;
use crate::textinput::{Direction, SelectionDirection, TextInput, UTF16CodeUnits, UTF8Bytes};
-use caseless::compatibility_caseless_match_str;
use dom_struct::dom_struct;
use embedder_traits::FilterPattern;
use encoding_rs::Encoding;
@@ -235,6 +234,7 @@ pub struct HTMLInputElement {
filelist: MutNullableDom<FileList>,
form_owner: MutNullableDom<HTMLFormElement>,
+ labels_node_list: MutNullableDom<NodeList>,
}
#[derive(JSTraceable)]
@@ -304,6 +304,7 @@ impl HTMLInputElement {
value_dirty: Cell::new(false),
filelist: MutNullableDom::new(None),
form_owner: Default::default(),
+ labels_node_list: MutNullableDom::new(None),
}
}
@@ -792,12 +793,18 @@ impl HTMLInputElementMethods for HTMLInputElement {
}
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- fn Labels(&self) -> DomRoot<NodeList> {
+ // Different from make_labels_getter because this one
+ // conditionally returns null.
+ fn GetLabels(&self) -> Option<DomRoot<NodeList>> {
if self.input_type() == InputType::Hidden {
- let window = window_from_node(self);
- NodeList::empty(&window)
+ None
} else {
- self.upcast::<HTMLElement>().labels()
+ Some(self.labels_node_list.or_init(|| {
+ NodeList::new_labels_list(
+ self.upcast::<Node>().owner_doc().window(),
+ self.upcast::<HTMLElement>(),
+ )
+ }))
}
}
@@ -917,7 +924,7 @@ fn in_same_group(
// TODO Both a and b are in the same home subtree.
other.form_owner().as_deref() == owner &&
match (other.radio_group_name(), group) {
- (Some(ref s1), Some(s2)) => compatibility_caseless_match_str(s1, s2) && s2 != &atom!(""),
+ (Some(ref s1), Some(s2)) => s1 == s2 && s2 != &atom!(""),
_ => false
}
}
@@ -1659,6 +1666,26 @@ impl VirtualMethods for HTMLInputElement {
}
}
}
+
+ // https://html.spec.whatwg.org/multipage/#the-input-element%3Aconcept-node-clone-ext
+ fn cloning_steps(
+ &self,
+ copy: &Node,
+ maybe_doc: Option<&Document>,
+ clone_children: CloneChildrenFlag,
+ ) {
+ if let Some(ref s) = self.super_type() {
+ s.cloning_steps(copy, maybe_doc, clone_children);
+ }
+ let elem = copy.downcast::<HTMLInputElement>().unwrap();
+ elem.value_dirty.set(self.value_dirty.get());
+ elem.checked_changed.set(self.checked_changed.get());
+ elem.upcast::<Element>()
+ .set_state(ElementState::IN_CHECKED_STATE, self.Checked());
+ elem.textinput
+ .borrow_mut()
+ .set_content(self.textinput.borrow().get_content());
+ }
}
impl FormControl for HTMLInputElement {
diff --git a/components/script/dom/htmllabelelement.rs b/components/script/dom/htmllabelelement.rs
index 0a1401d6283..cca8e0f03c9 100644
--- a/components/script/dom/htmllabelelement.rs
+++ b/components/script/dom/htmllabelelement.rs
@@ -4,8 +4,11 @@
use crate::dom::activation::{synthetic_click_activation, Activatable, ActivationSource};
use crate::dom::attr::Attr;
+use crate::dom::bindings::codegen::Bindings::AttrBinding::AttrMethods;
+use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
use crate::dom::bindings::codegen::Bindings::HTMLLabelElementBinding;
use crate::dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods;
+use crate::dom::bindings::codegen::Bindings::NodeBinding::{GetRootNodeOptions, NodeMethods};
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString;
@@ -15,7 +18,7 @@ use crate::dom::event::Event;
use crate::dom::eventtarget::EventTarget;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::{FormControl, FormControlElementHelpers, HTMLFormElement};
-use crate::dom::node::{document_from_node, Node, ShadowIncluding};
+use crate::dom::node::{Node, ShadowIncluding};
use crate::dom::virtualmethods::VirtualMethods;
use dom_struct::dom_struct;
use html5ever::{LocalName, Prefix};
@@ -99,10 +102,6 @@ impl HTMLLabelElementMethods for HTMLLabelElement {
// https://html.spec.whatwg.org/multipage/#dom-label-control
fn GetControl(&self) -> Option<DomRoot<HTMLElement>> {
- if !self.upcast::<Node>().is_in_doc() {
- return None;
- }
-
let for_attr = match self
.upcast::<Element>()
.get_attribute(&ns!(), &local_name!("for"))
@@ -111,13 +110,40 @@ impl HTMLLabelElementMethods for HTMLLabelElement {
None => return self.first_labelable_descendant(),
};
- let for_value = for_attr.value();
- document_from_node(self)
- .get_element_by_id(for_value.as_atom())
- .and_then(DomRoot::downcast::<HTMLElement>)
- .into_iter()
- .filter(|e| e.is_labelable_element())
- .next()
+ let for_value = for_attr.Value();
+
+ // "If the attribute is specified and there is an element in the tree
+ // whose ID is equal to the value of the for attribute, and the first
+ // such element in tree order is a labelable element, then that
+ // element is the label element's labeled control."
+ // Two subtle points here: we need to search the _tree_, which is
+ // not necessarily the document if we're detached from the document,
+ // and we only consider one element even if a later element with
+ // the same ID is labelable.
+
+ let maybe_found = self
+ .upcast::<Node>()
+ .GetRootNode(&GetRootNodeOptions::empty())
+ .traverse_preorder(ShadowIncluding::No)
+ .find_map(|e| {
+ if let Some(htmle) = e.downcast::<HTMLElement>() {
+ if htmle.upcast::<Element>().Id() == for_value {
+ Some(DomRoot::from_ref(htmle))
+ } else {
+ None
+ }
+ } else {
+ None
+ }
+ });
+ // We now have the element that we would return, but only return it
+ // if it's labelable.
+ if let Some(ref maybe_labelable) = maybe_found {
+ if maybe_labelable.is_labelable_element() {
+ return maybe_found;
+ }
+ }
+ None
}
}
diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs
index 91acd4b97e7..cb93a77a90d 100644
--- a/components/script/dom/htmlmediaelement.rs
+++ b/components/script/dom/htmlmediaelement.rs
@@ -2362,6 +2362,7 @@ impl HTMLMediaElementMethods for HTMLMediaElement {
label,
language,
TextTrackMode::Hidden,
+ None,
);
// Step 3 & 4
self.TextTracks().add(&track);
diff --git a/components/script/dom/htmlmeterelement.rs b/components/script/dom/htmlmeterelement.rs
index a627d9aee93..780080a6a65 100644
--- a/components/script/dom/htmlmeterelement.rs
+++ b/components/script/dom/htmlmeterelement.rs
@@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLMeterElementBinding::{
self, HTMLMeterElementMethods,
};
use crate::dom::bindings::inheritance::Castable;
-use crate::dom::bindings::root::DomRoot;
+use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
@@ -17,6 +17,7 @@ use html5ever::{LocalName, Prefix};
#[dom_struct]
pub struct HTMLMeterElement {
htmlelement: HTMLElement,
+ labels_node_list: MutNullableDom<NodeList>,
}
impl HTMLMeterElement {
@@ -27,6 +28,7 @@ impl HTMLMeterElement {
) -> HTMLMeterElement {
HTMLMeterElement {
htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
+ labels_node_list: MutNullableDom::new(None),
}
}
@@ -48,7 +50,5 @@ impl HTMLMeterElement {
impl HTMLMeterElementMethods for HTMLMeterElement {
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- fn Labels(&self) -> DomRoot<NodeList> {
- self.upcast::<HTMLElement>().labels()
- }
+ make_labels_getter!(Labels, labels_node_list);
}
diff --git a/components/script/dom/htmloptionelement.rs b/components/script/dom/htmloptionelement.rs
index 3893aea95ab..4ebb2860a79 100644
--- a/components/script/dom/htmloptionelement.rs
+++ b/components/script/dom/htmloptionelement.rs
@@ -8,12 +8,14 @@ use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding;
use crate::dom::bindings::codegen::Bindings::HTMLOptionElementBinding::HTMLOptionElementMethods;
use crate::dom::bindings::codegen::Bindings::HTMLSelectElementBinding::HTMLSelectElementBinding::HTMLSelectElementMethods;
use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
+use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
+use crate::dom::bindings::error::Fallible;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString;
use crate::dom::characterdata::CharacterData;
use crate::dom::document::Document;
-use crate::dom::element::{AttributeMutation, Element};
+use crate::dom::element::{AttributeMutation, CustomElementCreationMode, Element, ElementCreator};
use crate::dom::htmlelement::HTMLElement;
use crate::dom::htmlformelement::HTMLFormElement;
use crate::dom::htmloptgroupelement::HTMLOptGroupElement;
@@ -22,8 +24,9 @@ use crate::dom::htmlselectelement::HTMLSelectElement;
use crate::dom::node::{BindContext, Node, ShadowIncluding, UnbindContext};
use crate::dom::text::Text;
use crate::dom::virtualmethods::VirtualMethods;
+use crate::dom::window::Window;
use dom_struct::dom_struct;
-use html5ever::{LocalName, Prefix};
+use html5ever::{LocalName, Prefix, QualName};
use std::cell::Cell;
use style::element_state::ElementState;
use style::str::{split_html_space_chars, str_join};
@@ -72,6 +75,37 @@ impl HTMLOptionElement {
)
}
+ // https://html.spec.whatwg.org/multipage/#dom-option
+ pub fn Option(
+ window: &Window,
+ text: DOMString,
+ value: Option<DOMString>,
+ default_selected: bool,
+ selected: bool,
+ ) -> Fallible<DomRoot<HTMLOptionElement>> {
+ let element = Element::create(
+ QualName::new(None, ns!(html), local_name!("option")),
+ None,
+ &window.Document(),
+ ElementCreator::ScriptCreated,
+ CustomElementCreationMode::Synchronous,
+ );
+
+ let option = DomRoot::downcast::<HTMLOptionElement>(element).unwrap();
+
+ if !text.is_empty() {
+ option.upcast::<Node>().SetTextContent(Some(text))
+ }
+
+ if let Some(val) = value {
+ option.SetValue(val)
+ }
+
+ option.SetDefaultSelected(default_selected);
+ option.set_selectedness(selected);
+ Ok(option)
+ }
+
pub fn set_selectedness(&self, selected: bool) {
self.selectedness.set(selected);
}
diff --git a/components/script/dom/htmloutputelement.rs b/components/script/dom/htmloutputelement.rs
index 65b9ae554c8..9314672d3d0 100644
--- a/components/script/dom/htmloutputelement.rs
+++ b/components/script/dom/htmloutputelement.rs
@@ -22,6 +22,7 @@ use html5ever::{LocalName, Prefix};
pub struct HTMLOutputElement {
htmlelement: HTMLElement,
form_owner: MutNullableDom<HTMLFormElement>,
+ labels_node_list: MutNullableDom<NodeList>,
}
impl HTMLOutputElement {
@@ -33,6 +34,7 @@ impl HTMLOutputElement {
HTMLOutputElement {
htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
form_owner: Default::default(),
+ labels_node_list: Default::default(),
}
}
@@ -65,9 +67,7 @@ impl HTMLOutputElementMethods for HTMLOutputElement {
}
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- fn Labels(&self) -> DomRoot<NodeList> {
- self.upcast::<HTMLElement>().labels()
- }
+ make_labels_getter!(Labels, labels_node_list);
}
impl VirtualMethods for HTMLOutputElement {
diff --git a/components/script/dom/htmlprogresselement.rs b/components/script/dom/htmlprogresselement.rs
index 26ee952b2c9..0c4789fdc14 100644
--- a/components/script/dom/htmlprogresselement.rs
+++ b/components/script/dom/htmlprogresselement.rs
@@ -6,7 +6,7 @@ use crate::dom::bindings::codegen::Bindings::HTMLProgressElementBinding::{
self, HTMLProgressElementMethods,
};
use crate::dom::bindings::inheritance::Castable;
-use crate::dom::bindings::root::DomRoot;
+use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::document::Document;
use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::Node;
@@ -17,6 +17,7 @@ use html5ever::{LocalName, Prefix};
#[dom_struct]
pub struct HTMLProgressElement {
htmlelement: HTMLElement,
+ labels_node_list: MutNullableDom<NodeList>,
}
impl HTMLProgressElement {
@@ -27,6 +28,7 @@ impl HTMLProgressElement {
) -> HTMLProgressElement {
HTMLProgressElement {
htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
+ labels_node_list: MutNullableDom::new(None),
}
}
@@ -48,7 +50,5 @@ impl HTMLProgressElement {
impl HTMLProgressElementMethods for HTMLProgressElement {
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- fn Labels(&self) -> DomRoot<NodeList> {
- self.upcast::<HTMLElement>().labels()
- }
+ make_labels_getter!(Labels, labels_node_list);
}
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index fdeca285e30..3a55590c81d 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -12,6 +12,7 @@ use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::refcounted::Trusted;
use crate::dom::bindings::reflector::DomObject;
use crate::dom::bindings::root::{Dom, DomRoot};
+use crate::dom::bindings::settings_stack::AutoEntryScript;
use crate::dom::bindings::str::{DOMString, USVString};
use crate::dom::document::Document;
use crate::dom::element::{
@@ -27,6 +28,8 @@ use crate::dom::performanceresourcetiming::InitiatorType;
use crate::dom::virtualmethods::VirtualMethods;
use crate::fetch::create_a_potential_CORS_request;
use crate::network_listener::{self, NetworkListener, PreInvoke, ResourceTimingListener};
+use crate::script_module::fetch_inline_module_script;
+use crate::script_module::{fetch_external_module_script, ModuleOwner};
use content_security_policy as csp;
use dom_struct::dom_struct;
use encoding_rs::Encoding;
@@ -35,7 +38,7 @@ use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
use js::jsval::UndefinedValue;
use msg::constellation_msg::PipelineId;
-use net_traits::request::{CorsSettings, Destination, Referrer, RequestBuilder};
+use net_traits::request::{CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder};
use net_traits::ReferrerPolicy;
use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError};
use net_traits::{ResourceFetchTiming, ResourceTimingType};
@@ -51,6 +54,10 @@ use std::sync::{Arc, Mutex};
use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS};
use uuid::Uuid;
+/// An unique id for script element.
+#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, PartialEq)]
+pub struct ScriptId(Uuid);
+
#[dom_struct]
pub struct HTMLScriptElement {
htmlelement: HTMLElement,
@@ -71,6 +78,10 @@ pub struct HTMLScriptElement {
/// Track line line_number
line_number: u64,
+
+ /// Unique id for each script element
+ #[ignore_malloc_size_of = "Defined in uuid"]
+ id: ScriptId,
}
impl HTMLScriptElement {
@@ -81,6 +92,7 @@ impl HTMLScriptElement {
creator: ElementCreator,
) -> HTMLScriptElement {
HTMLScriptElement {
+ id: ScriptId(Uuid::new_v4()),
htmlelement: HTMLElement::new_inherited(local_name, prefix, document),
already_started: Cell::new(false),
parser_inserted: Cell::new(creator.is_parser_created()),
@@ -105,11 +117,15 @@ impl HTMLScriptElement {
HTMLScriptElementBinding::Wrap,
)
}
+
+ pub fn get_script_id(&self) -> ScriptId {
+ self.id.clone()
+ }
}
/// Supported script types as defined by
/// <https://html.spec.whatwg.org/multipage/#javascript-mime-type>.
-static SCRIPT_JS_MIMES: StaticStringVec = &[
+pub static SCRIPT_JS_MIMES: StaticStringVec = &[
"application/ecmascript",
"application/javascript",
"application/x-ecmascript",
@@ -143,7 +159,7 @@ pub struct ScriptOrigin {
}
impl ScriptOrigin {
- fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin {
+ pub fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin {
ScriptOrigin {
text: text,
url: url,
@@ -152,7 +168,7 @@ impl ScriptOrigin {
}
}
- fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin {
+ pub fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin {
ScriptOrigin {
text: text,
url: url,
@@ -160,6 +176,10 @@ impl ScriptOrigin {
type_,
}
}
+
+ pub fn text(&self) -> DOMString {
+ self.text.clone()
+ }
}
pub type ScriptResult = Result<ScriptOrigin, NetworkError>;
@@ -427,7 +447,10 @@ impl HTMLScriptElement {
return;
}
- // TODO: Step 12: nomodule content attribute
+ // Step 12
+ if element.has_attribute(&local_name!("nomodule")) && script_type == ScriptType::Classic {
+ return;
+ }
// Step 13.
if !element.has_attribute(&local_name!("src")) &&
@@ -441,23 +464,25 @@ impl HTMLScriptElement {
}
// Step 14.
- let for_attribute = element.get_attribute(&ns!(), &local_name!("for"));
- let event_attribute = element.get_attribute(&ns!(), &local_name!("event"));
- match (for_attribute, event_attribute) {
- (Some(ref for_attribute), Some(ref event_attribute)) => {
- let for_value = for_attribute.value().to_ascii_lowercase();
- let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS);
- if for_value != "window" {
- return;
- }
+ if script_type == ScriptType::Classic {
+ let for_attribute = element.get_attribute(&ns!(), &local_name!("for"));
+ let event_attribute = element.get_attribute(&ns!(), &local_name!("event"));
+ match (for_attribute, event_attribute) {
+ (Some(ref for_attribute), Some(ref event_attribute)) => {
+ let for_value = for_attribute.value().to_ascii_lowercase();
+ let for_value = for_value.trim_matches(HTML_SPACE_CHARACTERS);
+ if for_value != "window" {
+ return;
+ }
- let event_value = event_attribute.value().to_ascii_lowercase();
- let event_value = event_value.trim_matches(HTML_SPACE_CHARACTERS);
- if event_value != "onload" && event_value != "onload()" {
- return;
- }
- },
- (_, _) => (),
+ let event_value = event_attribute.value().to_ascii_lowercase();
+ let event_value = event_value.trim_matches(HTML_SPACE_CHARACTERS);
+ if event_value != "onload" && event_value != "onload()" {
+ return;
+ }
+ },
+ (_, _) => (),
+ }
}
// Step 15.
@@ -469,7 +494,18 @@ impl HTMLScriptElement {
// Step 16.
let cors_setting = cors_setting_for_element(element);
- // TODO: Step 17: Module script credentials mode.
+ // Step 17.
+ let credentials_mode = match script_type {
+ ScriptType::Classic => None,
+ ScriptType::Module => Some(reflect_cross_origin_attribute(element).map_or(
+ CredentialsMode::CredentialsSameOrigin,
+ |attr| match &*attr {
+ "use-credentials" => CredentialsMode::Include,
+ "anonymous" => CredentialsMode::CredentialsSameOrigin,
+ _ => CredentialsMode::CredentialsSameOrigin,
+ },
+ )),
+ };
// TODO: Step 18: Nonce.
@@ -514,6 +550,7 @@ impl HTMLScriptElement {
},
};
+ // Step 24.6.
match script_type {
ScriptType::Classic => {
// Preparation for step 26.
@@ -555,50 +592,69 @@ impl HTMLScriptElement {
}
},
ScriptType::Module => {
- warn!(
- "{} is a module script. It should be fixed after #23545 landed.",
- url.clone()
+ fetch_external_module_script(
+ ModuleOwner::Window(Trusted::new(self)),
+ url.clone(),
+ Destination::Script,
+ integrity_metadata.to_owned(),
+ credentials_mode.unwrap(),
);
- self.global().issue_page_warning(&format!(
- "Module scripts are not supported; {} will not be executed.",
- url.clone()
- ));
+
+ if !r#async && was_parser_inserted {
+ doc.add_deferred_script(self);
+ } else if !r#async && !self.non_blocking.get() {
+ doc.push_asap_in_order_script(self);
+ } else {
+ doc.add_asap_script(self);
+ };
},
}
} else {
// Step 25.
assert!(!text.is_empty());
- // Step 25-1.
+ // Step 25-1. & 25-2.
let result = Ok(ScriptOrigin::internal(
text.clone(),
base_url.clone(),
script_type.clone(),
));
- // TODO: Step 25-2.
- if let ScriptType::Module = script_type {
- warn!(
- "{} is a module script. It should be fixed after #23545 landed.",
- base_url.clone()
- );
- self.global().issue_page_warning(
- "Module scripts are not supported; ignoring inline module script.",
- );
- return;
- }
+ // Step 25-2.
+ match script_type {
+ ScriptType::Classic => {
+ if was_parser_inserted &&
+ doc.get_current_parser()
+ .map_or(false, |parser| parser.script_nesting_level() <= 1) &&
+ doc.get_script_blocking_stylesheets_count() > 0
+ {
+ // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet.
+ doc.set_pending_parsing_blocking_script(self, Some(result));
+ } else {
+ // Step 26.i: otherwise.
+ self.execute(result);
+ }
+ },
+ ScriptType::Module => {
+ // We should add inline module script elements
+ // into those vectors in case that there's no
+ // descendants in the inline module script.
+ if !r#async && was_parser_inserted {
+ doc.add_deferred_script(self);
+ } else if !r#async && !self.non_blocking.get() {
+ doc.push_asap_in_order_script(self);
+ } else {
+ doc.add_asap_script(self);
+ };
- // Step 26.
- if was_parser_inserted &&
- doc.get_current_parser()
- .map_or(false, |parser| parser.script_nesting_level() <= 1) &&
- doc.get_script_blocking_stylesheets_count() > 0
- {
- // Step 26.h: classic, has no src, was parser-inserted, is blocked on stylesheet.
- doc.set_pending_parsing_blocking_script(self, Some(result));
- } else {
- // Step 26.i: otherwise.
- self.execute(result);
+ fetch_inline_module_script(
+ ModuleOwner::Window(Trusted::new(self)),
+ text.clone(),
+ base_url.clone(),
+ self.id.clone(),
+ credentials_mode.unwrap(),
+ );
+ },
}
}
}
@@ -656,7 +712,7 @@ impl HTMLScriptElement {
}
/// <https://html.spec.whatwg.org/multipage/#execute-the-script-block>
- pub fn execute(&self, result: Result<ScriptOrigin, NetworkError>) {
+ pub fn execute(&self, result: ScriptResult) {
// Step 1.
let doc = document_from_node(self);
if self.parser_inserted.get() && &*doc != &*self.parser_document {
@@ -674,10 +730,12 @@ impl HTMLScriptElement {
Ok(script) => script,
};
- self.unminify_js(&mut script);
+ if script.type_ == ScriptType::Classic {
+ self.unminify_js(&mut script);
+ }
// Step 3.
- let neutralized_doc = if script.external {
+ let neutralized_doc = if script.external || script.type_ == ScriptType::Module {
debug!("loading external script, url = {}", script.url);
let doc = document_from_node(self);
doc.incr_ignore_destructive_writes_counter();
@@ -690,21 +748,24 @@ impl HTMLScriptElement {
let document = document_from_node(self);
let old_script = document.GetCurrentScript();
- // Step 5.a.1.
- document.set_current_script(Some(self));
-
- // Step 5.a.2.
- self.run_a_classic_script(&script);
-
- // Step 6.
- document.set_current_script(old_script.as_deref());
+ match script.type_ {
+ ScriptType::Classic => {
+ document.set_current_script(Some(self));
+ self.run_a_classic_script(&script);
+ document.set_current_script(old_script.as_deref());
+ },
+ ScriptType::Module => {
+ assert!(old_script.is_none());
+ self.run_a_module_script(&script, false);
+ },
+ }
- // Step 7.
+ // Step 5.
if let Some(doc) = neutralized_doc {
doc.decr_ignore_destructive_writes_counter();
}
- // Step 8.
+ // Step 6.
if script.external {
self.dispatch_load_event();
}
@@ -736,6 +797,72 @@ impl HTMLScriptElement {
);
}
+ #[allow(unsafe_code)]
+ /// https://html.spec.whatwg.org/multipage/#run-a-module-script
+ pub fn run_a_module_script(&self, script: &ScriptOrigin, _rethrow_errors: bool) {
+ // TODO use a settings object rather than this element's document/window
+ // Step 2
+ let document = document_from_node(self);
+ if !document.is_fully_active() || !document.is_scripting_enabled() {
+ return;
+ }
+
+ // Step 4
+ let window = window_from_node(self);
+ let global = window.upcast::<GlobalScope>();
+ let _aes = AutoEntryScript::new(&global);
+
+ if script.external {
+ let module_map = global.get_module_map().borrow();
+
+ if let Some(module_tree) = module_map.get(&script.url) {
+ // Step 6.
+ {
+ let module_error = module_tree.get_error().borrow();
+ if module_error.is_some() {
+ module_tree.report_error(&global);
+ return;
+ }
+ }
+
+ let module_record = module_tree.get_record().borrow();
+ if let Some(record) = &*module_record {
+ let evaluated = module_tree.execute_module(global, record.handle());
+
+ if let Err(exception) = evaluated {
+ module_tree.set_error(Some(exception.clone()));
+ module_tree.report_error(&global);
+ return;
+ }
+ }
+ }
+ } else {
+ let inline_module_map = global.get_inline_module_map().borrow();
+
+ if let Some(module_tree) = inline_module_map.get(&self.id.clone()) {
+ // Step 6.
+ {
+ let module_error = module_tree.get_error().borrow();
+ if module_error.is_some() {
+ module_tree.report_error(&global);
+ return;
+ }
+ }
+
+ let module_record = module_tree.get_record().borrow();
+ if let Some(record) = &*module_record {
+ let evaluated = module_tree.execute_module(global, record.handle());
+
+ if let Err(exception) = evaluated {
+ module_tree.set_error(Some(exception.clone()));
+ module_tree.report_error(&global);
+ return;
+ }
+ }
+ }
+ }
+ }
+
pub fn queue_error_event(&self) {
let window = window_from_node(self);
window
@@ -818,10 +945,18 @@ impl HTMLScriptElement {
self.parser_inserted.set(parser_inserted);
}
+ pub fn get_parser_inserted(&self) -> bool {
+ self.parser_inserted.get()
+ }
+
pub fn set_already_started(&self, already_started: bool) {
self.already_started.set(already_started);
}
+ pub fn get_non_blocking(&self) -> bool {
+ self.non_blocking.get()
+ }
+
fn dispatch_event(
&self,
type_: Atom,
@@ -930,6 +1065,11 @@ impl HTMLScriptElementMethods for HTMLScriptElement {
// https://html.spec.whatwg.org/multipage/#dom-script-defer
make_bool_setter!(SetDefer, "defer");
+ // https://html.spec.whatwg.org/multipage/#dom-script-nomodule
+ make_bool_getter!(NoModule, "nomodule");
+ // https://html.spec.whatwg.org/multipage/#dom-script-nomodule
+ make_bool_setter!(SetNoModule, "nomodule");
+
// https://html.spec.whatwg.org/multipage/#dom-script-integrity
make_getter!(Integrity, "integrity");
// https://html.spec.whatwg.org/multipage/#dom-script-integrity
diff --git a/components/script/dom/htmlselectelement.rs b/components/script/dom/htmlselectelement.rs
index c71a5442e73..0ef500ccb1a 100755
--- a/components/script/dom/htmlselectelement.rs
+++ b/components/script/dom/htmlselectelement.rs
@@ -61,6 +61,7 @@ pub struct HTMLSelectElement {
htmlelement: HTMLElement,
options: MutNullableDom<HTMLOptionsCollection>,
form_owner: MutNullableDom<HTMLFormElement>,
+ labels_node_list: MutNullableDom<NodeList>,
}
static DEFAULT_SELECT_SIZE: u32 = 0;
@@ -80,6 +81,7 @@ impl HTMLSelectElement {
),
options: Default::default(),
form_owner: Default::default(),
+ labels_node_list: Default::default(),
}
}
@@ -249,9 +251,7 @@ impl HTMLSelectElementMethods for HTMLSelectElement {
}
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- fn Labels(&self) -> DomRoot<NodeList> {
- self.upcast::<HTMLElement>().labels()
- }
+ make_labels_getter!(Labels, labels_node_list);
// https://html.spec.whatwg.org/multipage/#dom-select-options
fn Options(&self) -> DomRoot<HTMLOptionsCollection> {
diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs
index ed2372fb247..eb8fcab3873 100755
--- a/components/script/dom/htmltextareaelement.rs
+++ b/components/script/dom/htmltextareaelement.rs
@@ -52,6 +52,7 @@ pub struct HTMLTextAreaElement {
// https://html.spec.whatwg.org/multipage/#concept-textarea-dirty
value_dirty: Cell<bool>,
form_owner: MutNullableDom<HTMLFormElement>,
+ labels_node_list: MutNullableDom<NodeList>,
}
pub trait LayoutHTMLTextAreaElementHelpers {
@@ -153,6 +154,7 @@ impl HTMLTextAreaElement {
)),
value_dirty: Cell::new(false),
form_owner: Default::default(),
+ labels_node_list: Default::default(),
}
}
@@ -316,9 +318,7 @@ impl HTMLTextAreaElementMethods for HTMLTextAreaElement {
}
// https://html.spec.whatwg.org/multipage/#dom-lfe-labels
- fn Labels(&self) -> DomRoot<NodeList> {
- self.upcast::<HTMLElement>().labels()
- }
+ make_labels_getter!(Labels, labels_node_list);
// https://html.spec.whatwg.org/multipage/#dom-textarea/input-select
fn Select(&self) {
diff --git a/components/script/dom/htmltrackelement.rs b/components/script/dom/htmltrackelement.rs
index caa8932b415..c67701b3894 100644
--- a/components/script/dom/htmltrackelement.rs
+++ b/components/script/dom/htmltrackelement.rs
@@ -59,6 +59,7 @@ impl HTMLTrackElement {
Default::default(),
Default::default(),
Default::default(),
+ None,
);
Node::reflect_node(
Box::new(HTMLTrackElement::new_inherited(
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index a1941662963..fe578f6f675 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -141,6 +141,21 @@ macro_rules! make_form_action_getter(
);
#[macro_export]
+macro_rules! make_labels_getter(
+ ( $attr:ident, $memo:ident ) => (
+ fn $attr(&self) -> DomRoot<NodeList> {
+ use crate::dom::htmlelement::HTMLElement;
+ use crate::dom::nodelist::NodeList;
+ self.$memo.or_init(|| NodeList::new_labels_list(
+ self.upcast::<Node>().owner_doc().window(),
+ self.upcast::<HTMLElement>()
+ )
+ )
+ }
+ );
+);
+
+#[macro_export]
macro_rules! make_enumerated_getter(
( $attr:ident, $htmlname:tt, $default:expr, $($choices: pat)|+) => (
fn $attr(&self) -> DOMString {
diff --git a/components/script/dom/nodelist.rs b/components/script/dom/nodelist.rs
index 930fedbbec4..88fdd4cb70c 100644
--- a/components/script/dom/nodelist.rs
+++ b/components/script/dom/nodelist.rs
@@ -7,6 +7,7 @@ use crate::dom::bindings::codegen::Bindings::NodeListBinding;
use crate::dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods;
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
+use crate::dom::htmlelement::HTMLElement;
use crate::dom::node::{ChildrenMutation, Node};
use crate::dom::window::Window;
use dom_struct::dom_struct;
@@ -17,6 +18,7 @@ use std::cell::Cell;
pub enum NodeListType {
Simple(Vec<Dom<Node>>),
Children(ChildrenList),
+ Labels(LabelsList),
}
// https://dom.spec.whatwg.org/#interface-nodelist
@@ -65,6 +67,10 @@ impl NodeList {
NodeList::new(window, NodeListType::Children(ChildrenList::new(node)))
}
+ pub fn new_labels_list(window: &Window, element: &HTMLElement) -> DomRoot<NodeList> {
+ NodeList::new(window, NodeListType::Labels(LabelsList::new(element)))
+ }
+
pub fn empty(window: &Window) -> DomRoot<NodeList> {
NodeList::new(window, NodeListType::Simple(vec![]))
}
@@ -76,6 +82,7 @@ impl NodeListMethods for NodeList {
match self.list_type {
NodeListType::Simple(ref elems) => elems.len() as u32,
NodeListType::Children(ref list) => list.len(),
+ NodeListType::Labels(ref list) => list.len(),
}
}
@@ -86,6 +93,7 @@ impl NodeListMethods for NodeList {
.get(index as usize)
.map(|node| DomRoot::from_ref(&**node)),
NodeListType::Children(ref list) => list.item(index),
+ NodeListType::Labels(ref list) => list.item(index),
}
}
@@ -319,3 +327,33 @@ impl ChildrenList {
self.last_index.set(0u32);
}
}
+
+// Labels lists: There might room for performance optimization
+// analogous to the ChildrenMutation case of a children list,
+// in which we can keep information from an older access live
+// if we know nothing has happened that would change it.
+// However, label relationships can happen from further away
+// in the DOM than parent-child relationships, so it's not as simple,
+// and it's possible that tracking label moves would end up no faster
+// than recalculating labels.
+#[derive(JSTraceable, MallocSizeOf)]
+#[unrooted_must_root_lint::must_root]
+pub struct LabelsList {
+ element: Dom<HTMLElement>,
+}
+
+impl LabelsList {
+ pub fn new(element: &HTMLElement) -> LabelsList {
+ LabelsList {
+ element: Dom::from_ref(element),
+ }
+ }
+
+ pub fn len(&self) -> u32 {
+ self.element.labels_count()
+ }
+
+ pub fn item(&self, index: u32) -> Option<DomRoot<Node>> {
+ self.element.label_at(index)
+ }
+}
diff --git a/components/script/dom/promise.rs b/components/script/dom/promise.rs
index d2e209b98dd..785c1be8939 100644
--- a/components/script/dom/promise.rs
+++ b/components/script/dom/promise.rs
@@ -225,7 +225,7 @@ impl Promise {
}
#[allow(unsafe_code)]
- fn promise_obj(&self) -> HandleObject {
+ pub fn promise_obj(&self) -> HandleObject {
let obj = self.reflector().get_jsobject();
unsafe {
assert!(IsPromiseObject(obj));
diff --git a/components/script/dom/texttrack.rs b/components/script/dom/texttrack.rs
index 88c4859e05e..7c2b54adcd9 100644
--- a/components/script/dom/texttrack.rs
+++ b/components/script/dom/texttrack.rs
@@ -2,16 +2,18 @@
* 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 crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::TextTrackBinding::{
self, TextTrackKind, TextTrackMethods, TextTrackMode,
};
use crate::dom::bindings::error::{Error, ErrorResult};
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
-use crate::dom::bindings::root::{DomRoot, MutNullableDom};
+use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString;
use crate::dom::eventtarget::EventTarget;
use crate::dom::texttrackcue::TextTrackCue;
use crate::dom::texttrackcuelist::TextTrackCueList;
+use crate::dom::texttracklist::TextTrackList;
use crate::dom::window::Window;
use dom_struct::dom_struct;
use std::cell::Cell;
@@ -25,6 +27,7 @@ pub struct TextTrack {
id: String,
mode: Cell<TextTrackMode>,
cue_list: MutNullableDom<TextTrackCueList>,
+ track_list: DomRefCell<Option<Dom<TextTrackList>>>,
}
impl TextTrack {
@@ -34,6 +37,7 @@ impl TextTrack {
label: DOMString,
language: DOMString,
mode: TextTrackMode,
+ track_list: Option<&TextTrackList>,
) -> TextTrack {
TextTrack {
eventtarget: EventTarget::new_inherited(),
@@ -43,6 +47,7 @@ impl TextTrack {
id: id.into(),
mode: Cell::new(mode),
cue_list: Default::default(),
+ track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))),
}
}
@@ -53,9 +58,12 @@ impl TextTrack {
label: DOMString,
language: DOMString,
mode: TextTrackMode,
+ track_list: Option<&TextTrackList>,
) -> DomRoot<TextTrack> {
reflect_dom_object(
- Box::new(TextTrack::new_inherited(id, kind, label, language, mode)),
+ Box::new(TextTrack::new_inherited(
+ id, kind, label, language, mode, track_list,
+ )),
window,
TextTrackBinding::Wrap,
)
@@ -69,6 +77,14 @@ impl TextTrack {
pub fn id(&self) -> &str {
&self.id
}
+
+ pub fn add_track_list(&self, track_list: &TextTrackList) {
+ *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list));
+ }
+
+ pub fn remove_track_list(&self) {
+ *self.track_list.borrow_mut() = None;
+ }
}
impl TextTrackMethods for TextTrack {
diff --git a/components/script/dom/texttracklist.rs b/components/script/dom/texttracklist.rs
index f6f9037902e..0e978972d69 100644
--- a/components/script/dom/texttracklist.rs
+++ b/components/script/dom/texttracklist.rs
@@ -94,6 +94,7 @@ impl TextTrackList {
}),
&canceller,
);
+ track.add_track_list(self);
}
}
@@ -101,6 +102,9 @@ impl TextTrackList {
// removed from the TextTrackList.
#[allow(dead_code)]
pub fn remove(&self, idx: usize) {
+ if let Some(track) = self.dom_tracks.borrow().get(idx) {
+ track.remove_track_list();
+ }
self.dom_tracks.borrow_mut().remove(idx);
self.upcast::<EventTarget>()
.fire_event(atom!("removetrack"));
diff --git a/components/script/dom/videotrack.rs b/components/script/dom/videotrack.rs
index b1453da0df4..18a383ab816 100644
--- a/components/script/dom/videotrack.rs
+++ b/components/script/dom/videotrack.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 crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::VideoTrackBinding::{self, VideoTrackMethods};
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
@@ -19,7 +20,7 @@ pub struct VideoTrack {
label: DOMString,
language: DOMString,
selected: Cell<bool>,
- track_list: Option<Dom<VideoTrackList>>,
+ track_list: DomRefCell<Option<Dom<VideoTrackList>>>,
}
impl VideoTrack {
@@ -37,7 +38,7 @@ impl VideoTrack {
label: label.into(),
language: language.into(),
selected: Cell::new(false),
- track_list: track_list.map(|t| Dom::from_ref(t)),
+ track_list: DomRefCell::new(track_list.map(|t| Dom::from_ref(t))),
}
}
@@ -73,6 +74,14 @@ impl VideoTrack {
pub fn set_selected(&self, value: bool) {
self.selected.set(value);
}
+
+ pub fn add_track_list(&self, track_list: &VideoTrackList) {
+ *self.track_list.borrow_mut() = Some(Dom::from_ref(track_list));
+ }
+
+ pub fn remove_track_list(&self) {
+ *self.track_list.borrow_mut() = None;
+ }
}
impl VideoTrackMethods for VideoTrack {
@@ -103,7 +112,7 @@ impl VideoTrackMethods for VideoTrack {
// https://html.spec.whatwg.org/multipage/#dom-videotrack-selected
fn SetSelected(&self, value: bool) {
- if let Some(list) = self.track_list.as_ref() {
+ if let Some(list) = self.track_list.borrow().as_ref() {
if let Some(idx) = list.find(self) {
list.set_selected(idx, value);
}
diff --git a/components/script/dom/videotracklist.rs b/components/script/dom/videotracklist.rs
index 9654123d3f3..98fa495bfdd 100644
--- a/components/script/dom/videotracklist.rs
+++ b/components/script/dom/videotracklist.rs
@@ -113,9 +113,14 @@ impl VideoTrackList {
self.set_selected(idx, false);
}
}
+ track.add_track_list(self);
}
pub fn clear(&self) {
+ self.tracks
+ .borrow()
+ .iter()
+ .for_each(|t| t.remove_track_list());
self.tracks.borrow_mut().clear();
}
}
diff --git a/components/script/dom/webgl_validations/tex_image_2d.rs b/components/script/dom/webgl_validations/tex_image_2d.rs
index fc5919132cf..54643e7a2da 100644
--- a/components/script/dom/webgl_validations/tex_image_2d.rs
+++ b/components/script/dom/webgl_validations/tex_image_2d.rs
@@ -47,10 +47,12 @@ pub enum TexImageValidationError {
InvalidOffsets,
}
-impl std::error::Error for TexImageValidationError {
- fn description(&self) -> &str {
+impl std::error::Error for TexImageValidationError {}
+
+impl fmt::Display for TexImageValidationError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::TexImageValidationError::*;
- match *self {
+ let description = match *self {
InvalidTextureTarget(_) => "Invalid texture target",
TextureTargetNotBound(_) => "Texture was not bound",
InvalidCubicTextureDimensions => {
@@ -68,17 +70,8 @@ impl std::error::Error for TexImageValidationError {
NonPotTexture => "Expected a power of two texture",
InvalidCompressionFormat => "Unrecognized texture compression format",
InvalidOffsets => "Invalid X/Y texture offset parameters",
- }
- }
-}
-
-impl fmt::Display for TexImageValidationError {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(
- f,
- "TexImageValidationError({})",
- std::error::Error::description(self)
- )
+ };
+ write!(f, "TexImageValidationError({})", description)
}
}
diff --git a/components/script/dom/webidls/CustomElementRegistry.webidl b/components/script/dom/webidls/CustomElementRegistry.webidl
index 6d3a7b436de..3ba49a2082c 100644
--- a/components/script/dom/webidls/CustomElementRegistry.webidl
+++ b/components/script/dom/webidls/CustomElementRegistry.webidl
@@ -11,6 +11,8 @@ interface CustomElementRegistry {
any get(DOMString name);
Promise<void> whenDefined(DOMString name);
+
+ [CEReactions] void upgrade(Node root);
};
callback CustomElementConstructor = HTMLElement();
diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl
index 9476b9c2d6d..7d92ddbd137 100644
--- a/components/script/dom/webidls/Document.webidl
+++ b/components/script/dom/webidls/Document.webidl
@@ -34,9 +34,10 @@ interface Document : Node {
HTMLCollection getElementsByClassName(DOMString classNames);
[CEReactions, NewObject, Throws]
- Element createElement(DOMString localName, optional ElementCreationOptions options = {});
+ Element createElement(DOMString localName, optional (DOMString or ElementCreationOptions) options = {});
[CEReactions, NewObject, Throws]
- Element createElementNS(DOMString? namespace, DOMString qualifiedName, optional ElementCreationOptions options = {});
+ Element createElementNS(DOMString? namespace, DOMString qualifiedName,
+ optional (DOMString or ElementCreationOptions) options = {});
[NewObject]
DocumentFragment createDocumentFragment();
[NewObject]
diff --git a/components/script/dom/webidls/HTMLInputElement.webidl b/components/script/dom/webidls/HTMLInputElement.webidl
index 48001bc555c..64ee9aa7c2f 100644
--- a/components/script/dom/webidls/HTMLInputElement.webidl
+++ b/components/script/dom/webidls/HTMLInputElement.webidl
@@ -89,7 +89,7 @@ interface HTMLInputElement : HTMLElement {
//boolean reportValidity();
//void setCustomValidity(DOMString error);
- readonly attribute NodeList labels;
+ readonly attribute NodeList? labels;
void select();
[SetterThrows]
diff --git a/components/script/dom/webidls/HTMLOptionElement.webidl b/components/script/dom/webidls/HTMLOptionElement.webidl
index 56a379fc8db..65f37458295 100644
--- a/components/script/dom/webidls/HTMLOptionElement.webidl
+++ b/components/script/dom/webidls/HTMLOptionElement.webidl
@@ -3,9 +3,9 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
// https://html.spec.whatwg.org/multipage/#htmloptionelement
-[Exposed=Window/*, NamedConstructor=Option(optional DOMString text = "", optional DOMString value,
+[Exposed=Window, NamedConstructor=Option(optional DOMString text = "", optional DOMString value,
optional boolean defaultSelected = false,
- optional boolean selected = false)*/]
+ optional boolean selected = false)]
interface HTMLOptionElement : HTMLElement {
[HTMLConstructor] constructor();
diff --git a/components/script/dom/webidls/HTMLScriptElement.webidl b/components/script/dom/webidls/HTMLScriptElement.webidl
index f7126b7901b..13b69865fa5 100644
--- a/components/script/dom/webidls/HTMLScriptElement.webidl
+++ b/components/script/dom/webidls/HTMLScriptElement.webidl
@@ -12,6 +12,8 @@ interface HTMLScriptElement : HTMLElement {
[CEReactions]
attribute DOMString type;
[CEReactions]
+ attribute boolean noModule;
+ [CEReactions]
attribute DOMString charset;
[CEReactions]
attribute boolean async;
diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs
index 2d126933849..7eb958cd095 100644
--- a/components/script/dom/worker.rs
+++ b/components/script/dom/worker.rs
@@ -140,11 +140,7 @@ impl Worker {
self.terminated.get()
}
- pub fn handle_message(
- address: TrustedWorkerAddress,
- origin: String,
- data: StructuredSerializedData,
- ) {
+ pub fn handle_message(address: TrustedWorkerAddress, data: StructuredSerializedData) {
let worker = address.root();
if worker.is_terminated() {
@@ -156,14 +152,7 @@ impl Worker {
let _ac = enter_realm(target);
rooted!(in(*global.get_cx()) let mut message = UndefinedValue());
if let Ok(ports) = structuredclone::read(&global, data, message.handle_mut()) {
- MessageEvent::dispatch_jsval(
- target,
- &global,
- message.handle(),
- Some(&origin),
- None,
- ports,
- );
+ MessageEvent::dispatch_jsval(target, &global, message.handle(), None, None, ports);
} else {
// Step 4 of the "port post message steps" of the implicit messageport, fire messageerror.
MessageEvent::dispatch_error(target, &global);
diff --git a/components/script/dom/xr.rs b/components/script/dom/xr.rs
index 72cc573d645..5804918a532 100644
--- a/components/script/dom/xr.rs
+++ b/components/script/dom/xr.rs
@@ -26,14 +26,14 @@ use crate::dom::xrtest::XRTest;
use crate::script_thread::ScriptThread;
use crate::task_source::TaskSource;
use dom_struct::dom_struct;
-use ipc_channel::ipc::IpcSender;
+use ipc_channel::ipc::{self as ipc_crate, IpcReceiver, IpcSender};
use ipc_channel::router::ROUTER;
use profile_traits::ipc;
use std::cell::Cell;
use std::rc::Rc;
use webvr_traits::{WebVRDisplayData, WebVRDisplayEvent, WebVREvent, WebVRMsg};
use webvr_traits::{WebVRGamepadData, WebVRGamepadEvent, WebVRGamepadState};
-use webxr_api::{Error as XRError, Session, SessionMode};
+use webxr_api::{Error as XRError, Frame, Session, SessionMode};
#[dom_struct]
pub struct XR {
@@ -185,12 +185,15 @@ impl XRMethods for XR {
.task_manager()
.dom_manipulation_task_source_with_canceller();
let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap();
+ let (frame_sender, frame_receiver) = ipc_crate::channel().unwrap();
+ let mut frame_receiver = Some(frame_receiver);
ROUTER.add_route(
receiver.to_opaque(),
Box::new(move |message| {
// router doesn't know this is only called once
let trusted = trusted.take().unwrap();
let this = this.clone();
+ let frame_receiver = frame_receiver.take().unwrap();
let message: Result<Session, webxr_api::Error> = if let Ok(message) = message.to() {
message
} else {
@@ -199,13 +202,15 @@ impl XRMethods for XR {
};
let _ = task_source.queue_with_canceller(
task!(request_session: move || {
- this.root().session_obtained(message, trusted.root(), mode);
+ this.root().session_obtained(message, trusted.root(), mode, frame_receiver);
}),
&canceller,
);
}),
);
- window.webxr_registry().request_session(mode.into(), sender);
+ window
+ .webxr_registry()
+ .request_session(mode.into(), sender, frame_sender);
promise
}
@@ -222,6 +227,7 @@ impl XR {
response: Result<Session, XRError>,
promise: Rc<Promise>,
mode: XRSessionMode,
+ frame_receiver: IpcReceiver<Frame>,
) {
let session = match response {
Ok(session) => session,
@@ -231,7 +237,7 @@ impl XR {
},
};
- let session = XRSession::new(&self.global(), session, mode);
+ let session = XRSession::new(&self.global(), session, mode, frame_receiver);
if mode == XRSessionMode::Inline {
self.active_inline_sessions
.borrow_mut()
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs
index 6e076b6daba..a4ced8689a5 100644
--- a/components/script/dom/xrsession.rs
+++ b/components/script/dom/xrsession.rs
@@ -41,7 +41,7 @@ use crate::dom::xrwebgllayer::XRWebGLLayer;
use crate::task_source::TaskSource;
use dom_struct::dom_struct;
use euclid::{Rect, RigidTransform3D, Transform3D};
-use ipc_channel::ipc::IpcSender;
+use ipc_channel::ipc::IpcReceiver;
use ipc_channel::router::ROUTER;
use metrics::ToMs;
use profile_traits::ipc;
@@ -73,8 +73,6 @@ pub struct XRSession {
next_raf_id: Cell<i32>,
#[ignore_malloc_size_of = "closures are hard"]
raf_callback_list: DomRefCell<Vec<(i32, Option<Rc<XRFrameRequestCallback>>)>>,
- #[ignore_malloc_size_of = "defined in ipc-channel"]
- raf_sender: DomRefCell<Option<IpcSender<Frame>>>,
input_sources: Dom<XRInputSourceArray>,
// Any promises from calling end()
#[ignore_malloc_size_of = "promises are hard"]
@@ -108,7 +106,6 @@ impl XRSession {
next_raf_id: Cell::new(0),
raf_callback_list: DomRefCell::new(vec![]),
- raf_sender: DomRefCell::new(None),
input_sources: Dom::from_ref(input_sources),
end_promises: DomRefCell::new(vec![]),
ended: Cell::new(false),
@@ -116,7 +113,12 @@ impl XRSession {
}
}
- pub fn new(global: &GlobalScope, session: Session, mode: XRSessionMode) -> DomRoot<XRSession> {
+ pub fn new(
+ global: &GlobalScope,
+ session: Session,
+ mode: XRSessionMode,
+ frame_receiver: IpcReceiver<Frame>,
+ ) -> DomRoot<XRSession> {
let ivfov = if mode == XRSessionMode::Inline {
Some(FRAC_PI_2)
} else {
@@ -136,7 +138,7 @@ impl XRSession {
);
input_sources.set_initial_inputs(&ret);
ret.attach_event_handler();
- ret.setup_raf_loop();
+ ret.setup_raf_loop(frame_receiver);
ret
}
@@ -153,21 +155,15 @@ impl XRSession {
self.mode != XRSessionMode::Inline
}
- fn setup_raf_loop(&self) {
- assert!(
- self.raf_sender.borrow().is_none(),
- "RAF loop already set up"
- );
+ fn setup_raf_loop(&self, frame_receiver: IpcReceiver<Frame>) {
let this = Trusted::new(self);
let global = self.global();
let window = global.as_window();
let (task_source, canceller) = window
.task_manager()
.dom_manipulation_task_source_with_canceller();
- let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap();
- *self.raf_sender.borrow_mut() = Some(sender);
ROUTER.add_route(
- receiver.to_opaque(),
+ frame_receiver.to_opaque(),
Box::new(move |message| {
let this = this.clone();
let _ = task_source.queue_with_canceller(
@@ -179,15 +175,7 @@ impl XRSession {
}),
);
- self.request_new_xr_frame();
- }
-
- /// Requests a new https://immersive-web.github.io/webxr/#xr-animation-frame
- ///
- /// This happens regardless of the presense of rAF callbacks
- fn request_new_xr_frame(&self) {
- let sender = self.raf_sender.borrow().clone().unwrap();
- self.session.borrow_mut().request_animation_frame(sender);
+ self.session.borrow_mut().start_render_loop();
}
pub fn is_outside_raf(&self) -> bool {
@@ -360,8 +348,9 @@ impl XRSession {
if self.is_immersive() {
base_layer.swap_buffers();
self.session.borrow_mut().render_animation_frame();
+ } else {
+ self.session.borrow_mut().start_render_loop();
}
- self.request_new_xr_frame();
// If the canvas element is attached to the DOM, it is now dirty,
// and we need to trigger a reflow.
diff --git a/components/script/lib.rs b/components/script/lib.rs
index 79c0657b996..2ae7f76923a 100644
--- a/components/script/lib.rs
+++ b/components/script/lib.rs
@@ -83,6 +83,8 @@ mod microtask;
#[warn(deprecated)]
mod network_listener;
#[warn(deprecated)]
+mod script_module;
+#[warn(deprecated)]
pub mod script_runtime;
#[warn(deprecated)]
#[allow(unsafe_code)]
diff --git a/components/script/script_module.rs b/components/script/script_module.rs
new file mode 100644
index 00000000000..4bb60f5a233
--- /dev/null
+++ b/components/script/script_module.rs
@@ -0,0 +1,1430 @@
+/* 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/. */
+
+//! The script module mod contains common traits and structs
+//! related to `type=module` for script thread or worker threads.
+
+use crate::compartments::{enter_realm, AlreadyInCompartment, InCompartment};
+use crate::document_loader::LoadType;
+use crate::dom::bindings::cell::DomRefCell;
+use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods;
+use crate::dom::bindings::conversions::jsstring_to_str;
+use crate::dom::bindings::error::report_pending_exception;
+use crate::dom::bindings::error::Error;
+use crate::dom::bindings::inheritance::Castable;
+use crate::dom::bindings::refcounted::{Trusted, TrustedPromise};
+use crate::dom::bindings::reflector::DomObject;
+use crate::dom::bindings::root::DomRoot;
+use crate::dom::bindings::settings_stack::AutoIncumbentScript;
+use crate::dom::bindings::str::DOMString;
+use crate::dom::bindings::trace::RootedTraceableBox;
+use crate::dom::document::Document;
+use crate::dom::element::Element;
+use crate::dom::globalscope::GlobalScope;
+use crate::dom::htmlscriptelement::{HTMLScriptElement, ScriptId};
+use crate::dom::htmlscriptelement::{ScriptOrigin, ScriptType, SCRIPT_JS_MIMES};
+use crate::dom::node::document_from_node;
+use crate::dom::performanceresourcetiming::InitiatorType;
+use crate::dom::promise::Promise;
+use crate::dom::promisenativehandler::{Callback, PromiseNativeHandler};
+use crate::dom::window::Window;
+use crate::dom::worker::TrustedWorkerAddress;
+use crate::network_listener::{self, NetworkListener};
+use crate::network_listener::{PreInvoke, ResourceTimingListener};
+use crate::task::TaskBox;
+use crate::task_source::TaskSourceName;
+use encoding_rs::UTF_8;
+use hyper_serde::Serde;
+use ipc_channel::ipc;
+use ipc_channel::router::ROUTER;
+use js::glue::{AppendToAutoObjectVector, CreateAutoObjectVector};
+use js::jsapi::Handle as RawHandle;
+use js::jsapi::HandleObject;
+use js::jsapi::HandleValue as RawHandleValue;
+use js::jsapi::{AutoObjectVector, JSAutoRealm, JSObject, JSString};
+use js::jsapi::{GetModuleResolveHook, JSRuntime, SetModuleResolveHook};
+use js::jsapi::{GetRequestedModules, SetModuleMetadataHook};
+use js::jsapi::{GetWaitForAllPromise, ModuleEvaluate, ModuleInstantiate, SourceText};
+use js::jsapi::{Heap, JSContext, JS_ClearPendingException, SetModulePrivate};
+use js::jsapi::{SetModuleDynamicImportHook, SetScriptPrivateReferenceHooks};
+use js::jsval::{JSVal, PrivateValue, UndefinedValue};
+use js::rust::jsapi_wrapped::{CompileModule, JS_GetArrayLength, JS_GetElement};
+use js::rust::jsapi_wrapped::{GetRequestedModuleSpecifier, JS_GetPendingException};
+use js::rust::wrappers::JS_SetPendingException;
+use js::rust::CompileOptionsWrapper;
+use js::rust::IntoHandle;
+use js::rust::{Handle, HandleValue};
+use net_traits::request::{CredentialsMode, Destination, ParserMetadata};
+use net_traits::request::{Referrer, RequestBuilder, RequestMode};
+use net_traits::{FetchMetadata, Metadata};
+use net_traits::{FetchResponseListener, NetworkError};
+use net_traits::{ResourceFetchTiming, ResourceTimingType};
+use servo_url::ServoUrl;
+use std::cmp::Ordering;
+use std::collections::{HashMap, HashSet};
+use std::ffi;
+use std::marker::PhantomData;
+use std::ptr;
+use std::rc::Rc;
+use std::sync::{Arc, Mutex};
+use url::ParseError as UrlParseError;
+
+use indexmap::IndexSet;
+
+pub fn get_source_text(source: &[u16]) -> SourceText<u16> {
+ SourceText {
+ units_: source.as_ptr() as *const _,
+ length_: source.len() as u32,
+ ownsUnits_: false,
+ _phantom_0: PhantomData,
+ }
+}
+
+#[allow(unsafe_code)]
+unsafe fn gen_type_error(global: &GlobalScope, string: String) -> ModuleError {
+ rooted!(in(*global.get_cx()) let mut thrown = UndefinedValue());
+ Error::Type(string).to_jsval(*global.get_cx(), &global, thrown.handle_mut());
+
+ return ModuleError::RawException(RootedTraceableBox::from_box(Heap::boxed(thrown.get())));
+}
+
+#[derive(JSTraceable)]
+pub struct ModuleObject(Box<Heap<*mut JSObject>>);
+
+impl ModuleObject {
+ #[allow(unsafe_code)]
+ pub fn handle(&self) -> HandleObject {
+ unsafe { self.0.handle() }
+ }
+}
+
+#[derive(JSTraceable)]
+pub enum ModuleError {
+ Network(NetworkError),
+ RawException(RootedTraceableBox<Heap<JSVal>>),
+}
+
+impl Eq for ModuleError {}
+
+impl PartialEq for ModuleError {
+ fn eq(&self, other: &Self) -> bool {
+ match (self, other) {
+ (Self::Network(_), Self::RawException(_)) |
+ (Self::RawException(_), Self::Network(_)) => false,
+ _ => true,
+ }
+ }
+}
+
+impl Ord for ModuleError {
+ fn cmp(&self, other: &Self) -> Ordering {
+ match (self, other) {
+ (Self::Network(_), Self::RawException(_)) => Ordering::Greater,
+ (Self::RawException(_), Self::Network(_)) => Ordering::Less,
+ _ => Ordering::Equal,
+ }
+ }
+}
+
+impl PartialOrd for ModuleError {
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ Some(self.cmp(other))
+ }
+}
+
+impl ModuleError {
+ #[allow(unsafe_code)]
+ pub fn handle(&self) -> Handle<JSVal> {
+ match self {
+ Self::Network(_) => unreachable!(),
+ Self::RawException(exception) => exception.handle(),
+ }
+ }
+}
+
+impl Clone for ModuleError {
+ fn clone(&self) -> Self {
+ match self {
+ Self::Network(network_error) => Self::Network(network_error.clone()),
+ Self::RawException(exception) => Self::RawException(RootedTraceableBox::from_box(
+ Heap::boxed(exception.get().clone()),
+ )),
+ }
+ }
+}
+
+struct ModuleScript {
+ base_url: ServoUrl,
+}
+
+#[derive(JSTraceable)]
+pub struct ModuleTree {
+ url: ServoUrl,
+ text: DomRefCell<DOMString>,
+ record: DomRefCell<Option<ModuleObject>>,
+ status: DomRefCell<ModuleStatus>,
+ // The spec maintains load order for descendants, so we use an indexset for descendants and
+ // parents. This isn't actually necessary for parents however the IndexSet APIs don't
+ // interop with HashSet, and IndexSet isn't very expensive
+ // (https://github.com/bluss/indexmap/issues/110)
+ //
+ // By default all maps in web specs are ordered maps
+ // (https://infra.spec.whatwg.org/#ordered-map), however we can usually get away with using
+ // stdlib maps and sets because we rarely iterate over them.
+ parent_urls: DomRefCell<IndexSet<ServoUrl>>,
+ descendant_urls: DomRefCell<IndexSet<ServoUrl>>,
+ visited_urls: DomRefCell<HashSet<ServoUrl>>,
+ error: DomRefCell<Option<ModuleError>>,
+ promise: DomRefCell<Option<Rc<Promise>>>,
+}
+
+impl ModuleTree {
+ pub fn new(url: ServoUrl) -> Self {
+ ModuleTree {
+ url,
+ text: DomRefCell::new(DOMString::new()),
+ record: DomRefCell::new(None),
+ status: DomRefCell::new(ModuleStatus::Initial),
+ parent_urls: DomRefCell::new(IndexSet::new()),
+ descendant_urls: DomRefCell::new(IndexSet::new()),
+ visited_urls: DomRefCell::new(HashSet::new()),
+ error: DomRefCell::new(None),
+ promise: DomRefCell::new(None),
+ }
+ }
+
+ pub fn get_promise(&self) -> &DomRefCell<Option<Rc<Promise>>> {
+ &self.promise
+ }
+
+ pub fn set_promise(&self, promise: Rc<Promise>) {
+ *self.promise.borrow_mut() = Some(promise);
+ }
+
+ pub fn get_status(&self) -> ModuleStatus {
+ self.status.borrow().clone()
+ }
+
+ pub fn set_status(&self, status: ModuleStatus) {
+ *self.status.borrow_mut() = status;
+ }
+
+ pub fn get_record(&self) -> &DomRefCell<Option<ModuleObject>> {
+ &self.record
+ }
+
+ pub fn set_record(&self, record: ModuleObject) {
+ *self.record.borrow_mut() = Some(record);
+ }
+
+ pub fn get_error(&self) -> &DomRefCell<Option<ModuleError>> {
+ &self.error
+ }
+
+ pub fn set_error(&self, error: Option<ModuleError>) {
+ *self.error.borrow_mut() = error;
+ }
+
+ pub fn get_text(&self) -> &DomRefCell<DOMString> {
+ &self.text
+ }
+
+ pub fn set_text(&self, module_text: DOMString) {
+ *self.text.borrow_mut() = module_text;
+ }
+
+ pub fn get_parent_urls(&self) -> &DomRefCell<IndexSet<ServoUrl>> {
+ &self.parent_urls
+ }
+
+ pub fn insert_parent_url(&self, parent_url: ServoUrl) {
+ self.parent_urls.borrow_mut().insert(parent_url);
+ }
+
+ pub fn append_parent_urls(&self, parent_urls: IndexSet<ServoUrl>) {
+ self.parent_urls.borrow_mut().extend(parent_urls);
+ }
+
+ pub fn get_descendant_urls(&self) -> &DomRefCell<IndexSet<ServoUrl>> {
+ &self.descendant_urls
+ }
+
+ pub fn append_descendant_urls(&self, descendant_urls: IndexSet<ServoUrl>) {
+ self.descendant_urls.borrow_mut().extend(descendant_urls);
+ }
+
+ /// recursively checks if all of the transitive descendants are
+ /// in the FetchingDescendants or later status
+ fn recursive_check_descendants(
+ module_tree: &ModuleTree,
+ module_map: &HashMap<ServoUrl, Rc<ModuleTree>>,
+ discovered_urls: &mut HashSet<ServoUrl>,
+ ) -> bool {
+ discovered_urls.insert(module_tree.url.clone());
+
+ let descendant_urls = module_tree.descendant_urls.borrow();
+
+ for descendant_module in descendant_urls
+ .iter()
+ .filter_map(|url| module_map.get(&url.clone()))
+ {
+ if discovered_urls.contains(&descendant_module.url) {
+ continue;
+ }
+
+ let descendant_status = descendant_module.get_status();
+ if descendant_status < ModuleStatus::FetchingDescendants {
+ return false;
+ }
+
+ let all_ready_descendants = ModuleTree::recursive_check_descendants(
+ &descendant_module,
+ module_map,
+ discovered_urls,
+ );
+
+ if !all_ready_descendants {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ fn has_all_ready_descendants(&self, module_map: &HashMap<ServoUrl, Rc<ModuleTree>>) -> bool {
+ let mut discovered_urls = HashSet::new();
+
+ return ModuleTree::recursive_check_descendants(&self, module_map, &mut discovered_urls);
+ }
+
+ pub fn get_visited_urls(&self) -> &DomRefCell<HashSet<ServoUrl>> {
+ &self.visited_urls
+ }
+
+ pub fn append_handler(&self, owner: ModuleOwner, module_url: ServoUrl, is_top_level: bool) {
+ let promise = self.promise.borrow();
+
+ let resolve_this = owner.clone();
+ let reject_this = owner.clone();
+
+ let resolved_url = module_url.clone();
+ let rejected_url = module_url.clone();
+
+ let handler = PromiseNativeHandler::new(
+ &owner.global(),
+ Some(ModuleHandler::new(Box::new(
+ task!(fetched_resolve: move || {
+ resolve_this.finish_module_load(Some(resolved_url), is_top_level);
+ }),
+ ))),
+ Some(ModuleHandler::new(Box::new(
+ task!(failure_reject: move || {
+ reject_this.finish_module_load(Some(rejected_url), is_top_level);
+ }),
+ ))),
+ );
+
+ let _compartment = enter_realm(&*owner.global());
+ AlreadyInCompartment::assert(&*owner.global());
+ let _ais = AutoIncumbentScript::new(&*owner.global());
+
+ let promise = promise.as_ref().unwrap();
+
+ promise.append_native_handler(&handler);
+ }
+}
+
+#[derive(Clone, Copy, Debug, JSTraceable, PartialEq, PartialOrd)]
+pub enum ModuleStatus {
+ Initial,
+ Fetching,
+ FetchingDescendants,
+ FetchFailed,
+ Ready,
+ Finished,
+}
+
+impl ModuleTree {
+ #[allow(unsafe_code)]
+ /// https://html.spec.whatwg.org/multipage/#creating-a-module-script
+ /// Step 7-11.
+ fn compile_module_script(
+ &self,
+ global: &GlobalScope,
+ module_script_text: DOMString,
+ url: ServoUrl,
+ ) -> Result<ModuleObject, ModuleError> {
+ let module: Vec<u16> = module_script_text.encode_utf16().collect();
+
+ let url_cstr = ffi::CString::new(url.as_str().as_bytes()).unwrap();
+
+ let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject());
+
+ let compile_options = CompileOptionsWrapper::new(*global.get_cx(), url_cstr.as_ptr(), 1);
+
+ rooted!(in(*global.get_cx()) let mut module_script = ptr::null_mut::<JSObject>());
+
+ let mut source = get_source_text(&module);
+
+ unsafe {
+ if !CompileModule(
+ *global.get_cx(),
+ compile_options.ptr,
+ &mut source,
+ &mut module_script.handle_mut(),
+ ) {
+ warn!("fail to compile module script of {}", url);
+
+ rooted!(in(*global.get_cx()) let mut exception = UndefinedValue());
+ assert!(JS_GetPendingException(
+ *global.get_cx(),
+ &mut exception.handle_mut()
+ ));
+ JS_ClearPendingException(*global.get_cx());
+
+ return Err(ModuleError::RawException(RootedTraceableBox::from_box(
+ Heap::boxed(exception.get()),
+ )));
+ }
+
+ let module_script_data = Box::new(ModuleScript {
+ base_url: url.clone(),
+ });
+
+ SetModulePrivate(
+ module_script.get(),
+ &PrivateValue(Box::into_raw(module_script_data) as *const _),
+ );
+ }
+
+ debug!("module script of {} compile done", url);
+
+ self.resolve_requested_module_specifiers(
+ &global,
+ module_script.handle().into_handle(),
+ url.clone(),
+ )
+ .map(|_| ModuleObject(Heap::boxed(*module_script)))
+ }
+
+ #[allow(unsafe_code)]
+ pub fn instantiate_module_tree(
+ &self,
+ global: &GlobalScope,
+ module_record: HandleObject,
+ ) -> Result<(), ModuleError> {
+ let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject());
+
+ unsafe {
+ if !ModuleInstantiate(*global.get_cx(), module_record) {
+ warn!("fail to instantiate module");
+
+ rooted!(in(*global.get_cx()) let mut exception = UndefinedValue());
+ assert!(JS_GetPendingException(
+ *global.get_cx(),
+ &mut exception.handle_mut()
+ ));
+ JS_ClearPendingException(*global.get_cx());
+
+ Err(ModuleError::RawException(RootedTraceableBox::from_box(
+ Heap::boxed(exception.get()),
+ )))
+ } else {
+ debug!("module instantiated successfully");
+
+ Ok(())
+ }
+ }
+ }
+
+ #[allow(unsafe_code)]
+ pub fn execute_module(
+ &self,
+ global: &GlobalScope,
+ module_record: HandleObject,
+ ) -> Result<(), ModuleError> {
+ let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject());
+
+ unsafe {
+ if !ModuleEvaluate(*global.get_cx(), module_record) {
+ warn!("fail to evaluate module");
+
+ rooted!(in(*global.get_cx()) let mut exception = UndefinedValue());
+ assert!(JS_GetPendingException(
+ *global.get_cx(),
+ &mut exception.handle_mut()
+ ));
+ JS_ClearPendingException(*global.get_cx());
+
+ Err(ModuleError::RawException(RootedTraceableBox::from_box(
+ Heap::boxed(exception.get()),
+ )))
+ } else {
+ debug!("module evaluated successfully");
+ Ok(())
+ }
+ }
+ }
+
+ #[allow(unsafe_code)]
+ pub fn report_error(&self, global: &GlobalScope) {
+ let module_error = self.error.borrow();
+
+ if let Some(exception) = &*module_error {
+ unsafe {
+ JS_SetPendingException(*global.get_cx(), exception.handle());
+ report_pending_exception(*global.get_cx(), true);
+ }
+ }
+ }
+
+ /// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-a-module-script
+ /// Step 5.
+ pub fn resolve_requested_modules(
+ &self,
+ global: &GlobalScope,
+ ) -> Result<IndexSet<ServoUrl>, ModuleError> {
+ let status = self.get_status();
+
+ assert_ne!(status, ModuleStatus::Initial);
+ assert_ne!(status, ModuleStatus::Fetching);
+
+ let record = self.record.borrow();
+
+ if let Some(raw_record) = &*record {
+ let valid_specifier_urls = self.resolve_requested_module_specifiers(
+ &global,
+ raw_record.handle(),
+ self.url.clone(),
+ );
+
+ return valid_specifier_urls.map(|parsed_urls| {
+ parsed_urls
+ .iter()
+ .filter_map(|parsed_url| {
+ let mut visited = self.visited_urls.borrow_mut();
+
+ if !visited.contains(&parsed_url) {
+ visited.insert(parsed_url.clone());
+
+ Some(parsed_url.clone())
+ } else {
+ None
+ }
+ })
+ .collect::<IndexSet<ServoUrl>>()
+ });
+ }
+
+ unreachable!("Didn't have record while resolving its requested module")
+ }
+
+ #[allow(unsafe_code)]
+ fn resolve_requested_module_specifiers(
+ &self,
+ global: &GlobalScope,
+ module_object: HandleObject,
+ base_url: ServoUrl,
+ ) -> Result<IndexSet<ServoUrl>, ModuleError> {
+ let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject());
+
+ let mut specifier_urls = IndexSet::new();
+
+ unsafe {
+ rooted!(in(*global.get_cx()) let requested_modules = GetRequestedModules(*global.get_cx(), module_object));
+
+ let mut length = 0;
+
+ if !JS_GetArrayLength(*global.get_cx(), requested_modules.handle(), &mut length) {
+ let module_length_error =
+ gen_type_error(&global, "Wrong length of requested modules".to_owned());
+
+ return Err(module_length_error);
+ }
+
+ for index in 0..length {
+ rooted!(in(*global.get_cx()) let mut element = UndefinedValue());
+
+ if !JS_GetElement(
+ *global.get_cx(),
+ requested_modules.handle(),
+ index,
+ &mut element.handle_mut(),
+ ) {
+ let get_element_error =
+ gen_type_error(&global, "Failed to get requested module".to_owned());
+
+ return Err(get_element_error);
+ }
+
+ rooted!(in(*global.get_cx()) let specifier = GetRequestedModuleSpecifier(
+ *global.get_cx(), element.handle()
+ ));
+
+ let url = ModuleTree::resolve_module_specifier(
+ *global.get_cx(),
+ &base_url,
+ specifier.handle().into_handle(),
+ );
+
+ if url.is_err() {
+ let specifier_error =
+ gen_type_error(&global, "Wrong module specifier".to_owned());
+
+ return Err(specifier_error);
+ }
+
+ specifier_urls.insert(url.unwrap());
+ }
+ }
+
+ Ok(specifier_urls)
+ }
+
+ /// The following module specifiers are allowed by the spec:
+ /// - a valid absolute URL
+ /// - a valid relative URL that starts with "/", "./" or "../"
+ ///
+ /// Bareword module specifiers are currently disallowed as these may be given
+ /// special meanings in the future.
+ /// https://html.spec.whatwg.org/multipage/#resolve-a-module-specifier
+ #[allow(unsafe_code)]
+ fn resolve_module_specifier(
+ cx: *mut JSContext,
+ url: &ServoUrl,
+ specifier: RawHandle<*mut JSString>,
+ ) -> Result<ServoUrl, UrlParseError> {
+ let specifier_str = unsafe { jsstring_to_str(cx, *specifier) };
+
+ // Step 1.
+ if let Ok(specifier_url) = ServoUrl::parse(&specifier_str) {
+ return Ok(specifier_url);
+ }
+
+ // Step 2.
+ if !specifier_str.starts_with("/") &&
+ !specifier_str.starts_with("./") &&
+ !specifier_str.starts_with("../")
+ {
+ return Err(UrlParseError::InvalidDomainCharacter);
+ }
+
+ // Step 3.
+ return ServoUrl::parse_with_base(Some(url), &specifier_str.clone());
+ }
+
+ /// https://html.spec.whatwg.org/multipage/#finding-the-first-parse-error
+ fn find_first_parse_error(
+ global: &GlobalScope,
+ module_tree: &ModuleTree,
+ discovered_urls: &mut HashSet<ServoUrl>,
+ ) -> Option<ModuleError> {
+ // 3.
+ discovered_urls.insert(module_tree.url.clone());
+
+ // 4.
+ let module_map = global.get_module_map().borrow();
+ let record = module_tree.get_record().borrow();
+ if record.is_none() {
+ let module_error = module_tree.get_error().borrow();
+
+ return module_error.clone();
+ }
+
+ // 5-6.
+ let descendant_urls = module_tree.get_descendant_urls().borrow();
+
+ for descendant_module in descendant_urls
+ .iter()
+ // 7.
+ .filter_map(|url| module_map.get(&url.clone()))
+ {
+ // 8-2.
+ if discovered_urls.contains(&descendant_module.url) {
+ continue;
+ }
+
+ // 8-3.
+ let child_parse_error =
+ ModuleTree::find_first_parse_error(&global, &descendant_module, discovered_urls);
+
+ // 8-4.
+ if child_parse_error.is_some() {
+ return child_parse_error;
+ }
+ }
+
+ // Step 9.
+ return None;
+ }
+}
+
+#[derive(JSTraceable, MallocSizeOf)]
+struct ModuleHandler {
+ #[ignore_malloc_size_of = "Measuring trait objects is hard"]
+ task: DomRefCell<Option<Box<dyn TaskBox>>>,
+}
+
+impl ModuleHandler {
+ pub fn new(task: Box<dyn TaskBox>) -> Box<dyn Callback> {
+ Box::new(Self {
+ task: DomRefCell::new(Some(task)),
+ })
+ }
+}
+
+impl Callback for ModuleHandler {
+ fn callback(&self, _cx: *mut JSContext, _v: HandleValue) {
+ let task = self.task.borrow_mut().take().unwrap();
+ task.run_box();
+ }
+}
+
+/// The owner of the module
+/// It can be `worker` or `script` element
+#[derive(Clone)]
+pub enum ModuleOwner {
+ #[allow(dead_code)]
+ Worker(TrustedWorkerAddress),
+ Window(Trusted<HTMLScriptElement>),
+}
+
+impl ModuleOwner {
+ pub fn global(&self) -> DomRoot<GlobalScope> {
+ match &self {
+ ModuleOwner::Worker(worker) => (*worker.root().clone()).global(),
+ ModuleOwner::Window(script) => (*script.root()).global(),
+ }
+ }
+
+ fn gen_promise_with_final_handler(
+ &self,
+ module_url: Option<ServoUrl>,
+ is_top_level: bool,
+ ) -> Rc<Promise> {
+ let resolve_this = self.clone();
+ let reject_this = self.clone();
+
+ let resolved_url = module_url.clone();
+ let rejected_url = module_url.clone();
+
+ let handler = PromiseNativeHandler::new(
+ &self.global(),
+ Some(ModuleHandler::new(Box::new(
+ task!(fetched_resolve: move || {
+ resolve_this.finish_module_load(resolved_url, is_top_level);
+ }),
+ ))),
+ Some(ModuleHandler::new(Box::new(
+ task!(failure_reject: move || {
+ reject_this.finish_module_load(rejected_url, is_top_level);
+ }),
+ ))),
+ );
+
+ let compartment = enter_realm(&*self.global());
+ let comp = InCompartment::Entered(&compartment);
+ let _ais = AutoIncumbentScript::new(&*self.global());
+
+ let promise = Promise::new_in_current_compartment(&self.global(), comp);
+
+ promise.append_native_handler(&handler);
+
+ promise
+ }
+
+ /// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-and-link-a-module-script
+ /// step 4-7.
+ pub fn finish_module_load(&self, module_url: Option<ServoUrl>, is_top_level: bool) {
+ match &self {
+ ModuleOwner::Worker(_) => unimplemented!(),
+ ModuleOwner::Window(script) => {
+ let global = self.global();
+
+ let document = document_from_node(&*script.root());
+
+ let module_map = global.get_module_map().borrow();
+
+ let (module_tree, mut load) = if let Some(script_src) = module_url.clone() {
+ let module_tree = module_map.get(&script_src.clone()).unwrap().clone();
+
+ let load = Ok(ScriptOrigin::external(
+ module_tree.get_text().borrow().clone(),
+ script_src.clone(),
+ ScriptType::Module,
+ ));
+
+ debug!(
+ "Going to finish external script from {}",
+ script_src.clone()
+ );
+
+ (module_tree, load)
+ } else {
+ let module_tree = {
+ let inline_module_map = global.get_inline_module_map().borrow();
+ inline_module_map
+ .get(&script.root().get_script_id())
+ .unwrap()
+ .clone()
+ };
+
+ let base_url = document.base_url();
+
+ let load = Ok(ScriptOrigin::internal(
+ module_tree.get_text().borrow().clone(),
+ base_url.clone(),
+ ScriptType::Module,
+ ));
+
+ debug!("Going to finish internal script from {}", base_url.clone());
+
+ (module_tree, load)
+ };
+
+ module_tree.set_status(ModuleStatus::Finished);
+
+ if !module_tree.has_all_ready_descendants(&module_map) {
+ return;
+ }
+
+ let parent_urls = module_tree.get_parent_urls().borrow();
+ let parent_all_ready = parent_urls
+ .iter()
+ .filter_map(|parent_url| module_map.get(&parent_url.clone()))
+ .all(|parent_tree| parent_tree.has_all_ready_descendants(&module_map));
+
+ if !parent_all_ready {
+ return;
+ }
+
+ parent_urls
+ .iter()
+ .filter_map(|parent_url| module_map.get(&parent_url.clone()))
+ .for_each(|parent_tree| {
+ let parent_promise = parent_tree.get_promise().borrow();
+ if let Some(promise) = parent_promise.as_ref() {
+ promise.resolve_native(&());
+ }
+ });
+
+ let mut discovered_urls: HashSet<ServoUrl> = HashSet::new();
+ let module_error =
+ ModuleTree::find_first_parse_error(&global, &module_tree, &mut discovered_urls);
+
+ match module_error {
+ None => {
+ let module_record = module_tree.get_record().borrow();
+ if let Some(record) = &*module_record {
+ let instantiated =
+ module_tree.instantiate_module_tree(&global, record.handle());
+
+ if let Err(exception) = instantiated {
+ module_tree.set_error(Some(exception.clone()));
+ }
+ }
+ },
+ Some(ModuleError::RawException(exception)) => {
+ module_tree.set_error(Some(ModuleError::RawException(exception)));
+ },
+ Some(ModuleError::Network(network_error)) => {
+ module_tree.set_error(Some(ModuleError::Network(network_error.clone())));
+
+ // Change the `result` load of the script into `network` error
+ load = Err(network_error);
+ },
+ };
+
+ if is_top_level {
+ let r#async = script
+ .root()
+ .upcast::<Element>()
+ .has_attribute(&local_name!("async"));
+
+ if !r#async && (&*script.root()).get_parser_inserted() {
+ document.deferred_script_loaded(&*script.root(), load);
+ } else if !r#async && !(&*script.root()).get_non_blocking() {
+ document.asap_in_order_script_loaded(&*script.root(), load);
+ } else {
+ document.asap_script_loaded(&*script.root(), load);
+ };
+ }
+ },
+ }
+ }
+}
+
+/// The context required for asynchronously loading an external module script source.
+struct ModuleContext {
+ /// The owner of the module that initiated the request.
+ owner: ModuleOwner,
+ /// The response body received to date.
+ data: Vec<u8>,
+ /// The response metadata received to date.
+ metadata: Option<Metadata>,
+ /// The initial URL requested.
+ url: ServoUrl,
+ /// Destination of current module context
+ destination: Destination,
+ /// Credentials Mode of current module context
+ credentials_mode: CredentialsMode,
+ /// Indicates whether the request failed, and why
+ status: Result<(), NetworkError>,
+ /// Timing object for this resource
+ resource_timing: ResourceFetchTiming,
+}
+
+impl FetchResponseListener for ModuleContext {
+ fn process_request_body(&mut self) {} // TODO(cybai): Perhaps add custom steps to perform fetch here?
+
+ fn process_request_eof(&mut self) {} // TODO(cybai): Perhaps add custom steps to perform fetch here?
+
+ fn process_response(&mut self, metadata: Result<FetchMetadata, NetworkError>) {
+ self.metadata = metadata.ok().map(|meta| match meta {
+ FetchMetadata::Unfiltered(m) => m,
+ FetchMetadata::Filtered { unsafe_, .. } => unsafe_,
+ });
+
+ let status_code = self
+ .metadata
+ .as_ref()
+ .and_then(|m| match m.status {
+ Some((c, _)) => Some(c),
+ _ => None,
+ })
+ .unwrap_or(0);
+
+ self.status = match status_code {
+ 0 => Err(NetworkError::Internal(
+ "No http status code received".to_owned(),
+ )),
+ 200..=299 => Ok(()), // HTTP ok status codes
+ _ => Err(NetworkError::Internal(format!(
+ "HTTP error code {}",
+ status_code
+ ))),
+ };
+ }
+
+ fn process_response_chunk(&mut self, mut chunk: Vec<u8>) {
+ if self.status.is_ok() {
+ self.data.append(&mut chunk);
+ }
+ }
+
+ /// <https://html.spec.whatwg.org/multipage/#fetch-a-single-module-script>
+ /// Step 9-12
+ #[allow(unsafe_code)]
+ fn process_response_eof(&mut self, response: Result<ResourceFetchTiming, NetworkError>) {
+ let global = self.owner.global();
+
+ if let Some(window) = global.downcast::<Window>() {
+ window
+ .Document()
+ .finish_load(LoadType::Script(self.url.clone()));
+ }
+
+ // Step 9-1 & 9-2.
+ let load = response.and(self.status.clone()).and_then(|_| {
+ // Step 9-3.
+ let meta = self.metadata.take().unwrap();
+
+ if let Some(content_type) = meta.content_type.map(Serde::into_inner) {
+ let c = content_type.to_string();
+ // The MIME crate includes params (e.g. charset=utf8) in the to_string
+ // https://github.com/hyperium/mime/issues/120
+ if let Some(ty) = c.split(';').next() {
+ if !SCRIPT_JS_MIMES.contains(&ty) {
+ return Err(NetworkError::Internal(format!("Invalid MIME type: {}", ty)));
+ }
+ } else {
+ return Err(NetworkError::Internal("Empty MIME type".into()));
+ }
+ } else {
+ return Err(NetworkError::Internal("No MIME type".into()));
+ }
+
+ // Step 10.
+ let (source_text, _, _) = UTF_8.decode(&self.data);
+ Ok(ScriptOrigin::external(
+ DOMString::from(source_text),
+ meta.final_url,
+ ScriptType::Module,
+ ))
+ });
+
+ if let Err(err) = load {
+ // Step 9.
+ error!("Failed to fetch {} with error {:?}", self.url.clone(), err);
+ let module_tree = {
+ let module_map = global.get_module_map().borrow();
+ module_map.get(&self.url.clone()).unwrap().clone()
+ };
+
+ module_tree.set_status(ModuleStatus::FetchFailed);
+
+ module_tree.set_error(Some(ModuleError::Network(err)));
+
+ let promise = module_tree.get_promise().borrow();
+ promise.as_ref().unwrap().resolve_native(&());
+
+ return;
+ }
+
+ // Step 12.
+ if let Ok(ref resp_mod_script) = load {
+ let module_tree = {
+ let module_map = global.get_module_map().borrow();
+ module_map.get(&self.url.clone()).unwrap().clone()
+ };
+
+ module_tree.set_text(resp_mod_script.text());
+
+ let compiled_module = module_tree.compile_module_script(
+ &global,
+ resp_mod_script.text(),
+ self.url.clone(),
+ );
+
+ match compiled_module {
+ Err(exception) => {
+ module_tree.set_error(Some(exception));
+
+ let promise = module_tree.get_promise().borrow();
+ promise.as_ref().unwrap().resolve_native(&());
+
+ return;
+ },
+ Ok(record) => {
+ module_tree.set_record(record);
+
+ {
+ let mut visited = module_tree.get_visited_urls().borrow_mut();
+ visited.insert(self.url.clone());
+ }
+
+ let descendant_results = fetch_module_descendants_and_link(
+ &self.owner,
+ &module_tree,
+ self.destination.clone(),
+ self.credentials_mode.clone(),
+ );
+
+ // Resolve the request of this module tree promise directly
+ // when there's no descendant
+ if descendant_results.is_none() {
+ module_tree.set_status(ModuleStatus::Ready);
+
+ let promise = module_tree.get_promise().borrow();
+ promise.as_ref().unwrap().resolve_native(&());
+ }
+ },
+ }
+ }
+ }
+
+ fn resource_timing_mut(&mut self) -> &mut ResourceFetchTiming {
+ &mut self.resource_timing
+ }
+
+ fn resource_timing(&self) -> &ResourceFetchTiming {
+ &self.resource_timing
+ }
+
+ fn submit_resource_timing(&mut self) {
+ network_listener::submit_timing(self)
+ }
+}
+
+impl ResourceTimingListener for ModuleContext {
+ fn resource_timing_information(&self) -> (InitiatorType, ServoUrl) {
+ let initiator_type = InitiatorType::LocalName("module".to_string());
+ (initiator_type, self.url.clone())
+ }
+
+ fn resource_timing_global(&self) -> DomRoot<GlobalScope> {
+ self.owner.global()
+ }
+}
+
+impl PreInvoke for ModuleContext {}
+
+#[allow(unsafe_code)]
+/// A function to register module hooks (e.g. listening on resolving modules,
+/// getting module metadata, getting script private reference and resolving dynamic import)
+pub unsafe fn EnsureModuleHooksInitialized(rt: *mut JSRuntime) {
+ if GetModuleResolveHook(rt).is_some() {
+ return;
+ }
+
+ SetModuleResolveHook(rt, Some(HostResolveImportedModule));
+ SetModuleMetadataHook(rt, None);
+ SetScriptPrivateReferenceHooks(rt, None, None);
+
+ SetModuleDynamicImportHook(rt, None);
+}
+
+#[allow(unsafe_code)]
+/// https://tc39.github.io/ecma262/#sec-hostresolveimportedmodule
+/// https://html.spec.whatwg.org/multipage/#hostresolveimportedmodule(referencingscriptormodule%2C-specifier)
+unsafe extern "C" fn HostResolveImportedModule(
+ cx: *mut JSContext,
+ reference_private: RawHandleValue,
+ specifier: RawHandle<*mut JSString>,
+) -> *mut JSObject {
+ let global_scope = GlobalScope::from_context(cx);
+
+ // Step 2.
+ let mut base_url = global_scope.api_base_url();
+
+ // Step 3.
+ let module_data = (reference_private.to_private() as *const ModuleScript).as_ref();
+ if let Some(data) = module_data {
+ base_url = data.base_url.clone();
+ }
+
+ // Step 5.
+ let url = ModuleTree::resolve_module_specifier(*global_scope.get_cx(), &base_url, specifier);
+
+ // Step 6.
+ assert!(url.is_ok());
+
+ let parsed_url = url.unwrap();
+
+ // Step 4 & 7.
+ let module_map = global_scope.get_module_map().borrow();
+
+ let module_tree = module_map.get(&parsed_url);
+
+ // Step 9.
+ assert!(module_tree.is_some());
+
+ let fetched_module_object = module_tree.unwrap().get_record().borrow();
+
+ // Step 8.
+ assert!(fetched_module_object.is_some());
+
+ // Step 10.
+ if let Some(record) = &*fetched_module_object {
+ return record.handle().get();
+ }
+
+ unreachable!()
+}
+
+/// https://html.spec.whatwg.org/multipage/#fetch-a-module-script-tree
+pub fn fetch_external_module_script(
+ owner: ModuleOwner,
+ url: ServoUrl,
+ destination: Destination,
+ integrity_metadata: String,
+ credentials_mode: CredentialsMode,
+) -> Rc<Promise> {
+ // Step 1.
+ fetch_single_module_script(
+ owner,
+ url,
+ destination,
+ Referrer::Client,
+ ParserMetadata::NotParserInserted,
+ integrity_metadata,
+ credentials_mode,
+ None,
+ true,
+ )
+}
+
+/// https://html.spec.whatwg.org/multipage/#fetch-a-single-module-script
+pub fn fetch_single_module_script(
+ owner: ModuleOwner,
+ url: ServoUrl,
+ destination: Destination,
+ referrer: Referrer,
+ parser_metadata: ParserMetadata,
+ integrity_metadata: String,
+ credentials_mode: CredentialsMode,
+ parent_url: Option<ServoUrl>,
+ top_level_module_fetch: bool,
+) -> Rc<Promise> {
+ {
+ // Step 1.
+ let global = owner.global();
+ let module_map = global.get_module_map().borrow();
+
+ debug!("Start to fetch {}", url);
+
+ if let Some(module_tree) = module_map.get(&url.clone()) {
+ let status = module_tree.get_status();
+
+ let promise = module_tree.get_promise().borrow();
+
+ debug!("Meet a fetched url {} and its status is {:?}", url, status);
+
+ assert!(promise.is_some());
+
+ module_tree.append_handler(owner.clone(), url.clone(), top_level_module_fetch);
+
+ let promise = promise.as_ref().unwrap();
+
+ match status {
+ ModuleStatus::Initial => unreachable!(
+ "We have the module in module map so its status should not be `initial`"
+ ),
+ // Step 2.
+ ModuleStatus::Fetching => return promise.clone(),
+ ModuleStatus::FetchingDescendants => {
+ if module_tree.has_all_ready_descendants(&module_map) {
+ promise.resolve_native(&());
+ }
+ },
+ // Step 3.
+ ModuleStatus::FetchFailed | ModuleStatus::Ready | ModuleStatus::Finished => {
+ promise.resolve_native(&());
+ },
+ }
+
+ return promise.clone();
+ }
+ }
+
+ let global = owner.global();
+
+ let module_tree = ModuleTree::new(url.clone());
+ module_tree.set_status(ModuleStatus::Fetching);
+
+ let promise = owner.gen_promise_with_final_handler(Some(url.clone()), top_level_module_fetch);
+
+ module_tree.set_promise(promise.clone());
+ if let Some(parent_url) = parent_url {
+ module_tree.insert_parent_url(parent_url);
+ }
+
+ // Step 4.
+ global.set_module_map(url.clone(), module_tree);
+
+ // Step 5-6.
+ let mode = match destination.clone() {
+ Destination::Worker | Destination::SharedWorker if top_level_module_fetch => {
+ RequestMode::SameOrigin
+ },
+ _ => RequestMode::CorsMode,
+ };
+
+ let document: Option<DomRoot<Document>> = match &owner {
+ ModuleOwner::Worker(_) => None,
+ ModuleOwner::Window(script) => Some(document_from_node(&*script.root())),
+ };
+
+ // Step 7-8.
+ let request = RequestBuilder::new(url.clone())
+ .destination(destination.clone())
+ .origin(global.origin().immutable().clone())
+ .referrer(Some(referrer))
+ .parser_metadata(parser_metadata)
+ .integrity_metadata(integrity_metadata.clone())
+ .credentials_mode(credentials_mode)
+ .mode(mode);
+
+ let context = Arc::new(Mutex::new(ModuleContext {
+ owner,
+ data: vec![],
+ metadata: None,
+ url: url.clone(),
+ destination: destination.clone(),
+ credentials_mode: credentials_mode.clone(),
+ status: Ok(()),
+ resource_timing: ResourceFetchTiming::new(ResourceTimingType::Resource),
+ }));
+
+ let (action_sender, action_receiver) = ipc::channel().unwrap();
+
+ let listener = NetworkListener {
+ context,
+ task_source: global.networking_task_source(),
+ canceller: Some(global.task_canceller(TaskSourceName::Networking)),
+ };
+
+ ROUTER.add_route(
+ action_receiver.to_opaque(),
+ Box::new(move |message| {
+ listener.notify_fetch(message.to().unwrap());
+ }),
+ );
+
+ if let Some(doc) = document {
+ doc.fetch_async(LoadType::Script(url), request, action_sender);
+ }
+
+ promise
+}
+
+#[allow(unsafe_code)]
+/// https://html.spec.whatwg.org/multipage/#fetch-an-inline-module-script-graph
+pub fn fetch_inline_module_script(
+ owner: ModuleOwner,
+ module_script_text: DOMString,
+ url: ServoUrl,
+ script_id: ScriptId,
+ credentials_mode: CredentialsMode,
+) {
+ let global = owner.global();
+
+ let module_tree = ModuleTree::new(url.clone());
+
+ let promise = owner.gen_promise_with_final_handler(None, true);
+
+ module_tree.set_promise(promise.clone());
+
+ let compiled_module =
+ module_tree.compile_module_script(&global, module_script_text, url.clone());
+
+ match compiled_module {
+ Ok(record) => {
+ module_tree.set_record(record);
+
+ let descendant_results = fetch_module_descendants_and_link(
+ &owner,
+ &module_tree,
+ Destination::Script,
+ credentials_mode,
+ );
+
+ global.set_inline_module_map(script_id, module_tree);
+
+ if descendant_results.is_none() {
+ promise.resolve_native(&());
+ }
+ },
+ Err(exception) => {
+ module_tree.set_status(ModuleStatus::Ready);
+ module_tree.set_error(Some(exception));
+ global.set_inline_module_map(script_id, module_tree);
+ promise.resolve_native(&());
+ },
+ }
+}
+
+/// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-and-link-a-module-script
+/// Step 1-3.
+#[allow(unsafe_code)]
+fn fetch_module_descendants_and_link(
+ owner: &ModuleOwner,
+ module_tree: &ModuleTree,
+ destination: Destination,
+ credentials_mode: CredentialsMode,
+) -> Option<Rc<Promise>> {
+ let descendant_results =
+ fetch_module_descendants(owner, module_tree, destination, credentials_mode);
+
+ match descendant_results {
+ Ok(descendants) => {
+ if descendants.len() > 0 {
+ unsafe {
+ let global = owner.global();
+
+ let _compartment = enter_realm(&*global);
+ AlreadyInCompartment::assert(&*global);
+ let _ais = AutoIncumbentScript::new(&*global);
+
+ let abv = CreateAutoObjectVector(*global.get_cx());
+
+ for descendant in descendants {
+ assert!(AppendToAutoObjectVector(
+ abv as *mut AutoObjectVector,
+ descendant.promise_obj().get()
+ ));
+ }
+
+ rooted!(in(*global.get_cx()) let raw_promise_all = GetWaitForAllPromise(*global.get_cx(), abv));
+
+ let promise_all =
+ Promise::new_with_js_promise(raw_promise_all.handle(), global.get_cx());
+
+ let promise = module_tree.get_promise().borrow();
+ let promise = promise.as_ref().unwrap().clone();
+
+ let resolve_promise = TrustedPromise::new(promise.clone());
+ let reject_promise = TrustedPromise::new(promise.clone());
+
+ let handler = PromiseNativeHandler::new(
+ &global,
+ Some(ModuleHandler::new(Box::new(
+ task!(all_fetched_resolve: move || {
+ let promise = resolve_promise.root();
+ promise.resolve_native(&());
+ }),
+ ))),
+ Some(ModuleHandler::new(Box::new(
+ task!(all_failure_reject: move || {
+ let promise = reject_promise.root();
+ promise.reject_native(&());
+ }),
+ ))),
+ );
+
+ promise_all.append_native_handler(&handler);
+
+ return Some(promise_all);
+ }
+ }
+ },
+ Err(err) => {
+ module_tree.set_error(Some(err));
+ },
+ }
+
+ None
+}
+
+#[allow(unsafe_code)]
+/// https://html.spec.whatwg.org/multipage/#fetch-the-descendants-of-a-module-script
+fn fetch_module_descendants(
+ owner: &ModuleOwner,
+ module_tree: &ModuleTree,
+ destination: Destination,
+ credentials_mode: CredentialsMode,
+) -> Result<Vec<Rc<Promise>>, ModuleError> {
+ debug!("Start to load dependencies of {}", module_tree.url.clone());
+
+ let global = owner.global();
+
+ module_tree.set_status(ModuleStatus::FetchingDescendants);
+
+ module_tree
+ .resolve_requested_modules(&global)
+ .map(|requested_urls| {
+ module_tree.append_descendant_urls(requested_urls.clone());
+
+ let parent_urls = module_tree.get_parent_urls().borrow();
+
+ if parent_urls.intersection(&requested_urls).count() > 0 {
+ return Vec::new();
+ }
+
+ requested_urls
+ .iter()
+ .map(|requested_url| {
+ // https://html.spec.whatwg.org/multipage/#internal-module-script-graph-fetching-procedure
+ // Step 1.
+ {
+ let visited = module_tree.get_visited_urls().borrow();
+ assert!(visited.get(&requested_url).is_some());
+ }
+
+ // Step 2.
+ fetch_single_module_script(
+ owner.clone(),
+ requested_url.clone(),
+ destination.clone(),
+ Referrer::Client,
+ ParserMetadata::NotParserInserted,
+ "".to_owned(),
+ credentials_mode.clone(),
+ Some(module_tree.url.clone()),
+ false,
+ )
+ })
+ .collect()
+ })
+}
diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs
index 02a6b42b854..284c49312c6 100644
--- a/components/script/script_runtime.rs
+++ b/components/script/script_runtime.rs
@@ -30,6 +30,7 @@ use crate::dom::promise::Promise;
use crate::dom::promiserejectionevent::PromiseRejectionEvent;
use crate::dom::response::Response;
use crate::microtask::{EnqueuedPromiseCallback, Microtask, MicrotaskQueue};
+use crate::script_module::EnsureModuleHooksInitialized;
use crate::script_thread::trace_thread;
use crate::task::TaskBox;
use crate::task_source::networking::NetworkingTaskSource;
@@ -498,6 +499,8 @@ unsafe fn new_rt_and_cx_with_parent(
SetJobQueue(cx, job_queue);
SetPromiseRejectionTrackerCallback(cx, Some(promise_rejection_tracker), ptr::null_mut());
+ EnsureModuleHooksInitialized(runtime.rt());
+
set_gc_zeal_options(cx);
// Enable or disable the JITs.
@@ -915,16 +918,13 @@ unsafe extern "C" fn consume_stream(
let mimetype = unwrapped_source.Headers().extract_mime_type();
//Step 2.3 If mimeType is not `application/wasm`, return with a TypeError and abort these substeps.
- match &mimetype[..] {
- b"application/wasm" | b"APPLICATION/wasm" | b"APPLICATION/WASM" => {},
- _ => {
- throw_dom_exception(
- cx,
- &global,
- Error::Type("Response has unsupported MIME type".to_string()),
- );
- return false;
- },
+ if !&mimetype[..].eq_ignore_ascii_case(b"application/wasm") {
+ throw_dom_exception(
+ cx,
+ &global,
+ Error::Type("Response has unsupported MIME type".to_string()),
+ );
+ return false;
}
//Step 2.4 If response is not CORS-same-origin, return with a TypeError and abort these substeps.
diff --git a/components/script_plugins/lib.rs b/components/script_plugins/lib.rs
index ea2b0fa74a6..f686f64f6fe 100644
--- a/components/script_plugins/lib.rs
+++ b/components/script_plugins/lib.rs
@@ -216,8 +216,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnrootedPass {
let parent_item = map.expect_item(map.get_parent_item(var.id));
if !has_lint_attr(&self.symbols, &parent_item.attrs, self.symbols.must_root) {
match var.data {
- hir::VariantData::Tuple(ref fields, ..) => {
- for ref field in fields {
+ hir::VariantData::Tuple(fields, ..) => {
+ for field in fields {
let def_id = cx.tcx.hir().local_def_id(field.hir_id);
if is_unrooted_ty(&self.symbols, cx, cx.tcx.type_of(def_id), false) {
cx.span_lint(
diff --git a/components/style/properties/longhands/border.mako.rs b/components/style/properties/longhands/border.mako.rs
index 09cbea19a7f..f281fa1a30d 100644
--- a/components/style/properties/longhands/border.mako.rs
+++ b/components/style/properties/longhands/border.mako.rs
@@ -75,7 +75,7 @@
"BorderCornerRadius",
"computed::BorderCornerRadius::zero()",
"parse",
- engines="gecko servo-2013",
+ engines="gecko servo-2013 servo-2020",
extra_prefixes=prefixes,
spec=maybe_logical_spec(corner, "radius"),
boxed=True,
diff --git a/components/style/properties/shorthands/border.mako.rs b/components/style/properties/shorthands/border.mako.rs
index d584e568aed..1f77b905021 100644
--- a/components/style/properties/shorthands/border.mako.rs
+++ b/components/style/properties/shorthands/border.mako.rs
@@ -239,7 +239,7 @@ pub fn parse_border<'i, 't>(
<%helpers:shorthand
name="border-radius"
- engines="gecko servo-2013"
+ engines="gecko servo-2013 servo-2020"
sub_properties="${' '.join(
'border-%s-radius' % (corner)
for corner in ['top-left', 'top-right', 'bottom-right', 'bottom-left']
diff --git a/etc/taskcluster/decision_task.py b/etc/taskcluster/decision_task.py
index a3d70653794..6f8d41e3cb8 100644
--- a/etc/taskcluster/decision_task.py
+++ b/etc/taskcluster/decision_task.py
@@ -181,9 +181,6 @@ def linux_tidy_unit_untrusted():
.with_dockerfile(dockerfile_path("build"))
.with_env(**build_env, **unix_build_env, **linux_build_env)
.with_repo_bundle()
- .with_script("rustup set profile minimal")
- # required by components/script_plugins:
- .with_script("rustup component add rustc-dev")
.with_script("""
./mach test-tidy --no-progress --all
./mach test-tidy --no-progress --self-test
@@ -229,7 +226,6 @@ def linux_docs_check():
linux_build_task("Docs + check")
.with_treeherder("Linux x64", "Doc+Check")
.with_script("""
- rustup component add rust-docs
RUSTDOCFLAGS="--disable-minification" ./mach doc
(
cd target/doc
@@ -304,11 +300,10 @@ def with_rust_nightly():
modified_build_env["RUSTFLAGS"] = " ".join(flags)
return (
- linux_build_task("with Rust Nightly", build_env=modified_build_env, install_rustc_dev=False)
+ linux_build_task("with Rust Nightly", build_env=modified_build_env)
.with_treeherder("Linux x64", "RustNightly")
.with_script("""
echo "nightly" > rust-toolchain
- rustup component add rustc-dev
./mach build --dev
./mach test-unit
""")
@@ -850,7 +845,7 @@ def macos_task(name):
)
-def linux_build_task(name, *, build_env=build_env, install_rustc_dev=True):
+def linux_build_task(name, *, build_env=build_env):
task = (
linux_task(name)
# https://docs.taskcluster.net/docs/reference/workers/docker-worker/docs/caches
@@ -867,14 +862,8 @@ def linux_build_task(name, *, build_env=build_env, install_rustc_dev=True):
.with_dockerfile(dockerfile_path("build"))
.with_env(**build_env, **unix_build_env, **linux_build_env)
.with_repo_bundle()
- .with_script("""
- rustup set profile minimal
- ./mach bootstrap-gstreamer
- """)
+ .with_script("./mach bootstrap-gstreamer")
)
- if install_rustc_dev:
- # required by components/script_plugins:
- task = task.with_script("rustup component add rustc-dev")
return task
@@ -884,9 +873,9 @@ def android_build_task(name):
# file: NDK parses $(file $SHELL) to tell x64 host from x86
# wget: servo-media-gstreamer’s build script
.with_script("""
- apt-get update -q
- apt-get install -y --no-install-recommends openjdk-8-jdk-headless file wget
- ./mach bootstrap-android --accept-all-licences --build
+ time apt-get update -q
+ time apt-get install -y --no-install-recommends openjdk-8-jdk-headless file wget
+ time ./mach bootstrap-android --accept-all-licences --build
""")
)
@@ -920,9 +909,6 @@ def windows_build_task(name, package=True, arch="x86_64"):
path="python3",
)
.with_rustup()
- .with_script("rustup set profile minimal")
- # required by components/script_plugins:
- .with_script("rustup component add rustc-dev")
)
if arch in hashes["non-devel"] and arch in hashes["devel"]:
task = (
@@ -968,11 +954,6 @@ def macos_build_task(name):
.with_repo_bundle(alternate_object_dir="/var/cache/servo.git/objects")
.with_python2()
.with_rustup()
- # Since macOS workers are long-lived and ~/.rustup kept across tasks:
- .with_script("rustup self update")
- .with_script("rustup set profile minimal")
- # required by components/script_plugins:
- .with_script("rustup component add rustc-dev")
.with_index_and_artifacts_expire_in(build_artifacts_expire_in)
# Debugging for surprising generic-worker behaviour
.with_early_script("ls")
diff --git a/etc/taskcluster/decisionlib.py b/etc/taskcluster/decisionlib.py
index b8d878da9d8..2dca9e882ac 100644
--- a/etc/taskcluster/decisionlib.py
+++ b/etc/taskcluster/decisionlib.py
@@ -693,6 +693,7 @@ class MacOsGenericWorkerTask(UnixTaskMixin, GenericWorkerTask):
return self.with_early_script("""
export PATH="$HOME/.cargo/bin:$PATH"
which rustup || curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain none -y
+ rustup self update
""")
diff --git a/etc/taskcluster/docker/build.dockerfile b/etc/taskcluster/docker/build.dockerfile
index c5e148c4df3..e5a1edafc4a 100644
--- a/etc/taskcluster/docker/build.dockerfile
+++ b/etc/taskcluster/docker/build.dockerfile
@@ -44,7 +44,8 @@ RUN \
#
&& \
#
- #
+ # Install the version of rustup that is current when this Docker image is being built:
+ # We want at least 1.21 (increment in this comment to force an image rebuild).
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain none --profile=minimal -y && \
#
#
diff --git a/python/servo/bootstrap_commands.py b/python/servo/bootstrap_commands.py
index 835c7bf21c2..b8a88314609 100644
--- a/python/servo/bootstrap_commands.py
+++ b/python/servo/bootstrap_commands.py
@@ -281,8 +281,7 @@ class MachCommands(CommandBase):
default='1',
help='Keep up to this many most recent nightlies')
def clean_nightlies(self, force=False, keep=None):
- default_toolchain = self.default_toolchain()
- print("Current Rust version for Servo: {}".format(default_toolchain))
+ print("Current Rust version for Servo: {}".format(self.rust_toolchain()))
old_toolchains = []
keep = int(keep)
stdout = subprocess.check_output(['git', 'log', '--format=%H', 'rust-toolchain'])
diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py
index 4630c9a9dbf..2aa70862fd6 100644
--- a/python/servo/build_commands.py
+++ b/python/servo/build_commands.py
@@ -30,7 +30,7 @@ from mach.decorators import (
from mach.registrar import Registrar
from mach_bootstrap import _get_exec_path
-from servo.command_base import CommandBase, cd, call, check_call, BIN_SUFFIX, append_to_path_env, gstreamer_root
+from servo.command_base import CommandBase, cd, call, check_call, append_to_path_env, gstreamer_root
from servo.util import host_triple
@@ -237,14 +237,6 @@ class MachCommands(CommandBase):
if very_verbose:
opts += ["-vv"]
- if target:
- if self.config["tools"]["use-rustup"] and not uwp:
- # 'rustup target add' fails if the toolchain is not installed at all.
- self.call_rustup_run(["rustc", "--version"])
-
- check_call(["rustup" + BIN_SUFFIX, "target", "add",
- "--toolchain", self.toolchain(), target])
-
env = self.build_env(target=target, is_build=True, uwp=uwp, features=features)
self.ensure_bootstrapped(target=target)
self.ensure_clobbered()
diff --git a/python/servo/command_base.py b/python/servo/command_base.py
index 371eb9844a2..31eb17800ae 100644
--- a/python/servo/command_base.py
+++ b/python/servo/command_base.py
@@ -345,38 +345,23 @@ class CommandBase(object):
# Set default android target
self.handle_android_target("armv7-linux-androideabi")
- _default_toolchain = None
+ _rust_toolchain = None
- def toolchain(self):
- return self.default_toolchain()
-
- def default_toolchain(self):
- if self._default_toolchain is None:
+ def rust_toolchain(self):
+ if self._rust_toolchain is None:
filename = path.join(self.context.topdir, "rust-toolchain")
with open(filename) as f:
- self._default_toolchain = f.read().strip()
- return self._default_toolchain
+ self._rust_toolchain = f.read().strip()
+
+ if platform.system() == "Windows":
+ self._rust_toolchain += "-x86_64-pc-windows-msvc"
+
+ return self._rust_toolchain
def call_rustup_run(self, args, **kwargs):
if self.config["tools"]["use-rustup"]:
- try:
- version_line = subprocess.check_output(["rustup" + BIN_SUFFIX, "--version"])
- except OSError as e:
- if e.errno == NO_SUCH_FILE_OR_DIRECTORY:
- print("It looks like rustup is not installed. See instructions at "
- "https://github.com/servo/servo/#setting-up-your-environment")
- print()
- return 1
- raise
- version = tuple(map(int, re.match(b"rustup (\d+)\.(\d+)\.(\d+)", version_line).groups()))
- if version < (1, 11, 0):
- print("rustup is at version %s.%s.%s, Servo requires 1.11.0 or more recent." % version)
- print("Try running 'rustup self update'.")
- return 1
- toolchain = self.toolchain()
- if platform.system() == "Windows":
- toolchain += "-x86_64-pc-windows-msvc"
- args = ["rustup" + BIN_SUFFIX, "run", "--install", toolchain] + args
+ assert self.context.bootstrapped
+ args = ["rustup" + BIN_SUFFIX, "run", "--install", self.rust_toolchain()] + args
else:
args[0] += BIN_SUFFIX
return call(args, **kwargs)
@@ -1009,7 +994,7 @@ install them, let us know by filing a bug!")
return True
return False
- def ensure_bootstrapped(self, target=None):
+ def ensure_bootstrapped(self, target=None, rustup_components=None):
if self.context.bootstrapped:
return
@@ -1019,8 +1004,44 @@ install them, let us know by filing a bug!")
if "msvc" in target_platform:
Registrar.dispatch("bootstrap", context=self.context)
+ if self.config["tools"]["use-rustup"]:
+ self.ensure_rustup_version()
+ toolchain = self.rust_toolchain()
+
+ if toolchain.encode("utf-8") not in check_output(["rustup", "toolchain", "list"]):
+ check_call(["rustup", "toolchain", "install", "--profile", "minimal", toolchain])
+
+ installed = check_output(
+ ["rustup", "component", "list", "--installed", "--toolchain", toolchain]
+ )
+ for component in set(rustup_components or []) | {"rustc-dev"}:
+ if component.encode("utf-8") not in installed:
+ check_call(["rustup", "component", "add", "--toolchain", toolchain, component])
+
+ if target and "uwp" not in target and target not in check_output(
+ ["rustup", "target", "list", "--installed", "--toolchain", toolchain]
+ ):
+ check_call(["rustup", "target", "add", "--toolchain", toolchain, target])
+
self.context.bootstrapped = True
+ def ensure_rustup_version(self):
+ try:
+ version_line = subprocess.check_output(["rustup" + BIN_SUFFIX, "--version"])
+ except OSError as e:
+ if e.errno == NO_SUCH_FILE_OR_DIRECTORY:
+ print("It looks like rustup is not installed. See instructions at "
+ "https://github.com/servo/servo/#setting-up-your-environment")
+ print()
+ sys.exit(1)
+ raise
+ version = tuple(map(int, re.match(b"rustup (\d+)\.(\d+)\.(\d+)", version_line).groups()))
+ version_needed = (1, 21, 0)
+ if version < version_needed:
+ print("rustup is at version %s.%s.%s, Servo requires %s.%s.%s or more recent." % (version + version_needed))
+ print("Try running 'rustup self update'.")
+ sys.exit(1)
+
def ensure_clobbered(self, target_dir=None):
if target_dir is None:
target_dir = self.get_target_dir()
diff --git a/python/servo/devenv_commands.py b/python/servo/devenv_commands.py
index 45a3f946f38..bc715205523 100644
--- a/python/servo/devenv_commands.py
+++ b/python/servo/devenv_commands.py
@@ -24,7 +24,7 @@ from mach.decorators import (
Command,
)
-from servo.command_base import CommandBase, cd, call, BIN_SUFFIX
+from servo.command_base import CommandBase, cd, call
from servo.build_commands import notify_build_done
from servo.util import get_static_rust_lang_org_dist, get_urlopen_kwargs
@@ -49,7 +49,7 @@ class MachCommands(CommandBase):
features += self.pick_media_stack(media_stack, target)
- self.ensure_bootstrapped()
+ self.ensure_bootstrapped(target=target)
self.ensure_clobbered()
env = self.build_env()
@@ -213,7 +213,7 @@ class MachCommands(CommandBase):
filename = path.join(self.context.topdir, "rust-toolchain")
with open(filename, "w") as f:
f.write(toolchain + "\n")
- return call(["rustup" + BIN_SUFFIX, "component", "add", "rustc-dev"])
+ self.ensure_bootstrapped()
@Command('fetch',
description='Fetch Rust, Cargo and Cargo dependencies',
diff --git a/python/servo/post_build_commands.py b/python/servo/post_build_commands.py
index a6ab4de647c..0311350e273 100644
--- a/python/servo/post_build_commands.py
+++ b/python/servo/post_build_commands.py
@@ -241,14 +241,13 @@ class PostBuildCommands(CommandBase):
@CommandBase.build_like_command_arguments
def doc(self, params, features, target=None, android=False, magicleap=False,
media_stack=None, **kwargs):
- env = os.environ.copy()
- env["RUSTUP_TOOLCHAIN"] = self.toolchain()
- rustc_path = check_output(["rustup" + BIN_SUFFIX, "which", "rustc"], env=env)
+ self.ensure_bootstrapped(rustup_components=["rust-docs"])
+ rustc_path = check_output(
+ ["rustup" + BIN_SUFFIX, "which", "--toolchain", self.rust_toolchain(), "rustc"])
assert path.basename(path.dirname(rustc_path)) == "bin"
toolchain_path = path.dirname(path.dirname(rustc_path))
rust_docs = path.join(toolchain_path, "share", "doc", "rust", "html")
- self.ensure_bootstrapped()
docs = path.join(self.get_target_dir(), "doc")
if not path.exists(docs):
os.makedirs(docs)
diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py
index 0c107a1867b..bc29955fd79 100644
--- a/python/servo/testing_commands.py
+++ b/python/servo/testing_commands.py
@@ -199,7 +199,6 @@ class MachCommands(CommandBase):
def test_perf(self, base=None, date=None, submit=False):
self.set_software_rendering_env(True, False)
- self.ensure_bootstrapped()
env = self.build_env()
cmd = ["bash", "test_perf.sh"]
if base:
@@ -298,7 +297,7 @@ class MachCommands(CommandBase):
args += ["--", "--nocapture"]
err = self.run_cargo_build_like_command("bench" if bench else "test", args, env=env, **kwargs)
- if err is not 0:
+ if err:
return err
@Command('test-content',
@@ -310,6 +309,7 @@ class MachCommands(CommandBase):
return 0
def install_rustfmt(self):
+ self.ensure_bootstrapped()
with open(os.devnull, "w") as devnull:
if self.call_rustup_run(["cargo", "fmt", "--version", "-q"],
stderr=devnull) != 0:
@@ -369,8 +369,6 @@ class MachCommands(CommandBase):
@CommandArgument('tests', default=None, nargs="...",
help="Specific tests to run, relative to the tests directory")
def test_webidl(self, quiet, tests):
- self.ensure_bootstrapped()
-
test_file_dir = path.abspath(path.join(PROJECT_TOPLEVEL_PATH, "components", "script",
"dom", "bindings", "codegen", "parser"))
# For the `import WebIDL` in runtests.py
@@ -388,7 +386,6 @@ class MachCommands(CommandBase):
category='testing',
parser=create_parser_wpt)
def test_wpt_failure(self, **kwargs):
- self.ensure_bootstrapped()
kwargs["pause_after_test"] = False
kwargs["include"] = ["infrastructure/failing-test.html"]
return not self._test_wpt(**kwargs)
@@ -398,7 +395,6 @@ class MachCommands(CommandBase):
category='testing',
parser=create_parser_wpt)
def test_wpt(self, **kwargs):
- self.ensure_bootstrapped()
ret = self.run_test_list_or_dispatch(kwargs["test_list"], "wpt", self._test_wpt, **kwargs)
if kwargs["always_succeed"]:
return 0
@@ -498,7 +494,6 @@ class MachCommands(CommandBase):
category='testing',
parser=updatecommandline.create_parser())
def update_wpt(self, **kwargs):
- self.ensure_bootstrapped()
run_file = path.abspath(path.join("tests", "wpt", "update.py"))
patch = kwargs.get("patch", False)
@@ -716,7 +711,6 @@ class MachCommands(CommandBase):
str(c1).ljust(width_col3), str(d1).ljust(width_col4)))
def jquery_test_runner(self, cmd, release, dev):
- self.ensure_bootstrapped()
base_dir = path.abspath(path.join("tests", "jquery"))
jquery_dir = path.join(base_dir, "jquery")
run_file = path.join(base_dir, "run_jquery.py")
@@ -736,7 +730,6 @@ class MachCommands(CommandBase):
return call([run_file, cmd, bin_path, base_dir])
def dromaeo_test_runner(self, tests, release, dev):
- self.ensure_bootstrapped()
base_dir = path.abspath(path.join("tests", "dromaeo"))
dromaeo_dir = path.join(base_dir, "dromaeo")
run_file = path.join(base_dir, "run_dromaeo.py")
@@ -969,8 +962,6 @@ testing/web-platform/mozilla/tests for Servo-only tests""" % reference_path)
@CommandArgument('--version', default='2.0.0',
help='WebGL conformance suite version')
def update_webgl(self, version=None):
- self.ensure_bootstrapped()
-
base_dir = path.abspath(path.join(PROJECT_TOPLEVEL_PATH,
"tests", "wpt", "mozilla", "tests", "webgl"))
run_file = path.join(base_dir, "tools", "import-conformance-tests.py")
diff --git a/rust-toolchain b/rust-toolchain
index fc40182b3c4..85efddc5ce0 100644
--- a/rust-toolchain
+++ b/rust-toolchain
@@ -1 +1 @@
-nightly-2019-12-05
+nightly-2019-12-23
diff --git a/tests/wpt/include.ini b/tests/wpt/include.ini
index 2f662095640..f11d0d0baa4 100644
--- a/tests/wpt/include.ini
+++ b/tests/wpt/include.ini
@@ -116,7 +116,11 @@ skip: true
[json-module]
skip: true
[module]
- skip: true
+ skip: false
+ [dynamic-import]
+ skip: true
+ [import-meta]
+ skip: true
[js]
skip: false
[mediasession]
diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
index a9e46713244..76b398963ae 100644
--- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
@@ -7,7 +7,7 @@
expected: FAIL
[Opening a blob URL in a new window immediately before revoking it works.]
- expected: TIMEOUT
+ expected: FAIL
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: FAIL
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 319c87bd348..0942f7eec75 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -8331,6 +8331,18 @@
{}
]
],
+ "css/css-pseudo/spelling-error-002-manual.html": [
+ [
+ "css/css-pseudo/spelling-error-002-manual.html",
+ {}
+ ]
+ ],
+ "css/css-pseudo/spelling-error-003-manual.html": [
+ [
+ "css/css-pseudo/spelling-error-003-manual.html",
+ {}
+ ]
+ ],
"css/css-regions/animations/animations-001.html": [
[
"css/css-regions/animations/animations-001.html",
@@ -129801,6 +129813,342 @@
{}
]
],
+ "css/css-images/image-orientation/image-orientation-default.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-default.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-default-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-none-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-composited.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-composited.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-content-images.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-content-images.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-dynamic1.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-dynamic1.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-dynamic2.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-dynamic2.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-none-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-image-document.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-image-document.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-none-content-images.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-none-content-images.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-none-image-document.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-none-image-document.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-none.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-none.html",
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-none-ref.html",
+ "=="
+ ]
+ ],
+ {
+ "fuzzy": [
+ [
+ null,
+ [
+ [
+ 10,
+ 10
+ ],
+ [
+ 100,
+ 100
+ ]
+ ]
+ ]
+ ]
+ }
+ ]
+ ],
"css/css-images/infinite-radial-gradient-refcrash.html": [
[
"css/css-images/infinite-radial-gradient-refcrash.html",
@@ -134289,6 +134637,18 @@
{}
]
],
+ "css/css-multicol/change-intrinsic-width.html": [
+ [
+ "css/css-multicol/change-intrinsic-width.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-multicol/column-count-used-001.html": [
[
"css/css-multicol/column-count-used-001.html",
@@ -134409,6 +134769,18 @@
{}
]
],
+ "css/css-multicol/intrinsic-width-change-column-count.html": [
+ [
+ "css/css-multicol/intrinsic-width-change-column-count.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-multicol/large-actual-column-count.html": [
[
"css/css-multicol/large-actual-column-count.html",
@@ -139509,6 +139881,30 @@
{}
]
],
+ "css/css-position/position-sticky-large-top-2.tentative.html": [
+ [
+ "css/css-position/position-sticky-large-top-2.tentative.html",
+ [
+ [
+ "/css/css-position/position-sticky-large-top-2-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position/position-sticky-large-top.tentative.html": [
+ [
+ "css/css-position/position-sticky-large-top.tentative.html",
+ [
+ [
+ "/css/css-position/position-sticky-large-top-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-position/position-sticky-nested-inline.html": [
[
"css/css-position/position-sticky-nested-inline.html",
@@ -140577,6 +140973,30 @@
{}
]
],
+ "css/css-pseudo/marker-content-017.html": [
+ [
+ "css/css-pseudo/marker-content-017.html",
+ [
+ [
+ "/css/css-pseudo/marker-content-017-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-pseudo/marker-content-018.html": [
+ [
+ "css/css-pseudo/marker-content-018.html",
+ [
+ [
+ "/css/css-pseudo/marker-content-018-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-pseudo/marker-display-dynamic-001.html": [
[
"css/css-pseudo/marker-display-dynamic-001.html",
@@ -143269,6 +143689,54 @@
{}
]
],
+ "css/css-ruby/ruby-align-001.html": [
+ [
+ "css/css-ruby/ruby-align-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-align-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-align-001a.html": [
+ [
+ "css/css-ruby/ruby-align-001a.html",
+ [
+ [
+ "/css/css-ruby/ruby-align-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-align-002.html": [
+ [
+ "css/css-ruby/ruby-align-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-align-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-align-002a.html": [
+ [
+ "css/css-ruby/ruby-align-002a.html",
+ [
+ [
+ "/css/css-ruby/ruby-align-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-ruby/ruby-base-different-size.html": [
[
"css/css-ruby/ruby-base-different-size.html",
@@ -143281,6 +143749,306 @@
{}
]
],
+ "css/css-ruby/ruby-bidi-001.html": [
+ [
+ "css/css-ruby/ruby-bidi-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-bidi-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-bidi-002.html": [
+ [
+ "css/css-ruby/ruby-bidi-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-bidi-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-bidi-003.html": [
+ [
+ "css/css-ruby/ruby-bidi-003.html",
+ [
+ [
+ "/css/css-ruby/ruby-bidi-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-box-generation-001.html": [
+ [
+ "css/css-ruby/ruby-box-generation-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-box-generation-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-box-generation-002.html": [
+ [
+ "css/css-ruby/ruby-box-generation-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-box-generation-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-box-generation-003.html": [
+ [
+ "css/css-ruby/ruby-box-generation-003.html",
+ [
+ [
+ "/css/css-ruby/ruby-box-generation-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-box-generation-004.html": [
+ [
+ "css/css-ruby/ruby-box-generation-004.html",
+ [
+ [
+ "/css/css-ruby/ruby-box-generation-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-box-generation-005.html": [
+ [
+ "css/css-ruby/ruby-box-generation-005.html",
+ [
+ [
+ "/css/css-ruby/ruby-box-generation-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-001.html": [
+ [
+ "css/css-ruby/ruby-dynamic-insertion-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-insertion-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-002.html": [
+ [
+ "css/css-ruby/ruby-dynamic-insertion-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-insertion-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-003.html": [
+ [
+ "css/css-ruby/ruby-dynamic-insertion-003.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-insertion-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-004.html": [
+ [
+ "css/css-ruby/ruby-dynamic-insertion-004.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-insertion-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-005.html": [
+ [
+ "css/css-ruby/ruby-dynamic-insertion-005.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-insertion-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-removal-001.html": [
+ [
+ "css/css-ruby/ruby-dynamic-removal-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-removal-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-removal-002.html": [
+ [
+ "css/css-ruby/ruby-dynamic-removal-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-removal-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-dynamic-removal-003.html": [
+ [
+ "css/css-ruby/ruby-dynamic-removal-003.html",
+ [
+ [
+ "/css/css-ruby/ruby-dynamic-removal-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-float-handling-001.html": [
+ [
+ "css/css-ruby/ruby-float-handling-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-float-handling-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-001.html": [
+ [
+ "css/css-ruby/ruby-intra-level-whitespace-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-intra-level-whitespace-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-002.html": [
+ [
+ "css/css-ruby/ruby-intra-level-whitespace-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-intra-level-whitespace-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-003.html": [
+ [
+ "css/css-ruby/ruby-intra-level-whitespace-003.html",
+ [
+ [
+ "/css/css-ruby/ruby-intra-level-whitespace-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-001.html": [
+ [
+ "css/css-ruby/ruby-intrinsic-isize-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-intrinsic-isize-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-002.html": [
+ [
+ "css/css-ruby/ruby-intrinsic-isize-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-intrinsic-isize-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-justification-001.html": [
+ [
+ "css/css-ruby/ruby-justification-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-justification-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-justification-002.html": [
+ [
+ "css/css-ruby/ruby-justification-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-justification-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-lang-specific-style-001.html": [
+ [
+ "css/css-ruby/ruby-lang-specific-style-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-lang-specific-style-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-ruby/ruby-layout-internal-boxes.html": [
[
"css/css-ruby/ruby-layout-internal-boxes.html",
@@ -143293,6 +144061,174 @@
{}
]
],
+ "css/css-ruby/ruby-line-break-suppression-001.html": [
+ [
+ "css/css-ruby/ruby-line-break-suppression-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-break-suppression-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-line-break-suppression-002.html": [
+ [
+ "css/css-ruby/ruby-line-break-suppression-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-break-suppression-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-line-break-suppression-003.html": [
+ [
+ "css/css-ruby/ruby-line-break-suppression-003.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-break-suppression-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-line-break-suppression-004.html": [
+ [
+ "css/css-ruby/ruby-line-break-suppression-004.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-break-suppression-004-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-line-break-suppression-005.html": [
+ [
+ "css/css-ruby/ruby-line-break-suppression-005.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-break-suppression-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-line-breaking-001.html": [
+ [
+ "css/css-ruby/ruby-line-breaking-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-breaking-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-line-breaking-002.html": [
+ [
+ "css/css-ruby/ruby-line-breaking-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-breaking-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-line-breaking-003.html": [
+ [
+ "css/css-ruby/ruby-line-breaking-003.html",
+ [
+ [
+ "/css/css-ruby/ruby-line-breaking-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-no-transform.html": [
+ [
+ "css/css-ruby/ruby-no-transform.html",
+ [
+ [
+ "/css/css-ruby/ruby-no-transform-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-reflow-001-opaqueruby.html": [
+ [
+ "css/css-ruby/ruby-reflow-001-opaqueruby.html",
+ [
+ [
+ "/css/css-ruby/ruby-reflow-001-noruby.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-reflow-001-transparentruby.html": [
+ [
+ "css/css-ruby/ruby-reflow-001-transparentruby.html",
+ [
+ [
+ "/css/css-ruby/ruby-reflow-001-noruby.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-span-001.html": [
+ [
+ "css/css-ruby/ruby-span-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-span-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-whitespace-001.html": [
+ [
+ "css/css-ruby/ruby-whitespace-001.html",
+ [
+ [
+ "/css/css-ruby/ruby-whitespace-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ruby/ruby-whitespace-002.html": [
+ [
+ "css/css-ruby/ruby-whitespace-002.html",
+ [
+ [
+ "/css/css-ruby/ruby-whitespace-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-scoping/css-scoping-shadow-assigned-node-with-before-after.html": [
[
"css/css-scoping/css-scoping-shadow-assigned-node-with-before-after.html",
@@ -202763,6 +203699,18 @@
{}
]
],
+ "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html": [
+ [
+ "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html",
+ [
+ [
+ "/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"encoding/eof-shift_jis.html": [
[
"encoding/eof-shift_jis.html",
@@ -205907,6 +206855,18 @@
{}
]
],
+ "html/semantics/document-metadata/the-link-element/link-type-attribute.html": [
+ [
+ "html/semantics/document-metadata/the-link-element/link-type-attribute.html",
+ [
+ [
+ "/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"html/semantics/document-metadata/the-link-element/stylesheet-change-href.html": [
[
"html/semantics/document-metadata/the-link-element/stylesheet-change-href.html",
@@ -254432,6 +255392,81 @@
"css/css-images/gradients-with-transparent-ref.html": [
[]
],
+ "css/css-images/image-orientation/reference/image-orientation-default-ref.html": [
+ []
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html": [
+ []
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html": [
+ []
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-from-image-ref.html": [
+ []
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html": [
+ []
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html": [
+ []
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-none-ref.html": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-1-ul.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-2-ur.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-3-lr.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-4-lol.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-5-lu.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-6-ru.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-7-rl.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-8-llo.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg": [
+ []
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-9-u.jpg": [
+ []
+ ],
"css/css-images/infinite-radial-gradient-crash-ref.html": [
[]
],
@@ -256124,6 +257159,12 @@
"css/css-position/position-sticky-inline-ref.html": [
[]
],
+ "css/css-position/position-sticky-large-top-2-ref.html": [
+ []
+ ],
+ "css/css-position/position-sticky-large-top-ref.html": [
+ []
+ ],
"css/css-position/position-sticky-nested-inline-ref.html": [
[]
],
@@ -256325,6 +257366,12 @@
"css/css-pseudo/marker-content-016-ref.html": [
[]
],
+ "css/css-pseudo/marker-content-017-ref.html": [
+ []
+ ],
+ "css/css-pseudo/marker-content-018-ref.html": [
+ []
+ ],
"css/css-pseudo/marker-font-properties-ref.html": [
[]
],
@@ -256349,6 +257396,9 @@
"css/css-pseudo/spelling-error-001-ref.html": [
[]
],
+ "css/css-pseudo/textpath-selection-011-ref.html": [
+ []
+ ],
"css/css-regions/META.yml": [
[]
],
@@ -257045,12 +258095,138 @@
"css/css-ruby/root-ruby-ref.xhtml": [
[]
],
+ "css/css-ruby/ruby-align-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-align-002-ref.html": [
+ []
+ ],
"css/css-ruby/ruby-base-different-size-ref.html": [
[]
],
+ "css/css-ruby/ruby-bidi-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-bidi-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-bidi-003-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-box-generation-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-box-generation-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-box-generation-003-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-box-generation-004-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-box-generation-005-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-003-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-004-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-005-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-removal-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-removal-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-dynamic-removal-003-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-float-handling-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-003-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-justification-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-justification-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-lang-specific-style-001-ref.html": [
+ []
+ ],
"css/css-ruby/ruby-layout-internal-boxes-ref.html": [
[]
],
+ "css/css-ruby/ruby-line-break-suppression-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-line-break-suppression-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-line-break-suppression-003-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-line-break-suppression-004-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-line-break-suppression-005-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-line-breaking-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-line-breaking-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-line-breaking-003-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-no-transform-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-span-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-whitespace-001-ref.html": [
+ []
+ ],
+ "css/css-ruby/ruby-whitespace-002-ref.html": [
+ []
+ ],
+ "css/css-ruby/support/ruby-common.css": [
+ []
+ ],
+ "css/css-ruby/support/ruby-dynamic-insertion.js": [
+ []
+ ],
+ "css/css-ruby/support/ruby-dynamic-removal.js": [
+ []
+ ],
"css/css-scoping/META.yml": [
[]
],
@@ -268325,6 +269501,9 @@
"dom/nodes/query-target-in-load-event.part.html": [
[]
],
+ "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html": [
+ []
+ ],
"dom/nodes/selectors.js": [
[]
],
@@ -268382,6 +269561,9 @@
"domxpath/README.md": [
[]
],
+ "domxpath/helpers.js": [
+ []
+ ],
"domxpath/xml_xpath_tests.xml": [
[]
],
@@ -270284,6 +271466,18 @@
"fetch/data-urls/resources/data-urls.json": [
[]
],
+ "fetch/h1-parsing/resources/README.md": [
+ []
+ ],
+ "fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis": [
+ []
+ ],
+ "fetch/h1-parsing/resources/document-with-0x00-in-header.py": [
+ []
+ ],
+ "fetch/h1-parsing/resources/script-with-0x00-in-header.py": [
+ []
+ ],
"fetch/http-cache/README.md": [
[]
],
@@ -271736,6 +272930,9 @@
"html/browsers/origin/cross-origin-objects/frame.html": [
[]
],
+ "html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html": [
+ []
+ ],
"html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html": [
[]
],
@@ -275612,6 +276809,9 @@
"html/semantics/document-metadata/the-link-element/link-rel-attribute-ascii-case-insensitive-notref.html": [
[]
],
+ "html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html": [
+ []
+ ],
"html/semantics/document-metadata/the-link-element/resources/bad.css": [
[]
],
@@ -280334,6 +281534,15 @@
"native-file-system/script-tests/FileSystemFileHandle-getFile.js": [
[]
],
+ "native-file-system/script-tests/FileSystemWritableFileStream-piped.js": [
+ []
+ ],
+ "native-file-system/script-tests/FileSystemWritableFileStream-write.js": [
+ []
+ ],
+ "native-file-system/script-tests/FileSystemWritableFileStream.js": [
+ []
+ ],
"native-file-system/script-tests/FileSystemWriter.js": [
[]
],
@@ -280859,6 +282068,9 @@
"portals/resources/postmessage-referrer.sub.html": [
[]
],
+ "portals/resources/predecessor-fires-unload-watch-unload.html": [
+ []
+ ],
"portals/resources/simple-portal-adopts-and-activates-predecessor.html": [
[]
],
@@ -294245,6 +295457,9 @@
"webxr/resources/webxr_test_constants.js": [
[]
],
+ "webxr/resources/webxr_test_constants_fake_world.js": [
+ []
+ ],
"webxr/resources/webxr_util.js": [
[]
],
@@ -319603,12 +320818,24 @@
{}
]
],
+ "css/css-align/animation/column-gap-composition.html": [
+ [
+ "css/css-align/animation/column-gap-composition.html",
+ {}
+ ]
+ ],
"css/css-align/animation/column-gap-interpolation.html": [
[
"css/css-align/animation/column-gap-interpolation.html",
{}
]
],
+ "css/css-align/animation/row-gap-composition.html": [
+ [
+ "css/css-align/animation/row-gap-composition.html",
+ {}
+ ]
+ ],
"css/css-align/animation/row-gap-interpolation.html": [
[
"css/css-align/animation/row-gap-interpolation.html",
@@ -320689,18 +321916,48 @@
{}
]
],
+ "css/css-backgrounds/animations/border-bottom-left-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-bottom-left-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-bottom-right-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-bottom-right-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-bottom-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-bottom-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-color-interpolation.html": [
[
"css/css-backgrounds/animations/border-color-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-image-outset-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-image-outset-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-image-outset-interpolation.html": [
[
"css/css-backgrounds/animations/border-image-outset-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-image-slice-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-image-slice-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-image-slice-interpolation-stability.html": [
[
"css/css-backgrounds/animations/border-image-slice-interpolation-stability.html",
@@ -320719,18 +321976,54 @@
{}
]
],
+ "css/css-backgrounds/animations/border-image-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-image-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-image-width-interpolation.html": [
[
"css/css-backgrounds/animations/border-image-width-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-left-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-left-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-radius-interpolation.html": [
[
"css/css-backgrounds/animations/border-radius-interpolation.html",
{}
]
],
+ "css/css-backgrounds/animations/border-right-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-right-width-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-top-left-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-top-left-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-top-right-radius-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-top-right-radius-composition.html",
+ {}
+ ]
+ ],
+ "css/css-backgrounds/animations/border-top-width-composition.html": [
+ [
+ "css/css-backgrounds/animations/border-top-width-composition.html",
+ {}
+ ]
+ ],
"css/css-backgrounds/animations/border-width-interpolation.html": [
[
"css/css-backgrounds/animations/border-width-interpolation.html",
@@ -321241,18 +322534,66 @@
{}
]
],
+ "css/css-box/animation/margin-bottom-composition.html": [
+ [
+ "css/css-box/animation/margin-bottom-composition.html",
+ {}
+ ]
+ ],
"css/css-box/animation/margin-interpolation.html": [
[
"css/css-box/animation/margin-interpolation.html",
{}
]
],
+ "css/css-box/animation/margin-left-composition.html": [
+ [
+ "css/css-box/animation/margin-left-composition.html",
+ {}
+ ]
+ ],
+ "css/css-box/animation/margin-right-composition.html": [
+ [
+ "css/css-box/animation/margin-right-composition.html",
+ {}
+ ]
+ ],
+ "css/css-box/animation/margin-top-composition.html": [
+ [
+ "css/css-box/animation/margin-top-composition.html",
+ {}
+ ]
+ ],
+ "css/css-box/animation/padding-bottom-composition.html": [
+ [
+ "css/css-box/animation/padding-bottom-composition.html",
+ {}
+ ]
+ ],
"css/css-box/animation/padding-interpolation.html": [
[
"css/css-box/animation/padding-interpolation.html",
{}
]
],
+ "css/css-box/animation/padding-left-composition.html": [
+ [
+ "css/css-box/animation/padding-left-composition.html",
+ {}
+ ]
+ ],
+ "css/css-box/animation/padding-right-composition.html": [
+ [
+ "css/css-box/animation/padding-right-composition.html",
+ {}
+ ]
+ ],
+ "css/css-box/animation/padding-top-composition.html": [
+ [
+ "css/css-box/animation/padding-top-composition.html",
+ {}
+ ]
+ ],
"css/css-box/box-chrome-crash-001.html": [
[
"css/css-box/box-chrome-crash-001.html",
@@ -325687,6 +327028,18 @@
{}
]
],
+ "css/css-images/image-orientation/image-orientation-from-image-computed-style.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-from-image-computed-style.html",
+ {}
+ ]
+ ],
+ "css/css-images/image-orientation/image-orientation-none-computed-style.html": [
+ [
+ "css/css-images/image-orientation/image-orientation-none-computed-style.html",
+ {}
+ ]
+ ],
"css/css-images/inheritance.html": [
[
"css/css-images/inheritance.html",
@@ -328761,18 +330114,36 @@
{}
]
],
+ "css/css-shadow-parts/style-sharing.html": [
+ [
+ "css/css-shadow-parts/style-sharing.html",
+ {}
+ ]
+ ],
"css/css-shapes/animation/shape-image-threshold-interpolation.html": [
[
"css/css-shapes/animation/shape-image-threshold-interpolation.html",
{}
]
],
+ "css/css-shapes/animation/shape-margin-composition.html": [
+ [
+ "css/css-shapes/animation/shape-margin-composition.html",
+ {}
+ ]
+ ],
"css/css-shapes/animation/shape-margin-interpolation.html": [
[
"css/css-shapes/animation/shape-margin-interpolation.html",
{}
]
],
+ "css/css-shapes/animation/shape-outside-composition.html": [
+ [
+ "css/css-shapes/animation/shape-outside-composition.html",
+ {}
+ ]
+ ],
"css/css-shapes/animation/shape-outside-interpolation.html": [
[
"css/css-shapes/animation/shape-outside-interpolation.html",
@@ -329433,36 +330804,72 @@
{}
]
],
+ "css/css-sizing/animation/height-composition.html": [
+ [
+ "css/css-sizing/animation/height-composition.html",
+ {}
+ ]
+ ],
"css/css-sizing/animation/height-interpolation.html": [
[
"css/css-sizing/animation/height-interpolation.html",
{}
]
],
+ "css/css-sizing/animation/max-height-composition.html": [
+ [
+ "css/css-sizing/animation/max-height-composition.html",
+ {}
+ ]
+ ],
"css/css-sizing/animation/max-height-interpolation.html": [
[
"css/css-sizing/animation/max-height-interpolation.html",
{}
]
],
+ "css/css-sizing/animation/max-width-composition.html": [
+ [
+ "css/css-sizing/animation/max-width-composition.html",
+ {}
+ ]
+ ],
"css/css-sizing/animation/max-width-interpolation.html": [
[
"css/css-sizing/animation/max-width-interpolation.html",
{}
]
],
+ "css/css-sizing/animation/min-height-composition.html": [
+ [
+ "css/css-sizing/animation/min-height-composition.html",
+ {}
+ ]
+ ],
"css/css-sizing/animation/min-height-interpolation.html": [
[
"css/css-sizing/animation/min-height-interpolation.html",
{}
]
],
+ "css/css-sizing/animation/min-width-composition.html": [
+ [
+ "css/css-sizing/animation/min-width-composition.html",
+ {}
+ ]
+ ],
"css/css-sizing/animation/min-width-interpolation.html": [
[
"css/css-sizing/animation/min-width-interpolation.html",
{}
]
],
+ "css/css-sizing/animation/width-composition.html": [
+ [
+ "css/css-sizing/animation/width-composition.html",
+ {}
+ ]
+ ],
"css/css-sizing/animation/width-interpolation.html": [
[
"css/css-sizing/animation/width-interpolation.html",
@@ -330621,18 +332028,36 @@
{}
]
],
+ "css/css-text/animations/letter-spacing-composition.html": [
+ [
+ "css/css-text/animations/letter-spacing-composition.html",
+ {}
+ ]
+ ],
"css/css-text/animations/letter-spacing-interpolation.html": [
[
"css/css-text/animations/letter-spacing-interpolation.html",
{}
]
],
+ "css/css-text/animations/text-indent-composition.html": [
+ [
+ "css/css-text/animations/text-indent-composition.html",
+ {}
+ ]
+ ],
"css/css-text/animations/text-indent-interpolation.html": [
[
"css/css-text/animations/text-indent-interpolation.html",
{}
]
],
+ "css/css-text/animations/word-spacing-composition.html": [
+ [
+ "css/css-text/animations/word-spacing-composition.html",
+ {}
+ ]
+ ],
"css/css-text/animations/word-spacing-interpolation.html": [
[
"css/css-text/animations/word-spacing-interpolation.html",
@@ -335105,6 +336530,12 @@
{}
]
],
+ "css/css-ui/animation/caret-color-composition.html": [
+ [
+ "css/css-ui/animation/caret-color-composition.html",
+ {}
+ ]
+ ],
"css/css-ui/animation/caret-color-interpolation.html": [
[
"css/css-ui/animation/caret-color-interpolation.html",
@@ -335117,12 +336548,24 @@
{}
]
],
+ "css/css-ui/animation/outline-offset-composition.html": [
+ [
+ "css/css-ui/animation/outline-offset-composition.html",
+ {}
+ ]
+ ],
"css/css-ui/animation/outline-offset-interpolation.html": [
[
"css/css-ui/animation/outline-offset-interpolation.html",
{}
]
],
+ "css/css-ui/animation/outline-width-composition.html": [
+ [
+ "css/css-ui/animation/outline-width-composition.html",
+ {}
+ ]
+ ],
"css/css-ui/animation/outline-width-interpolation.html": [
[
"css/css-ui/animation/outline-width-interpolation.html",
@@ -336737,6 +338180,12 @@
{}
]
],
+ "css/cssom-view/getClientRects-inline-inline-child.html": [
+ [
+ "css/cssom-view/getClientRects-inline-inline-child.html",
+ {}
+ ]
+ ],
"css/cssom-view/historical.html": [
[
"css/cssom-view/historical.html",
@@ -338217,12 +339666,24 @@
{}
]
],
+ "css/motion/animation/offset-anchor-composition.html": [
+ [
+ "css/motion/animation/offset-anchor-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-anchor-interpolation.html": [
[
"css/motion/animation/offset-anchor-interpolation.html",
{}
]
],
+ "css/motion/animation/offset-distance-composition.html": [
+ [
+ "css/motion/animation/offset-distance-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-distance-interpolation.html": [
[
"css/motion/animation/offset-distance-interpolation.html",
@@ -338235,6 +339696,12 @@
{}
]
],
+ "css/motion/animation/offset-path-composition.html": [
+ [
+ "css/motion/animation/offset-path-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-path-interpolation-001.html": [
[
"css/motion/animation/offset-path-interpolation-001.html",
@@ -338265,12 +339732,24 @@
{}
]
],
+ "css/motion/animation/offset-position-composition.html": [
+ [
+ "css/motion/animation/offset-position-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-position-interpolation.html": [
[
"css/motion/animation/offset-position-interpolation.html",
{}
]
],
+ "css/motion/animation/offset-rotate-composition.html": [
+ [
+ "css/motion/animation/offset-rotate-composition.html",
+ {}
+ ]
+ ],
"css/motion/animation/offset-rotate-interpolation.html": [
[
"css/motion/animation/offset-rotate-interpolation.html",
@@ -341879,6 +343358,12 @@
{}
]
],
+ "domxpath/booleans.html": [
+ [
+ "domxpath/booleans.html",
+ {}
+ ]
+ ],
"domxpath/document.tentative.html": [
[
"domxpath/document.tentative.html",
@@ -341891,6 +343376,18 @@
{}
]
],
+ "domxpath/fn-concat.html": [
+ [
+ "domxpath/fn-concat.html",
+ {}
+ ]
+ ],
+ "domxpath/fn-contains.html": [
+ [
+ "domxpath/fn-contains.html",
+ {}
+ ]
+ ],
"domxpath/fn-lang.html": [
[
"domxpath/fn-lang.html",
@@ -341903,12 +343400,54 @@
{}
]
],
+ "domxpath/fn-starts-with.html": [
+ [
+ "domxpath/fn-starts-with.html",
+ {}
+ ]
+ ],
+ "domxpath/fn-substring-after.html": [
+ [
+ "domxpath/fn-substring-after.html",
+ {}
+ ]
+ ],
+ "domxpath/fn-substring-before.html": [
+ [
+ "domxpath/fn-substring-before.html",
+ {}
+ ]
+ ],
+ "domxpath/fn-substring.html": [
+ [
+ "domxpath/fn-substring.html",
+ {}
+ ]
+ ],
+ "domxpath/fn-translate.html": [
+ [
+ "domxpath/fn-translate.html",
+ {}
+ ]
+ ],
+ "domxpath/lexical-structure.html": [
+ [
+ "domxpath/lexical-structure.html",
+ {}
+ ]
+ ],
"domxpath/node-sets.html": [
[
"domxpath/node-sets.html",
{}
]
],
+ "domxpath/numbers.html": [
+ [
+ "domxpath/numbers.html",
+ {}
+ ]
+ ],
"domxpath/predicates.html": [
[
"domxpath/predicates.html",
@@ -356606,6 +358145,12 @@
{}
]
],
+ "fetch/h1-parsing/resources-with-0x00-in-header.window.js": [
+ [
+ "fetch/h1-parsing/resources-with-0x00-in-header.window.html",
+ {}
+ ]
+ ],
"fetch/http-cache/304-update.html": [
[
"fetch/http-cache/304-update.html",
@@ -359017,6 +360562,12 @@
{}
]
],
+ "html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html": [
+ [
+ "html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html",
+ {}
+ ]
+ ],
"html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html": [
[
"html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html",
@@ -361743,6 +363294,12 @@
{}
]
],
+ "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html": [
+ [
+ "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html",
+ {}
+ ]
+ ],
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html": [
[
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html",
@@ -374455,14 +376012,6 @@
{}
]
],
- "layout-instability/observe-layout-shift.html": [
- [
- "layout-instability/observe-layout-shift.html",
- {
- "testdriver": true
- }
- ]
- ],
"layout-instability/partially-clipped-visual-rect.html": [
[
"layout-instability/partially-clipped-visual-rect.html",
@@ -374485,6 +376034,14 @@
}
]
],
+ "layout-instability/recent-input.html": [
+ [
+ "layout-instability/recent-input.html",
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"layout-instability/rtl-distance.html": [
[
"layout-instability/rtl-distance.html",
@@ -374593,6 +376150,18 @@
{}
]
],
+ "loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html": [
+ [
+ "loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html",
+ {}
+ ]
+ ],
+ "loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html": [
+ [
+ "loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html",
+ {}
+ ]
+ ],
"loading/lazyload/image-loading-lazy-load-event.tentative.html": [
[
"loading/lazyload/image-loading-lazy-load-event.tentative.html",
@@ -374617,6 +376186,12 @@
{}
]
],
+ "loading/lazyload/move-element-and-scroll.tentative.html": [
+ [
+ "loading/lazyload/move-element-and-scroll.tentative.html",
+ {}
+ ]
+ ],
"loading/lazyload/not-rendered-below-viewport-image-loading-lazy.tentative.html": [
[
"loading/lazyload/not-rendered-below-viewport-image-loading-lazy.tentative.html",
@@ -374665,6 +376240,12 @@
{}
]
],
+ "loading/lazyload/remove-element-and-scroll.tentative.html": [
+ [
+ "loading/lazyload/remove-element-and-scroll.tentative.html",
+ {}
+ ]
+ ],
"loading/preloader-css-import-no-quote.tentative.html": [
[
"loading/preloader-css-import-no-quote.tentative.html",
@@ -379490,6 +381071,81 @@
}
]
],
+ "native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js": [
+ [
+ "native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/native-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream-piped.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js": [
+ [
+ "native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/native-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream-write.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js": [
+ [
+ "native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/testdriver.js"
+ ],
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/native-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream.js"
+ ]
+ ]
+ }
+ ]
+ ],
"native-file-system/native_FileSystemWriter.tentative.https.manual.window.js": [
[
"native-file-system/native_FileSystemWriter.tentative.https.manual.window.html",
@@ -379869,6 +381525,134 @@
}
]
],
+ "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js": [
+ [
+ "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/sandboxed-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "../streams/resources/recording-streams.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream-piped.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/sandboxed-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "../streams/resources/recording-streams.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream-piped.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js": [
+ [
+ "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/sandboxed-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream-write.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/sandboxed-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream-write.js"
+ ]
+ ]
+ }
+ ]
+ ],
+ "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js": [
+ [
+ "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/sandboxed-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "resources/test-helpers.js"
+ ],
+ [
+ "script",
+ "resources/sandboxed-fs-test-helpers.js"
+ ],
+ [
+ "script",
+ "script-tests/FileSystemWritableFileStream.js"
+ ]
+ ]
+ }
+ ]
+ ],
"native-file-system/sandboxed_FileSystemWriter.tentative.https.any.js": [
[
"native-file-system/sandboxed_FileSystemWriter.tentative.https.any.html",
@@ -392319,6 +394103,12 @@
{}
]
],
+ "portals/predecessor-fires-unload.html": [
+ [
+ "portals/predecessor-fires-unload.html",
+ {}
+ ]
+ ],
"preload/avoid-delaying-onload-link-preload.html": [
[
"preload/avoid-delaying-onload-link-preload.html",
@@ -431260,6 +433050,14 @@
}
]
],
+ "webrtc/RTCDataChannel-close.html": [
+ [
+ "webrtc/RTCDataChannel-close.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"webrtc/RTCDataChannel-id.html": [
[
"webrtc/RTCDataChannel-id.html",
@@ -431366,6 +433164,12 @@
{}
]
],
+ "webrtc/RTCPeerConnection-close.html": [
+ [
+ "webrtc/RTCPeerConnection-close.html",
+ {}
+ ]
+ ],
"webrtc/RTCPeerConnection-connectionState.https.html": [
[
"webrtc/RTCPeerConnection-connectionState.https.html",
@@ -460110,6 +461914,12 @@
{}
]
],
+ "css/css-pseudo/textpath-selection-011.html": [
+ [
+ "css/css-pseudo/textpath-selection-011.html",
+ {}
+ ]
+ ],
"css/css-regions/elements/video-001.html": [
[
"css/css-regions/elements/video-001.html",
@@ -460218,6 +462028,12 @@
{}
]
],
+ "css/css-ruby/ruby-reflow-001-noruby.html": [
+ [
+ "css/css-ruby/ruby-reflow-001-noruby.html",
+ {}
+ ]
+ ],
"css/css-sizing/intrinsic-percent-non-replaced-002.html": [
[
"css/css-sizing/intrinsic-percent-non-replaced-002.html",
@@ -474350,7 +476166,7 @@
"support"
],
"common/security-features/README.md": [
- "98afe1af1be8d6329f9ae687320d4bd4797ca2c8",
+ "c19874653a7cac4d314fd9dd0bf921082c6f8d70",
"support"
],
"common/security-features/resources/common.sub.js": [
@@ -557949,10 +559765,18 @@
"bd26585d9e639e3133a650c26d3f3cb93579e4ae",
"support"
],
+ "css/css-align/animation/column-gap-composition.html": [
+ "0054206cca8b3448ad5d19e055e9f435a6e123b1",
+ "testharness"
+ ],
"css/css-align/animation/column-gap-interpolation.html": [
"c2f02d3ba87f4dee555be80caa45d6909e2495ae",
"testharness"
],
+ "css/css-align/animation/row-gap-composition.html": [
+ "238253adf0cda81aca80d9345219ac8cd8e0df50",
+ "testharness"
+ ],
"css/css-align/animation/row-gap-interpolation.html": [
"1d85ffa3b07e8695e7b3a6ad82c02ae4da8d7b21",
"testharness"
@@ -559073,14 +560897,34 @@
"f6a480c7bd2ccc4a6c46fa2eade5e7231fab4938",
"testharness"
],
+ "css/css-backgrounds/animations/border-bottom-left-radius-composition.html": [
+ "87042d1969d59b6865761c60beaeba5219c6148c",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-bottom-right-radius-composition.html": [
+ "2b5a72df6914f571ca00418484d9f782cd46aa63",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-bottom-width-composition.html": [
+ "5377c0ab42b44623c1d7e0aa81344345db795f68",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-color-interpolation.html": [
"3e7843b8a07577970279ef9a4e14bfb83c1816f0",
"testharness"
],
+ "css/css-backgrounds/animations/border-image-outset-composition.html": [
+ "e3311711753e34295eb3c7c83d5aee3d4cd684aa",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-image-outset-interpolation.html": [
"aebadbbafb236a090aa543ecf82e5661bee7de74",
"testharness"
],
+ "css/css-backgrounds/animations/border-image-slice-composition.html": [
+ "d0ccb1a3a64f2b3fe75b4957dc0a75036c3cd392",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-image-slice-interpolation-stability.html": [
"26431334e4acf13f6c095868a0e9cee6926a9ef1",
"testharness"
@@ -559093,14 +560937,38 @@
"60dcfceddc791737487fab07ea7035fac40856d6",
"testharness"
],
+ "css/css-backgrounds/animations/border-image-width-composition.html": [
+ "0d0a1dc4ed263c80b472e3ba241fffeaf771d6aa",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-image-width-interpolation.html": [
"ea138201b15805cd86d8a63ed37b401b103bfee2",
"testharness"
],
+ "css/css-backgrounds/animations/border-left-width-composition.html": [
+ "1b90effbc32cd56e9120fec92158f518a67d6ae8",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-radius-interpolation.html": [
"195469e83164c965ee33b6277983870100bda111",
"testharness"
],
+ "css/css-backgrounds/animations/border-right-width-composition.html": [
+ "aa9e1dcc66764c2ec8c072cbf9365529e3729d88",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-top-left-radius-composition.html": [
+ "1c2056bc010a82228416983897c63676ac3aeb0f",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-top-right-radius-composition.html": [
+ "9a26d51375e78bfe54ba7a3689f6b72fe6c36417",
+ "testharness"
+ ],
+ "css/css-backgrounds/animations/border-top-width-composition.html": [
+ "475c3930b9d1704267267ff30d747b266ea3d851",
+ "testharness"
+ ],
"css/css-backgrounds/animations/border-width-interpolation.html": [
"11f92f41652a9f1b167c5a399849d1e1e61c4df7",
"testharness"
@@ -562821,14 +564689,46 @@
"dde409360faf79a301c3ae3ea34a995d154d7bb4",
"support"
],
+ "css/css-box/animation/margin-bottom-composition.html": [
+ "c95f8de23efe6e853dd4b05eed07af01c1d02af7",
+ "testharness"
+ ],
"css/css-box/animation/margin-interpolation.html": [
"088836cbbd18d0daf203de7dbacfb65733e35813",
"testharness"
],
+ "css/css-box/animation/margin-left-composition.html": [
+ "8f3c646dfec219d30d2fefafdcb89c9e7cabb2b5",
+ "testharness"
+ ],
+ "css/css-box/animation/margin-right-composition.html": [
+ "c903303313bcc06ecf67f86efc55b21537e4af4c",
+ "testharness"
+ ],
+ "css/css-box/animation/margin-top-composition.html": [
+ "5f050bd6c7d9663025d53a04ecd2ec6352275fba",
+ "testharness"
+ ],
+ "css/css-box/animation/padding-bottom-composition.html": [
+ "855b5d3dc2948a9dc4ae391aaaa5caee06f88665",
+ "testharness"
+ ],
"css/css-box/animation/padding-interpolation.html": [
"3bf284117960fe78300e95140244d309f8f439a4",
"testharness"
],
+ "css/css-box/animation/padding-left-composition.html": [
+ "417777ae253428cf6c852e6846960494a8ea53f7",
+ "testharness"
+ ],
+ "css/css-box/animation/padding-right-composition.html": [
+ "3c80849bb2bc68a68c098f42a1a29b9247e6a224",
+ "testharness"
+ ],
+ "css/css-box/animation/padding-top-composition.html": [
+ "b5083ae79b3db8a55f7af45373804d223cbbbc47",
+ "testharness"
+ ],
"css/css-box/box-chrome-crash-001.html": [
"351df37f1550ab40818b7f7f1c51191cfae5583e",
"testharness"
@@ -583133,6 +585033,162 @@
"6947515f7e4634fc3f240ffda91c6f5bdac862ce",
"visual"
],
+ "css/css-images/image-orientation/image-orientation-default.html": [
+ "36fb1a665ffa858f716195f0cafd04d4d7388c85",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html": [
+ "26db7da18453817947a5e974f993222ec4c92b17",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html": [
+ "f6474afaa0ab942a3574433ac93492f7ee20bac6",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-composited.html": [
+ "596e497ed3e2b86dfea3e191951b4c3483b0abc4",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-computed-style.html": [
+ "32933244c384063016d4880bc7da2a590275b54b",
+ "testharness"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-content-images.html": [
+ "36a2a343168ddbec199fe41bc887e2c7719248af",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-dynamic1.html": [
+ "15e05884cf5594702c172b81587ea578714aa4e0",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-dynamic2.html": [
+ "c0df221337e036cd6ebf5dc306b2bc6a00e204ff",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image-image-document.html": [
+ "793fc017e6f91746c23078f9f766d04dd1aae22d",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-from-image.html": [
+ "f1343e9f23fa0c5eeae8134cff269cfc6e7308d7",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-none-computed-style.html": [
+ "49919288b552b760ed5230adcad09eb255a6546b",
+ "testharness"
+ ],
+ "css/css-images/image-orientation/image-orientation-none-content-images.html": [
+ "7bcb5ce3394d32678eb9c7e014931cfc62b99b2b",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-none-image-document.html": [
+ "29ec30f1431590ce374ab223aa852553de76be57",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/image-orientation-none.html": [
+ "03c46c620a028492e6b364c9e6cf96d3c615c4ba",
+ "reftest"
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-default-ref.html": [
+ "aa8bede601460a0ed59495af6eb5a11ea0cd807d",
+ "support"
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html": [
+ "21fed5fbb66bfa3bc04d0e708204827b355db591",
+ "support"
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html": [
+ "d2c7e6916bc1bf07eef4bc400f760a89babd08a8",
+ "support"
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-from-image-ref.html": [
+ "d731e837778db1e0ba68745b23a6b453f2ac3230",
+ "support"
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html": [
+ "d73c554f3290b3451c88e1bfd2b4c9928763c1a7",
+ "support"
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html": [
+ "db84d0e23cf7c727cb989db409d661667bd9ab18",
+ "support"
+ ],
+ "css/css-images/image-orientation/reference/image-orientation-none-ref.html": [
+ "8293d6e003d9b55de2b5c1082d875ba54417607c",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg": [
+ "d9acd656f92567e31487d6c03b59d2201c1b9756",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-1-ul.jpg": [
+ "7c13bf7dc4f4b7cefcbeb20df9fff79ee5d5bd90",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg": [
+ "1d06bf3d2f4f3e097428ce9c8561653eb674eadb",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-2-ur.jpg": [
+ "2387b05feef33054621217d56c9031d8c368852d",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg": [
+ "1c5ce1a8f6f4f4337765f16d6cad65b1891187dc",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-3-lr.jpg": [
+ "cb1a82dab1682f6ff24436e8c42de30e3b7bb0f0",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg": [
+ "cf71c6a1444ceeec4a0c8afb44deedba274289a0",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-4-lol.jpg": [
+ "8f93096803013123ee81f413a36c7d8ccdbfcdb6",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg": [
+ "62ddea22e44fa65461ca4a9bd4948d67ee8ac3af",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-5-lu.jpg": [
+ "e65d2eb5cc293014e821fecdde6a0c6cc84cbc45",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg": [
+ "3d21ec96ec54ee22a6626e00c8d535627177c8d7",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-6-ru.jpg": [
+ "6f487dae1358c2c8a399784e835b006502cb0595",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg": [
+ "7d49d4f20cca13b2ac943aa7ef15b305b17f39b7",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-7-rl.jpg": [
+ "769be7df85388ccbc1cd1a23372576c9b3e44a01",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg": [
+ "e88b00c38b6edd14fd833684a37497b74aa5f713",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-8-llo.jpg": [
+ "c4a51ed3ff698006649df4c905e2b4bb6102d6dc",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg": [
+ "b6b517f6b72561ed93b70cd45103a693ae28928c",
+ "support"
+ ],
+ "css/css-images/image-orientation/support/exif-orientation-9-u.jpg": [
+ "1003bfb7c21401063b8460904281299f3ccab7c2",
+ "support"
+ ],
"css/css-images/infinite-radial-gradient-crash-ref.html": [
"a80236dcf75c22ecd8e43935d004f1fddf0550cb",
"support"
@@ -586241,6 +588297,10 @@
"434dc52ea3d731bd1393270372294cd007382e59",
"testharness"
],
+ "css/css-multicol/change-intrinsic-width.html": [
+ "3df3e1ebc8f9b5780dc858a878bca13dbedcdb35",
+ "reftest"
+ ],
"css/css-multicol/column-count-used-001.html": [
"2949a1996ebae0c48329906ea7ef34c83080e90f",
"reftest"
@@ -586305,6 +588365,10 @@
"ce8011b17f82407599ea28a2eaf543ec9d45a98b",
"reftest"
],
+ "css/css-multicol/intrinsic-width-change-column-count.html": [
+ "30e7671e41c3879ceef30627b3d5b65dc8c0ff86",
+ "reftest"
+ ],
"css/css-multicol/large-actual-column-count.html": [
"615e3f2f0598973d66518b7abbabe2fbf2f76bda",
"reftest"
@@ -589997,6 +592061,22 @@
"5b2d705e2d0721c072bedf1dcc489fae25b2014f",
"testharness"
],
+ "css/css-position/position-sticky-large-top-2-ref.html": [
+ "941047901df08a616888746d6c0332d69c9382f9",
+ "support"
+ ],
+ "css/css-position/position-sticky-large-top-2.tentative.html": [
+ "1cf9c0dfb43b6bfd71c1496a5d7b3b9428d0c086",
+ "reftest"
+ ],
+ "css/css-position/position-sticky-large-top-ref.html": [
+ "075551a6e856112bb12909684f718b0875fec690",
+ "support"
+ ],
+ "css/css-position/position-sticky-large-top.tentative.html": [
+ "b00a0d139683717b57633e38bb9ce7f033833b65",
+ "reftest"
+ ],
"css/css-position/position-sticky-left.html": [
"054cf10eabc256cde34fc738d9fcd7429946849c",
"testharness"
@@ -590769,6 +592849,22 @@
"9a0585db72206768e2a7ed77f9245f67103d587b",
"reftest"
],
+ "css/css-pseudo/marker-content-017-ref.html": [
+ "9628123611d0bfb9dd90ac621ba39177982e8075",
+ "support"
+ ],
+ "css/css-pseudo/marker-content-017.html": [
+ "267e519feee6541596f11310e2075419e13cffc2",
+ "reftest"
+ ],
+ "css/css-pseudo/marker-content-018-ref.html": [
+ "8107d4297d7349c0b40cfe368da74190a9924433",
+ "support"
+ ],
+ "css/css-pseudo/marker-content-018.html": [
+ "0a4a73cd5056415084f9579a2323318c58f1a167",
+ "reftest"
+ ],
"css/css-pseudo/marker-default-styles.html": [
"05da6f89a9e2f858eadfdfb63e5194feda5ce3fc",
"testharness"
@@ -590790,7 +592886,7 @@
"reftest"
],
"css/css-pseudo/marker-font-variant-numeric-default-ref.html": [
- "3d10621121931859c15ec7552172c7a02fc1cceb",
+ "be932213b0f1657524df67788130c09f3602cf80",
"reftest"
],
"css/css-pseudo/marker-font-variant-numeric-default.html": [
@@ -590798,7 +592894,7 @@
"reftest"
],
"css/css-pseudo/marker-font-variant-numeric-normal-ref.html": [
- "45ab55d14b86c7f4dc1fc510b1e213cc51bcc0c9",
+ "b730a24e55a46d307afc0fe41d4517d65e44046f",
"reftest"
],
"css/css-pseudo/marker-font-variant-numeric-normal.html": [
@@ -590889,6 +592985,22 @@
"a71d6f0155e42ad0ebe33f6ea11aa5755201beaa",
"reftest"
],
+ "css/css-pseudo/spelling-error-002-manual.html": [
+ "88fa97038ce0a5791c733cbc50926e4447440259",
+ "manual"
+ ],
+ "css/css-pseudo/spelling-error-003-manual.html": [
+ "559a4fe092ebaa72e31e5a07c38abcc0e6ca6122",
+ "manual"
+ ],
+ "css/css-pseudo/textpath-selection-011-ref.html": [
+ "d9ba940518e121eeb0e9701ccd4e36772fdfa786",
+ "support"
+ ],
+ "css/css-pseudo/textpath-selection-011.html": [
+ "2e42c6be8fbcfc756c578986517efc0b1739d1f3",
+ "visual"
+ ],
"css/css-regions/META.yml": [
"37bdc98c84c0f4c9a32d3cc5b2f4e3494eb63999",
"support"
@@ -593153,12 +595265,236 @@
"80f49f0dbcf3e3a76ba6f740243e19a5f627bfd2",
"visual"
],
+ "css/css-ruby/ruby-align-001-ref.html": [
+ "eb368b3ae6141ecfa12d57c4c1ed06f388b82b53",
+ "support"
+ ],
+ "css/css-ruby/ruby-align-001.html": [
+ "13c96f53f2f30ecef1a9017cd7f63159dfd9a6e7",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-align-001a.html": [
+ "6e652f172653867d8a9fce5930463fb7fd1832e5",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-align-002-ref.html": [
+ "4c5413aef719dd1e0b5ffb08cbde0a19119495cb",
+ "support"
+ ],
+ "css/css-ruby/ruby-align-002.html": [
+ "ec40be5e105b5e1e64802b56b465a5f3286a761b",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-align-002a.html": [
+ "dfb7ae37ed90232164728b0d47e2273a9e794b48",
+ "reftest"
+ ],
"css/css-ruby/ruby-base-different-size-ref.html": [
- "695ab1cdb7125ae75532a58027a361bd882348c4",
+ "70f47eaa8beb9f23197e2efb3bced5e8ecd0a754",
"support"
],
"css/css-ruby/ruby-base-different-size.html": [
- "dcfde6c16eab415d24c5c1f0404c982dc21a98d6",
+ "f71b5644c626b9835f5c9015c04badb626b336a1",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-bidi-001-ref.html": [
+ "c714921d32ea97dbda15537f11056ce4603dc732",
+ "support"
+ ],
+ "css/css-ruby/ruby-bidi-001.html": [
+ "ba18071150a71aa8dab724eb71f777c1b4825104",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-bidi-002-ref.html": [
+ "874284de998dd056ef74d26f106e88c0770eb4cc",
+ "support"
+ ],
+ "css/css-ruby/ruby-bidi-002.html": [
+ "d6692a333aefd75d600a136545addb100dcc9676",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-bidi-003-ref.html": [
+ "ec00293d861112fa8feef5aa6e3b5a36e55e4344",
+ "support"
+ ],
+ "css/css-ruby/ruby-bidi-003.html": [
+ "2510408ec22524069588b8280913fa781c4ec2da",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-box-generation-001-ref.html": [
+ "8d836fe23c830d0aa815dc2291033615a62a0c81",
+ "support"
+ ],
+ "css/css-ruby/ruby-box-generation-001.html": [
+ "ac58d4d43ab966eb1ac57f56c826e309877cebac",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-box-generation-002-ref.html": [
+ "730ab787d30253e11dbe7070ba35a9114829f3a5",
+ "support"
+ ],
+ "css/css-ruby/ruby-box-generation-002.html": [
+ "e09ecf1eb252ea773164527e2a82eb0823c050f0",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-box-generation-003-ref.html": [
+ "e4c92a498bb61b48aabb1bbd21a3f4aef1632f5c",
+ "support"
+ ],
+ "css/css-ruby/ruby-box-generation-003.html": [
+ "6b975afdfbf18db4a8487c4421b4924ee7bf377d",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-box-generation-004-ref.html": [
+ "7a27622cac1600d7969856a0df0400b644c95d54",
+ "support"
+ ],
+ "css/css-ruby/ruby-box-generation-004.html": [
+ "0f6ed72d717a375b861fff1ff067b52c0c2aedcc",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-box-generation-005-ref.html": [
+ "55ba7b2c73faa017ec07203df3284c84667ffece",
+ "support"
+ ],
+ "css/css-ruby/ruby-box-generation-005.html": [
+ "c86b697bf9d6b2c145dcb0871234c48779e03887",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-001-ref.html": [
+ "0a09924c653d80bfb69124ead3d65d6f2f8e411f",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-001.html": [
+ "be1c5ce50056ecd0ffb3699bd4e47f63c7c6c7bf",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-002-ref.html": [
+ "cd85db944e36786e5b0fe18862dfca4f7d11bf3d",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-002.html": [
+ "c2a12a041958ce097c44f2d022e1da25b654fae3",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-003-ref.html": [
+ "ef71525479d23fbc221529715b911f001b069899",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-003.html": [
+ "68984b5568ba969f8caae70e6c1abfbc33137b40",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-004-ref.html": [
+ "9c8120ee3fa73ca360b67a9e57f2c6ace8455a95",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-004.html": [
+ "9b3c36e3ac88764d44c78b1ba516231a84c9e2d9",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-005-ref.html": [
+ "03e5cabe55c7cfd55527a8a79190b8903915969f",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-insertion-005.html": [
+ "a684d665c8918f5b5b87b36fd6a7c469b7a1653d",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-removal-001-ref.html": [
+ "23beda289871a98350d8d0584dd4d2526ee79826",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-removal-001.html": [
+ "090ea43c79a11f58908c481651132bc6a21c99f7",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-removal-002-ref.html": [
+ "f9d2fd7240d12c5453f1a2c3553d48b3f5e2d969",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-removal-002.html": [
+ "76846e547bb555956256e3adcf8af8913a6ef397",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-dynamic-removal-003-ref.html": [
+ "0067c014f5d6663f17b6ed0bcbf9cc75452e740c",
+ "support"
+ ],
+ "css/css-ruby/ruby-dynamic-removal-003.html": [
+ "d35b2b968d651ecb7cc4d8a0e461b83f900ddcfc",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-float-handling-001-ref.html": [
+ "245a366172afddb3d8cde9e13b6f03ddb51dbfea",
+ "support"
+ ],
+ "css/css-ruby/ruby-float-handling-001.html": [
+ "5cb56e88aca36dce07fcdf17a690edc13ef8b375",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-001-ref.html": [
+ "1d9fbb344fd335316c63bdf8530c4be081694df0",
+ "support"
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-001.html": [
+ "4fceda1fb09b7923bb1eeb27e202e274e8168017",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-002-ref.html": [
+ "c5949dbeb504787dc27f3cce563796aac42c2d66",
+ "support"
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-002.html": [
+ "67aab53bfb0d0542da875db4abe9e7a6d0d4f6a5",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-003-ref.html": [
+ "d1df82371c9f910e713f040b502439de8601ddb3",
+ "support"
+ ],
+ "css/css-ruby/ruby-intra-level-whitespace-003.html": [
+ "716f2e3f0b4f2dbfeed1607272e308a5c1baf2fb",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-001-ref.html": [
+ "9d2889f8116a36fd141faf871c32c4c9672b9a21",
+ "support"
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-001.html": [
+ "84f48e2fc936155628c290bfa83006ef509aa0b7",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-002-ref.html": [
+ "d71de26a259d7bc8784c207980676ac6eb0d5b8e",
+ "support"
+ ],
+ "css/css-ruby/ruby-intrinsic-isize-002.html": [
+ "741d41bec577bfe1aeb2e3e1e56a7973911f92bf",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-justification-001-ref.html": [
+ "eaec8897133ee0527aec706a7a9e1dccc4dcf914",
+ "support"
+ ],
+ "css/css-ruby/ruby-justification-001.html": [
+ "edef72874b6b564e0618eb9e795f863ee4cbf20b",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-justification-002-ref.html": [
+ "c61dae5c62d903323ac956b6d1d70a36bfd5889a",
+ "support"
+ ],
+ "css/css-ruby/ruby-justification-002.html": [
+ "979987c028baed8a7f6cd6de0c481b87ce9f2848",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-lang-specific-style-001-ref.html": [
+ "c0655a5310b183080e0afb259fb65546102d9bb1",
+ "support"
+ ],
+ "css/css-ruby/ruby-lang-specific-style-001.html": [
+ "3206514f0d44855d3a9376ecfa47a6e9c3b62775",
"reftest"
],
"css/css-ruby/ruby-layout-internal-boxes-ref.html": [
@@ -593169,6 +595505,126 @@
"cfd271233e20402a20d7e66d174d6b2f05072c4d",
"reftest"
],
+ "css/css-ruby/ruby-line-break-suppression-001-ref.html": [
+ "1cd43b80018e896085984d53e5c4d1267efd387c",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-001.html": [
+ "11d4d40d43610fbcdbc8df580336eb1a41bfea22",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-002-ref.html": [
+ "8281ea1d74fa6c17f820cc4e6024fb742aa45049",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-002.html": [
+ "394b9c27e536eb7dfc7e9b248f9b27d5b848af20",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-003-ref.html": [
+ "f8b1e168e11b48e32bb01a584636bb01eb9e392f",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-003.html": [
+ "dadfd562a45ac49ad303ea232a04fa5fe5c66621",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-004-ref.html": [
+ "5aa55829574cd3f395b00262b81b6292906ba6ab",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-004.html": [
+ "0314237f07f61c30fa562aa86c3142aaa8057a06",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-005-ref.html": [
+ "c40780e37dd9dcf8922f2fd389727525f5ab0e13",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-break-suppression-005.html": [
+ "10d6690b3d8bbea027f250a3a0cfbbbf72da4c43",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-line-breaking-001-ref.html": [
+ "1f3031c59ad413d7fd93b8ce8393a70957e725d2",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-breaking-001.html": [
+ "b6b4d861e21e241852bb97d1671a73d160089ccc",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-line-breaking-002-ref.html": [
+ "08510f7fb056ad928f40c92977c422b0912c7393",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-breaking-002.html": [
+ "dddf41f9309abc3aa0535400a0cd967b97910cdc",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-line-breaking-003-ref.html": [
+ "4f3cecb27ce1f243030edae98fa4ea753a6894ad",
+ "support"
+ ],
+ "css/css-ruby/ruby-line-breaking-003.html": [
+ "27348d0cf11082e875506b9df6a56b0117538e65",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-no-transform-ref.html": [
+ "56afd9366fe787670771a82874f1016335f1b7c6",
+ "support"
+ ],
+ "css/css-ruby/ruby-no-transform.html": [
+ "1cdd4f3bbf5af81309805285a25622f7e444a3ee",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-reflow-001-noruby.html": [
+ "4c00573422b3954853965a3d86ad1464a53a244f",
+ "visual"
+ ],
+ "css/css-ruby/ruby-reflow-001-opaqueruby.html": [
+ "fe4a80423839f6167fa0e42315b6b814cc839b92",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-reflow-001-transparentruby.html": [
+ "3e7112c4d61397e74cd1d75519292f3ecca5e9ee",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-span-001-ref.html": [
+ "3bf873453cd8df2216cd0a318466464b0518e698",
+ "support"
+ ],
+ "css/css-ruby/ruby-span-001.html": [
+ "e7b19667aa9fdbbf25ef662036ed1c0babd8e0fc",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-whitespace-001-ref.html": [
+ "d24e207f8676d010cdfef2ddac1412833944faaf",
+ "support"
+ ],
+ "css/css-ruby/ruby-whitespace-001.html": [
+ "9df61585700777911c19e8336beed37827ce78d4",
+ "reftest"
+ ],
+ "css/css-ruby/ruby-whitespace-002-ref.html": [
+ "8aade20051630ee89d258916b1029a71d91ce0fb",
+ "support"
+ ],
+ "css/css-ruby/ruby-whitespace-002.html": [
+ "bc84919a123c0554d9a6f80bea7d78341eb6cafe",
+ "reftest"
+ ],
+ "css/css-ruby/support/ruby-common.css": [
+ "cf83123281dfa8896339138faab3c6196943832c",
+ "support"
+ ],
+ "css/css-ruby/support/ruby-dynamic-insertion.js": [
+ "0bf6cd969779db94866a58ab7b534d2f53a5b99a",
+ "support"
+ ],
+ "css/css-ruby/support/ruby-dynamic-removal.js": [
+ "c703e7601e4f3a84e7d7739baf5841e16a46e3f0",
+ "support"
+ ],
"css/css-scoping/META.yml": [
"826341652122a40956ccc74288e23f952f1f40e8",
"support"
@@ -594149,6 +596605,10 @@
"a7f17d9670b137995b0dfc6f43221e16b988376d",
"testharness"
],
+ "css/css-shadow-parts/style-sharing.html": [
+ "4af1260b5e992af7816cdbe96056495a9ad7e216",
+ "testharness"
+ ],
"css/css-shadow-parts/support/shadow-helper.js": [
"94accd6b1f9b095fda0079f7b86b866d88ffee01",
"support"
@@ -594161,10 +596621,18 @@
"edac744592f76704ba82b0c4a7e5a53c7db6ba79",
"testharness"
],
+ "css/css-shapes/animation/shape-margin-composition.html": [
+ "395bad063f4c1bfb036d650d6b0319cd3d572fe2",
+ "testharness"
+ ],
"css/css-shapes/animation/shape-margin-interpolation.html": [
"48b3d0c460794b18261ce7a6beedf980d8335d36",
"testharness"
],
+ "css/css-shapes/animation/shape-outside-composition.html": [
+ "0115148ec1adde1a32b1c1fb4b3c33ea8b56ece0",
+ "testharness"
+ ],
"css/css-shapes/animation/shape-outside-interpolation.html": [
"3380acdba00db8e9440b33c60275f6fd6340d345",
"testharness"
@@ -595461,26 +597929,50 @@
"086e654a8e039f259b5e828d024f808c2e95016b",
"support"
],
+ "css/css-sizing/animation/height-composition.html": [
+ "094e247dcf22d9bd665b244993b6239265ee73bb",
+ "testharness"
+ ],
"css/css-sizing/animation/height-interpolation.html": [
"10ceed5b2cc0d5511b8020aeaced36be39834c3a",
"testharness"
],
+ "css/css-sizing/animation/max-height-composition.html": [
+ "fb5b241d00865fe68c198a9fee88d932a8977f7e",
+ "testharness"
+ ],
"css/css-sizing/animation/max-height-interpolation.html": [
"c4cab0e1cf4534d3705801f3159b6b8724977b66",
"testharness"
],
+ "css/css-sizing/animation/max-width-composition.html": [
+ "8b6d8b704c8771491419db0aa2a3c783a1dea2b3",
+ "testharness"
+ ],
"css/css-sizing/animation/max-width-interpolation.html": [
"111199baa7ed89c6023d43b56313413cc5aeeeeb",
"testharness"
],
+ "css/css-sizing/animation/min-height-composition.html": [
+ "1e92b0ec2fd664e7b3dd6dc1cd8310c7b9526e7c",
+ "testharness"
+ ],
"css/css-sizing/animation/min-height-interpolation.html": [
"6fd5b4e2f5366f6b18678f60b982e82905558e51",
"testharness"
],
+ "css/css-sizing/animation/min-width-composition.html": [
+ "e8bd41030bbd8a273f7e7c45f5f445d706d044eb",
+ "testharness"
+ ],
"css/css-sizing/animation/min-width-interpolation.html": [
"d11fb3d5cb139f870d1eb40618bf547176f109b1",
"testharness"
],
+ "css/css-sizing/animation/width-composition.html": [
+ "bfe45cb31471d0c8623dbb9e84000bc1208bb76f",
+ "testharness"
+ ],
"css/css-sizing/animation/width-interpolation.html": [
"d165c994b5de6fe1561498aa04c075196357f5f6",
"testharness"
@@ -597993,14 +600485,26 @@
"e7914c0fc7ff9e6999f8847dc1800968472483f2",
"support"
],
+ "css/css-text/animations/letter-spacing-composition.html": [
+ "c1b614b5ebaa5bc190a080bd8da5694096a2be20",
+ "testharness"
+ ],
"css/css-text/animations/letter-spacing-interpolation.html": [
"7d4958113915913bb8a3a5af13f5cee90b080825",
"testharness"
],
+ "css/css-text/animations/text-indent-composition.html": [
+ "57c528ca271646a284048bb49e11025ac25469da",
+ "testharness"
+ ],
"css/css-text/animations/text-indent-interpolation.html": [
"2269fdfa5b60f6f4a8d63a7f777e6abbf499c4b7",
"testharness"
],
+ "css/css-text/animations/word-spacing-composition.html": [
+ "17aacaef1506eddbc8ef40ade114a856310a508e",
+ "testharness"
+ ],
"css/css-text/animations/word-spacing-interpolation.html": [
"ffd6bb476ad87976a1183cde70a10892bab77982",
"testharness"
@@ -611933,6 +614437,10 @@
"7ce4b54a22c78576dc2318ebd651dfd1cce374ad",
"support"
],
+ "css/css-ui/animation/caret-color-composition.html": [
+ "6c69578677896e2463331deba85731e13fd94a25",
+ "testharness"
+ ],
"css/css-ui/animation/caret-color-interpolation.html": [
"b3a4e30130843163d76a0a24196c66853bd4160a",
"testharness"
@@ -611941,10 +614449,18 @@
"f49aa79a382c8e5a8f4c9d834f5f12aea551818f",
"testharness"
],
+ "css/css-ui/animation/outline-offset-composition.html": [
+ "984a63fdc34274fab133308dbb0b9a5c2eca03b9",
+ "testharness"
+ ],
"css/css-ui/animation/outline-offset-interpolation.html": [
"46c1c51c6eefaa490fc9d55e4cadfb0cb7804337",
"testharness"
],
+ "css/css-ui/animation/outline-width-composition.html": [
+ "b770feda61ca6c74467c597749a053d3569af012",
+ "testharness"
+ ],
"css/css-ui/animation/outline-width-interpolation.html": [
"c024c7cf6a08e0f6e02ccb451ca04d0b4a8c9251",
"testharness"
@@ -620238,7 +622754,7 @@
"reftest"
],
"css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht": [
- "3b1fef0f84e53ad72e61fc1b849ec6521b162968",
+ "dea13d4238dab838610355056ddaf105e947f3bf",
"support"
],
"css/css-writing-modes/sizing-orthog-htb-in-vrl-013.xht": [
@@ -623109,6 +625625,10 @@
"f1f6fc5abc679d087d221573456eb9219d1a405c",
"testharness"
],
+ "css/cssom-view/getClientRects-inline-inline-child.html": [
+ "9a03ccdbccc80d8a0ce6f701aeaa802b1b4715e4",
+ "testharness"
+ ],
"css/cssom-view/getClientRects-inline.html": [
"415e34a6f0430e08441ee32b3f7c0ca8cd11a692",
"reftest"
@@ -625725,10 +628245,18 @@
"20835b48397f136a30b82a62654d389cad326315",
"support"
],
+ "css/motion/animation/offset-anchor-composition.html": [
+ "53210fdf38a86ec9f4e852a33527fc88b1eb9fe3",
+ "testharness"
+ ],
"css/motion/animation/offset-anchor-interpolation.html": [
"9c69c0f0bed2b14c02091ccf63f50ace61f2eb2a",
"testharness"
],
+ "css/motion/animation/offset-distance-composition.html": [
+ "4ff6e95b05792505b2f98c511f5a80d64e86624d",
+ "testharness"
+ ],
"css/motion/animation/offset-distance-interpolation.html": [
"bc0c094a8e5305c970f0a4d44ee8a3726d2965a1",
"testharness"
@@ -625737,6 +628265,10 @@
"2ee011bd77a975e9b566d24658995693c574f620",
"testharness"
],
+ "css/motion/animation/offset-path-composition.html": [
+ "eedd363efafe05b870314ad797d9dc63f2c7409c",
+ "testharness"
+ ],
"css/motion/animation/offset-path-interpolation-001.html": [
"5b90813bb591d0aa7e17eeddcb1a9e3a908670f0",
"testharness"
@@ -625757,10 +628289,18 @@
"9924106f4b75ede89e5270a76fe217f85ef20050",
"testharness"
],
+ "css/motion/animation/offset-position-composition.html": [
+ "0ee517a73a8e9e673a83a0f81bbdea98d6a3d808",
+ "testharness"
+ ],
"css/motion/animation/offset-position-interpolation.html": [
"9faaf9487afb20059046e95a8cd5b3a796e8fd42",
"testharness"
],
+ "css/motion/animation/offset-rotate-composition.html": [
+ "bf60c19abeffafa36c50f1d1da0e9f9d64b1a151",
+ "testharness"
+ ],
"css/motion/animation/offset-rotate-interpolation.html": [
"55845108ebf5f3c42a8b0532121199136160d695",
"testharness"
@@ -635102,15 +637642,15 @@
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py": [
- "dd823c78a68d555e3a235cd917edd09297f7c34e",
+ "12fb6a3ad850b357808c47a90a818dd73be2de5b",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py": [
- "62363a207bd15c3d8733ecd496e73e3f61eb5744",
+ "527959068762f5a7185bf11bdc2536054d2db258",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py": [
- "b5c59e6f50185f4a63badfb860375959f3af4a02",
+ "fdbaec052e4e4bdfdcad1e9fc9731bf26a518509",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-010-tests.sh": [
@@ -635118,7 +637658,7 @@
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py": [
- "34e047ab003e0c515cf03e448796aaa5b23a6df7",
+ "1b1d6fc16f24b91eef28cd99c428f426cc61c349",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-01-ref.html": [
@@ -636162,7 +638702,7 @@
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py": [
- "75168420287b275af5782891adf73eb4cf7ca2e6",
+ "6e13861374a6f6d5def71d7c2c1a59fbd57b2895",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text3/text-align-match-parent-01.html": [
@@ -637854,7 +640394,7 @@
"testharness"
],
"custom-elements/pseudo-class-defined.html": [
- "60d88cffb517c0062db338e5ba89e98f7748c280",
+ "24cb5fe4cd392246e292d255c0858aa7f2b5dd0e",
"testharness"
],
"custom-elements/range-and-constructors.html": [
@@ -638102,7 +640642,7 @@
"testharness"
],
"custom-elements/upgrading.html": [
- "d6b8ed387540ae9572774e5557b1168f844a017f",
+ "ac0fdff7a2111507632ac2c36fd5c60a6f832b20",
"testharness"
],
"custom-elements/upgrading/Document-importNode.html": [
@@ -639925,6 +642465,14 @@
"d37015ec9f923bfc74319631723defa0b222654d",
"testharness"
],
+ "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html": [
+ "98de2b688369099806c525034a6bfc9e63d20a72",
+ "support"
+ ],
+ "dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html": [
+ "612aed637df48d19f3050844ed418f3e35d8fa91",
+ "reftest"
+ ],
"dom/nodes/remove-unscopable.html": [
"0238b0fa97a40dd9e5058d4153d1483553552033",
"testharness"
@@ -640297,6 +642845,10 @@
"918997b1646d73d71a79c302953ab9f0f8ed69cc",
"support"
],
+ "domxpath/booleans.html": [
+ "41522edf05f8bc752408eb2cdde10a05bd211a7a",
+ "testharness"
+ ],
"domxpath/document.tentative.html": [
"b75c0f0d66dacb47a825ae2aa00bb63a19616433",
"testharness"
@@ -640305,6 +642857,14 @@
"8239d9c395e3c965c5ae2f23ed79156b7b85c01f",
"testharness"
],
+ "domxpath/fn-concat.html": [
+ "fe160966aa7983191e81ffa65f5955c86afe7bb9",
+ "testharness"
+ ],
+ "domxpath/fn-contains.html": [
+ "a4d8bbfa7b3ce35b574bdcb902c4a0caa9ad39c3",
+ "testharness"
+ ],
"domxpath/fn-lang.html": [
"c7c102945d070a4ea65cae0e30ea6ec64bb82c95",
"testharness"
@@ -640313,10 +642873,42 @@
"a9f33a0ee3d153abd6fe05415c6ce6699ce8525c",
"testharness"
],
+ "domxpath/fn-starts-with.html": [
+ "99d2df7db6b67c9e186ade1160da6932f8dc90bd",
+ "testharness"
+ ],
+ "domxpath/fn-substring-after.html": [
+ "c290914d24b0463d42959ff675f1498a7898806d",
+ "testharness"
+ ],
+ "domxpath/fn-substring-before.html": [
+ "69b3f1ef6e45e948a55d49b409c5a58a9cf83381",
+ "testharness"
+ ],
+ "domxpath/fn-substring.html": [
+ "3311a15061de49c5337b938d732946358f2245f3",
+ "testharness"
+ ],
+ "domxpath/fn-translate.html": [
+ "ee1700d1b427ea80fc5076a22a00f2dd62f4937b",
+ "testharness"
+ ],
+ "domxpath/helpers.js": [
+ "0805bd682b48461588250a22018a6bd90990d002",
+ "support"
+ ],
+ "domxpath/lexical-structure.html": [
+ "f93820b0e4176d8c96518268b6453024dd43f1df",
+ "testharness"
+ ],
"domxpath/node-sets.html": [
"a47314fb0869885db01fd13bd8aa35687e283d0d",
"testharness"
],
+ "domxpath/numbers.html": [
+ "e847d6cd2e53839914a649ca1cb61953c659e2ed",
+ "testharness"
+ ],
"domxpath/predicates.html": [
"1786740dbd2522c15325a6e8677b07402a7cd767",
"testharness"
@@ -646009,6 +648601,26 @@
"be1d1e74cf5f5105619a574c3caa7f2c0a39e7f6",
"support"
],
+ "fetch/h1-parsing/resources-with-0x00-in-header.window.js": [
+ "f1afeeb740b1d77bd392e23afb1c5abdf5687302",
+ "testharness"
+ ],
+ "fetch/h1-parsing/resources/README.md": [
+ "2175d274088bdaeb2ee636765cc31a2fa6f3b132",
+ "support"
+ ],
+ "fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis": [
+ "102340a6313feb75c1cad7f15b4d5a31e9c67568",
+ "support"
+ ],
+ "fetch/h1-parsing/resources/document-with-0x00-in-header.py": [
+ "6e8db6195910ef4c85dced8b24541ecde83c5405",
+ "support"
+ ],
+ "fetch/h1-parsing/resources/script-with-0x00-in-header.py": [
+ "f4a016a369831ee5dcdb3563468ccf8dd0b0982b",
+ "support"
+ ],
"fetch/http-cache/304-update.html": [
"d6d8481e87427816113397bbed49f30b3e43c336",
"testharness"
@@ -646066,7 +648678,7 @@
"support"
],
"fetch/http-cache/split-cache.tentative.html": [
- "533dd6a936fef7c6036bba42fbd7d0d71222a192",
+ "9e557fed7b79bc38ccf6fb016ce0e3258f4dd2ef",
"testharness"
],
"fetch/http-cache/status.html": [
@@ -649937,6 +652549,10 @@
"a5d8e59406e870c7be80dfe57ef404ddc7b288a4",
"manual"
],
+ "html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html": [
+ "919a05ed2a2a5c40f56ce46e1597e8bd763b0921",
+ "testharness"
+ ],
"html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html": [
"3ad0de6a3a3fd7fb2304154d602226e9d5299724",
"testharness"
@@ -649953,6 +652569,10 @@
"ca2dd8ebf829d6f677fdf57b4a6db029a4aa457d",
"support"
],
+ "html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html": [
+ "10ac8ece0e174b9a180c904c5bcdf6cc514c3a92",
+ "support"
+ ],
"html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html": [
"a315e21208728ed38155fa0e13c5f4d58dbea496",
"support"
@@ -657846,11 +660466,15 @@
"testharness"
],
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html": [
- "1d231d52cde8b4758cf834db42231720c374b060",
+ "ab36eeede733f094d2e6340ddf6ce4d82d7a24d6",
+ "testharness"
+ ],
+ "html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html": [
+ "42be8ce7a81b824f0e62553490ae406b6b736f9f",
"testharness"
],
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html": [
- "5b155c1047da85d2bd8301effaa3ef9d9096b0ad",
+ "3000032978082356086930b2b5bee96b73947dc8",
"testharness"
],
"html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-dim-ref.html": [
@@ -658297,6 +660921,14 @@
"ae2efa415ee51e4b2b54df2f3f90965746b43ed3",
"testharness"
],
+ "html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html": [
+ "f32472105d543a456e1a5ea469f932b8d643c06d",
+ "support"
+ ],
+ "html/semantics/document-metadata/the-link-element/link-type-attribute.html": [
+ "80acb9f3dcc2d312fd8a8051b92e6e70ca343bb3",
+ "reftest"
+ ],
"html/semantics/document-metadata/the-link-element/resources/bad.css": [
"4e1fe36165c52792e3a3816962c36e6090f04f67",
"support"
@@ -661906,11 +664538,11 @@
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-valid.html": [
- "cec5dcbf0d5cfb340e100a82e723e1d620d16399",
+ "03655ffd2f5ba24b30e6864c8393ecbf36230aef",
"testharness"
],
"html/semantics/forms/constraints/form-validation-validity-valueMissing.html": [
- "3c9e4c4cb096bbe93b540c3f704d0d116a055aba",
+ "2e1c666436a19bc759026ebf55df4a17073ecb5d",
"testharness"
],
"html/semantics/forms/constraints/form-validation-willValidate.html": [
@@ -661926,7 +664558,7 @@
"testharness"
],
"html/semantics/forms/constraints/support/validator.js": [
- "9b28b32309e349a87a5ee6b5b8cced2c501dd6a1",
+ "33508fb3289be3736f6f467957dc6614bec2bc9b",
"support"
],
"html/semantics/forms/constraints/tooLong-input-email-delete-manual.html": [
@@ -662754,7 +665386,7 @@
"testharness"
],
"html/semantics/forms/the-input-element/time.html": [
- "ad4e38cbc74f50dc764fc958b8cf68f4dd790cbe",
+ "ec815d4cb302cfb68db7976ba79bec1de762b7b7",
"testharness"
],
"html/semantics/forms/the-input-element/type-change-file-to-text-crash.html": [
@@ -669154,23 +671786,23 @@
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini": [
- "d97432ed39c5f161c4e6feeac5b954e63f17e73d",
+ "c7b3482c786fc4532488f388b802930ccea8dc0e",
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini": [
- "3adcbe6885645fbf3b8cb08e0133de836a3357f0",
+ "68ccafcec2a1dd55184d234071c809ce1fcc73d8",
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini": [
- "d01525b3cfa16083b00a07060935fe93450028fa",
+ "5d714dd77733edd0199535f0f1cb20a46237d6dd",
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini": [
- "a87d9f936fdbf5a9d1ac97352ee1417a06bc678a",
+ "40626b8193ecc99e3e5ec5fe181f5553bfd8473a",
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini": [
- "fe1bf469f4f07575469878ccfb9bedcad32fdca8",
+ "4f1939a431ae272024f62a4169bf8431efc2c5bb",
"support"
],
"infrastructure/metadata/infrastructure/testdriver/actions/pause.html.ini": [
@@ -670090,7 +672722,7 @@
"support"
],
"interfaces/webaudio.idl": [
- "674673d90b1e8fd3e6d182f25289948fc0290cac",
+ "9491090337c342fc06a35a97ee6dc6887829c1bc",
"support"
],
"interfaces/webauthn.idl": [
@@ -670126,7 +672758,7 @@
"support"
],
"interfaces/webrtc.idl": [
- "e30fc38fd003a283ebb4184786d181c5b4293dc4",
+ "49ed6bb0333020a6eee8d5411ae88a4e3a7dbd9a",
"support"
],
"interfaces/webusb.idl": [
@@ -670762,11 +673394,11 @@
"testharness"
],
"layout-instability/buffer-layout-shift.html": [
- "0cfce2f7124226cf4256284c1238ba1ef024c42b",
+ "b6a33f579b4009d1497fdc104c07633793d53f01",
"testharness"
],
"layout-instability/buffered-flag.html": [
- "dabc8068931ff3b15eb4b80481ed2102a7725a62",
+ "cd1260e3613f58c191688ab2f492647b0cc72c0c",
"testharness"
],
"layout-instability/clip-negative-bottom-margin.html": [
@@ -670797,10 +673429,6 @@
"36475d4c826c11807e9c0a7fbf4457c33c92c2c0",
"testharness"
],
- "layout-instability/observe-layout-shift.html": [
- "1c35fe2aa234c96fce8798e6a1c35362f418e6f1",
- "testharness"
- ],
"layout-instability/partially-clipped-visual-rect.html": [
"3b18b98dd93312c37b9e2f25918df50266a09243",
"testharness"
@@ -670813,6 +673441,10 @@
"e2e7a911dc043bb21cebfd4a5b625795f3523a14",
"testharness"
],
+ "layout-instability/recent-input.html": [
+ "a4fa0d8b0d92a83984034926de30958b840c1028",
+ "testharness"
+ ],
"layout-instability/resources/slow-image.py": [
"ee7988c551f6429eea2b929af083ad30cbd5c73d",
"support"
@@ -670826,11 +673458,11 @@
"testharness"
],
"layout-instability/shift-into-viewport.html": [
- "6ace93ad54c2f6b173df060e39be097eca4b6867",
+ "61267a32648e0389dc32b8166fd1e8d2c1df2320",
"testharness"
],
"layout-instability/shift-outside-viewport.html": [
- "49242913760a76d124eac0eeb3de8bb4e8eb8a19",
+ "2d92835b88928fd6586fff00adb16c46308558e1",
"testharness"
],
"layout-instability/shift-while-scrolled.html": [
@@ -670850,7 +673482,7 @@
"testharness"
],
"layout-instability/toJSON.html": [
- "3d39d623e13314b183463fa1c365df3a7b725243",
+ "374a7de0cd1c4d5d5b089b7d026c8eb5709e91f1",
"testharness"
],
"layout-instability/transform.html": [
@@ -670914,7 +673546,7 @@
"testharness"
],
"lint.whitelist": [
- "d06f4c59bca28d01632cf693062a7d30ecbd5cc8",
+ "b5a8f80687044b596e449e357f7e731895b3a94d",
"support"
],
"loading/lazyload/META.yml": [
@@ -670945,6 +673577,14 @@
"76eef3a8f45c131bdbf90028f8bcad75be0e5f32",
"testharness"
],
+ "loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html": [
+ "a545410f9787a7e8650fcde54556f407bafffa83",
+ "testharness"
+ ],
+ "loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html": [
+ "d316a6ae22bea4b4bf7a1b02ba21c24556923790",
+ "testharness"
+ ],
"loading/lazyload/image-loading-lazy-load-event.tentative.html": [
"9e56a3150953494533d117841dcdd454aaa039f2",
"testharness"
@@ -670961,6 +673601,10 @@
"f7d887b18a228e648a5de45b890bfce371963cec",
"testharness"
],
+ "loading/lazyload/move-element-and-scroll.tentative.html": [
+ "f9d89807b8c5575982e4d28f156cb604ae0bbd8b",
+ "testharness"
+ ],
"loading/lazyload/not-rendered-below-viewport-image-loading-lazy.tentative.html": [
"0c40d7dbcd832b379a3d8427f9390fca842439cd",
"testharness"
@@ -670993,6 +673637,10 @@
"58f8c3a4d5a1e21ce2afd9def3ab9b5870cc272f",
"testharness"
],
+ "loading/lazyload/remove-element-and-scroll.tentative.html": [
+ "53708ceac75fa3421c4ecc1a8b91034c5a91c396",
+ "testharness"
+ ],
"loading/lazyload/resources/image.png": [
"b712825093805d1052b01047b1dbb102f0af8f0f",
"support"
@@ -676213,6 +678861,18 @@
"16c68c59b273663fb16847f121f38e03bb94cf19",
"testharness"
],
+ "native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js": [
+ "2c0299df12e9577261cce2f68d12a1bf744158c2",
+ "testharness"
+ ],
+ "native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js": [
+ "0efacf9e607d990bccf185b7d84d5f45220338d8",
+ "testharness"
+ ],
+ "native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js": [
+ "caf6fbd1c52a3cef603896f8ee98d9618e4dc92e",
+ "testharness"
+ ],
"native-file-system/native_FileSystemWriter.tentative.https.manual.window.js": [
"25d8ee995857fa67be2c41f048e882ec473f739d",
"testharness"
@@ -676254,11 +678914,11 @@
"support"
],
"native-file-system/resources/native-fs-test-helpers.js": [
- "5ad8c04724b7a2e7743b43a84efaa05b7e6b703d",
+ "bcdfd484cf2b8b12632c964e2b60a390c03c4225",
"support"
],
"native-file-system/resources/opaque-origin-sandbox.html": [
- "937a6c385de2fc16d4afa1fecb762e38f4e2131b",
+ "07301af1cfaf250e0da67de4021a86f12c7e42e8",
"support"
],
"native-file-system/resources/sandboxed-fs-test-helpers.js": [
@@ -676305,6 +678965,18 @@
"fb93858fe7934b27244fa0ff828eac75c34b6629",
"testharness"
],
+ "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js": [
+ "eed6a561dc40e658b6b6c8d51766cdacc42a024c",
+ "testharness"
+ ],
+ "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js": [
+ "7ef0ea0ef82626eae74f152b94f898859aca6832",
+ "testharness"
+ ],
+ "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js": [
+ "16dbbe6a808a603c9b81482f733dcf09e84670ff",
+ "testharness"
+ ],
"native-file-system/sandboxed_FileSystemWriter.tentative.https.any.js": [
"8352e2487fe0823a2d353372757d833d85e98c4b",
"testharness"
@@ -676345,6 +679017,18 @@
"6b7d9f9a3171c96aaa2e1312451b3a9cac6c2e9b",
"support"
],
+ "native-file-system/script-tests/FileSystemWritableFileStream-piped.js": [
+ "59fc1e3d1362b3ec90e3ef7a4f0981bdd4a21340",
+ "support"
+ ],
+ "native-file-system/script-tests/FileSystemWritableFileStream-write.js": [
+ "f14d79fd040a0e7fc7f19216fec1aec0ca23dec8",
+ "support"
+ ],
+ "native-file-system/script-tests/FileSystemWritableFileStream.js": [
+ "5acf93aec8cee8ef3a8389979e2a402acf5cbc7f",
+ "support"
+ ],
"native-file-system/script-tests/FileSystemWriter.js": [
"1c51d0b4eb771eec5a606263e72719be589aa317",
"support"
@@ -685037,6 +687721,10 @@
"70a16436a67f254372be5f861d83d9e9b66f895f",
"testharness"
],
+ "portals/predecessor-fires-unload.html": [
+ "6512195eaf613ad556a148d9136425aa20915648",
+ "testharness"
+ ],
"portals/references/portals-rendering.html": [
"4a8414ab5656593811772c3728e4ee83eb034457",
"support"
@@ -685161,6 +687849,10 @@
"92aef00380ae4a6180039ad0b10169c81a190441",
"support"
],
+ "portals/resources/predecessor-fires-unload-watch-unload.html": [
+ "ada5a64967e9b169209b5cfede256c60ac3f8acc",
+ "support"
+ ],
"portals/resources/simple-portal-adopts-and-activates-predecessor.html": [
"56bfd10f647fb63597dbc5ec902a8c2b90257b18",
"support"
@@ -698906,7 +701598,7 @@
"support"
],
"resources/chromium/nfc-mock.js": [
- "7eee8ce04c4630ae82d2520def13cfa107b7ef13",
+ "2c1724b7592eb1d6e66177544998abbec70fbfe6",
"support"
],
"resources/chromium/sensor.mojom.js": [
@@ -698966,7 +701658,7 @@
"support"
],
"resources/chromium/webxr-test.js": [
- "a819a3b425be2aabb83696acb6b26b69211c33dd",
+ "b45ff20dbc4ec9cf9fbcd36b8e3b7887ba512947",
"support"
],
"resources/chromium/webxr-test.js.headers": [
@@ -710798,7 +713490,7 @@
"support"
],
"tools/requirements_mypy.txt": [
- "50afed2bb2dec184caee69a1074e428d115c5b40",
+ "f3a56a6dd715ac6d6b01057a609a3e470ba8e303",
"support"
],
"tools/runner/css/bootstrap-theme.min.css": [
@@ -715158,7 +717850,7 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/base.py": [
- "655344581973c15b657729feb736dd2073d79a30",
+ "fef052dd5ab495dad4342e086491723c761edcfd",
"support"
],
"tools/wptrunner/wptrunner/browsers/chrome.py": [
@@ -715186,15 +717878,15 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/epiphany.py": [
- "8a0e5f578b2feb871ddd50ab08168c6b9d45e4b0",
+ "f6c4c602a38c043637cf9dbc8bbb5350ec94527e",
"support"
],
"tools/wptrunner/wptrunner/browsers/firefox.py": [
- "0f8075337813783c76e4be4dec9cc931a4252c41",
+ "b6ee0f4998e9a2189cfca99b3cce1a6b11ea858c",
"support"
],
"tools/wptrunner/wptrunner/browsers/firefox_android.py": [
- "33b5d51e54e82adb6cdbe4612263bc30883dd108",
+ "fee528071f68843ab056f513295146685f8f78f4",
"support"
],
"tools/wptrunner/wptrunner/browsers/ie.py": [
@@ -715230,11 +717922,11 @@
"support"
],
"tools/wptrunner/wptrunner/browsers/webkit.py": [
- "aa2862139450f682e6051c5f617ab8caf1960784",
+ "1be683ed26e43a9e10a1f82520811c33e90dad05",
"support"
],
"tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py": [
- "d735f3c0792a6356c6270143205c55b7c02eef47",
+ "d8b9744bd743e39ce19f008e7f40cbc80e80107c",
"support"
],
"tools/wptrunner/wptrunner/config.py": [
@@ -715242,7 +717934,7 @@
"support"
],
"tools/wptrunner/wptrunner/environment.py": [
- "e79ae3750647f88bba44703181c208229800f658",
+ "7dcea4aeafabb9c481dccdc1aaf9bd153572bb7d",
"support"
],
"tools/wptrunner/wptrunner/executors/__init__.py": [
@@ -715270,7 +717962,7 @@
"support"
],
"tools/wptrunner/wptrunner/executors/executormarionette.py": [
- "59f7e865a5b8711fa71c9c8955eca731e0048c3f",
+ "01306397db7944cd0dfadf8f1bf0327dbacf94d6",
"support"
],
"tools/wptrunner/wptrunner/executors/executoropera.py": [
@@ -715286,7 +717978,7 @@
"support"
],
"tools/wptrunner/wptrunner/executors/executorservo.py": [
- "9cef1fb2d7f78e8729e51ff400b3df2402a2e94e",
+ "9eebfa59febf991bd41db25f2b02ea4c8c00195e",
"support"
],
"tools/wptrunner/wptrunner/executors/executorservodriver.py": [
@@ -715326,7 +718018,7 @@
"support"
],
"tools/wptrunner/wptrunner/executors/test-wait.js": [
- "8a7edb79d62256eef63c71eabd450d42bce7c4d2",
+ "ad08ad7d76fb0299aadedb572193c38c5055e654",
"support"
],
"tools/wptrunner/wptrunner/executors/testharness_servodriver.js": [
@@ -715342,11 +718034,11 @@
"support"
],
"tools/wptrunner/wptrunner/expectedtree.py": [
- "4d505086bd8d991c953c34d38d8e1fa0cb920f99",
+ "7521f25b1344f5c50b8182a2b7a68278858f9b47",
"support"
],
"tools/wptrunner/wptrunner/font.py": [
- "6647a8580be7ab4050bbd37593b2e6595bc3ac72",
+ "daf0a1c1bfa221aa47981d93239021e4aefa74a9",
"support"
],
"tools/wptrunner/wptrunner/formatters/__init__.py": [
@@ -715370,23 +718062,23 @@
"support"
],
"tools/wptrunner/wptrunner/manifestexpected.py": [
- "eae85b1f6661a67dff59ef78a9ed627e3e3603d8",
+ "65b53f0ab97b581b2b71277bd8f260f79a1afb12",
"support"
],
"tools/wptrunner/wptrunner/manifestinclude.py": [
- "d302831a57abbaadd75fe49e094482dc14223ea3",
+ "79b5b19b3a3f617e5dd40118042da0b3ea8e4115",
"support"
],
"tools/wptrunner/wptrunner/manifestupdate.py": [
- "af9af18d90715d43bbcd2ae47ce76275bb0e1577",
+ "3cb1b5107924c4d897efccaf8f5de93df2311609",
"support"
],
"tools/wptrunner/wptrunner/metadata.py": [
- "c328dcefa7253ddea952549c702723e98b4cadc4",
+ "aafc7d52250f62fdcd7025858f2273290c77d49e",
"support"
],
"tools/wptrunner/wptrunner/products.py": [
- "e3117042709f99f4e0443dc0dfaf561ad0b548b0",
+ "abd84094bb33dbd13b3594a7acbe8467512a99ce",
"support"
],
"tools/wptrunner/wptrunner/stability.py": [
@@ -715418,7 +718110,7 @@
"support"
],
"tools/wptrunner/wptrunner/testloader.py": [
- "fa54ca361576318cb35ec716a1a159bdb532e6c8",
+ "8fcf66d64ed9cec5979ae2ef3b02320d5782b818",
"support"
],
"tools/wptrunner/wptrunner/testrunner.py": [
@@ -715446,7 +718138,7 @@
"support"
],
"tools/wptrunner/wptrunner/tests/test_expectedtree.py": [
- "2308be9590e9004f41a492682d187a7b4fc57231",
+ "d71237a42dad58c69b686e6040b65f40064c9437",
"support"
],
"tools/wptrunner/wptrunner/tests/test_formatters.py": [
@@ -715454,7 +718146,7 @@
"support"
],
"tools/wptrunner/wptrunner/tests/test_manifestexpected.py": [
- "525915d1832ac8af1957a799615969e058eefca5",
+ "f3e4ce796a45c472a88fe022277e0347b4e98948",
"support"
],
"tools/wptrunner/wptrunner/tests/test_products.py": [
@@ -715466,15 +718158,15 @@
"support"
],
"tools/wptrunner/wptrunner/tests/test_testloader.py": [
- "e857cd43db6d281f95414230f52c984aad915118",
+ "836003d106038ab4303035eecca31774c9a26ce1",
"support"
],
"tools/wptrunner/wptrunner/tests/test_update.py": [
- "5f199390b64f9d0843df7900cf624a9e674f3dd7",
+ "a24e4a733dae576bf82f5b6e17a7bbe3f6d351ef",
"support"
],
"tools/wptrunner/wptrunner/tests/test_wpttest.py": [
- "9bb3e1fd34e37c4430f752b87e4bb4e3bfa7f959",
+ "1a94a2f3303a7b5a1d5b2c553af6bbd1d8b45bc7",
"support"
],
"tools/wptrunner/wptrunner/update/__init__.py": [
@@ -715490,7 +718182,7 @@
"support"
],
"tools/wptrunner/wptrunner/update/state.py": [
- "64dbf1180604cd8df7a468e036447f95b80371b0",
+ "f8a83525cbd4706bdfbc99a518d2bac123d34e96",
"support"
],
"tools/wptrunner/wptrunner/update/sync.py": [
@@ -715514,11 +718206,11 @@
"support"
],
"tools/wptrunner/wptrunner/wptcommandline.py": [
- "923bdaa55857e793e8d6e8c587167360aed4ae94",
+ "91f1161b01b99f31ef1d3dde05333627bf4365b2",
"support"
],
"tools/wptrunner/wptrunner/wptlogging.py": [
- "69cee744879eb6780cb99ec93123922e166d9e16",
+ "444d1d962d25873109977b937d96c86cb293cd8f",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/__init__.py": [
@@ -715534,7 +718226,7 @@
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py": [
- "a81ad9d06a144bff7f3cc9ed91a4260cd061b7fb",
+ "3b11e83012ab50fe0ea240ae056d02c8968b6a60",
"support"
],
"tools/wptrunner/wptrunner/wptmanifest/backends/static.py": [
@@ -715578,11 +718270,11 @@
"support"
],
"tools/wptrunner/wptrunner/wptrunner.py": [
- "cac172a5940ec696e3a3b279170f9712aaf4668d",
+ "75ce104c7cee335afa2e86592caa2c4caa473bcf",
"support"
],
"tools/wptrunner/wptrunner/wpttest.py": [
- "67b57583424d08779114dc2fa030390e584d716f",
+ "d650e98dfbf5976afa0138f0ac166e950e194e82",
"support"
],
"tools/wptserve/.gitignore": [
@@ -715866,7 +718558,7 @@
"support"
],
"tools/wptserve/wptserve/handlers.py": [
- "ca5118009cfc9c4763f99e2a6296d784a6539216",
+ "efc1a16a93225d033574a22f7ba81e7d3d50bfd9",
"support"
],
"tools/wptserve/wptserve/logger.py": [
@@ -715874,7 +718566,7 @@
"support"
],
"tools/wptserve/wptserve/pipes.py": [
- "ceb34cc3f4f994ed049915c7784f7c69c712abca",
+ "e5d6e1c96db9c18020ed2b8aee23d41dd503509a",
"support"
],
"tools/wptserve/wptserve/ranges.py": [
@@ -721098,7 +723790,7 @@
"testharness"
],
"wasm/jsapi/constructor/multi-value.any.js": [
- "7fbac5b24f1a50568170e257552bdc7a7783ae25",
+ "2c53e3611e044c8ba44a5c0436d4409bc9f1af42",
"testharness"
],
"wasm/jsapi/constructor/validate.any.js": [
@@ -721146,7 +723838,7 @@
"testharness"
],
"wasm/jsapi/instanceTestFactory.js": [
- "7ccf06c234a7ce5c17353f3bd74565b66c289952",
+ "c81672f208b1505430dd1ee909afaf12d9b2db20",
"support"
],
"wasm/jsapi/interface.any.js": [
@@ -721174,7 +723866,7 @@
"testharness"
],
"wasm/jsapi/module/customSections.any.js": [
- "8e9732e5512d3295c445c110e949905cec0efbe6",
+ "09355979d84ade5385e7b3a5ac265eaa0da500cf",
"testharness"
],
"wasm/jsapi/module/exports.any.js": [
@@ -721214,7 +723906,7 @@
"testharness"
],
"wasm/jsapi/wasm-module-builder.js": [
- "09ff891f52e2b4e9dd80fbc88586129cd0a910b6",
+ "82c6e04135f1b86df1a1d8e72c5f829c3297bb10",
"support"
],
"wasm/resources/load_wasm.js": [
@@ -721726,7 +724418,7 @@
"support"
],
"web-animations/timing-model/animations/reverse-running-animation.html": [
- "c5179a72c9dc83ce1c4426b5a844d61a039e250b",
+ "65f89b3e04c0b7ff6af221a100685fa71bcf7591",
"reftest"
],
"web-animations/timing-model/animations/reversing-an-animation.html": [
@@ -721742,7 +724434,7 @@
"testharness"
],
"web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html": [
- "0522c43b16a881a14b339294e5ed56b8ae064f92",
+ "a1f9e4f3acea04337dd0147fbfa373f950a67409",
"testharness"
],
"web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html": [
@@ -721934,7 +724626,7 @@
"support"
],
"web-nfc/NDEFMessage_constructor.https.html": [
- "1c842f5c7b61c35d09e2cd41014e1b8e04839624",
+ "4e53828c310976b5b37657f84a89f03c48e7bc59",
"testharness"
],
"web-nfc/NDEFReader-document-hidden-manual.https.html": [
@@ -721942,7 +724634,7 @@
"manual"
],
"web-nfc/NDEFReader_scan.https.html": [
- "a9b1d7516173418243c630817eea22fd0bed2046",
+ "17b9fdb8569db230c3a3ded22e0258e4f73a69fc",
"testharness"
],
"web-nfc/NDEFReader_scan_filter.https.html": [
@@ -721954,11 +724646,11 @@
"testharness"
],
"web-nfc/NDEFReadingEvent_constructor.https.html": [
- "cc56f8a18bdc6f7a0cde3f9f7246330f8e867dd6",
+ "5427b75ae2b6d0fa6c45b24af51b02a8737ffd0b",
"testharness"
],
"web-nfc/NDEFRecord_constructor.https.html": [
- "d46503ab172bf358bff005ce8c2c56941e333eea",
+ "2da7ca91078aa5ec8232f5347fb276618dad3c3c",
"testharness"
],
"web-nfc/NDEFWriter-document-hidden-manual.https.html": [
@@ -721966,7 +724658,7 @@
"manual"
],
"web-nfc/NDEFWriter_push.https.html": [
- "a6050b8ff7112cc00ec29b596c992cafb3657b7e",
+ "cb6b3941410035c5c5736e13d59fbbfb85f0d4cc",
"testharness"
],
"web-nfc/README.md": [
@@ -725189,6 +727881,10 @@
"89f6b1b4d7a425f2d05688d14315227454a3d4be",
"testharness"
],
+ "webrtc/RTCDataChannel-close.html": [
+ "9f43dc93c5ba7917c327d642fa6883ff19d74cac",
+ "testharness"
+ ],
"webrtc/RTCDataChannel-id.html": [
"0cf01976ff0eeb66c51ded321e777123f063b02c",
"testharness"
@@ -725214,7 +727910,7 @@
"testharness"
],
"webrtc/RTCError.html": [
- "4d0726093c19c2828e59e7f61d2f65954c8075fc",
+ "9c7227521edeb8e9db1c744ce3f6a145bc66314b",
"testharness"
],
"webrtc/RTCIceCandidate-constructor.html": [
@@ -725261,8 +727957,12 @@
"09ad67751a73a6482415a6ff6c2dac70e049c82c",
"testharness"
],
+ "webrtc/RTCPeerConnection-close.html": [
+ "74f816bf3fc0c8970582216e82e9eedc3227def1",
+ "testharness"
+ ],
"webrtc/RTCPeerConnection-connectionState.https.html": [
- "9ed5808727a6a293eedc705f40abdc7dc62f8eb4",
+ "a054a1e8cccbd02cc7b55f96ff483219846cf997",
"testharness"
],
"webrtc/RTCPeerConnection-constructor.html": [
@@ -725514,7 +728214,7 @@
"testharness"
],
"webrtc/RTCRtpTransceiver.https.html": [
- "67571895175f19c008743523f035aa31fced9681",
+ "af84fe2498c9242f49639fa1bd55a4e848affbbf",
"testharness"
],
"webrtc/RTCSctpTransport-constructor.html": [
@@ -730390,13 +733090,17 @@
"support"
],
"webxr/resources/webxr_test_asserts.js": [
- "863b994572441d0efdbe92dbd8aec29f9152069f",
+ "38f1364ce03ce96890cda97dcc226b8e472dd332",
"support"
],
"webxr/resources/webxr_test_constants.js": [
"3d9bfa2082baa90670131774920805a7f16cd5a2",
"support"
],
+ "webxr/resources/webxr_test_constants_fake_world.js": [
+ "0601f54fce994d027ae17dc958cee6d746440c35",
+ "support"
+ ],
"webxr/resources/webxr_util.js": [
"85821d4d3d5d7fd953cace5e7ea7bacc9d3b7dab",
"support"
@@ -730522,7 +733226,7 @@
"testharness"
],
"webxr/xrRigidTransform_inverse.https.html": [
- "a314f6b55a21b03abe5fb4ae0b32bc5c458e09f6",
+ "3098fb64936349e58aa6a919a8ec97d6334e5e02",
"testharness"
],
"webxr/xrRigidTransform_matrix.https.html": [
@@ -733730,7 +736434,7 @@
"support"
],
"xhr/resources/parse-headers.py": [
- "fdc626539e842f6660f533a3684da72e719cef09",
+ "c661f22c3e9eb6eb8ded5c7160111221dc4ac319",
"support"
],
"xhr/resources/pass.txt": [
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/has-instance.html.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/has-instance.html.ini
deleted file mode 100644
index 8536f4d7c4a..00000000000
--- a/tests/wpt/metadata/WebIDL/ecmascript-binding/has-instance.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[has-instance.html]
- type: testharness
- [instanceof must return false across different globals, for platform objects]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/css-align/animation/column-gap-composition.html.ini b/tests/wpt/metadata/css/css-align/animation/column-gap-composition.html.ini
new file mode 100644
index 00000000000..efdef9e8059
--- /dev/null
+++ b/tests/wpt/metadata/css/css-align/animation/column-gap-composition.html.ini
@@ -0,0 +1,61 @@
+[column-gap-composition.html]
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (0.5) should be [normal\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (-0.3) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (1) should be [normal\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [100px\] from add [100px\] to add [normal\] at (1.5) should be [normal\]]
+ expected: FAIL
+
+ [Compositing: property <column-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-align/animation/row-gap-composition.html.ini b/tests/wpt/metadata/css/css-align/animation/row-gap-composition.html.ini
new file mode 100644
index 00000000000..ea7c97b7b94
--- /dev/null
+++ b/tests/wpt/metadata/css/css-align/animation/row-gap-composition.html.ini
@@ -0,0 +1,61 @@
+[row-gap-composition.html]
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (1) should be [normal\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (-0.3) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (0) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (0.5) should be [normal\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [100px\] to add [normal\] at (1.5) should be [normal\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <row-gap> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini
new file mode 100644
index 00000000000..737e7291c6f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-left-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-bottom-left-radius-composition.html]
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini
new file mode 100644
index 00000000000..1604dd021c5
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-bottom-right-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-bottom-right-radius-composition.html]
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-bottom-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini
new file mode 100644
index 00000000000..da3928e72bf
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-outset-composition.html.ini
@@ -0,0 +1,169 @@
+[border-image-outset-composition.html]
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1) should be [300 500 800 700\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.5) should be [50px 50\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1.25) should be [325 550 900 750\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0) should be [100px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.75) should be [77 79 81px 83px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (1.25) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (1.25) should be [127 129 131px 133px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (1) should be [102 104 106px 108px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.75) should be [275 450 700 650\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (-0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.25) should be [27 29 31px 33px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1.25) should be [225 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1.25) should be [75px 75px 50px 50px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0.5) should be [52 54 56px 58px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (-0.25) should be [125px 125\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.25) should be [175px 175px 250px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1) should be [200 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.75) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.75) should be [175px 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (-0.25) should be [75px 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.25) should be [225 350 500 550\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.75) should be [175 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.5) should be [150px 150px 200px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.25) should be [125 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0) should be [100 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.25) should be [125px 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1.25) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0) should be [200 300 400 500\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.5) should be [150 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (0) should be [2 4 6px 8px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.5) should be [250 400 600 600\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.75) should be [25px 25\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0) should be [100px 100\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (-0.25) should be [75 75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.75) should be [125px 125px 150px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (0.5) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (-0.25) should be [175 250 300 450\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (-0.25) should be [225px 225px 350px 350px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1) should be [200px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1.25) should be [225px 275px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100 150px\] to add [200px 250\] at (1) should be [200px 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0) should be [200px 200px 300px 300px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3px 4px\] from add [1 2 3px 4px\] to add [101 102 103px 104px\] at (-0.25) should be [0 0 0px 0px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.25) should be [75px 75\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-outset> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.5) should be [150px 200px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini
new file mode 100644
index 00000000000..3b247e9bf05
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-slice-composition.html.ini
@@ -0,0 +1,169 @@
+[border-image-slice-composition.html]
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.75) should be [125% 125% 150% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.5) should be [150% 150% 200% 200%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (-0.25) should be [225% 225% 350% 350%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.75) should be [25% 25\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (1.25) should be [325 550 900 750 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (1.25) should be [0% 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (-0.25) should be [75 75%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.25) should be [100 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.75) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (1) should be [200 200%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.25) should be [225 350 500 550 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (1.25) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.5) should be [52 54 56% 58%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.5) should be [250 400 600 600 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.25) should be [75% 75\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (-0.25) should be [100 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (1) should be [0% 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (1) should be [300 500 800 700 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.5) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (-0.25) should be [175 250 300 450 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0.25) should be [175% 175% 250% 250%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0.5) should be [50% 50\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.75) should be [77 79 81% 83%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.75) should be [175 175%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.75) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (1.25) should be [75% 75% 50% 50%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0.25) should be [27 29 31% 33%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (-0.25) should be [0 0 0% 0%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0.25) should be [100% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (1) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (1.25) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (0) should be [2 4 6% 8%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0) should be [200 300 400 500 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0.5) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (1) should be [200% 250% fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (0) should be [200% 200% 300% 300%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (1.25) should be [127 129 131% 133%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.5) should be [150 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20%\] from add [190% 180% 290% 280%\] to add [90% 80%\] at (1) should be [100%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (-0.25) should be [125% 125\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100 150%\] to add [200% 250\] at (0) should be [100 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (1.25) should be [225 225%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0.25) should be [125 125%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10% 20\] from add [90% 80\] to replace [0% 0 0% 0\] at (0) should be [100% 100\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (-0.25) should be [100% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [1 2 3% 4%\] from add [1 2 3% 4%\] to add [101 102 103% 104%\] at (1) should be [102 104 106% 108%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [100 200 300 400 fill\] from add [100 fill\] to add [200 300 500 fill\] at (0.75) should be [275 450 700 650 fill\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20\] from add [100% 150%\] to add [200% 250% fill\] at (0) should be [100% 150%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-slice> underlying [10 20%\] from replace [100 100%\] to add [190 180%\] at (0) should be [100 100%\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini
new file mode 100644
index 00000000000..82af1c481b6
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-image-width-composition.html.ini
@@ -0,0 +1,169 @@
+[border-image-width-composition.html]
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.75) should be [77 79 81 83\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (-0.25) should be [0 0 0px 0%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.5) should be [52 54 56px 58%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (1.25) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.25) should be [27 29 31px 33%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0) should be [2 4 6 8\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1.25) should be [225px 275px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1) should be [102 104 106 108\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.75) should be [175 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.75) should be [275 450 700 650\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.25) should be [175px 175px 250px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.25) should be [225 350 500 550\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1.25) should be [75px 75px 50px 50px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (-0.25) should be [125px 125\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1.25) should be [225 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.5) should be [150px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1) should be [300 500 800 700\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.75) should be [125px 125px 150px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (1) should be [200px 250px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (-0.25) should be [75px 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (1) should be [102 104 106px 108%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (1) should be [200 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0) should be [2 4 6px 8%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.25) should be [75px 75\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (-0.25) should be [225px 225px 350px 350px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.5) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (1.25) should be [325 550 900 750\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (-0.25) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0) should be [200px 200px 300px 300px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.25) should be [125 125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (1) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.75) should be [175px 225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.25) should be [27 29 31 33\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0.75) should be [200% 250\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0.5) should be [250 400 600 600\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (1.25) should be [127 129 131px 133%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (-0.25) should be [175 250 300 450\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (0.5) should be [150px 150px 200px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (1.25) should be [0px 0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0) should be [100px 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100px 150px\] to add [200px 250px\] at (0.25) should be [125px 175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3px 4%\] from add [1 2 3px 4%\] to add [101 102 103px 104%\] at (0.75) should be [77 79 81px 83%\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [100 200 300 400\] from add [100\] to add [200 300 500\] at (0) should be [200 300 400 500\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20\] from add [100 150px\] to add [200% 250\] at (0) should be [100 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (-0.25) should be [75 75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (0.5) should be [52 54 56 58\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (-0.25) should be [0\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0.5) should be [150 150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10 20px\] from replace [100 100px\] to add [190 180px\] at (0) should be [100 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.75) should be [25px 25\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0) should be [100px 100\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20\] from add [90px 80\] to replace [0px 0 0px 0\] at (0.5) should be [50px 50\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [1 2 3 4\] from add [1 2 3 4\] to add [101 102 103 104\] at (1.25) should be [127 129 131 133\]]
+ expected: FAIL
+
+ [Compositing: property <border-image-width> underlying [10px 20px\] from add [190px 180px 290px 280px\] to add [90px 80px\] at (1) should be [100px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini
new file mode 100644
index 00000000000..25995a6b87f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-left-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-top-left-radius-composition.html]
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-left-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini
new file mode 100644
index 00000000000..682ccbf3446
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/animations/border-top-right-radius-composition.html.ini
@@ -0,0 +1,64 @@
+[border-top-right-radius-composition.html]
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1.25) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.25) should be [125px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0) should be [100px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.5) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (-0.25) should be [75px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1.25) should be [225px 100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (1.25) should be [225px 220px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.75) should be [175px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0.5) should be [150px 160px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (1) should be [200px 120px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (0) should be [100px 200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.25) should be [125px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0.75) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (0) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.25) should be [125px 140px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 40px\] from add [60px 60px\] to add [160px 160px\] at (-0.25) should be [75px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 140px\] from replace [100px 120px\] to add [160px 60px\] at (0.75) should be [175px 180px\]]
+ expected: FAIL
+
+ [Compositing: property <border-top-right-radius> underlying [40px 60px\] from add [60px 140px\] to replace [200px 120px\] at (-0.25) should be [75px 220px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-default.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-default.html.ini
new file mode 100644
index 00000000000..057dabc0515
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-default.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-default.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html.ini
new file mode 100644
index 00000000000..aa1989bb77c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image-composited-dynamic1.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html.ini
new file mode 100644
index 00000000000..5394b8fab7b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image-composited-dynamic2.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited.html.ini
new file mode 100644
index 00000000000..8a34587ad95
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-composited.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image-composited.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-computed-style.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-computed-style.html.ini
new file mode 100644
index 00000000000..57324a9b0df
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-computed-style.html.ini
@@ -0,0 +1,4 @@
+[image-orientation-from-image-computed-style.html]
+ [image-orientation:from-image computed style reports correct values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-content-images.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-content-images.html.ini
new file mode 100644
index 00000000000..35dbe9c5b2c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-content-images.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image-content-images.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html.ini
new file mode 100644
index 00000000000..ce44e995bf5
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image-dynamic1.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html.ini
new file mode 100644
index 00000000000..f7ee1605d04
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image-dynamic2.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-image-document.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-image-document.html.ini
new file mode 100644
index 00000000000..4b8e7851463
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image-image-document.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image-image-document.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image.html.ini
new file mode 100644
index 00000000000..341fd5a2699
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-from-image.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-from-image.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-computed-style.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-computed-style.html.ini
new file mode 100644
index 00000000000..f0c6302697b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-computed-style.html.ini
@@ -0,0 +1,4 @@
+[image-orientation-none-computed-style.html]
+ [image-orientation:none computed style reports correct values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-content-images.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-content-images.html.ini
new file mode 100644
index 00000000000..8545087eb40
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-content-images.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-none-content-images.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-image-document.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-image-document.html.ini
new file mode 100644
index 00000000000..dfbaa35f28c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none-image-document.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-none-image-document.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none.html.ini b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none.html.ini
new file mode 100644
index 00000000000..262691575b2
--- /dev/null
+++ b/tests/wpt/metadata/css/css-images/image-orientation/image-orientation-none.html.ini
@@ -0,0 +1,2 @@
+[image-orientation-none.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini
new file mode 100644
index 00000000000..e27601fb798
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/letter-spacing-composition.html.ini
@@ -0,0 +1,46 @@
+[letter-spacing-composition.html]
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <letter-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini
new file mode 100644
index 00000000000..bf9cc8cda70
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/text-indent-composition.html.ini
@@ -0,0 +1,94 @@
+[text-indent-composition.html]
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0.6) should be [110px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (1) should be [150px hanging\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0) should be [-100%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0.3) should be [80px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.6) should be [20%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.3) should be [-40%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (0) should be [50px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (1.5) should be [150px hanging\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0.6) should be [calc(100% + 110px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (1) should be [150px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0.6) should be [180px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (-0.3) should be [calc(100% + 20px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0.3) should be [calc(100% + 80px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (1.5) should be [200px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (1.5) should be [200%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (1) should be [100px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0.6) should be [150px hanging\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (0) should be [calc(100% + 50px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0.3) should be [240px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (1.5) should be [0px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px each-line hanging\] to replace [150px hanging each-line\] at (-0.3) should be [20px hanging each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (1.5) should be [calc(100% + 200px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (-0.3) should be [300px each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (0) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px\] from add [50px\] to replace [100px\] at (-0.3) should be [360px\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (0.5) should be [0%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (1) should be [100%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [50%\] from replace [-100%\] to add [50%\] at (-0.3) should be [-160%\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0) should be [300px each-line\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [100%\] from add [50px\] to add [150px\] at (1) should be [calc(100% + 150px)\]]
+ expected: FAIL
+
+ [Compositing: property <text-indent> underlying [250px each-line\] from add [50px each-line\] to replace [150px hanging\] at (0.3) should be [300px each-line\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini b/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini
new file mode 100644
index 00000000000..def2fce15d0
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/animations/word-spacing-composition.html.ini
@@ -0,0 +1,46 @@
+[word-spacing-composition.html]
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <word-spacing> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-ui/animation/caret-color-composition.html.ini b/tests/wpt/metadata/css/css-ui/animation/caret-color-composition.html.ini
new file mode 100644
index 00000000000..ae82fda3148
--- /dev/null
+++ b/tests/wpt/metadata/css/css-ui/animation/caret-color-composition.html.ini
@@ -0,0 +1,31 @@
+[caret-color-composition.html]
+ [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (-0.3) should be [rgb(120, 120, 120)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1.5) should be [rgb(250, 250, 250)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (-0.3) should be [rgb(70, 70, 70)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0) should be [rgb(100, 100, 100)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1) should be [rgb(200, 200, 200)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0.5) should be [rgb(200, 200, 200)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [auto\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0.5) should be [rgb(150, 150, 150)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1.5) should be [rgb(255, 255, 255)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (0) should be [rgb(150, 150, 150)\]]
+ expected: FAIL
+
+ [Compositing: property <caret-color> underlying [rgb(50, 50, 50)\] from add [rgb(100, 100, 100)\] to add [rgb(200, 200, 200)\] at (1) should be [rgb(250, 250, 250)\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-ui/animation/outline-offset-composition.html.ini b/tests/wpt/metadata/css/css-ui/animation/outline-offset-composition.html.ini
new file mode 100644
index 00000000000..ebb722b54a0
--- /dev/null
+++ b/tests/wpt/metadata/css/css-ui/animation/outline-offset-composition.html.ini
@@ -0,0 +1,61 @@
+[outline-offset-composition.html]
+ [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (1.5) should be [calc(-50px + 40em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (0) should be [calc(100px + 10em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (0.5) should be [calc(50px + 20em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (-0.3) should be [calc(130px + 4em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [10em\] from add [100px\] to add [20em\] at (1) should be [30em\]]
+ expected: FAIL
+
+ [Compositing: property <outline-offset> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-ui/animation/outline-width-composition.html.ini b/tests/wpt/metadata/css/css-ui/animation/outline-width-composition.html.ini
new file mode 100644
index 00000000000..307f72aadda
--- /dev/null
+++ b/tests/wpt/metadata/css/css-ui/animation/outline-width-composition.html.ini
@@ -0,0 +1,79 @@
+[outline-width-composition.html]
+ [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (-0.5) should be [114px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (1) should be [102px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (0) should be [calc(100px + 10em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (0) should be [110px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (-0.3) should be [19px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (1) should be [30em\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (1.5) should be [1px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (0) should be [150px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (2) should be [0px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (0.5) should be [calc(50px + 20em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (1) should be [250px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (1) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (0.5) should be [106px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (-0.3) should be [135px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (1.5) should be [225px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (0.5) should be [200px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (0.5) should be [11px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (1) should be [6px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (1.5) should be [calc(-50px + 40em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (1.5) should be [300px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [100px\] from add [10px\] to add [2px\] at (1.5) should be [98px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [thick\] from add [11px\] to add [thin\] at (0) should be [16px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [10em\] from add [100px\] to add [20em\] at (-0.3) should be [calc(130px + 4em)\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to add [200px\] at (-0.3) should be [120px\]]
+ expected: FAIL
+
+ [Compositing: property <outline-width> underlying [50px\] from add [100px\] to replace [200px\] at (0.5) should be [175px\]]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini b/tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini
new file mode 100644
index 00000000000..4c79907309b
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini
@@ -0,0 +1,4 @@
+[CaretPosition-001.html]
+ [Element at (400, 100)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini
new file mode 100644
index 00000000000..e38782d8c85
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini
@@ -0,0 +1,4 @@
+[elementFromPoint-001.html]
+ [CSSOM View - 5 - extensions to the Document interface]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini b/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini
new file mode 100644
index 00000000000..8ff7d008595
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/getClientRects-inline-inline-child.html.ini
@@ -0,0 +1,4 @@
+[getClientRects-inline-inline-child.html]
+ [sub element in a child inline box should not be included]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini
index 0fcea9e70f7..7459d90358e 100644
--- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini
+++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-absolute.html.ini
@@ -1,2 +1,973 @@
[getComputedStyle-insets-absolute.html]
- expected: TIMEOUT
+ [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini
index e46b9c445e0..dd428b03af0 100644
--- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini
+++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-fixed.html.ini
@@ -1,2 +1,973 @@
[getComputedStyle-insets-fixed.html]
- expected: TIMEOUT
+ [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages absolutize the computed value when overconstrained]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-nobox.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-nobox.html.ini
deleted file mode 100644
index 7ca66dc0456..00000000000
--- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-nobox.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[getComputedStyle-insets-nobox.html]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini
index 623f02a9f9a..60a7cddb8e3 100644
--- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini
+++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-relative.html.ini
@@ -1,2 +1,757 @@
[getComputedStyle-insets-relative.html]
- expected: TIMEOUT
+ [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve to used value]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves to used value]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-static.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-static.html.ini
deleted file mode 100644
index 555f2b80aae..00000000000
--- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-static.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[getComputedStyle-insets-static.html]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini
index 41718a2bea7..ad55e43fe66 100644
--- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini
+++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky-container-for-abspos.html.ini
@@ -1,2 +1,757 @@
[getComputedStyle-insets-sticky-container-for-abspos.html]
- expected: TIMEOUT
+ [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini
index 4723e4371f4..a9bd906e52d 100644
--- a/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini
+++ b/tests/wpt/metadata/css/cssom/getComputedStyle-insets-sticky.html.ini
@@ -1,2 +1,757 @@
[getComputedStyle-insets-sticky.html]
- expected: TIMEOUT
+ [horizontal-tb ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-lr rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl rtl inside vertical-rl ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-rl rtl - If end side is 'auto' and start side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-rl rtl - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb rtl inside horizontal-tb ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr rtl - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb rtl inside vertical-lr ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl ltr - Pixels resolve as-is]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb rtl - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-rl rtl - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [vertical-rl ltr inside vertical-rl rtl - Pixels resolve as-is]
+ expected: FAIL
+
+ [horizontal-tb ltr inside horizontal-tb ltr - If opposite sides are 'auto', they resolve as-is]
+ expected: FAIL
+
+ [vertical-rl ltr inside horizontal-tb ltr - Relative lengths are absolutized into pixels]
+ expected: FAIL
+
+ [horizontal-tb ltr inside vertical-lr ltr - If start side is 'auto' and end side is not, 'auto' resolves as-is]
+ expected: FAIL
+
+ [vertical-lr ltr inside vertical-lr ltr - calc() is absolutized into pixels]
+ expected: FAIL
+
+ [vertical-lr rtl inside horizontal-tb ltr - Percentages are absolutized into pixels]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini b/tests/wpt/metadata/custom-elements/Document-createElement.html.ini
index 228fc09afd7..ef2a2e288c1 100644
--- a/tests/wpt/metadata/custom-elements/Document-createElement.html.ini
+++ b/tests/wpt/metadata/custom-elements/Document-createElement.html.ini
@@ -1,10 +1,3 @@
[Document-createElement.html]
- [document.createElement with unknown "is" value should create "undefined" state element]
- expected: FAIL
-
[document.createElement must create an instance of autonomous custom elements when it has is attribute]
expected: FAIL
-
- [document.createElement()'s second argument is to be ignored when it's a string]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/custom-elements/Document-createElementNS.html.ini b/tests/wpt/metadata/custom-elements/Document-createElementNS.html.ini
deleted file mode 100644
index eca647d1fac..00000000000
--- a/tests/wpt/metadata/custom-elements/Document-createElementNS.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[Document-createElementNS.html]
- [document.createElementNS()'s third argument is to be ignored when it's a string]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini b/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini
index 92de0b6d054..196dd3decbd 100644
--- a/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini
+++ b/tests/wpt/metadata/custom-elements/builtin-coverage.html.ini
@@ -8,437 +8,221 @@
[a: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [a: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[abbr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [abbr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[address: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [address: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[area: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [area: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[article: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [article: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[aside: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [aside: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[audio: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [audio: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[b: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [b: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[base: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [base: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[bdi: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [bdi: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[bdo: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [bdo: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[blockquote: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [blockquote: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[body: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [body: document parser should instantiate a customized built-in element]
- expected: FAIL
[br: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [br: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[button: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [button: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[canvas: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [canvas: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[caption: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [caption: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[cite: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [cite: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[code: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [code: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[col: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [col: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[colgroup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [colgroup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[data: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [data: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[datalist: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [datalist: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dd: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dd: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[del: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [del: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[details: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [details: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dfn: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dfn: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dialog: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dialog: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[div: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [div: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dl: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dl: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[dt: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [dt: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[em: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [em: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[embed: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [embed: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[fieldset: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [fieldset: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[figcaption: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [figcaption: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[figure: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [figure: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[footer: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [footer: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[form: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [form: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h1: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h1: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h2: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h2: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h3: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h3: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h4: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h4: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h5: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h5: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[h6: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [h6: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[header: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [header: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[hgroup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [hgroup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[hr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [hr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[html: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [html: document parser should instantiate a customized built-in element]
- expected: FAIL
[i: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [i: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[iframe: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [iframe: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[img: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [img: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[input: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [input: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ins: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ins: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[kbd: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [kbd: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[label: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [label: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[legend: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [legend: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[li: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [li: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[link: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [link: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[main: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [main: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[map: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [map: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[mark: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [mark: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[menu: Define a customized built-in element]
expected: FAIL
[meta: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [meta: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[meter: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [meter: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[nav: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [nav: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[noscript: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [noscript: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[object: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [object: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ol: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ol: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[optgroup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [optgroup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[option: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [option: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[output: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [output: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[p: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [p: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[param: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [param: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[picture: Define a customized built-in element]
expected: FAIL
[pre: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [pre: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[progress: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [progress: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[q: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [q: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[rp: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [rp: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[rt: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [rt: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ruby: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ruby: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[s: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [s: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[samp: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [samp: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[script: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [script: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[section: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [section: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[select: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [select: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[small: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [small: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[source: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [source: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[span: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [span: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[strong: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [strong: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[style: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [style: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[sub: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [sub: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[summary: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [summary: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[sup: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [sup: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[table: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [table: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[tbody: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [tbody: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[td: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [td: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[template: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [template: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[textarea: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [textarea: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[tfoot: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [tfoot: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[th: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [th: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[thead: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [thead: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[time: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [time: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[title: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [title: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[tr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [tr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[track: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [track: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[u: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [u: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[ul: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [ul: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[var: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [var: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[video: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [video: innerHTML should instantiate a customized built-in element]
- expected: FAIL
[wbr: Operator 'new' should instantiate a customized built-in element]
expected: FAIL
- [wbr: innerHTML should instantiate a customized built-in element]
- expected: FAIL
diff --git a/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini b/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini
index 3c538145973..f38f6bafb44 100644
--- a/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini
+++ b/tests/wpt/metadata/custom-elements/custom-element-registry/upgrade.html.ini
@@ -1,16 +1,4 @@
[upgrade.html]
- [Upgrading an element directly (example from the spec)]
- expected: FAIL
-
- [Two elements as children of the upgraded node]
- expected: FAIL
-
- [Two elements as descendants of the upgraded node]
- expected: FAIL
-
[Two elements as shadow-including descendants (and not descendants) of the upgraded node]
expected: FAIL
- [Elements inside a template contents DocumentFragment node]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/custom-elements/upgrading.html.ini b/tests/wpt/metadata/custom-elements/upgrading.html.ini
index 8f4577d5b77..e8aee585a04 100644
--- a/tests/wpt/metadata/custom-elements/upgrading.html.ini
+++ b/tests/wpt/metadata/custom-elements/upgrading.html.ini
@@ -5,3 +5,9 @@
[If definition's disable shadow is true and element's shadow root is non-null, then throw a "NotSupportedError" DOMException.]
expected: FAIL
+ [Infinite constructor recursion with upgrade(this) should not be possible]
+ expected: FAIL
+
+ [Infinite constructor recursion with appendChild should not be possible]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini b/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini
index 589b0d6ff32..e7c91ebb270 100644
--- a/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini
+++ b/tests/wpt/metadata/custom-elements/upgrading/Document-importNode.html.ini
@@ -1,7 +1,4 @@
[Document-importNode.html]
- [built-in: document.importNode() should import "undefined" custom elements successfully]
- expected: FAIL
-
[Document-importNode]
expected: FAIL
diff --git a/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini b/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini
deleted file mode 100644
index 503570bcb71..00000000000
--- a/tests/wpt/metadata/custom-elements/upgrading/Node-cloneNode.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[Node-cloneNode.html]
- [Node.prototype.cloneNode(false) must be able to clone as a customized built-in element when it has an inconsistent "is" attribute]
- expected: FAIL
diff --git a/tests/wpt/metadata/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html.ini b/tests/wpt/metadata/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html.ini
new file mode 100644
index 00000000000..8ab70585687
--- /dev/null
+++ b/tests/wpt/metadata/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html.ini
@@ -0,0 +1,2 @@
+[remove-from-shadow-host-and-adopt-into-iframe.html]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.any.js.ini b/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.any.js.ini
deleted file mode 100644
index 05bb2f4b081..00000000000
--- a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.any.js.ini
+++ /dev/null
@@ -1,23 +0,0 @@
-[request-forbidden-headers.any.html]
- type: testharness
- [Accept-Encoding is a forbidden request header]
- expected: FAIL
-
- [Access-Control-Request-Headers is a forbidden request header]
- expected: FAIL
-
- [Access-Control-Request-Method is a forbidden request header]
- expected: FAIL
-
-
-[request-forbidden-headers.any.worker.html]
- type: testharness
- [Accept-Encoding is a forbidden request header]
- expected: FAIL
-
- [Access-Control-Request-Headers is a forbidden request header]
- expected: FAIL
-
- [Access-Control-Request-Method is a forbidden request header]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini b/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini
index d366c5a617b..c196a28ec0f 100644
--- a/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini
+++ b/tests/wpt/metadata/fetch/api/headers/header-values-normalize.html.ini
@@ -48,15 +48,6 @@
[fetch() with value %08]
expected: FAIL
- [fetch() with value %09]
- expected: FAIL
-
- [fetch() with value %0A]
- expected: FAIL
-
- [fetch() with value %0D]
- expected: FAIL
-
[XMLHttpRequest with value %0E]
expected: FAIL
@@ -164,7 +155,3 @@
[fetch() with value %1F]
expected: FAIL
-
- [fetch() with value %20]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini b/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini
index 64af50663e8..cd59efee25a 100644
--- a/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini
+++ b/tests/wpt/metadata/fetch/api/headers/headers-no-cors.window.js.ini
@@ -1,10 +1,4 @@
[headers-no-cors.window.html]
- ["no-cors" Headers object cannot have accept-language/\x01 as header]
- expected: FAIL
-
- ["no-cors" Headers object cannot have content-language/\x01 as header]
- expected: FAIL
-
["no-cors" Headers object cannot have content-type set to text/plain;ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, text/plain]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/request/request-headers.html.ini b/tests/wpt/metadata/fetch/api/request/request-headers.html.ini
deleted file mode 100644
index 58f805ae0c8..00000000000
--- a/tests/wpt/metadata/fetch/api/request/request-headers.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[request-headers.html]
- type: testharness
- [Testing empty Request Content-Type header]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini b/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini
index d5d77c14514..3340acba7e7 100644
--- a/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-init-002.html.ini
@@ -3,9 +3,6 @@
[Read Response's body as readableStream]
expected: FAIL
- [Testing empty Response Content-Type header]
- expected: FAIL
-
[Testing null Response body]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
index a424798d044..52662ab4ad3 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -1,7 +1,7 @@
[response.window.html]
expected: TIMEOUT
[fetch(): combined response Content-Type: text/plain ]
- expected: FAIL
+ expected: NOTRUN
[Response: combined response Content-Type: text/plain;charset=gbk text/plain;charset=windows-1252]
expected: NOTRUN
@@ -64,7 +64,7 @@
expected: NOTRUN
[fetch(): combined response Content-Type: text/html text/plain]
- expected: FAIL
+ expected: NOTRUN
[Request: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: NOTRUN
@@ -76,13 +76,13 @@
expected: NOTRUN
[Response: combined response Content-Type: text/plain ]
- expected: FAIL
+ expected: NOTRUN
[fetch(): combined response Content-Type: text/plain;charset=gbk text/plain]
expected: NOTRUN
[Request: combined response Content-Type: text/html text/plain]
- expected: FAIL
+ expected: NOTRUN
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/html;charset=windows-1254]
expected: FAIL
@@ -115,7 +115,7 @@
expected: NOTRUN
[Response: combined response Content-Type: text/html text/plain]
- expected: TIMEOUT
+ expected: NOTRUN
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/plain]
expected: FAIL
@@ -139,7 +139,7 @@
expected: FAIL
[Response: combined response Content-Type: text/plain]
- expected: FAIL
+ expected: TIMEOUT
[<iframe>: combined response Content-Type: text/plain;charset=gbk text/plain;charset=windows-1252]
expected: FAIL
@@ -235,7 +235,7 @@
expected: FAIL
[Request: combined response Content-Type: text/plain ]
- expected: FAIL
+ expected: NOTRUN
[Response: combined response Content-Type: text/html */*;charset=gbk]
expected: NOTRUN
@@ -271,7 +271,7 @@
expected: FAIL
[fetch(): separate response Content-Type: text/html text/plain]
- expected: FAIL
+ expected: NOTRUN
[Request: combined response Content-Type: text/html;" text/plain]
expected: NOTRUN
@@ -309,28 +309,25 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
- expected: FAIL
-
- [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
- expected: FAIL
-
- [<iframe>: combined response Content-Type: */* text/html]
+ [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;" \\" text/plain]
+ [<iframe>: combined response Content-Type: text/html;x=" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;" text/plain]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
+ [<iframe>: combined response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL
- [<iframe>: separate response Content-Type: text/plain */*]
+ [fetch(): separate response Content-Type: text/plain ]
+ expected: NOTRUN
+
+ [<iframe>: combined response Content-Type: */* text/html]
expected: FAIL
- [<iframe>: combined response Content-Type: text/plain;charset=gbk text/html]
+ [<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
diff --git a/tests/wpt/metadata/fetch/h1-parsing/resources-with-0x00-in-header.window.js.ini b/tests/wpt/metadata/fetch/h1-parsing/resources-with-0x00-in-header.window.js.ini
new file mode 100644
index 00000000000..9b4906adfc8
--- /dev/null
+++ b/tests/wpt/metadata/fetch/h1-parsing/resources-with-0x00-in-header.window.js.ini
@@ -0,0 +1,4 @@
+[resources-with-0x00-in-header.window.html]
+ [Expect network error for frame navigation to resource with 0x00 in a header]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
index 87c807a49ff..536384f36e1 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,3 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
+ [X-Content-Type-Options%3A%20%2Cnosniff]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
index 80ebd73cb00..0cb858e8b2e 100644
--- a/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
+++ b/tests/wpt/metadata/fetch/security/embedded-credentials.tentative.sub.html.ini
@@ -8,14 +8,11 @@
expected: FAIL
[Embedded credentials are treated as network errors in new windows.]
- expected: TIMEOUT
+ expected: FAIL
[Embedded credentials matching the top-level are treated as network errors for cross-origin URLs.]
expected: TIMEOUT
- [Embedded credentials matching the top-level are not treated as network errors for same-origin URLs.]
- expected: TIMEOUT
-
[Embedded credentials matching the top-level are not treated as network errors for relative URLs.]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
deleted file mode 100644
index 87b07c3e670..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_1.html]
- [Multiple history traversals from the same task]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
index 75d75b4cda2..385376c7321 100644
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
@@ -1,4 +1,4 @@
-[traverse_the_history_2.html]
+[traverse_the_history_4.html]
[Multiple history traversals, last would be aborted]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html.ini b/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html.ini
new file mode 100644
index 00000000000..684b01a4733
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html.ini
@@ -0,0 +1,4 @@
+[cross-origin-due-to-document-domain-only.html]
+ [Cross-origin due to document.domain]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini
index c026f0614c0..0a7f3af6a0f 100644
--- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini
@@ -62,9 +62,6 @@
[CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type]
expected: FAIL
- [CustomElementRegistry interface: operation upgrade(Node)]
- expected: FAIL
-
[OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled]
expected: FAIL
@@ -2106,9 +2103,6 @@
[HTMLSelectElement interface: attribute willValidate]
expected: FAIL
- [HTMLOptionElement interface: named constructor]
- expected: FAIL
-
[HTMLMarqueeElement interface: attribute hspace]
expected: FAIL
@@ -2253,9 +2247,6 @@
[HTMLInputElement interface: createInput("url") must inherit property "checkValidity()" with the proper type]
expected: FAIL
- [HTMLOptionElement interface: named constructor prototype property]
- expected: FAIL
-
[HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type]
expected: FAIL
@@ -2916,9 +2907,6 @@
[HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type]
expected: FAIL
- [HTMLScriptElement interface: attribute noModule]
- expected: FAIL
-
[HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(long)" with the proper type]
expected: FAIL
@@ -3147,9 +3135,6 @@
[HTMLInputElement interface: calling stepDown(long) on createInput("password") with too few arguments must throw TypeError]
expected: FAIL
- [HTMLOptionElement interface: named constructor object]
- expected: FAIL
-
[HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type]
expected: FAIL
@@ -3261,9 +3246,6 @@
[HTMLMarqueeElement interface: attribute bgColor]
expected: FAIL
- [Stringification of new Option()]
- expected: FAIL
-
[HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type]
expected: FAIL
@@ -3309,9 +3291,6 @@
[HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type]
expected: FAIL
- [HTMLOptionElement interface: new Option() must inherit property "label" with the proper type]
- expected: FAIL
-
[HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type]
expected: FAIL
@@ -3348,9 +3327,6 @@
[HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type]
expected: FAIL
- [HTMLOptionElement interface: new Option() must inherit property "form" with the proper type]
- expected: FAIL
-
[HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity()" with the proper type]
expected: FAIL
@@ -3441,9 +3417,6 @@
[HTMLSelectElement interface: operation setCustomValidity(DOMString)]
expected: FAIL
- [HTMLOptionElement interface: named constructor name]
- expected: FAIL
-
[HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type]
expected: FAIL
@@ -3456,9 +3429,6 @@
[HTMLTableElement interface: attribute rules]
expected: FAIL
- [HTMLOptionElement interface: named constructor length]
- expected: FAIL
-
[HTMLInputElement interface: createInput("email") must inherit property "stepUp(long)" with the proper type]
expected: FAIL
@@ -3744,9 +3714,6 @@
[HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type]
expected: FAIL
- [HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type]
- expected: FAIL
-
[HTMLFieldSetElement interface: attribute name]
expected: FAIL
@@ -3828,9 +3795,6 @@
[HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type]
expected: FAIL
- [HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type]
- expected: FAIL
-
[HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type]
expected: FAIL
@@ -3963,9 +3927,6 @@
[HTMLAreaElement interface: attribute noHref]
expected: FAIL
- [HTMLOptionElement interface: new Option() must inherit property "value" with the proper type]
- expected: FAIL
-
[HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type]
expected: FAIL
@@ -4182,9 +4143,6 @@
[HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type]
expected: FAIL
- [HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type]
- expected: FAIL
-
[HTMLElement interface: attribute contentEditable]
expected: FAIL
@@ -4290,9 +4248,6 @@
[HTMLFormElement interface: document.createElement("form") must inherit property "rel" with the proper type]
expected: FAIL
- [HTMLOptionElement must be primary interface of new Option()]
- expected: FAIL
-
[HTMLIFrameElement interface: attribute allowPaymentRequest]
expected: FAIL
@@ -4350,9 +4305,6 @@
[HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type]
expected: FAIL
- [HTMLOptionElement interface: new Option() must inherit property "text" with the proper type]
- expected: FAIL
-
[HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type]
expected: FAIL
@@ -4521,9 +4473,6 @@
[HTMLMediaElement interface: operation getStartDate()]
expected: FAIL
- [HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type]
- expected: FAIL
-
[HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type]
expected: FAIL
@@ -5028,3 +4977,6 @@
[SVGAElement includes HTMLHyperlinkElementUtils: member names are unique]
expected: FAIL
+ [HTMLOptionElement interface: named constructor without 'new']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-misc.html.ini b/tests/wpt/metadata/html/dom/reflection-misc.html.ini
index 4a991afe689..9ff7bf5a98b 100644
--- a/tests/wpt/metadata/html/dom/reflection-misc.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-misc.html.ini
@@ -17610,102 +17610,6 @@
[script.nonce: IDL set to object "test-valueOf"]
expected: FAIL
- [script.noModule: typeof IDL attribute]
- expected: FAIL
-
- [script.noModule: IDL get with DOM attribute unset]
- expected: FAIL
-
- [script.noModule: setAttribute() to ""]
- expected: FAIL
-
- [script.noModule: setAttribute() to " foo "]
- expected: FAIL
-
- [script.noModule: setAttribute() to undefined]
- expected: FAIL
-
- [script.noModule: setAttribute() to null]
- expected: FAIL
-
- [script.noModule: setAttribute() to 7]
- expected: FAIL
-
- [script.noModule: setAttribute() to 1.5]
- expected: FAIL
-
- [script.noModule: setAttribute() to true]
- expected: FAIL
-
- [script.noModule: setAttribute() to false]
- expected: FAIL
-
- [script.noModule: setAttribute() to object "[object Object\]"]
- expected: FAIL
-
- [script.noModule: setAttribute() to NaN]
- expected: FAIL
-
- [script.noModule: setAttribute() to Infinity]
- expected: FAIL
-
- [script.noModule: setAttribute() to -Infinity]
- expected: FAIL
-
- [script.noModule: setAttribute() to "\\0"]
- expected: FAIL
-
- [script.noModule: setAttribute() to object "test-toString"]
- expected: FAIL
-
- [script.noModule: setAttribute() to object "test-valueOf"]
- expected: FAIL
-
- [script.noModule: setAttribute() to "noModule"]
- expected: FAIL
-
- [script.noModule: IDL set to ""]
- expected: FAIL
-
- [script.noModule: IDL set to " foo "]
- expected: FAIL
-
- [script.noModule: IDL set to undefined]
- expected: FAIL
-
- [script.noModule: IDL set to null]
- expected: FAIL
-
- [script.noModule: IDL set to 7]
- expected: FAIL
-
- [script.noModule: IDL set to 1.5]
- expected: FAIL
-
- [script.noModule: IDL set to false]
- expected: FAIL
-
- [script.noModule: IDL set to object "[object Object\]"]
- expected: FAIL
-
- [script.noModule: IDL set to NaN]
- expected: FAIL
-
- [script.noModule: IDL set to Infinity]
- expected: FAIL
-
- [script.noModule: IDL set to -Infinity]
- expected: FAIL
-
- [script.noModule: IDL set to "\\0"]
- expected: FAIL
-
- [script.noModule: IDL set to object "test-toString"]
- expected: FAIL
-
- [script.noModule: IDL set to object "test-valueOf"]
- expected: FAIL
-
[menu.type: setAttribute() to "context"]
expected: FAIL
@@ -19212,9 +19116,6 @@
[undefinedelement.tabIndex: setAttribute() to "5%"]
expected: FAIL
- [script.noModule: setAttribute() to "5%"]
- expected: FAIL
-
[undefinedelement.dir: setAttribute() to "5%"]
expected: FAIL
@@ -19416,9 +19317,6 @@
[details.dir: setAttribute() to "5%"]
expected: FAIL
- [script.noModule: IDL set to "5%"]
- expected: FAIL
-
[summary.dir: IDL set to "5%"]
expected: FAIL
@@ -19440,9 +19338,6 @@
[script.accessKey: IDL set to "+100"]
expected: FAIL
- [script.noModule: IDL set to "+100"]
- expected: FAIL
-
[ins.dateTime: IDL set to "+100"]
expected: FAIL
@@ -19581,9 +19476,6 @@
[details.tabIndex: setAttribute() to "+100"]
expected: FAIL
- [script.noModule: setAttribute() to "+100"]
- expected: FAIL
-
[script.dir: setAttribute() to ".5"]
expected: FAIL
@@ -19611,9 +19503,6 @@
[menu.dir: IDL set to ".5"]
expected: FAIL
- [script.noModule: IDL set to ".5"]
- expected: FAIL
-
[dialog.tabIndex: setAttribute() to "+100"]
expected: FAIL
@@ -19839,9 +19728,6 @@
[dialog.dir: IDL set to "+100"]
expected: FAIL
- [script.noModule: setAttribute() to ".5"]
- expected: FAIL
-
[undefinedelement.enterKeyHint: setAttribute() to "+100"]
expected: FAIL
diff --git a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini
deleted file mode 100644
index 76dbb504708..00000000000
--- a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmloptionscollection.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[htmloptionscollection.html]
- type: testharness
- [HTMLOptionsCollection.add method insert HTMLOptionElement Option element]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index f1aa94c7ced..8b743f36e1d 100644
--- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -4,7 +4,7 @@
expected: FAIL
[Element with tabindex should support autofocus]
- expected: FAIL
+ expected: TIMEOUT
[Host element with delegatesFocus including no focusable descendants should be skipped]
expected: NOTRUN
@@ -16,5 +16,5 @@
expected: NOTRUN
[Non-HTMLElement should not support autofocus]
- expected: TIMEOUT
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/link-type-attribute.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/link-type-attribute.html.ini
new file mode 100644
index 00000000000..31c7aa49cfd
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/the-link-element/link-type-attribute.html.ini
@@ -0,0 +1,2 @@
+[link-type-attribute.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
index 4df5d7a35de..c6f45be1eb2 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -1,4 +1,5 @@
[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/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index 5f60c78e73c..f6a7aca3306 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,6 +1,5 @@
[iframe_sandbox_popups_escaping-3.html]
type: testharness
- expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini
index b83b69dd2bc..ee0eac0e9a4 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini
@@ -1,6 +1,5 @@
[form-validation-checkValidity.html]
type: testharness
- expected: ERROR
[[INPUT in TEXT status\] no constraint]
expected: FAIL
@@ -427,3 +426,27 @@
[[INPUT in EMAIL status\] not suffering from being too long (in a form)]
expected: FAIL
+ [[select\] no constraint (in a form)]
+ expected: FAIL
+
+ [[select\] suffering from being missing (in a form)]
+ expected: FAIL
+
+ [[textarea\] suffering from being missing (in a form)]
+ expected: FAIL
+
+ [[select\] no constraint]
+ expected: FAIL
+
+ [[select\] suffering from being missing]
+ expected: FAIL
+
+ [[textarea\] no constraint]
+ expected: FAIL
+
+ [[textarea\] suffering from being missing]
+ expected: FAIL
+
+ [[textarea\] no constraint (in a form)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini
index 4dbcff22c2c..d8114fa0ed1 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini
@@ -1,6 +1,5 @@
[form-validation-reportValidity.html]
type: testharness
- expected: ERROR
[[INPUT in TEXT status\] no constraint]
expected: FAIL
@@ -433,3 +432,27 @@
[[INPUT in EMAIL status\] not suffering from being too long (in a form)]
expected: FAIL
+ [[select\] no constraint (in a form)]
+ expected: FAIL
+
+ [[select\] suffering from being missing (in a form)]
+ expected: FAIL
+
+ [[textarea\] suffering from being missing (in a form)]
+ expected: FAIL
+
+ [[select\] no constraint]
+ expected: FAIL
+
+ [[select\] suffering from being missing]
+ expected: FAIL
+
+ [[textarea\] no constraint]
+ expected: FAIL
+
+ [[textarea\] suffering from being missing]
+ expected: FAIL
+
+ [[textarea\] no constraint (in a form)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini
index e9618f1c032..25ad3f2bd44 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-customError.html.ini
@@ -1,6 +1,5 @@
[form-validation-validity-customError.html]
type: testharness
- expected: ERROR
[[input\] The validity.customError must be true if the custom validity error message is not empty]
expected: FAIL
@@ -13,3 +12,15 @@
[[button\] The validity.customError must be false if the custom validity error message is empty]
expected: FAIL
+ [[select\] The validity.customError must be false i the custom validity error message is empty]
+ expected: FAIL
+
+ [[select\] The validity.customError must be true if the custom validity error message is not empty]
+ expected: FAIL
+
+ [[textarea\] The validity.customError must be false if the custom validity error message is empty]
+ expected: FAIL
+
+ [[textarea\] The validity.customError must be true if the custom validity error message is not empty]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini
index 3f11b627f2a..9fb1fc2bf7a 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valid.html.ini
@@ -1,6 +1,5 @@
[form-validation-validity-valid.html]
type: testharness
- expected: ERROR
[[INPUT in TEXT status\] validity.valid must be false if validity.tooLong is true]
expected: FAIL
@@ -154,3 +153,6 @@
[[INPUT in DATETIME-LOCAL status\] validity.valid must be false if validity.valueMissing is true]
expected: FAIL
+ [[textarea\] validity.valid must be false if validity.valueMissing is true]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini
index de840378f42..f6390136918 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-validity-valueMissing.html.ini
@@ -1,6 +1,5 @@
[form-validation-validity-valueMissing.html]
type: testharness
- expected: ERROR
[[INPUT in TEXT status\] The required attribute is not set]
expected: FAIL
@@ -304,3 +303,15 @@
[[INPUT in DATETIME-LOCAL status\] The value attribute is empty string]
expected: FAIL
+ [[textarea\] The value is not empty]
+ expected: FAIL
+
+ [[textarea\] The value is empty]
+ expected: FAIL
+
+ [[textarea\] The required attribute is not set]
+ expected: FAIL
+
+ [[select\] Selected the option with value equals to empty]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini
index 599a5aeb57c..3823eb5fe6a 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-willValidate.html.ini
@@ -1,6 +1,5 @@
[form-validation-willValidate.html]
type: testharness
- expected: ERROR
[[INPUT in HIDDEN status\] Must be barred from the constraint validation]
expected: FAIL
@@ -268,3 +267,21 @@
[[output\] The willValidate attribute must be false since OUTPUT is not a submittable element]
expected: FAIL
+ [[textarea\] Must be barred from the constraint validation]
+ expected: FAIL
+
+ [[textarea\] The willValidate attribute must be false if it has a datalist ancestor]
+ expected: FAIL
+
+ [[textarea\] The willValidate attribute must be true if an element is mutable]
+ expected: FAIL
+
+ [[select\] The willValidate attribute must be false if it has a datalist ancestor]
+ expected: FAIL
+
+ [[select\] The willValidate attribute must be true if an element is mutable]
+ expected: FAIL
+
+ [[select\] Must be barred from the constraint validation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-menu-historical.html.ini b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-menu-historical.html.ini
deleted file mode 100644
index b548f3cb3ed..00000000000
--- a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-menu-historical.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[button-menu-historical.html]
- type: testharness
- [button.type reflects properly]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/clone.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/clone.html.ini
deleted file mode 100644
index 04df058a43f..00000000000
--- a/tests/wpt/metadata/html/semantics/forms/the-input-element/clone.html.ini
+++ /dev/null
@@ -1,56 +0,0 @@
-[clone.html]
- type: testharness
- [Checkbox must retain checked state.]
- expected: FAIL
-
- [Checkbox must retain unchecked state.]
- expected: FAIL
-
- [Radiobutton must retain checked state.]
- expected: FAIL
-
- [Radiobutton must retain unchecked state.]
- expected: FAIL
-
- [Text field must retain changed value.]
- expected: FAIL
-
- [Search field must retain changed value.]
- expected: FAIL
-
- [Phone number field must retain changed value.]
- expected: FAIL
-
- [URL field must retain changed value.]
- expected: FAIL
-
- [Email field must retain changed value.]
- expected: FAIL
-
- [Password field must retain changed value.]
- expected: FAIL
-
- [Date field must retain changed value.]
- expected: FAIL
-
- [Month field must retain changed value.]
- expected: FAIL
-
- [Week field must retain changed value.]
- expected: FAIL
-
- [Time field must retain changed value.]
- expected: FAIL
-
- [Datetime (local) field must retain changed value.]
- expected: FAIL
-
- [Number field must retain changed value.]
- expected: FAIL
-
- [Range control must retain changed value.]
- expected: FAIL
-
- [Color picker must retain changed value.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/cloning-steps.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/cloning-steps.html.ini
deleted file mode 100644
index c3cb6115f85..00000000000
--- a/tests/wpt/metadata/html/semantics/forms/the-input-element/cloning-steps.html.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[cloning-steps.html]
- type: testharness
- [input element's value should be cloned]
- expected: FAIL
-
- [input element's dirty value flag should be cloned, so setAttribute doesn't affect the cloned input's value]
- expected: FAIL
-
- [input element's checkedness should be cloned]
- expected: FAIL
-
- [input element's dirty checkedness should be cloned, so setAttribute doesn't affect the cloned input's checkedness]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini
deleted file mode 100644
index 69e88a9bd4e..00000000000
--- a/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini
+++ /dev/null
@@ -1,26 +0,0 @@
-[radio-groupname-case.html]
- type: testharness
- [radio button group name = paSSfield-killroyß]
- expected: FAIL
-
- [Among names like sImPlE, everything must be checkable at the same time]
- expected: FAIL
-
- [Among names like paSSfield-killroyß, everything must be checkable at the same time]
- expected: FAIL
-
- [Among names like глупый, everything must be checkable at the same time]
- expected: FAIL
-
- [Among names like åωk, everything must be checkable at the same time]
- expected: FAIL
-
- [Among names like blah1, everything must be checkable at the same time]
- expected: FAIL
-
- [Among names like tÉdz5アパートFi, everything must be checkable at the same time]
- expected: FAIL
-
- [Among names like ΣΣ, everything must be checkable at the same time]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini b/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini
index bb06ff82a5a..a5ca46944d7 100644
--- a/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.sub.html.ini
@@ -1,31 +1,3 @@
[label-attributes.sub.html]
- [The labeled control for a label element that has no 'for' attribute is the first labelable element which is a descendant of that label element.]
- expected: FAIL
-
- [A non-control follows by a control with same ID.]
- expected: FAIL
-
- [A labelable element is moved to outside of nested associated labels.]
- expected: FAIL
-
- [A labelable element is moved to inside of nested associated labels.]
- expected: FAIL
-
- [A labelable element which is a descendant of non-labelable element is moved to outside of associated label.]
- expected: FAIL
-
- [A labelable element is moved to iframe.]
- expected: FAIL
-
- [A div element which contains labelable element is removed.]
- expected: FAIL
-
- [A labelable element not in a document can label element in the same tree.]
- expected: FAIL
-
[A labelable element inside the shadow DOM.]
expected: FAIL
-
- [A form control has an implicit label.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini b/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini
index 8228dc83f92..806e80ede3c 100644
--- a/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/the-label-element/labelable-elements.html.ini
@@ -2,7 +2,3 @@
type: testharness
[Check if the keygen element is a labelable element]
expected: FAIL
-
- [Check if the hidden input element has null 'labels']
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/forms/the-option-element/option-element-constructor.html.ini b/tests/wpt/metadata/html/semantics/forms/the-option-element/option-element-constructor.html.ini
deleted file mode 100644
index 25d32bc456c..00000000000
--- a/tests/wpt/metadata/html/semantics/forms/the-option-element/option-element-constructor.html.ini
+++ /dev/null
@@ -1,35 +0,0 @@
-[option-element-constructor.html]
- type: testharness
- [Option constructor with no arguments]
- expected: FAIL
-
- [Option constructor with falsy arguments]
- expected: FAIL
-
- [Option constructor creates HTMLOptionElement with specified text and value]
- expected: FAIL
-
- [Option constructor handles selectedness correctly when specified with defaultSelected only]
- expected: FAIL
-
- [Option constructor handles selectedness correctly, even when incongruous with defaultSelected]
- expected: FAIL
-
- [Option constructor treats undefined text and value correctly]
- expected: FAIL
-
- [Option constructor treats empty text and value correctly]
- expected: FAIL
-
- [Option constructor treats falsy selected and defaultSelected correctly]
- expected: FAIL
-
- [Option constructor treats truthy selected and defaultSelected correctly]
- expected: FAIL
-
- [Option constructor does not set dirtiness (so, manipulating the selected content attribute still updates the selected IDL attribute)]
- expected: FAIL
-
- [Prototype of object created with named constructor]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini
index 8ee01faecbd..0ea72a3bf48 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html.ini
@@ -1,14 +1,13 @@
[utf8.tentative.html]
- expected: TIMEOUT
[windows-1252]
- expected: NOTRUN
+ expected: FAIL
[utf-7]
- expected: NOTRUN
+ expected: FAIL
[shift-jis]
- expected: NOTRUN
+ expected: FAIL
[utf-8]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini
deleted file mode 100644
index d958b30d7f4..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[charset-01.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini
index a919b698590..08b105f3507 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini
@@ -1,3 +1,7 @@
[charset-02.html]
- type: testharness
- expected: TIMEOUT
+ [UTF-16 module script with UTF-16LE BOM]
+ expected: FAIL
+
+ [UTF-16 module script with UTF-16BE BOM]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini
deleted file mode 100644
index 16b43178406..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[charset-03.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html.ini
deleted file mode 100644
index 2046faa6ed8..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[choice-of-error-1.html]
- [Parse errors in different files should be reported depending on different roots]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html.ini
deleted file mode 100644
index 9d55b00ff31..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[choice-of-error-2.html]
- [Instantiation errors in different files should be reported depending on different roots]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html.ini
deleted file mode 100644
index 19e185bb343..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[choice-of-error-3.html]
- [Evaluation errors are cached in intermediate module scripts]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-1.html.ini
deleted file mode 100644
index 689887b78e1..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-1.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[compilation-error-1.html]
- type: testharness
- [Test that syntax errors lead to SyntaxError events on window, and that exceptions are remembered.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-2.html.ini
deleted file mode 100644
index 5d518d97d25..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/compilation-error-2.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[compilation-error-2.html]
- type: testharness
- [Test that syntax errors lead to SyntaxError events on window, and that exceptions are remembered.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini
index 2e41efe9ac7..1d6ade5a09d 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini
@@ -1,3 +1,4 @@
+
[credentials.sub.html]
type: testharness
[Modules should be loaded with or without the credentials based on the same-origin-ness and the crossOrigin attribute]
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/crossorigin.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/crossorigin.html.ini
deleted file mode 100644
index 20738173875..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/crossorigin.html.ini
+++ /dev/null
@@ -1,32 +0,0 @@
-[crossorigin.html]
- type: testharness
- [Root module, Error in CORS-different-origin script]
- expected: FAIL
-
- [Root module, Error in CORS-same-origin script]
- expected: FAIL
-
- [Root module, Blocked script download, missing CORS ACAO header]
- expected: FAIL
-
- [Root module, Blocked script download, mismatched CORS ACAO header]
- expected: FAIL
-
- [Imported module, Error in CORS-different-origin script]
- expected: FAIL
-
- [Imported module, Error in CORS-same-origin script]
- expected: FAIL
-
- [Imported module, Blocked script download, missing CORS ACAO header]
- expected: FAIL
-
- [Imported module, Blocked script download, mismatched CORS ACAO header]
- expected: FAIL
-
- [Root module, Blocked script download, crossorigin attribute with missing CORS ACAO header]
- expected: FAIL
-
- [Imported module, Blocked script download, crossorigin attribute with missing CORS ACAO header]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/currentScript-null.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/currentScript-null.html.ini
deleted file mode 100644
index b3d97af5ba7..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/currentScript-null.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[currentScript-null.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini
deleted file mode 100644
index 4a87a4b2bba..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[custom-element-exception.html]
- type: testharness
- [Test that exceptions from the constructor of a custom element inside a module are propagated as expected.\n]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html.ini
deleted file mode 100644
index 53623ca1a01..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-1.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[duplicated-imports-1.html]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html.ini
deleted file mode 100644
index 39e00fd52ce..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/duplicated-imports-2.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[duplicated-imports-2.html]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html.ini
deleted file mode 100644
index 6af93a6e94e..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[error-and-slow-dependency.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-2.html.ini
deleted file mode 100644
index e24139fb1a2..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-2.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[error-type-2.html]
- [parse error has higher priority than instantiation error]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-3.html.ini
deleted file mode 100644
index 58cc436ec05..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/error-type-3.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[error-type-3.html]
- [instantiation error has higher priority than evaluation error]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/errorhandling.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/errorhandling.html.ini
deleted file mode 100644
index 6d3d5fdd67c..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/errorhandling.html.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-[errorhandling.html]
- type: testharness
- expected: TIMEOUT
- [IFrame test: 'iframe_parseError_Root']
- expected: FAIL
-
- [IFrame test: 'iframe_parseError_Dependent']
- expected: FAIL
-
- [IFrame test: 'iframe_parseError_DependentMultiple']
- expected: FAIL
-
- [External root module with non-script mimetype]
- expected: NOTRUN
-
- [Module with imported non-script mimetype]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html.ini
deleted file mode 100644
index 35ee19e1418..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[evaluation-error-1.html]
- type: testharness
- [Test that exceptions during evaluation lead to error events on window, and that exceptions are remembered.\n]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html.ini
deleted file mode 100644
index f71474208e5..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-2.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[evaluation-error-2.html]
- type: testharness
- [Test that ill-founded cyclic dependencies cause ReferenceError during evaluation, which leads to error events on window, and that exceptions are remembered.\n]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html.ini
deleted file mode 100644
index c2cb5cd0442..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-3.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[evaluation-error-3.html]
- type: testharness
- [Test that exceptions during evaluation lead to error events on window, and that exceptions are remembered.\n]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html.ini
deleted file mode 100644
index 16e2ac18463..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/evaluation-error-4.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[evaluation-error-4.html]
- type: testharness
- [Test that exceptions during evaluation lead to error events on window, and that exceptions are remembered.\n]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/execorder.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/execorder.html.ini
deleted file mode 100644
index 6df8f6cb577..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/execorder.html.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-[execorder.html]
- type: testharness
- expected: TIMEOUT
- [Unordered module script execution (parsed, unordered #1)]
- expected: NOTRUN
-
- [Unordered module script execution (parsed, unordered #2)]
- expected: NOTRUN
-
- [Unordered module script execution (dynamic, unordered #1)]
- expected: NOTRUN
-
- [Unordered module script execution (dynamic, unordered #2)]
- expected: NOTRUN
-
- [Interlaced module/non-module script execution (parsed, async-ordered)]
- expected: FAIL
-
- [Interlaced module/non-module script execution (dynamic, async-ordered)]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-1.html.ini
deleted file mode 100644
index 7ad54e37be7..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-1.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[fetch-error-1.html]
- type: testharness
- [Test that failure to fetch root leads to error event on script.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-2.html.ini
deleted file mode 100644
index e6acfd3210b..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/fetch-error-2.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[fetch-error-2.html]
- type: testharness
- [Test that failure to fetch dependency leads to error event on script.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html.ini
deleted file mode 100644
index c9bcdffbd0d..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/import-subgraph-404.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[import-subgraph-404.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/imports.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/imports.html.ini
deleted file mode 100644
index 8ca41f2b813..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/imports.html.ini
+++ /dev/null
@@ -1,15 +0,0 @@
-[imports.html]
- type: testharness
- expected: TIMEOUT
- [Import a module that tries to import itself]
- expected: NOTRUN
-
- [Import a module with a cyclical module dependency]
- expected: NOTRUN
-
- [Import a module that validly imports itself]
- expected: NOTRUN
-
- [Import a module with a valid cyclical module dependency]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inactive-context-import.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inactive-context-import.html.ini
new file mode 100644
index 00000000000..354ea7cb7c8
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inactive-context-import.html.ini
@@ -0,0 +1,5 @@
+[inactive-context-import.html]
+ type: testharness
+ [dynamic import from inactive context should not crash]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html.ini
deleted file mode 100644
index 54dcc064e7e..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/inline-async-execorder.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[inline-async-execorder.html]
- [Inline async module script execution order]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html.ini
deleted file mode 100644
index b3fdd6f764e..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-1.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[instantiation-error-1.html]
- type: testharness
- [Test that missing exports lead to SyntaxError events on window and load events on script, and that exceptions are remembered]
- expected: FAIL
-
- [Test that missing exports lead to SyntaxError events on window and load events on script]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html.ini
deleted file mode 100644
index c5e6fec931a..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-2.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[instantiation-error-2.html]
- type: testharness
- [Test that missing exports lead to SyntaxError events on window and load events on script, and that exceptions are remembered]
- expected: FAIL
-
- [Test that missing exports lead to SyntaxError events on window and load events on script]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html.ini
deleted file mode 100644
index 25019f2ce0f..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-3.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[instantiation-error-3.html]
- type: testharness
- [Test that unresolvable cycles lead to SyntaxError events on window and load events on script, and that exceptions are remembered]
- expected: FAIL
-
- [Test that unresolvable cycles lead to SyntaxError events on window and load events on script]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini
deleted file mode 100644
index 8acedfbc746..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[instantiation-error-4.html]
- type: testharness
- [Test that loading a graph in which a module is already errored results in that module's error.]
- expected: FAIL
-
- [Test that loading a graph in which a module is already errored results in an error.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini
deleted file mode 100644
index 44be8de5091..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[instantiation-error-5.html]
- type: testharness
- [Test that loading a graph in which a module is already errored results in that module's error.]
- expected: FAIL
-
- [Test that loading a graph in which a module is already errored results an error.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini
deleted file mode 100644
index c1729535a19..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[instantiation-error-6.html]
- type: testharness
- [Test that ambiguous star exports lead to an instantiation error and that the correct module is blamed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini
deleted file mode 100644
index 152942c5092..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[instantiation-error-7.html]
- type: testharness
- [Test that ambiguous star exports lead to an instantiation error, even when discovered through a star export, and that the correct module is blamed.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini
deleted file mode 100644
index 693c8174ed9..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[instantiation-error-8.html]
- type: testharness
- expected: TIMEOUT
- [Instantiate attempt on a tree w/ previously instantiate-failed tree as a sub-tree shouldn't crash.]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini
deleted file mode 100644
index 5bcd6c0a462..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[integrity.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html.ini
deleted file mode 100644
index 1006d488052..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[late-namespace-request.html]
- type: testharness
- [Test the situation where a module is instantiated without the need for a namespace object, but later on a different module requests the namespace.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-star-export-request.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-star-export-request.html.ini
deleted file mode 100644
index 09abe701e73..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/late-star-export-request.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[late-star-export-request.html]
- type: testharness
- [Test the situation where a module is instantiated without a use of its star-exports, but later on a different module requests them.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini
index e911f6b7fb9..1753a0856d7 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini
@@ -1,27 +1,5 @@
+
[load-error-events-inline.html]
type: testharness
- expected: TIMEOUT
- [src, 200, parser-inserted, defer, no async]
- expected: NOTRUN
-
- [src, 200, parser-inserted, no defer, async]
- expected: NOTRUN
-
- [src, 200, not parser-inserted, no defer, no async, no non-blocking]
- expected: NOTRUN
-
- [src, 200, not parser-inserted, no defer, async]
- expected: NOTRUN
-
- [src, 404, parser-inserted, defer, no async]
- expected: NOTRUN
-
- [src, 404, parser-inserted, no defer, async]
- expected: NOTRUN
-
- [src, 404, not parser-inserted, no defer, no async, no non-blocking]
- expected: NOTRUN
-
- [src, 404, not parser-inserted, no defer, async]
- expected: NOTRUN
+ expected: CRASH
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini
deleted file mode 100644
index b0a60904841..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini
+++ /dev/null
@@ -1,27 +0,0 @@
-[load-error-events.html]
- type: testharness
- expected: TIMEOUT
- [src, 200, parser-inserted, defer, no async]
- expected: NOTRUN
-
- [src, 200, parser-inserted, no defer, async]
- expected: NOTRUN
-
- [src, 200, not parser-inserted, no defer, no async, no non-blocking]
- expected: NOTRUN
-
- [src, 200, not parser-inserted, no defer, async]
- expected: NOTRUN
-
- [src, 404, parser-inserted, defer, no async]
- expected: NOTRUN
-
- [src, 404, parser-inserted, no defer, async]
- expected: NOTRUN
-
- [src, 404, not parser-inserted, no defer, no async, no non-blocking]
- expected: NOTRUN
-
- [src, 404, not parser-inserted, no defer, async]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini
deleted file mode 100644
index ad0ec28d799..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[module-in-xhtml.xhtml]
- type: testharness
- [module script in XHTML documents should be evaluated.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html.ini
deleted file mode 100644
index d91d145d1dc..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[module-vs-script-1.html]
- type: testharness
- [Test that evaluating something as classic script does not prevent it from being evaluated as module script.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html.ini
deleted file mode 100644
index 4864da5dc6a..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-vs-script-2.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[module-vs-script-2.html]
- type: testharness
- [Test that evaluating something as classic script does not prevent it from being evaluated as module script.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/nomodule-attribute.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/nomodule-attribute.html.ini
deleted file mode 100644
index e595c3421fa..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/nomodule-attribute.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[nomodule-attribute.html]
- type: testharness
- [Test that 'nomodule' has the desired effect on classic scripts, but no effect on module scripts.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html.ini
deleted file mode 100644
index 634cf356318..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-no-referrer.sub.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[referrer-no-referrer.sub.html]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini
index 92d04781a2e..a212c8c0e93 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html.ini
@@ -1,2 +1,19 @@
[referrer-origin-when-cross-origin.sub.html]
- expected: TIMEOUT
+ [Importing a remote-origin descendant script from a same-origin top-level script with the origin-when-cross-origin policy.]
+ expected: FAIL
+
+ [Importing a same-origin descendant script from a same-origin top-level script with the origin-when-cross-origin policy.]
+ expected: FAIL
+
+ [Importing a remote-origin descendant script from a remote-origin top-level script with the origin-when-cross-origin policy.]
+ expected: FAIL
+
+ [Importing a same-origin top-level script with the origin-when-cross-origin policy.]
+ expected: FAIL
+
+ [Importing a same-origin descendant script from a remote-origin top-level script with the origin-when-cross-origin policy.]
+ expected: FAIL
+
+ [Importing a remote-origin top-level script with the origin-when-cross-origin policy.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini
index 9a2db3d8993..413900f14b9 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-origin.sub.html.ini
@@ -1,2 +1,19 @@
[referrer-origin.sub.html]
- expected: TIMEOUT
+ [Importing a same-origin descendant script from a same-origin top-level script with the origin policy.]
+ expected: FAIL
+
+ [Importing a remote-origin descendant script from a same-origin top-level script with the origin policy.]
+ expected: FAIL
+
+ [Importing a remote-origin descendant script from a remote-origin top-level script with the origin policy.]
+ expected: FAIL
+
+ [Importing a same-origin descendant script from a remote-origin top-level script with the origin policy.]
+ expected: FAIL
+
+ [Importing a same-origin top-level script with the origin policy.]
+ expected: FAIL
+
+ [Importing a remote-origin top-level script with the origin policy.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini
index d499edb6fc8..ce528d7e641 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-same-origin.sub.html.ini
@@ -1,2 +1,10 @@
[referrer-same-origin.sub.html]
- expected: TIMEOUT
+ [Importing a same-origin descendant script from a same-origin top-level script with the same-origin policy.]
+ expected: FAIL
+
+ [Importing a same-origin descendant script from a remote-origin top-level script with the same-origin policy.]
+ expected: FAIL
+
+ [Importing a same-origin top-level script with the same-origin policy.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini
index 2b700b1c9b4..c1eeb5dcec7 100644
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/referrer-unsafe-url.sub.html.ini
@@ -1,2 +1,19 @@
[referrer-unsafe-url.sub.html]
- expected: TIMEOUT
+ [Importing a same-origin descendant script from a remote-origin top-level script with the unsafe-url policy.]
+ expected: FAIL
+
+ [Importing a same-origin descendant script from a same-origin top-level script with the unsafe-url policy.]
+ expected: FAIL
+
+ [Importing a remote-origin top-level script with the unsafe-url policy.]
+ expected: FAIL
+
+ [Importing a remote-origin descendant script from a remote-origin top-level script with the unsafe-url policy.]
+ expected: FAIL
+
+ [Importing a remote-origin descendant script from a same-origin top-level script with the unsafe-url policy.]
+ expected: FAIL
+
+ [Importing a same-origin top-level script with the unsafe-url policy.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/script-for-event.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/script-for-event.html.ini
deleted file mode 100644
index 3ad68cd5f47..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/script-for-event.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[script-for-event.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html.ini
deleted file mode 100644
index e5b288d78e0..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-1.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[single-evaluation-1.html]
- type: testharness
- [Test that a module is evaluated only once, and that 'this' is undefined (because of strict mode).]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html.ini
deleted file mode 100644
index c47fc9c8a4c..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/single-evaluation-2.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[single-evaluation-2.html]
- type: testharness
- [Test that a module is evaluated only once, and that 'this' is undefined (because of strict mode).]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/slow-cycle.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/slow-cycle.html.ini
deleted file mode 100644
index 37c99441cc7..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/slow-cycle.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[slow-cycle.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/specifier-error.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/specifier-error.html.ini
deleted file mode 100644
index 44e8c1ebac6..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/specifier-error.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[specifier-error.html]
- type: testharness
- [Test that invalid module specifier leads to TypeError on window.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-reflect.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-reflect.html.ini
deleted file mode 100644
index 333bbf3d0e9..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-reflect.html.ini
+++ /dev/null
@@ -1,32 +0,0 @@
-[nomodule-reflect.html]
- type: testharness
- [noModule IDL attribute on a parser created classic script element without nomodule content attribute]
- expected: FAIL
-
- [noModule IDL attribute on a parser created classic script element with nomodule content attribute]
- expected: FAIL
-
- [noModule IDL attribute on a parser created module script element without nomodule content attribute]
- expected: FAIL
-
- [noModule IDL attribute on a parser created module script element with nomodule content attribute]
- expected: FAIL
-
- [noModule IDL attribute on a dynamically created script element without nomodule content attribute]
- expected: FAIL
-
- [noModule IDL attribute on a dynamically created script element after nomodule content attribute is set to "nomodule"]
- expected: FAIL
-
- [noModule IDL attribute on a dynamically created script element after nomodule content attribute is set to ""]
- expected: FAIL
-
- [noModule IDL attribute on a dynamically created script element after nomodule content attribute had been removed]
- expected: FAIL
-
- [noModule IDL attribute must add nomodule content attribute on setting to true]
- expected: FAIL
-
- [noModule IDL attribute must remove nomodule content attribute on setting to false]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html.ini
deleted file mode 100644
index 2a43be95639..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-async-classic-script.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[nomodule-set-on-async-classic-script.html]
- type: testharness
- [An asynchronously loaded classic script with noModule set to true must not run]
- expected: FAIL
-
- [An asynchronously loaded classic script with noModule set to false must run]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html.ini
deleted file mode 100644
index 926d065aecd..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-external-module-script.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[nomodule-set-on-external-module-script.html]
- type: testharness
- [An external module script with nomodule content attribute must run]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html.ini
deleted file mode 100644
index cf471744a60..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-classic-scripts.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[nomodule-set-on-inline-classic-scripts.html]
- type: testharness
- [An inline classic script with nomodule content attribute must not run]
- expected: FAIL
-
- [An inline classic script element dynamically inserted after noModule was set to true must not run.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html.ini
deleted file mode 100644
index 898f25c4217..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-inline-module-script.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[nomodule-set-on-inline-module-script.html]
- type: testharness
- [An inline module script with nomodule content attribute must run]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html.ini
deleted file mode 100644
index 6bb6e4244ff..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/nomodule-set-on-synchronously-loaded-classic-scripts.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[nomodule-set-on-synchronously-loaded-classic-scripts.html]
- type: testharness
- [A synchronously loaded external classic script with nomodule content attribute must not run]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini b/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini
deleted file mode 100644
index ce482a60da8..00000000000
--- a/tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[aborted-parser.window.html]
- [document.open() after parser is aborted]
- expected: FAIL
-
- [async document.open() after parser is aborted]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini b/tests/wpt/metadata/webmessaging/with-ports/017.html.ini
deleted file mode 100644
index 064cf47545b..00000000000
--- a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[017.html]
- expected: TIMEOUT
- [origin of the script that invoked the method, about:blank]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html.ini b/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html.ini
deleted file mode 100644
index c810dcf32ed..00000000000
--- a/tests/wpt/metadata/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[message-event.html]
- type: testharness
- [Properties of the 'message' event]
- expected: FAIL
-
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index b259b7bc24d..559e6baff6c 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -19024,7 +19024,7 @@
"testharness"
],
"mozilla/interfaces.html": [
- "08e8181e6e639caeaecd84c16d582c0ec3f99474",
+ "945a8b33a109b0cc37db9351f94b9afd3eac798e",
"testharness"
],
"mozilla/interfaces.js": [
diff --git a/tests/wpt/mozilla/tests/mozilla/interfaces.html b/tests/wpt/mozilla/tests/mozilla/interfaces.html
index 08e8181e6e6..945a8b33a10 100644
--- a/tests/wpt/mozilla/tests/mozilla/interfaces.html
+++ b/tests/wpt/mozilla/tests/mozilla/interfaces.html
@@ -186,6 +186,7 @@ test_interfaces([
"NodeList",
"OfflineAudioCompletionEvent",
"OfflineAudioContext",
+ "Option",
"OscillatorNode",
"PageTransitionEvent",
"PannerNode",
diff --git a/tests/wpt/web-platform-tests/common/security-features/README.md b/tests/wpt/web-platform-tests/common/security-features/README.md
index 98afe1af1be..c19874653a7 100644
--- a/tests/wpt/web-platform-tests/common/security-features/README.md
+++ b/tests/wpt/web-platform-tests/common/security-features/README.md
@@ -143,7 +143,7 @@ For examples of spec JSON files, see [referrer-policy/spec.src.json](../../refer
* **`excluded_tests`**
- List of ```test_expansion``` patterns expanding into selections which get skipped when generating the tests (aka. blacklisting/suppressing)
+ List of ```test_expansion``` patterns expanding into selections which get skipped when generating the tests (aka. blocklisting/suppressing)
* **`test_expansion_schema`**
@@ -188,9 +188,9 @@ A **selection** is a single **test instance** (scenario) with explicit values th
Taking the spec JSON, the generator follows this algorithm:
-* Expand all ```excluded_tests``` to create a blacklist of selections
+* Expand all ```excluded_tests``` to create a blocklist of selections
-* For each specification requirement: Expand the ```test_expansion``` pattern into selections and check each against the blacklist, if not marked as suppresed, generate the test resources for the selection
+* For each specification requirement: Expand the ```test_expansion``` pattern into selections and check each against the blocklist, if not marked as suppresed, generate the test resources for the selection
### Source Contexts
diff --git a/tests/wpt/web-platform-tests/css/css-align/animation/column-gap-composition.html b/tests/wpt/web-platform-tests/css/css-align/animation/column-gap-composition.html
new file mode 100644
index 00000000000..0054206cca8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/animation/column-gap-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>column-gap composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-column-gap">
+<meta name="assert" content="column-gap supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'column-gap',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'column-gap',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'column-gap',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'column-gap',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'normal',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'normal'},
+ {at: 1, expect: 'normal'},
+ {at: 1.5, expect: 'normal'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-align/animation/row-gap-composition.html b/tests/wpt/web-platform-tests/css/css-align/animation/row-gap-composition.html
new file mode 100644
index 00000000000..238253adf0c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align/animation/row-gap-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>row-gap composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-row-gap">
+<meta name="assert" content="row-gap supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'row-gap',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'row-gap',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'row-gap',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'row-gap',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'normal',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'normal'},
+ {at: 1, expect: 'normal'},
+ {at: 1.5, expect: 'normal'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html
new file mode 100644
index 00000000000..87042d1969d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-left-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-bottom-left-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-bottom-left-radius supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-bottom-left-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-bottom-left-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-bottom-left-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html
new file mode 100644
index 00000000000..2b5a72df691
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-right-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-bottom-right-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-bottom-right-radius supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-bottom-right-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-bottom-right-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-bottom-right-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html
new file mode 100644
index 00000000000..5377c0ab42b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-bottom-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-bottom-width composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties">
+<meta name="assert" content="border-bottom-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-bottom-width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'border-bottom-width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'border-bottom-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-bottom-width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html
new file mode 100644
index 00000000000..e3311711753
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-outset-composition.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-image-outset composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-outset">
+<meta name="assert" content="border-image-outset supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-image-outset',
+ underlying: '1 2 3 4',
+ addFrom: '1 2 3 4',
+ addTo: '101 102 103 104',
+}, [
+ {at: -0.25, expect: '0'}, // Non-negative.
+ {at: 0, expect: '2 4 6 8'},
+ {at: 0.25, expect: '27 29 31 33'},
+ {at: 0.5, expect: '52 54 56 58'},
+ {at: 0.75, expect: '77 79 81 83'},
+ {at: 1, expect: '102 104 106 108'},
+ {at: 1.25, expect: '127 129 131 133'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '100 200 300 400',
+ addFrom: '100',
+ addTo: '200 300 500',
+}, [
+ {at: -0.25, expect: '175 250 300 450'},
+ {at: 0, expect: '200 300 400 500'},
+ {at: 0.25, expect: '225 350 500 550'},
+ {at: 0.5, expect: '250 400 600 600'},
+ {at: 0.75, expect: '275 450 700 650'},
+ {at: 1, expect: '300 500 800 700'},
+ {at: 1.25, expect: '325 550 900 750'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '1 2 3px 4px',
+ addFrom: '1 2 3px 4px',
+ addTo: '101 102 103px 104px',
+}, [
+ {at: -0.25, expect: '0 0 0px 0px'}, // Non-negative.
+ {at: 0, expect: '2 4 6px 8px'},
+ {at: 0.25, expect: '27 29 31px 33px'},
+ {at: 0.5, expect: '52 54 56px 58px'},
+ {at: 0.75, expect: '77 79 81px 83px'},
+ {at: 1, expect: '102 104 106px 108px'},
+ {at: 1.25, expect: '127 129 131px 133px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10px 20px',
+ addFrom: '190px 180px 290px 280px',
+ addTo: '90px 80px',
+}, [
+ {at: -0.25, expect: '225px 225px 350px 350px'},
+ {at: 0, expect: '200px 200px 300px 300px'},
+ {at: 0.25, expect: '175px 175px 250px 250px'},
+ {at: 0.5, expect: '150px 150px 200px 200px'},
+ {at: 0.75, expect: '125px 125px 150px 150px'},
+ {at: 1, expect: '100px'},
+ {at: 1.25, expect: '75px 75px 50px 50px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10 20px',
+ replaceFrom: '100 100px',
+ addTo: '190 180px',
+}, [
+ {at: -0.25, expect: '75 75px'},
+ {at: 0, expect: '100 100px'},
+ {at: 0.25, expect: '125 125px'},
+ {at: 0.5, expect: '150 150px'},
+ {at: 0.75, expect: '175 175px'},
+ {at: 1, expect: '200 200px'},
+ {at: 1.25, expect: '225 225px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10px 20',
+ addFrom: '90px 80',
+ replaceTo: '0px 0 0px 0',
+}, [
+ {at: -0.25, expect: '125px 125'},
+ {at: 0, expect: '100px 100'},
+ {at: 0.25, expect: '75px 75'},
+ {at: 0.5, expect: '50px 50'},
+ {at: 0.75, expect: '25px 25'},
+ {at: 1, expect: '0px 0'},
+ {at: 1.25, expect: '0px 0'}, // Non-negative.
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10 20',
+ addFrom: '100px 150px',
+ addTo: '200px 250px',
+}, [
+ {at: -0.25, expect: '75px 125px'},
+ {at: 0, expect: '100px 150px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 200px'},
+ {at: 0.75, expect: '175px 225px'},
+ {at: 1, expect: '200px 250px'},
+ {at: 1.25, expect: '225px 275px'},
+]);
+
+test_composition({
+ property: 'border-image-outset',
+ underlying: '10 20',
+ addFrom: '100 150px',
+ addTo: '200px 250',
+}, [
+ {at: -0.25, expect: '100 150px'},
+ {at: 0, expect: '100 150px'},
+ {at: 0.25, expect: '100 150px'},
+ {at: 0.5, expect: '200px 250'},
+ {at: 0.75, expect: '200px 250'},
+ {at: 1, expect: '200px 250'},
+ {at: 1.25, expect: '200px 250'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html
new file mode 100644
index 00000000000..d0ccb1a3a64
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-slice-composition.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-image-slice composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-slice">
+<meta name="assert" content="border-image-slice supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-image-slice',
+ underlying: '1 2 3 4',
+ addFrom: '1 2 3 4',
+ addTo: '101 102 103 104',
+}, [
+ {at: -0.25, expect: '0'}, // Non-negative.
+ {at: 0, expect: '2 4 6 8'},
+ {at: 0.25, expect: '27 29 31 33'},
+ {at: 0.5, expect: '52 54 56 58'},
+ {at: 0.75, expect: '77 79 81 83'},
+ {at: 1, expect: '102 104 106 108'},
+ {at: 1.25, expect: '127 129 131 133'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '100 200 300 400 fill',
+ addFrom: '100 fill',
+ addTo: '200 300 500 fill',
+}, [
+ {at: -0.25, expect: '175 250 300 450 fill'},
+ {at: 0, expect: '200 300 400 500 fill'},
+ {at: 0.25, expect: '225 350 500 550 fill'},
+ {at: 0.5, expect: '250 400 600 600 fill'},
+ {at: 0.75, expect: '275 450 700 650 fill'},
+ {at: 1, expect: '300 500 800 700 fill'},
+ {at: 1.25, expect: '325 550 900 750 fill'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '1 2 3% 4%',
+ addFrom: '1 2 3% 4%',
+ addTo: '101 102 103% 104%',
+}, [
+ {at: -0.25, expect: '0 0 0% 0%'}, // Non-negative.
+ {at: 0, expect: '2 4 6% 8%'},
+ {at: 0.25, expect: '27 29 31% 33%'},
+ {at: 0.5, expect: '52 54 56% 58%'},
+ {at: 0.75, expect: '77 79 81% 83%'},
+ {at: 1, expect: '102 104 106% 108%'},
+ {at: 1.25, expect: '127 129 131% 133%'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10% 20%',
+ addFrom: '190% 180% 290% 280%',
+ addTo: '90% 80%',
+}, [
+ {at: -0.25, expect: '225% 225% 350% 350%'},
+ {at: 0, expect: '200% 200% 300% 300%'},
+ {at: 0.25, expect: '175% 175% 250% 250%'},
+ {at: 0.5, expect: '150% 150% 200% 200%'},
+ {at: 0.75, expect: '125% 125% 150% 150%'},
+ {at: 1, expect: '100%'},
+ {at: 1.25, expect: '75% 75% 50% 50%'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10 20%',
+ replaceFrom: '100 100%',
+ addTo: '190 180%',
+}, [
+ {at: -0.25, expect: '75 75%'},
+ {at: 0, expect: '100 100%'},
+ {at: 0.25, expect: '125 125%'},
+ {at: 0.5, expect: '150 150%'},
+ {at: 0.75, expect: '175 175%'},
+ {at: 1, expect: '200 200%'},
+ {at: 1.25, expect: '225 225%'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10% 20',
+ addFrom: '90% 80',
+ replaceTo: '0% 0 0% 0',
+}, [
+ {at: -0.25, expect: '125% 125'},
+ {at: 0, expect: '100% 100'},
+ {at: 0.25, expect: '75% 75'},
+ {at: 0.5, expect: '50% 50'},
+ {at: 0.75, expect: '25% 25'},
+ {at: 1, expect: '0% 0'},
+ {at: 1.25, expect: '0% 0'}, // Non-negative.
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10 20',
+ addFrom: '100% 150%',
+ addTo: '200% 250% fill',
+}, [
+ {at: -0.25, expect: '100% 150%'},
+ {at: 0, expect: '100% 150%'},
+ {at: 0.25, expect: '100% 150%'},
+ {at: 0.5, expect: '200% 250% fill'},
+ {at: 0.75, expect: '200% 250% fill'},
+ {at: 1, expect: '200% 250% fill'},
+ {at: 1.25, expect: '200% 250% fill'},
+]);
+
+test_composition({
+ property: 'border-image-slice',
+ underlying: '10 20',
+ addFrom: '100 150%',
+ addTo: '200% 250',
+}, [
+ {at: -0.25, expect: '100 150%'},
+ {at: 0, expect: '100 150%'},
+ {at: 0.25, expect: '100 150%'},
+ {at: 0.5, expect: '200% 250'},
+ {at: 0.75, expect: '200% 250'},
+ {at: 1, expect: '200% 250'},
+ {at: 1.25, expect: '200% 250'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html
new file mode 100644
index 00000000000..0d0a1dc4ed2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-image-width-composition.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-image-width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-image-width">
+<meta name="assert" content="border-image-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-image-width',
+ underlying: '1 2 3 4',
+ addFrom: '1 2 3 4',
+ addTo: '101 102 103 104',
+}, [
+ {at: -0.25, expect: '0'}, // Non-negative.
+ {at: 0, expect: '2 4 6 8'},
+ {at: 0.25, expect: '27 29 31 33'},
+ {at: 0.5, expect: '52 54 56 58'},
+ {at: 0.75, expect: '77 79 81 83'},
+ {at: 1, expect: '102 104 106 108'},
+ {at: 1.25, expect: '127 129 131 133'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '100 200 300 400',
+ addFrom: '100',
+ addTo: '200 300 500',
+}, [
+ {at: -0.25, expect: '175 250 300 450'},
+ {at: 0, expect: '200 300 400 500'},
+ {at: 0.25, expect: '225 350 500 550'},
+ {at: 0.5, expect: '250 400 600 600'},
+ {at: 0.75, expect: '275 450 700 650'},
+ {at: 1, expect: '300 500 800 700'},
+ {at: 1.25, expect: '325 550 900 750'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '1 2 3px 4%',
+ addFrom: '1 2 3px 4%',
+ addTo: '101 102 103px 104%',
+}, [
+ {at: -0.25, expect: '0 0 0px 0%'}, // Non-negative.
+ {at: 0, expect: '2 4 6px 8%'},
+ {at: 0.25, expect: '27 29 31px 33%'},
+ {at: 0.5, expect: '52 54 56px 58%'},
+ {at: 0.75, expect: '77 79 81px 83%'},
+ {at: 1, expect: '102 104 106px 108%'},
+ {at: 1.25, expect: '127 129 131px 133%'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10px 20px',
+ addFrom: '190px 180px 290px 280px',
+ addTo: '90px 80px',
+}, [
+ {at: -0.25, expect: '225px 225px 350px 350px'},
+ {at: 0, expect: '200px 200px 300px 300px'},
+ {at: 0.25, expect: '175px 175px 250px 250px'},
+ {at: 0.5, expect: '150px 150px 200px 200px'},
+ {at: 0.75, expect: '125px 125px 150px 150px'},
+ {at: 1, expect: '100px'},
+ {at: 1.25, expect: '75px 75px 50px 50px'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10 20px',
+ replaceFrom: '100 100px',
+ addTo: '190 180px',
+}, [
+ {at: -0.25, expect: '75 75px'},
+ {at: 0, expect: '100 100px'},
+ {at: 0.25, expect: '125 125px'},
+ {at: 0.5, expect: '150 150px'},
+ {at: 0.75, expect: '175 175px'},
+ {at: 1, expect: '200 200px'},
+ {at: 1.25, expect: '225 225px'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10px 20',
+ addFrom: '90px 80',
+ replaceTo: '0px 0 0px 0',
+}, [
+ {at: -0.25, expect: '125px 125'},
+ {at: 0, expect: '100px 100'},
+ {at: 0.25, expect: '75px 75'},
+ {at: 0.5, expect: '50px 50'},
+ {at: 0.75, expect: '25px 25'},
+ {at: 1, expect: '0px 0'},
+ {at: 1.25, expect: '0px 0'}, // Non-negative.
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10 20',
+ addFrom: '100px 150px',
+ addTo: '200px 250px',
+}, [
+ {at: -0.25, expect: '75px 125px'},
+ {at: 0, expect: '100px 150px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 200px'},
+ {at: 0.75, expect: '175px 225px'},
+ {at: 1, expect: '200px 250px'},
+ {at: 1.25, expect: '225px 275px'},
+]);
+
+test_composition({
+ property: 'border-image-width',
+ underlying: '10 20',
+ addFrom: '100 150px',
+ addTo: '200% 250',
+}, [
+ {at: -0.25, expect: '100 150px'},
+ {at: 0, expect: '100 150px'},
+ {at: 0.25, expect: '100 150px'},
+ {at: 0.5, expect: '200% 250'},
+ {at: 0.75, expect: '200% 250'},
+ {at: 1, expect: '200% 250'},
+ {at: 1.25, expect: '200% 250'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html
new file mode 100644
index 00000000000..1b90effbc32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-left-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-left-width composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties">
+<meta name="assert" content="border-left-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-left-width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'border-left-width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'border-left-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-left-width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html
new file mode 100644
index 00000000000..aa9e1dcc667
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-right-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-right-width composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#border-width-properties">
+<meta name="assert" content="border-right-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-right-width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'border-right-width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'border-right-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-right-width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html
new file mode 100644
index 00000000000..1c2056bc010
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-left-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-top-left-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-top-left-radius supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-top-left-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-top-left-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-top-left-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html
new file mode 100644
index 00000000000..9a26d51375e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-right-radius-composition.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-top-right-radius composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#the-border-radius">
+<meta name="assert" content="border-top-right-radius supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-top-right-radius',
+ underlying: '40px 40px',
+ addFrom: '60px 60px',
+ addTo: '160px 160px',
+}, [
+ {at: -0.25, expect: '75px'},
+ {at: 0, expect: '100px'},
+ {at: 0.25, expect: '125px'},
+ {at: 0.5, expect: '150px'},
+ {at: 0.75, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px'},
+]);
+
+test_composition({
+ property: 'border-top-right-radius',
+ underlying: '40px 140px',
+ replaceFrom: '100px 120px',
+ addTo: '160px 60px',
+}, [
+ {at: -0.25, expect: '75px 100px'},
+ {at: 0, expect: '100px 120px'},
+ {at: 0.25, expect: '125px 140px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 180px'},
+ {at: 1, expect: '200px'},
+ {at: 1.25, expect: '225px 220px'},
+]);
+
+test_composition({
+ property: 'border-top-right-radius',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 120px',
+}, [
+ {at: -0.25, expect: '75px 220px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 180px'},
+ {at: 0.5, expect: '150px 160px'},
+ {at: 0.75, expect: '175px 140px'},
+ {at: 1, expect: '200px 120px'},
+ {at: 1.25, expect: '225px 100px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html
new file mode 100644
index 00000000000..475c3930b9d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/border-top-width-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>border-top-width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#border-width">
+<meta name="assert" content="border-top-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'border-top-width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'border-top-width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'border-top-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'border-top-width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-bottom-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-bottom-composition.html
new file mode 100644
index 00000000000..c95f8de23ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-bottom-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>margin-bottom composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties">
+<meta name="assert" content="margin-bottom supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'margin-bottom',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'margin-bottom',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'margin-bottom',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'margin-bottom',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'margin-bottom',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-left-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-left-composition.html
new file mode 100644
index 00000000000..8f3c646dfec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-left-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>margin-left composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties">
+<meta name="assert" content="margin-left supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'margin-left',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'margin-left',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'margin-left',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'margin-left',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'margin-left',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-right-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-right-composition.html
new file mode 100644
index 00000000000..c903303313b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-right-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>margin-right composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties">
+<meta name="assert" content="margin-right supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'margin-right',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'margin-right',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'margin-right',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'margin-right',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'margin-right',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/margin-top-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/margin-top-composition.html
new file mode 100644
index 00000000000..5f050bd6c7d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/margin-top-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>margin-top composition</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/box.html#margin-properties">
+<meta name="assert" content="margin-top supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'margin-top',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'margin-top',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'margin-top',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'margin-top',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'margin-top',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-bottom-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-bottom-composition.html
new file mode 100644
index 00000000000..855b5d3dc29
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-bottom-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>padding-bottom composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand">
+<meta name="assert" content="padding-bottom supports animation as a list of lengths">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'padding-bottom',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'padding-bottom',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'padding-bottom',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'padding-bottom',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-left-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-left-composition.html
new file mode 100644
index 00000000000..417777ae253
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-left-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>padding-left composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand">
+<meta name="assert" content="padding-left supports animation as a list of lengths">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'padding-left',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'padding-left',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'padding-left',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'padding-left',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-right-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-right-composition.html
new file mode 100644
index 00000000000..3c80849bb2b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-right-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>padding-right composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand">
+<meta name="assert" content="padding-right supports animation as a list of lengths">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'padding-right',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'padding-right',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'padding-right',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'padding-right',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-box/animation/padding-top-composition.html b/tests/wpt/web-platform-tests/css/css-box/animation/padding-top-composition.html
new file mode 100644
index 00000000000..b5083ae79b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-box/animation/padding-top-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>padding-top composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#padding-shorthand">
+<meta name="assert" content="padding-top supports animation as a list of lengths">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'padding-top',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'padding-top',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'padding-top',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'padding-top',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-default.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-default.html
new file mode 100644
index 00000000000..36fb1a665ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-default.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation defaults to from-image</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-default-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;
+ }
+ img {
+ border: 1px solid black;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because
+ no image-orientation property is given.</p>
+ <div>
+ <img src="support/exif-orientation-1-ul.jpg"/>
+ <br>Normal
+ </div>
+ <div>
+ <img src="support/exif-orientation-2-ur.jpg"/>
+ <br>Flipped horizontally
+ </div>
+ <div>
+ <img src="support/exif-orientation-3-lr.jpg"/>
+ <br>Rotated 180&deg;
+ </div>
+ <div>
+ <img src="support/exif-orientation-4-lol.jpg"/>
+ <br>Flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-5-lu.jpg"/>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-6-ru.jpg"/>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div>
+ <img src="support/exif-orientation-7-rl.jpg"/>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-8-llo.jpg"/>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <div>
+ <img src="support/exif-orientation-9-u.jpg"/>
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html
new file mode 100644
index 00000000000..26db7da1845
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic1.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: change from image-orientation: none to from-image with will-change: transform</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-from-image-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;}
+ img {
+ will-change: transform;
+ border: 1px solid black;
+ image-orientation: none;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+<script>
+ function runTest() {
+ for (var i = 1; i <= 9; i++) {
+ document.getElementById("img" + i).style.imageOrientation = "from-image";
+ }
+ }
+</script>
+</head>
+<body onload="runTest()">
+ <p>The images should rotate respecting their EXIF orientation because
+ image-orientation: from-image is specified.</p>
+ <div>
+ <img id="img1" src="support/exif-orientation-1-ul.jpg"/>
+ <br>Normal
+ </div>
+ <div>
+ <img id="img2" src="support/exif-orientation-2-ur.jpg"/>
+ <br>Flipped horizontally
+ </div>
+ <div>
+ <img id="img3" src="support/exif-orientation-3-lr.jpg"/>
+ <br>Rotated 180&deg;
+ </div>
+ <div>
+ <img id="img4" src="support/exif-orientation-4-lol.jpg"/>
+ <br>Flipped vertically
+ </div>
+ <div>
+ <img id="img5" src="support/exif-orientation-5-lu.jpg"/>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div>
+ <img id="img6" src="support/exif-orientation-6-ru.jpg"/>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div>
+ <img id="img7" src="support/exif-orientation-7-rl.jpg"/>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div>
+ <img id="img8" src="support/exif-orientation-8-llo.jpg"/>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <div>
+ <img id="img9" src="support/exif-orientation-9-u.jpg"/>
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html
new file mode 100644
index 00000000000..f6474afaa0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited-dynamic2.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: change from image-orientation: from-image to none with will-change: transform</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-none-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;
+ }
+ img {
+ will-change: transform;
+ border: 1px solid black;
+ image-orientation: from-image;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+<script>
+ function runTest() {
+ for (var i = 1; i <= 9; i++) {
+ document.getElementById("img" + i).style.imageOrientation = "none";
+ }
+ }
+</script>
+</head>
+<body onload="runTest()">
+ <p>The images should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified.</p>
+ <div>
+ <img id="img1" src="support/exif-orientation-1-ul.jpg"/>
+ </div>
+ <div>
+ <img id="img2" src="support/exif-orientation-2-ur.jpg"/>
+ </div>
+ <div>
+ <img id="img3" src="support/exif-orientation-3-lr.jpg"/>
+ </div>
+ <div>
+ <img id="img4" src="support/exif-orientation-4-lol.jpg"/>
+ </div>
+ <div>
+ <img id="img5" src="support/exif-orientation-5-lu.jpg"/>
+ </div>
+ <div>
+ <img id="img6" src="support/exif-orientation-6-ru.jpg"/>
+ </div>
+ <div>
+ <img id="img7" src="support/exif-orientation-7-rl.jpg"/>
+ </div>
+ <div>
+ <img id="img8" src="support/exif-orientation-8-llo.jpg"/>
+ </div>
+ <div>
+ <img id="img9" src="support/exif-orientation-9-u.jpg"/>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited.html
new file mode 100644
index 00000000000..596e497ed3e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-composited.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: from-image with will-change: transform</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-from-image-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;
+ image-orientation: from-image;
+ }
+ img {
+ will-change: transform;
+ border: 1px solid black;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because
+ image-orientation: from-image is specified.</p>
+ <div>
+ <img src="support/exif-orientation-1-ul.jpg"/>
+ <br>Normal
+ </div>
+ <div>
+ <img src="support/exif-orientation-2-ur.jpg"/>
+ <br>Flipped horizontally
+ </div>
+ <div>
+ <img src="support/exif-orientation-3-lr.jpg"/>
+ <br>Rotated 180&deg;
+ </div>
+ <div>
+ <img src="support/exif-orientation-4-lol.jpg"/>
+ <br>Flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-5-lu.jpg"/>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-6-ru.jpg"/>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div>
+ <img src="support/exif-orientation-7-rl.jpg"/>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-8-llo.jpg"/>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <div>
+ <img src="support/exif-orientation-9-u.jpg"/>
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-computed-style.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-computed-style.html
new file mode 100644
index 00000000000..32933244c38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-computed-style.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation:none computed style</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ body {
+ overflow: hidden;
+ image-orientation: from-image;}
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+<script>
+function run_tests() {
+ test(function() {
+ for (var i = 1; i <= 4; i++) {
+ var el = document.getElementById("img" + i);
+ var computedStyle = window.getComputedStyle(el);
+ assert_equals(computedStyle.width, "100px");
+ assert_equals(computedStyle.height, "50px");
+ assert_equals(computedStyle.imageOrientation, "from-image");
+ }
+ for (var i = 5; i <= 8; i++) {
+ var el = document.getElementById("img" + i);
+ var computedStyle = window.getComputedStyle(el);
+ assert_equals(computedStyle.width, "50px");
+ assert_equals(computedStyle.height, "100px");
+ assert_equals(computedStyle.imageOrientation, "from-image");
+ }
+ var el = document.getElementById("img9");
+ var computedStyle = window.getComputedStyle(el);
+ assert_equals(computedStyle.width, "100px");
+ assert_equals(computedStyle.height, "50px");
+ assert_equals(computedStyle.imageOrientation, "from-image");
+ }, "image-orientation:from-image computed style reports correct values");
+}
+</script>
+</head>
+<body onload="run_tests()">
+ <div><img id="img1" src="support/exif-orientation-1-ul.jpg"/></div>
+ <div><img id="img2" src="support/exif-orientation-2-ur.jpg"/></div>
+ <div><img id="img3" src="support/exif-orientation-3-lr.jpg"/></div>
+ <div><img id="img4" src="support/exif-orientation-4-lol.jpg"/></div>
+ <div><img id="img5" src="support/exif-orientation-5-lu.jpg"/></div>
+ <div><img id="img6" src="support/exif-orientation-6-ru.jpg"/></div>
+ <div><img id="img7" src="support/exif-orientation-7-rl.jpg"/></div>
+ <div><img id="img8" src="support/exif-orientation-8-llo.jpg"/></div>
+ <div><img id="img9" src="support/exif-orientation-9-u.jpg"/></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-content-images.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-content-images.html
new file mode 100644
index 00000000000..36a2a343168
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-content-images.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: from-image for content images</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-from-image-content-images-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ div.image {
+ display: inline-block;
+ border: 1px solid black;
+ }
+ div.container {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ image-orientation: from-image;
+ }
+ img {
+ width: 100px;
+ height: 100px;
+ background-repeat: no-repeat;
+ }
+ body {
+ overflow: hidden;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because
+ image-orientation: from-image is specified.</p>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-1-ul.jpg)"></div>
+ <br>Normal
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-2-ur.jpg)"></div>
+ <br>Flipped horizontally
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-3-lr.jpg)"></div>
+ <br>Rotated 180&deg;
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-4-lol.jpg)"></div>
+ <br>Flipped vertically
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-5-lu.jpg)"></div>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-6-ru.jpg)"></div>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-7-rl.jpg)"></div>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-8-llo.jpg)"></div>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <br>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-5-lu.jpg)"></img>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-6-ru.jpg)"></img>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-7-rl.jpg)"></img>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-8-llo.jpg)"></img>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-9-u.jpg)"></div>
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html
new file mode 100644
index 00000000000..15e05884cf5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic1.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: change from image-orientation: none to from-image</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-from-image-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;
+ }
+ img {
+ border: 1px solid black;
+ image-orientation: none;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+<script>
+ function runTest() {
+ for (var i = 1; i <= 9; i++) {
+ document.getElementById("img" + i).style.imageOrientation = "from-image";
+ }
+ }
+</script>
+</head>
+<body onload="runTest()">
+ <p>The images should rotate respecting their EXIF orientation because
+ image-orientation: from-image is specified.</p>
+ <div>
+ <img id="img1" src="support/exif-orientation-1-ul.jpg"/>
+ <br>Normal
+ </div>
+ <div>
+ <img id="img2" src="support/exif-orientation-2-ur.jpg"/>
+ <br>Flipped horizontally
+ </div>
+ <div>
+ <img id="img3" src="support/exif-orientation-3-lr.jpg"/>
+ <br>Rotated 180&deg;
+ </div>
+ <div>
+ <img id="img4" src="support/exif-orientation-4-lol.jpg"/>
+ <br>Flipped vertically
+ </div>
+ <div>
+ <img id="img5" src="support/exif-orientation-5-lu.jpg"/>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div>
+ <img id="img6" src="support/exif-orientation-6-ru.jpg"/>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div>
+ <img id="img7" src="support/exif-orientation-7-rl.jpg"/>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div>
+ <img id="img8" src="support/exif-orientation-8-llo.jpg"/>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <div>
+ <img id="img9" src="support/exif-orientation-9-u.jpg"/>
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html
new file mode 100644
index 00000000000..c0df221337e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-dynamic2.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: change from image-orientation: from-image to none</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-none-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;
+ }
+ img {
+ border: 1px solid black;
+ image-orientation: from-image;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+<script>
+ function runTest() {
+ for (var i = 1; i <= 9; i++) {
+ document.getElementById("img" + i).style.imageOrientation = "none";
+ }
+ }
+</script>
+</head>
+<body onload="runTest()">
+ <p>The images should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified.</p>
+ <div>
+ <img id="img1" src="support/exif-orientation-1-ul.jpg"/>
+ </div>
+ <div>
+ <img id="img2" src="support/exif-orientation-2-ur.jpg"/>
+ </div>
+ <div>
+ <img id="img3" src="support/exif-orientation-3-lr.jpg"/>
+ </div>
+ <div>
+ <img id="img4" src="support/exif-orientation-4-lol.jpg"/>
+ </div>
+ <div>
+ <img id="img5" src="support/exif-orientation-5-lu.jpg"/>
+ </div>
+ <div>
+ <img id="img6" src="support/exif-orientation-6-ru.jpg"/>
+ </div>
+ <div>
+ <img id="img7" src="support/exif-orientation-7-rl.jpg"/>
+ </div>
+ <div>
+ <img id="img8" src="support/exif-orientation-8-llo.jpg"/>
+ </div>
+ <div>
+ <img id="img9" src="support/exif-orientation-9-u.jpg"/>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-image-document.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-image-document.html
new file mode 100644
index 00000000000..793fc017e6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image-image-document.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: from-image in image documents</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-from-image-image-document-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ iframe {
+ display: inline-block;
+ width: 120px;
+ height: 110px;
+ vertical-align: top;
+ border: 1px solid black;
+ image-orientation: from-image;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because image
+ documents always respect the orientation, regardless of the image-orientation
+ property.</p>
+ <iframe src="support/exif-orientation-1-ul.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-2-ur.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-3-lr.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-4-lol.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="support/exif-orientation-5-lu.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-6-ru.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-7-rl.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-8-llo.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="support/exif-orientation-9-u.jpg" frameborder=0></iframe>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image.html
new file mode 100644
index 00000000000..f1343e9f23f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-from-image.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: from-image</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-from-image-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;
+ image-orientation: from-image;
+ }
+ img {
+ border: 1px solid black;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because
+ image-orientation: from-image is specified.</p>
+ <div>
+ <img src="support/exif-orientation-1-ul.jpg"/>
+ <br>Normal
+ </div>
+ <div>
+ <img src="support/exif-orientation-2-ur.jpg"/>
+ <br>Flipped horizontally
+ </div>
+ <div>
+ <img src="support/exif-orientation-3-lr.jpg"/>
+ <br>Rotated 180&deg;
+ </div>
+ <div>
+ <img src="support/exif-orientation-4-lol.jpg"/>
+ <br>Flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-5-lu.jpg"/>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-6-ru.jpg"/>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div>
+ <img src="support/exif-orientation-7-rl.jpg"/>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div>
+ <img src="support/exif-orientation-8-llo.jpg"/>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <div>
+ <img src="support/exif-orientation-9-u.jpg"/>
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html
new file mode 100644
index 00000000000..49919288b55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-computed-style.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: none computed style</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ body {
+ overflow: hidden;
+ image-orientation: none;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+<script>
+function run_tests() {
+ test(function() {
+ for (var i = 1; i <= 9; i++) {
+ var el = document.getElementById("img" + i);
+ var computedStyle = window.getComputedStyle(el);
+ assert_equals(computedStyle.width, "100px");
+ assert_equals(computedStyle.height, "50px");
+ assert_equals(computedStyle.imageOrientation, "none");
+ }
+ }, "image-orientation:none computed style reports correct values");
+
+}
+</script>
+</head>
+<body onload="run_tests()">
+ <div><img id="img1" src="support/exif-orientation-1-ul.jpg"/></div>
+ <div><img id="img2" src="support/exif-orientation-2-ur.jpg"/></div>
+ <div><img id="img3" src="support/exif-orientation-3-lr.jpg"/></div>
+ <div><img id="img4" src="support/exif-orientation-4-lol.jpg"/></div>
+ <div><img id="img5" src="support/exif-orientation-5-lu.jpg"/></div>
+ <div><img id="img6" src="support/exif-orientation-6-ru.jpg"/></div>
+ <div><img id="img7" src="support/exif-orientation-7-rl.jpg"/></div>
+ <div><img id="img8" src="support/exif-orientation-8-llo.jpg"/></div>
+ <div><img id="img9" src="support/exif-orientation-9-u.jpg"/></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html
new file mode 100644
index 00000000000..7bcb5ce3394
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-content-images.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: none for content images</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-none-content-images-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ div.image {
+ display: inline-block;
+ border: 1px solid black;
+ }
+ div.container {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ image-orientation: none;
+ }
+ img {
+ width: 100px;
+ height: 100px;
+ background-repeat: no-repeat;
+ }
+ body {
+ overflow: hidden;
+ }
+</style>
+</head>
+<body>
+ <p>The images should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified.</p>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-2-ur.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-3-lr.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-4-lol.jpg)"></div>
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-5-lu.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-6-ru.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-7-rl.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-8-llo.jpg)"></div>
+ </div>
+ <br>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-5-lu.jpg)"></img>
+ </div>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-6-ru.jpg)"></img>
+ </div>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-7-rl.jpg)"></img>
+ </div>
+ <div class="container">
+ <img style="background-image: url(support/exif-orientation-8-llo.jpg)"></img>
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(support/exif-orientation-9-u.jpg)"></div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-image-document.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-image-document.html
new file mode 100644
index 00000000000..29ec30f1431
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-image-document.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: none in image documents</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-none-image-document-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ iframe {
+ display: inline-block;
+ margin-right: 20px;
+ margin-bottom: 10px;
+ width: 120px;
+ height: 110px;
+ vertical-align: top;
+ border: 1px solid black;
+ image-orientation: none;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because image
+ documents always respect the orientation, regardless of the image-orientation
+ property.</p>
+ <iframe src="support/exif-orientation-1-ul.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-2-ur.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-3-lr.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-4-lol.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="support/exif-orientation-5-lu.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-6-ru.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-7-rl.jpg" frameborder=0></iframe>
+ <iframe src="support/exif-orientation-8-llo.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="support/exif-orientation-9-u.jpg" frameborder=0></iframe>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none.html
new file mode 100644
index 00000000000..03c46c620a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: none</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-none-ref.html">
+<meta name=fuzzy content="10;100">
+<style>
+ body {
+ overflow: hidden;
+ image-orientation: none;
+ }
+ img {
+ border: 1px solid black;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+</head>
+<body>
+ <p>The images should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified.</p>
+ <div><img src="support/exif-orientation-1-ul.jpg"/></div>
+ <div><img src="support/exif-orientation-2-ur.jpg"/></div>
+ <div><img src="support/exif-orientation-3-lr.jpg"/></div>
+ <div><img src="support/exif-orientation-4-lol.jpg"/></div>
+ <div><img src="support/exif-orientation-5-lu.jpg"/></div>
+ <div><img src="support/exif-orientation-6-ru.jpg"/></div>
+ <div><img src="support/exif-orientation-7-rl.jpg"/></div>
+ <div><img src="support/exif-orientation-8-llo.jpg"/></div>
+ <div><img src="support/exif-orientation-9-u.jpg"/></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-default-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-default-ref.html
new file mode 100644
index 00000000000..aa8bede6014
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-default-ref.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>CSS Images Module Level 3: image-orientation: from-image</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<style>
+ body {
+ overflow: hidden;
+ }
+ img {
+ border: 1px
+ solid black;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because
+ no image-orientation property is given.</p>
+ <div>
+ <img src="../support/exif-orientation-1-ul-pre-rotated.jpg">
+ <br>Normal
+ </div>
+ <div>
+ <img src="../support/exif-orientation-2-ur-pre-rotated.jpg">
+ <br>Flipped horizontally
+ </div>
+ <div>
+ <img src="../support/exif-orientation-3-lr-pre-rotated.jpg">
+ <br>Rotated 180&deg;
+ </div>
+ <div>
+ <img src="../support/exif-orientation-4-lol-pre-rotated.jpg">
+ <br>Flipped vertically
+ </div>
+ <div>
+ <img src="../support/exif-orientation-5-lu-pre-rotated.jpg">
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div>
+ <img src="../support/exif-orientation-6-ru-pre-rotated.jpg">
+ <br>Rotated 90&deg; CW
+ </div>
+ <div>
+ <img src="../support/exif-orientation-7-rl-pre-rotated.jpg">
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div>
+ <img src="../support/exif-orientation-8-llo-pre-rotated.jpg">
+ <br>Rotated 90&deg; CCW
+ </div>
+ <div>
+ <img src="../support/exif-orientation-9-u-pre-rotated.jpg">
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html
new file mode 100644
index 00000000000..21fed5fbb66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-content-images-ref.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>CSS Images Module Level 3: image-orientation: from-image for content images</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<style>
+ div.image {
+ display: inline-block;
+ border: 1px solid black;
+ }
+ div.container {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+ img {
+ width: 100px;
+ height: 100px;
+ background-repeat: no-repeat;
+ }
+ body {
+ overflow: hidden;
+ }
+</style>
+</head>
+<body >
+ <p>The images should rotate respecting their EXIF orientation because
+ image-orientation: from-image is specified.
+ </p>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul-pre-rotated.jpg)"></div>
+ <br>Normal
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-2-ur-pre-rotated.jpg)"></div>
+ <br>Flipped horizontally
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-3-lr-pre-rotated.jpg)"></div>
+ <br>Rotated 180&deg;
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-4-lol-pre-rotated.jpg)"></div>
+ <br>Flipped vertically
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-5-lu-pre-rotated.jpg)"></div>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-6-ru-pre-rotated.jpg)"></div>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-7-rl-pre-rotated.jpg)"></div>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-8-llo-pre-rotated.jpg)"></div>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <br>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-5-lu-pre-rotated.jpg)"></img>
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-6-ru-pre-rotated.jpg)"></img>
+ <br>Rotated 90&deg; CW
+ </div>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-7-rl-pre-rotated.jpg)"></img>
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-8-llo-pre-rotated.jpg)"></img>
+ <br>Rotated 90&deg; CCW
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-9-u-pre-rotated.jpg)"></div>
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html
new file mode 100644
index 00000000000..d2c7e6916bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-image-document-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: from-image in image documents</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<style>
+ iframe {
+ display: inline-block;
+ width: 120px;
+ height: 110px;
+ vertical-align: top;
+ border: 1px solid black;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because image
+ documents always respect the orientation, regardless of the image-orientation
+ property.</p>
+ <iframe src="../support/exif-orientation-1-ul-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-2-ur-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-3-lr-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-4-lol-pre-rotated.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="../support/exif-orientation-5-lu-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-6-ru-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-7-rl-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-8-llo-pre-rotated.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="../support/exif-orientation-9-u-pre-rotated.jpg" frameborder=0></iframe>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html
new file mode 100644
index 00000000000..d731e837778
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-from-image-ref.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: from-image</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<style>
+ body {
+ overflow: hidden;
+ }
+ img {
+ border: 1px solid black;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because
+ image-orientation: from-image is specified.</p>
+ <div>
+ <img src="../support/exif-orientation-1-ul-pre-rotated.jpg">
+ <br>Normal
+ </div>
+ <div>
+ <img src="../support/exif-orientation-2-ur-pre-rotated.jpg">
+ <br>Flipped horizontally
+ </div>
+ <div>
+ <img src="../support/exif-orientation-3-lr-pre-rotated.jpg">
+ <br>Rotated 180&deg;
+ </div>
+ <div>
+ <img src="../support/exif-orientation-4-lol-pre-rotated.jpg">
+ <br>Flipped vertically
+ </div>
+ <div>
+ <img src="../support/exif-orientation-5-lu-pre-rotated.jpg">
+ <br>Rotated 90&deg; CCW and flipped vertically
+ </div>
+ <div>
+ <img src="../support/exif-orientation-6-ru-pre-rotated.jpg">
+ <br>Rotated 90&deg; CW
+ </div>
+ <div>
+ <img src="../support/exif-orientation-7-rl-pre-rotated.jpg">
+ <br>Rotated 90&deg; CW and flipped vertically
+ </div>
+ <div>
+ <img src="../support/exif-orientation-8-llo-pre-rotated.jpg">
+ <br>Rotated 90&deg; CCW
+ </div>
+ <div>
+ <img src="../support/exif-orientation-9-u-pre-rotated.jpg">
+ <br>Undefined (invalid value)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html
new file mode 100644
index 00000000000..d73c554f329
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-content-images-ref.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: none for content images</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<style>
+ div.image {
+ display: inline-block;
+ border: 1px solid black;
+ }
+ div.container {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+ img {
+ width: 100px;
+ height: 100px;
+ background-repeat: no-repeat;
+ }
+ body {
+ overflow: hidden;
+ }
+</style>
+</head>
+<body>
+ <p>The images should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified.</p>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+ <br>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img>
+ </div>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img>
+ </div>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img>
+ </div>
+ <div class="container">
+ <img style="background-image: url(../support/exif-orientation-1-ul.jpg)"></img>
+ </div>
+ <br>
+ <div class="container">
+ <div class="image" style="content: url(../support/exif-orientation-1-ul.jpg)"></div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html
new file mode 100644
index 00000000000..db84d0e23cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-image-document-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: none in image documents</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<style>
+ iframe {
+ display: inline-block;
+ margin-right: 20px;
+ margin-bottom: 10px;
+ width: 120px;
+ height: 110px;
+ vertical-align: top;
+ border: 1px solid black;
+ }
+</style>
+</head>
+<body>
+ <p>The images should rotate respecting their EXIF orientation because image
+ documents always respect the orientation, regardless of the image-orientation
+ property.</p>
+ <iframe src="../support/exif-orientation-1-ul-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-2-ur-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-3-lr-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-4-lol-pre-rotated.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="../support/exif-orientation-5-lu-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-6-ru-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-7-rl-pre-rotated.jpg" frameborder=0></iframe>
+ <iframe src="../support/exif-orientation-8-llo-pre-rotated.jpg" frameborder=0></iframe>
+ <br>
+ <iframe src="../support/exif-orientation-9-u-pre-rotated.jpg" frameborder=0></iframe>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-ref.html
new file mode 100644
index 00000000000..8293d6e003d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: none</title>
+<link rel="author" title="Stephen Chenney" href="mailto:schenney@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<style>
+ body {
+ overflow: hidden;
+ }
+ img {
+ border: 1px solid black;
+ }
+ div {
+ display: inline-block;
+ width: 100px;
+ vertical-align: top;
+ }
+</style>
+</head>
+<body>
+ <p>The images should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified.</p>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+ <div><img src="../support/exif-orientation-1-ul.jpg"></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg
new file mode 100644
index 00000000000..d9acd656f92
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg
new file mode 100644
index 00000000000..7c13bf7dc4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg
new file mode 100644
index 00000000000..1d06bf3d2f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg
new file mode 100644
index 00000000000..2387b05feef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg
new file mode 100644
index 00000000000..1c5ce1a8f6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg
new file mode 100644
index 00000000000..cb1a82dab16
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg
new file mode 100644
index 00000000000..cf71c6a1444
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg
new file mode 100644
index 00000000000..8f930968030
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg
new file mode 100644
index 00000000000..62ddea22e44
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg
new file mode 100644
index 00000000000..e65d2eb5cc2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg
new file mode 100644
index 00000000000..3d21ec96ec5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg
new file mode 100644
index 00000000000..6f487dae135
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg
new file mode 100644
index 00000000000..7d49d4f20cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg
new file mode 100644
index 00000000000..769be7df853
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg
new file mode 100644
index 00000000000..e88b00c38b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg
new file mode 100644
index 00000000000..c4a51ed3ff6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg
new file mode 100644
index 00000000000..b6b517f6b72
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u-pre-rotated.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u.jpg
new file mode 100644
index 00000000000..1003bfb7c21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/exif-orientation-9-u.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html b/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html
new file mode 100644
index 00000000000..3df3e1ebc8f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/change-intrinsic-width.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#pseudo-algorithm">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1037790">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:fit-content; height:100px; background:red;">
+ <div id="firstChild" style="width:200px; height:100px; background:green;"></div>
+ <div style="width:50px; height:100px; background:green;"></div>
+</div>
+<script>
+ document.body.offsetTop;
+ firstChild.style.width = "50px";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/intrinsic-width-change-column-count.html b/tests/wpt/web-platform-tests/css/css-multicol/intrinsic-width-change-column-count.html
new file mode 100644
index 00000000000..30e7671e41c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/intrinsic-width-change-column-count.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#pseudo-algorithm">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1037790">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width:100px; background:red;">
+ <div id="container" style="columns:3; column-gap:0; column-fill:auto; width:fit-content; height:100px; background:green;">
+ <div style="width:25px; height:10px;"></div>
+ </div>
+</div>
+<script>
+ document.body.offsetTop;
+ container.style.columns = "4";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2-ref.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2-ref.html
new file mode 100644
index 00000000000..941047901df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Position Test Reference: Test position:sticky element with large top in an overflow scroll container</title>
+ <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="http://www.mozilla.org/">
+
+ <style>
+ .scroll {
+ border: 5px solid blue;
+ padding: 5px 3px 0 8px;
+ overflow: auto;
+ height: 200px;
+ width: 200px;
+ transform: scale(1);
+ }
+
+ .block {
+ width: 150px;
+ height: 200px;
+ background: yellow;
+ position: absolute;
+ top: 55px;
+ }
+
+ .sticky {
+ position: absolute;
+ background: purple;
+ width: 50px;
+ height: 50px;
+ top: 205px;
+ z-index: 1;
+ }
+ </style>
+ <script>
+ function runTest() {
+ document.getElementById("scroll2").scrollTop = 50;
+ }
+ </script>
+
+ <body onload="runTest();">
+ <div class="scroll">
+ <span>
+ <div class="sticky"></div>
+ </span>
+ <div class="block"></div>
+ </div>
+
+ <div class="scroll" id="scroll2">
+ <span>
+ <div class="sticky"></div>
+ </span>
+ <div class="block"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2.tentative.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2.tentative.html
new file mode 100644
index 00000000000..1cf9c0dfb43
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-2.tentative.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Position Test: Test position:sticky element with large top in an overflow container</title>
+ <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="http://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-position/#sticky-pos">
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1598112">
+ <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2794">
+ <link rel="match" href="position-sticky-large-top-2-ref.html">
+ <meta name="assert" content="This test verifies the position of a position:sticky element with large top value can be reached by scrolling the overflow container.">
+
+ <style>
+ .scroll {
+ border: 5px solid blue;
+ padding: 5px 3px 0 8px;
+ overflow: auto;
+ height: 200px;
+ width: 200px;
+ }
+
+ .block {
+ width: 150px;
+ height: 200px;
+ background: yellow;
+ }
+
+ .sticky {
+ position: sticky;
+ background: purple;
+ width: 50px;
+ height: 50px;
+ top: 200px;
+ }
+ </style>
+ <script>
+ function runTest() {
+ document.getElementById("scroll2").scrollTop = 50;
+ }
+ </script>
+
+ <body onload="runTest();">
+ <!-- test before scroll -->
+ <div class="scroll">
+ <span>
+ <div class="sticky"></div>
+ </span>
+ <div class="block"></div>
+ </div>
+
+ <!-- test after scroll -->
+ <div class="scroll" id="scroll2">
+ <span>
+ <div class="sticky"></div>
+ </span>
+ <div class="block"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-ref.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-ref.html
new file mode 100644
index 00000000000..075551a6e85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top-ref.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Position Test Reference: Test position:sticky element with large top in an overflow scroll container</title>
+ <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="http://www.mozilla.org/">
+
+ <style>
+ .scroll {
+ border: 5px solid blue;
+ overflow: auto;
+ height: 200px;
+ width: 200px;
+ transform: scale(1);
+ }
+
+ .block {
+ width: 100%;
+ height: 200px;
+ background: yellow;
+ position: absolute;
+ top: 50px;
+ }
+
+ .sticky {
+ position: absolute;
+ background: purple;
+ width: 50px;
+ height: 50px;
+ top: 200px;
+ z-index: 1;
+ }
+ </style>
+ <script>
+ function runTest() {
+ document.getElementById("scroll2").scrollTop = 50;
+ }
+ </script>
+
+ <body onload="runTest();">
+ <div class="scroll">
+ <div class="sticky"></div>
+ <div class="block"></div>
+ </div>
+
+ <div class="scroll" id="scroll2">
+ <div class="sticky"></div>
+ <div class="block"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top.tentative.html b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top.tentative.html
new file mode 100644
index 00000000000..b00a0d13968
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/position-sticky-large-top.tentative.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+ <meta charset="utf-8">
+ <title>CSS Position Test: Test position:sticky element with large top in an overflow container</title>
+ <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="http://www.mozilla.org/">
+ <link rel="help" href="https://drafts.csswg.org/css-position/#sticky-pos">
+ <link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1598112">
+ <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2794">
+ <link rel="match" href="position-sticky-large-top-ref.html">
+ <meta name="assert" content="This test verifies the position of a position:sticky element with large top value can be reached by scrolling the overflow container.">
+
+ <style>
+ .scroll {
+ border: 5px solid blue;
+ overflow: auto;
+ height: 200px;
+ width: 200px;
+ }
+
+ .block {
+ width: 100%;
+ height: 200px;
+ background: yellow;
+ }
+
+ .sticky {
+ position: sticky;
+ background: purple;
+ width: 50px;
+ height: 50px;
+ top: 200px;
+ }
+ </style>
+ <script>
+ function runTest() {
+ document.getElementById("scroll2").scrollTop = 50;
+ }
+ </script>
+
+ <body onload="runTest();">
+ <!-- test before scroll -->
+ <div class="scroll">
+ <div class="sticky"></div>
+ <div class="block"></div>
+ </div>
+
+ <!-- test after scroll -->
+ <div class="scroll" id="scroll2">
+ <div class="sticky"></div>
+ <div class="block"></div>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017-ref.html
new file mode 100644
index 00000000000..9628123611d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference: ::marker pseudo elements styled with 'content' property</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<style>
+img {
+ display: list-item;
+ list-style-type: "[marker]";
+}
+img.inside {
+ list-style-position: inside;
+}
+</style>
+<ol>
+ <img src="about:invalid" alt="alt" class="inside" />
+ <img src="about:invalid" alt="alt" />
+ <li value="3">item</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017.html
new file mode 100644
index 00000000000..267e519feee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-017.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::marker pseudo elements styled with 'content' property</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="match" href="marker-content-017-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
+<link rel="help" href="https://drafts.csswg.org/css-lists/#declaring-a-list-item">
+<meta name="assert" content="Checks that ::marker can be created inside a non-replaced <img>.">
+<style>
+img {
+ display: list-item;
+}
+img.inside {
+ list-style-position: inside;
+}
+img::marker {
+ content: '[marker]';
+}
+</style>
+<ol>
+ <img src="about:invalid" alt="alt" class="inside" />
+ <img src="about:invalid" alt="alt" />
+ <li>item</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018-ref.html
new file mode 100644
index 00000000000..8107d4297d7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018-ref.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference: ::marker pseudo elements styled with 'content' property</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<style>
+ol {
+ float: left;
+ width: 100px;
+}
+.inside {
+ list-style-position: inside;
+}
+li:nth-child(1) { list-style-type: "1" }
+li:nth-child(2) { list-style-type: "1 " }
+li:nth-child(3) { list-style-type: "1 " }
+li:nth-child(4) { list-style-type: " 1" }
+li:nth-child(5) { list-style-type: " 1" }
+li:nth-child(6) { list-style-type: " 1 " }
+li:nth-child(7) { list-style-type: "1\9 2" }
+li:nth-child(8) { list-style-type: "1\a 2" }
+</style>
+<ol class="inside">
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+</ol>
+<ol class="inside">
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+</ol>
+<ol class="outside">
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+</ol>
+<ol class="outside">
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018.html
new file mode 100644
index 00000000000..0a4a73cd505
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-content-018.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: ::marker pseudo elements styled with 'content' property</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="match" href="marker-content-018-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-rules">
+<meta name="assert" content="Checks that the 'content' property of a ::marker doesn't affect white space.">
+<style>
+ol {
+ float: left;
+ width: 100px;
+}
+.inside {
+ list-style-position: inside;
+}
+li:nth-child(1)::marker { content: "1" }
+li:nth-child(2)::marker { content: "1 " }
+li:nth-child(3)::marker { content: "1 " }
+li:nth-child(4)::marker { content: " 1" }
+li:nth-child(5)::marker { content: " 1" }
+li:nth-child(6)::marker { content: " 1 " }
+li:nth-child(7)::marker { content: "1\9 2" }
+li:nth-child(8)::marker { content: "1\a 2" }
+</style>
+<ol class="inside">
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+</ol>
+<ol class="inside">
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+</ol>
+<ol class="outside">
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+ <li>item</li>
+</ol>
+<ol class="outside">
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+ <li> item</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html
index 3d106211219..be932213b0f 100644
--- a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-default-ref.html
@@ -3,6 +3,7 @@
<title>CSS Reftest Reference</title>
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" />
<link rel="mismatch" href="marker-font-variant-numeric-normal-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
@font-face {
/* This font looks different with 'font-variant-numeric: tabular-nums' */
@@ -17,19 +18,13 @@ ol {
list-style-position: inside;
font-family: "Exo 2";
}
-span {
+li:first-child::after {
+ content: 'X X X X X X X X X';
display: inline-block;
+ font: 25px/1 Ahem;
vertical-align: top;
-}
-li:first-child::before {
- content: '\200B'; /* zero-width space */
-}
-li:first-child::after {
- content: '';
- position: absolute;
- height: 225px;
+ height: 0;
width: 25px;
- background: black;
}
</style>
<ol>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html
index 45ab55d14b8..b730a24e55a 100644
--- a/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/marker-font-variant-numeric-normal-ref.html
@@ -3,6 +3,7 @@
<title>CSS Reftest Reference</title>
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com" />
<link rel="mismatch" href="marker-font-variant-numeric-default-ref.html">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style>
@font-face {
/* This font looks different with 'font-variant-numeric: tabular-nums' */
@@ -19,10 +20,10 @@ ol {
}
span {
display: inline-block;
+ font: 25px/1 Ahem;
vertical-align: top;
width: 25px;
height: 25px;
- background: black;
}
</style>
<ol>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-002-manual.html b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-002-manual.html
new file mode 100644
index 00000000000..88fa97038ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-002-manual.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+
+ <html lang="en">
+
+ <meta charset="UTF-8">
+
+ <title>CSS Pseudo-Elements Test: highlighting of spelling error</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+ <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-selectors">
+ <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling">
+
+ <meta content="" name="flags">
+
+ <style>
+ input
+ {
+ font-size: 300%;
+ }
+
+ input::spelling-error
+ {
+ color: maroon;
+ text-decoration: underline dotted red;
+ }
+ </style>
+
+ <p>PREREQUISITE: User agent needs to have an enabled and capable spelling error module. If it does not, then this test does not apply to such user agent.
+
+ <p>Test passes if each glyph of "txet" is maroon and if "txet" is underlined with a red dotted line.
+
+ <div><input type="text" value="A txet sample"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-003-manual.html b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-003-manual.html
new file mode 100644
index 00000000000..559a4fe092e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/spelling-error-003-manual.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+
+ <html lang="en">
+
+ <meta charset="UTF-8">
+
+ <title>CSS Pseudo-Elements Test: highlighting of spelling error</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+ <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-selectors">
+ <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling">
+
+ <meta content="" name="flags">
+
+ <style>
+ textarea
+ {
+ font-size: 300%;
+ }
+
+ textarea::spelling-error
+ {
+ color: maroon;
+ text-decoration: underline dotted red;
+ }
+ </style>
+
+ <p>PREREQUISITE: User agent needs to have an enabled and capable spelling error module. If it does not, then this test does not apply to such user agent.
+
+ <p>Test passes if each glyph of "txet" is maroon and if "txet" is underlined with a red dotted line.
+
+ <div><textarea rows="2" cols="20">A txet sample</textarea></div>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011-ref.html
new file mode 100644
index 00000000000..d9ba940518e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011-ref.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+
+ <meta charset="UTF-8">
+
+ <title>CSS Reftest Reference</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+ <meta content="svg" name="flags">
+
+ <style>
+ text
+ {
+ fill: green;
+ /*
+ fill is the shorthand form for fill-color,
+ fill-image, fill-origin, fill-position, fill-size
+ and fill-repeat
+ https://www.w3.org/TR/fill-stroke-3/#fill-shorthand
+ */
+ stroke: yellow;
+ /*
+ stroke is the shorthand form for stroke-color,
+ stroke-image, stroke-origin, stroke-position,
+ stroke-size, and stroke-repeat
+ https://www.w3.org/TR/fill-stroke-3/#stroke-shorthand
+ */
+ stroke-width: 2px;
+ }
+ </style>
+
+ <p>Test passes if the glyphs of "Curvy text sample" are green with a yellow outline.
+
+ <div>
+
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="550" height="300">
+
+ <path id="pathToApply"
+ d="M 100 200
+ C 100 100 200 0 500 200" fill="none" />
+
+ <text style="font-size: 48px;"><textPath xlink:href="#pathToApply" id="test">Curvy text sample</textPath></text>
+
+ </svg>
+
+ </div>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011.html b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011.html
new file mode 100644
index 00000000000..2e42c6be8fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo/textpath-selection-011.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+
+ <meta charset="UTF-8">
+
+ <title>CSS Test: active selection of text following a path (complex)</title>
+
+ <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+ <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-selectors">
+ <link rel="help" href="https://www.w3.org/TR/css-pseudo-4/#highlight-styling">
+ <link rel="help" href="https://www.w3.org/TR/fill-stroke-3/#fill-shorthand">
+ <link rel="help" href="https://www.w3.org/TR/fill-stroke-3/#stroke-shorthand">
+
+ <meta content="svg" name="flags">
+ <meta content="This test checks that an SVG application with a text following a text path can be selected and then be styled." name="assert">
+
+ <style>
+ ::selected
+ {
+ fill: green;
+ /*
+ fill is the shorthand form for fill-color,
+ fill-image, fill-origin, fill-position, fill-size
+ and fill-repeat
+ https://www.w3.org/TR/fill-stroke-3/#fill-shorthand
+ */
+ stroke: yellow;
+ /*
+ stroke is the shorthand form for stroke-color,
+ stroke-image, stroke-origin, stroke-position,
+ stroke-size, and stroke-repeat
+ https://www.w3.org/TR/fill-stroke-3/#stroke-shorthand
+ */
+ stroke-width: 2px;
+ }
+ </style>
+
+ <p>Test passes if the glyphs of "Curvy text sample" are green with a yellow outline.
+
+ <div>
+
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="550" height="300">
+
+ <path id="pathToApply"
+ d="M 100 200
+ C 100 100 200 0 500 200" fill="none" />
+
+ <text fill="red" style="font-size: 48px;"><textPath xlink:href="#pathToApply" id="test">Curvy text sample</textPath></text>
+
+ </svg>
+
+ </div>
+
+ <script>
+ var targetRange = document.createRange();
+ /* We first create an empty range */
+
+ targetRange.setStart(document.getElementById("test").childNodes[0], 0);
+ /*
+ Then we set the start boundary of the range inside textPath#test to
+ the 1st character, which is "C"
+ */
+
+ targetRange.setEnd(document.getElementById("test").childNodes[0], 17);
+ /* And we set the end boundary of the range inside textPath#test
+ right after the 18th character which is "e" */
+
+ window.getSelection().addRange(targetRange);
+ /* Finally, we now select such range of content */
+ </script>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001-ref.html
new file mode 100644
index 00000000000..eb368b3ae61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Tests for ruby-align</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ div { width: 160px; box-sizing: border-box; }
+</style>
+<body style="font: 16px/3 Ahem">
+<div>X X X</div>
+<div style="text-align: center">X X X</div>
+<div style="text-align-last: justify">X X X</div>
+<!-- 8px = (width: 160px - 5 * font-size: 16px) /
+ (1 + justification opportunities: 4) / 2 -->
+<div style="text-align-last: justify; padding: 0 8px">X X X</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001.html
new file mode 100644
index 00000000000..13c96f53f2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Tests for ruby-align</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property">
+<link rel="match" href="ruby-align-001-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ ruby { line-height: 0; }
+ rt > div { width: 160px; }
+</style>
+<body style="font: 16px/3 Ahem">
+<ruby style="ruby-align: start">
+ <rb>X X X<rt><div></div></rt>
+</ruby><br>
+<ruby style="ruby-align: center">
+ <rb>X X X<rt><div></div></rt>
+</ruby><br>
+<ruby style="ruby-align: space-between">
+ <rb>X X X<rt><div></div></rt>
+</ruby><br>
+<ruby style="ruby-align: space-around">
+ <rb>X X X<rt><div></div></rt>
+</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001a.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001a.html
new file mode 100644
index 00000000000..6e652f17265
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-001a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Tests for ruby-align</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property">
+<link rel="match" href="ruby-align-001-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ ruby { line-height: 0; }
+ rt > div { width: 160px; }
+</style>
+<body style="font: 16px/3 Ahem">
+<ruby>
+ <rb style="ruby-align: start">X X X<rt><div></div></rt>
+</ruby><br>
+<ruby>
+ <rb style="ruby-align: center">X X X<rt><div></div></rt>
+</ruby><br>
+<ruby>
+ <rb style="ruby-align: space-between">X X X<rt><div></div></rt>
+</ruby><br>
+<ruby>
+ <rb style="ruby-align: space-around">X X X<rt><div></div></rt>
+</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002-ref.html
new file mode 100644
index 00000000000..4c5413aef71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Tests for ruby-align</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ ruby { line-height: 0; }
+ rt { font-size: 100%; }
+ rt > div { width: 160px; box-sizing: border-box; }
+</style>
+<body style="font: 16px/3 Ahem">
+<ruby>
+ <rt><div>X X X</div></rt>
+</ruby><br>
+<ruby>
+ <rt><div style="text-align: center">X X X</div></rt>
+</ruby><br>
+<ruby>
+ <rt><div style="text-align-last: justify">X X X</div></rt>
+</ruby><br>
+<!-- 8px = (width: 160px - 5 * font-size: 16px) /
+ (1 + justification opportunities: 4) / 2 -->
+<ruby>
+ <rt><div style="text-align-last: justify; padding: 0 8px">X X X</div></rt>
+</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002.html
new file mode 100644
index 00000000000..ec40be5e105
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Tests for ruby-align</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property">
+<link rel="match" href="ruby-align-002-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ ruby { line-height: 0; }
+ rt { font-size: 100%; }
+ rb { font-size: 0; }
+ rb > div { width: 160px; }
+</style>
+<body style="font: 16px/3 Ahem">
+<ruby style="ruby-align: start">
+ <rb><div></div><rt>X X X</rt>
+</ruby><br>
+<ruby style="ruby-align: center">
+ <rb><div></div><rt>X X X</rt>
+</ruby><br>
+<ruby style="ruby-align: space-between">
+ <rb><div></div><rt>X X X</rt>
+</ruby><br>
+<ruby style="ruby-align: space-around">
+ <rb><div></div><rt>X X X</rt>
+</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002a.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002a.html
new file mode 100644
index 00000000000..dfb7ae37ed9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-align-002a.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Tests for ruby-align</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-align-property">
+<link rel="match" href="ruby-align-002-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ ruby { line-height: 0; }
+ rt { font-size: 100%; }
+ rb { font-size: 0; }
+ rb > div { width: 160px; }
+</style>
+<body style="font: 16px/3 Ahem">
+<ruby>
+ <rb><div></div><rt style="ruby-align: start">X X X</rt>
+</ruby><br>
+<ruby>
+ <rb><div></div><rt style="ruby-align: center">X X X</rt>
+</ruby><br>
+<ruby>
+ <rb><div></div><rt style="ruby-align: space-between">X X X</rt>
+</ruby><br>
+<ruby>
+ <rb><div></div><rt style="ruby-align: space-around">X X X</rt>
+</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html
index 695ab1cdb71..70f47eaa8be 100644
--- a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size-ref.html
@@ -3,6 +3,7 @@
<meta charset="UTF-8">
<title>CSS Ruby Reference</title>
<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="stylesheet" href="/fonts/ahem.css">
<style>
body {
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html
index dcfde6c16ea..f71b5644c62 100644
--- a/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-base-different-size.html
@@ -3,6 +3,7 @@
<meta charset="UTF-8">
<title>CSS Ruby Test: sizing and positioning of ruby containers when size of ruby bases and the base container differ</title>
<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-layout">
<link rel="match" href="ruby-base-different-size-ref.html">
<link rel="stylesheet" href="/fonts/ahem.css">
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001-ref.html
new file mode 100644
index 00000000000..c714921d32e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Position of ruby annotation in RTL text</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<style>
+ body { color: transparent; }
+ rb { background: green; }
+ rtc { background: red; }
+ rt { background: cyan; }
+</style>
+<body style="text-align: right">
+ <ruby><rb>base<rtc><rt>text</ruby>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001.html
new file mode 100644
index 00000000000..ba18071150a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-001.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Position of ruby annotation in RTL text</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#bidi">
+<link rel="match" href="ruby-bidi-001-ref.html">
+<style>
+ body { color: transparent; }
+ rb { background: green; }
+ rtc { background: red; }
+ rt { background: cyan; }
+</style>
+<body dir="rtl">
+ <ruby><rb>base<rtc><rt>text</ruby>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002-ref.html
new file mode 100644
index 00000000000..874284de998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Bidi reordering of ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style> rb { margin: 0 5px; } </style>
+<p>
+ <ruby>
+ <rb>base1</rb><rb>base2</rb>
+ <rt>text1</rt><rt>text2</rt>
+ <rb>base4</rb><rb>base3</rb>
+ <rt>text4</rt><rt>text3</rt>
+ </ruby>
+ <ruby>
+ <rb>base7</rb><rb>base8</rb>
+ <rt>text7</rt><rt>text8</rt>
+ <rb>base6</rb><rb>base5</rb>
+ <rt>text6</rt><rt>text5</rt>
+ </ruby>
+</p>
+<p style="text-align: right">
+ <ruby>
+ <rb>base5</rb><rb>base6</rb>
+ <rt>text5</rt><rt>text6</rt>
+ <rb>base8</rb><rb>base7</rb>
+ <rt>text8</rt><rt>text7</rt>
+ </ruby>
+ <ruby>
+ <rb>base3</rb><rb>base4</rb>
+ <rt>text3</rt><rt>text4</rt>
+ <rb>base2</rb><rb>base1</rb>
+ <rt>text2</rt><rt>text1</rt>
+ </ruby>
+</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002.html
new file mode 100644
index 00000000000..d6692a333ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-002.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Bidi reordering of ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#bidi">
+<link rel="match" href="ruby-bidi-002-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style> rb { margin: 0 5px; } </style>
+<p>
+ <ruby>
+ <rb>base1</rb><rb>base2</rb>
+ <rtc dir="rtl">
+ <rt>text1</rt><rt>text2</rt>
+ </rtc>
+ <rbc dir="rtl">
+ <rb>base3</rb><rb>base4</rb>
+ </rbc>
+ <rt>text3</rt><rt>text4</rt>
+ </ruby>
+ <ruby dir="rtl">
+ <rb>base5</rb><rb>base6</rb>
+ <rt>text5</rt><rt>text6</rt>
+ <rbc dir="ltr">
+ <rb>base7</rb><rb>base8</rb>
+ </rbc>
+ <rt>text7</rt><rt>text8</rt>
+ </ruby>
+</p>
+<p dir="rtl">
+ <ruby>
+ <rb>base1</rb><rb>base2</rb>
+ <rtc dir="ltr">
+ <rt>text1</rt><rt>text2</rt>
+ </rtc>
+ <rbc dir="ltr">
+ <rb>base3</rb><rb>base4</rb>
+ </rbc>
+ <rt>text3</rt><rt>text4</rt>
+ </ruby>
+ <ruby dir="ltr">
+ <rb>base5</rb><rb>base6</rb>
+ <rt>text5</rt><rt>text6</rt>
+ <rbc dir="rtl">
+ <rb>base7</rb><rb>base8</rb>
+ </rbc>
+ <rt>text7</rt><rt>text8</rt>
+ </ruby>
+</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003-ref.html
new file mode 100644
index 00000000000..ec00293d861
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003-ref.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Bidirectional text inside ruby content box</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<body dir="rtl" style="font-size: 64px">
+<ruby><div>אב12ג</div><rt><div>אabבג</div></ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003.html
new file mode 100644
index 00000000000..2510408ec22
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-bidi-003.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Bidirectional text inside ruby content box</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#bidi">
+<link rel="match" href="ruby-bidi-003-ref.html">
+<body dir="rtl" style="font-size: 64px">
+<ruby>אב12ג<rt>אabבג</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001-ref.html
new file mode 100644
index 00000000000..8d836fe23c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001-ref.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<body class="large">
+
+ <p>|<ruby><rbc><rb>a</rb><rb><span> </span></rb><rb>b</rb></rbc
+ ><rtc pseudo><rt>c</rt><rt pseudo><span> </span></rt><rt>d</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>e</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>g</rb></rbc><rtc><rt>h</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>i</rb><rb><span> <span>j</span>
+ </span></rb></rbc><rtc pseudo><rt>k</rt></rtc><rbc><rb><span> <span>l</span>
+ </span></rb></rbc><rbc><rb>m</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>n</rb></rbc
+ ><rtc><rt>o</rt></rtc><rtc><rt>p</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>q</rb></rbc><rtc pseudo><rt>r</rt></rtc
+ ><rtc><rt>s</rt></rtc><rtc pseudo><rt>t</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>u</rb></rbc><rbc><rb><span> <span>v</span>
+ <span>w</span> </span></rb></rbc><rtc><rt>x</rt></rtc><rbc><rb><span>
+ <span>y</span> </span></rb><rb>z</rb></rbc></ruby>|</p>
+
+ <p>|<span> </span><ruby><rbc><rb>a</rb><rb><span> </span></rb><rb>b</rb></rbc
+ ><rtc pseudo><rt>c</rt><rt pseudo><span> </span></rt><rt>d</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>e</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>g</rb></rbc><rtc><rt>h</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>i</rb></rbc></ruby><span> <span>j</span>
+ </span><ruby><rbc></rbc><rtc pseudo><rt>k</rt></rtc></ruby><span> <span>l</span>
+ </span><ruby><rbc><rb>m</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>n</rb></rbc
+ ><rtc><rt>o</rt></rtc><rtc><rt>p</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>q</rb></rbc><rtc pseudo><rt>r</rt></rtc
+ ><rtc><rt>s</rt></rtc><rtc pseudo><rt>t</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>u</rb></rbc></ruby><span> <span>v</span>
+ <span>w</span> </span><ruby><rbc></rbc><rtc><rt>x</rt></rtc></ruby><span>
+ <span>y</span> </span><ruby><rbc><rb>z</rb></rbc></ruby><span> </span>|</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001.html
new file mode 100644
index 00000000000..ac58d4d43ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-001.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="stylesheet" href="support/ruby-common.css">
+<link rel="match" href="ruby-box-generation-001-ref.html">
+<body class="large">
+
+ <!--
+ The tests are written in this way:
+ there are five different elements may appear in a ruby container: rb, rt,
+ rbc, rtc, and inline content.
+
+ In each test file, there are two parts: all elements are wrapped inside a
+ <ruby> in one part, they are directly contained by a <p> in the other part.
+
+ In each part, all permutations of pairs of two adjacent elements are
+ presented, so there are 5*5+1=26 elements.
+
+ The five test files share the same structure, but with different element
+ type order.
+ -->
+
+ <p>|<ruby>
+ <rb>a</rb> <rb>b</rb>
+ <rt>c</rt> <rt>d</rt>
+ <rb>e</rb> <rbc><rb>f</rb></rbc>
+ <rb>g</rb> <rtc><rt>h</rt></rtc>
+ <rb>i</rb> <span>j</span>
+ <rt>k</rt> <span>l</span>
+ <rbc><rb>m</rb></rbc> <rbc><rb>n</rb></rbc>
+ <rtc><rt>o</rt></rtc> <rtc><rt>p</rt></rtc>
+ <rbc><rb>q</rb></rbc> <rt>r</rt>
+ <rtc><rt>s</rt></rtc> <rt>t</rt>
+ <rbc><rb>u</rb></rbc> <span>v</span>
+ <span>w</span> <rtc><rt>x</rt></rtc>
+ <span>y</span> <rb>z</rb>
+ </ruby>|</p>
+
+ <p>| <rb>a</rb> <rb>b</rb>
+ <rt>c</rt> <rt>d</rt>
+ <rb>e</rb> <rbc><rb>f</rb></rbc>
+ <rb>g</rb> <rtc><rt>h</rt></rtc>
+ <rb>i</rb> <span>j</span>
+ <rt>k</rt> <span>l</span>
+ <rbc><rb>m</rb></rbc> <rbc><rb>n</rb></rbc>
+ <rtc><rt>o</rt></rtc> <rtc><rt>p</rt></rtc>
+ <rbc><rb>q</rb></rbc> <rt>r</rt>
+ <rtc><rt>s</rt></rtc> <rt>t</rt>
+ <rbc><rb>u</rb></rbc> <span>v</span>
+ <span>w</span> <rtc><rt>x</rt></rtc>
+ <span>y</span> <rb>z</rb> |</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002-ref.html
new file mode 100644
index 00000000000..730ab787d30
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002-ref.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<body class="large">
+
+ <p>|<ruby><rbc></rbc
+ ><rtc pseudo><rt>a</rt><rt pseudo><span> </span></rt><rt>b</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>c</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>d</rb></rbc
+ ><rtc pseudo><rt>e</rt></rtc><rtc><rt>f</rt></rtc
+ ><rtc pseudo><rt>g</rt></rtc><rbc><rb><span> h
+ </span></rb></rbc><rtc pseudo><rt>i</rt></rtc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>j</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>k</rb></rbc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>l</rb></rbc
+ ><rtc><rt>m</rt></rtc><rtc><rt>n</rt></rtc><rbc><rb><span>
+ o p
+ </span></rb></rbc><rtc><rt>q</rt></rtc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>r</rb></rbc><rbc><rb><span>
+ s </span></rb></rbc><rbc><rb>t</rb></rbc
+ ><rtc><rt>u</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>v</rb><rb><span>
+ </span></rb><rb>w</rb><rb><span> x
+ </span></rb><rb>y</rb></rbc><rtc pseudo><rt>z</rt></rtc></ruby>|</p>
+
+ <p>|<span> </span><ruby><rbc></rbc
+ ><rtc pseudo><rt>a</rt><rt pseudo><span> </span></rt><rt>b</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>c</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>d</rb></rbc
+ ><rtc pseudo><rt>e</rt></rtc><rtc><rt>f</rt></rtc
+ ><rtc pseudo><rt>g</rt></rtc></ruby><span> h
+ </span><ruby><rbc></rbc><rtc pseudo><rt>i</rt></rtc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>j</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>k</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>l</rb></rbc
+ ><rtc><rt>m</rt></rtc><rtc><rt>n</rt></rtc></ruby><span>
+ o p
+ </span><ruby><rbc></rbc><rtc><rt>q</rt></rtc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>r</rb></rbc></ruby><span>
+ s </span><ruby><rbc><rb>t</rb></rbc
+ ><rtc><rt>u</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>v</rb><rb><span>
+ </span></rb><rb>w</rb></rbc></ruby><span> x
+ </span><ruby><rbc><rb>y</rb></rbc><rtc pseudo><rt>z</rt></rtc></ruby><span> </span>|</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002.html
new file mode 100644
index 00000000000..e09ecf1eb25
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-002.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="stylesheet" href="support/ruby-common.css">
+<link rel="match" href="ruby-box-generation-002-ref.html">
+<body class="large">
+
+ <!--
+ The tests are written in this way:
+ there are five different elements may appear in a ruby container: rb, rt,
+ rbc, rtc, and inline content.
+
+ In each test file, there are two parts: all elements are wrapped inside a
+ <ruby> in one part, they are directly contained by a <p> in the other part.
+
+ In each part, all permutations of pairs of two adjacent elements are
+ presented, so there are 5*5+1=26 elements.
+
+ The five test files share the same structure, but with different element
+ type order.
+ -->
+
+ <p>|<ruby>
+ <rt>a</rt> <rt>b</rt>
+ <rbc><rb>c</rb></rbc> <rbc><rb>d</rb></rbc>
+ <rt>e</rt> <rtc><rt>f</rt></rtc>
+ <rt>g</rt> <span>h</span>
+ <rt>i</rt> <rb>j</rb>
+ <rbc><rb>k</rb></rbc> <rb>l</rb>
+ <rtc><rt>m</rt></rtc> <rtc><rt>n</rt></rtc>
+ <span>o</span> <span>p</span>
+ <rtc><rt>q</rt></rtc> <rbc><rb>r</rb></rbc>
+ <span>s</span> <rbc><rb>t</rb></rbc>
+ <rtc><rt>u</rt></rtc> <rb>v</rb>
+ <rb>w</rb> <span>x</span>
+ <rb>y</rb> <rt>z</rt>
+ </ruby>|</p>
+
+ <p>| <rt>a</rt> <rt>b</rt>
+ <rbc><rb>c</rb></rbc> <rbc><rb>d</rb></rbc>
+ <rt>e</rt> <rtc><rt>f</rt></rtc>
+ <rt>g</rt> <span>h</span>
+ <rt>i</rt> <rb>j</rb>
+ <rbc><rb>k</rb></rbc> <rb>l</rb>
+ <rtc><rt>m</rt></rtc> <rtc><rt>n</rt></rtc>
+ <span>o</span> <span>p</span>
+ <rtc><rt>q</rt></rtc> <rbc><rb>r</rb></rbc>
+ <span>s</span> <rbc><rb>t</rb></rbc>
+ <rtc><rt>u</rt></rtc> <rb>v</rb>
+ <rb>w</rb> <span>x</span>
+ <rb>y</rb> <rt>z</rt> |</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003-ref.html
new file mode 100644
index 00000000000..e4c92a498bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003-ref.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<body class="large">
+
+ <p>|<ruby><rbc><rb>a</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>b</rb></rbc
+ ><rtc><rt>c</rt></rtc><rtc><rt>d</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>e</rb></rbc><rbc><rb><span> <span>f</span>
+ </span></rb></rbc><rbc><rb>g</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>h</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>i</rb></rbc><rtc pseudo><rt>j</rt></rtc
+ ><rtc><rt>k</rt></rtc><rtc pseudo><rt>l</rt></rtc><rbc><rb><span>
+ <span>m</span> <span>n</span>
+ </span></rb><rb>o</rb><rb><span> </span></rb><rb>p</rb><rb><span>
+ <span>q</span> </span></rb></rbc><rtc><rt>r</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>s</rb></rbc><rtc><rt>t</rt></rtc><rbc><rb><span>
+ <span>u</span> </span></rb></rbc><rtc pseudo><rt>v</rt><rt pseudo><span>
+ </span></rt><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc
+ ><rtc pseudo><rt>y</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>z</rb></rbc
+ ></ruby>|</p>
+
+ <p>|<span> </span><ruby><rbc><rb>a</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>b</rb></rbc
+ ><rtc><rt>c</rt></rtc><rtc><rt>d</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>e</rb></rbc></ruby><span> <span>f</span>
+ </span><ruby><rbc><rb>g</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>h</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>i</rb></rbc><rtc pseudo><rt>j</rt></rtc
+ ><rtc><rt>k</rt></rtc><rtc pseudo><rt>l</rt></rtc></ruby><span>
+ <span>m</span> <span>n</span>
+ </span><ruby><rbc><rb>o</rb><rb><span> </span></rb><rb>p</rb></rbc></ruby><span>
+ <span>q</span> </span><ruby><rbc></rbc><rtc><rt>r</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>s</rb></rbc><rtc><rt>t</rt></rtc></ruby><span>
+ <span>u</span> </span><ruby><rbc></rbc><rtc pseudo><rt>v</rt><rt pseudo><span>
+ </span><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc
+ ><rtc pseudo><rt>y</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>z</rb></rbc></ruby
+ ><span> </span>|</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003.html
new file mode 100644
index 00000000000..6b975afdfbf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-003.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="stylesheet" href="support/ruby-common.css">
+<link rel="match" href="ruby-box-generation-003-ref.html">
+<body class="large">
+
+ <!--
+ The tests are written in this way:
+ there are five different elements may appear in a ruby container: rb, rt,
+ rbc, rtc, and inline content.
+
+ In each test file, there are two parts: all elements are wrapped inside a
+ <ruby> in one part, they are directly contained by a <p> in the other part.
+
+ In each part, all permutations of pairs of two adjacent elements are
+ presented, so there are 5*5+1=26 elements.
+
+ The five test files share the same structure, but with different element
+ type order.
+ -->
+
+ <p>|<ruby>
+ <rbc><rb>a</rb></rbc> <rbc><rb>b</rb></rbc>
+ <rtc><rt>c</rt></rtc> <rtc><rt>d</rt></rtc>
+ <rbc><rb>e</rb></rbc> <span>f</span>
+ <rbc><rb>g</rb></rbc> <rb>h</rb>
+ <rbc><rb>i</rb></rbc> <rt>j</rt>
+ <rtc><rt>k</rt></rtc> <rt>l</rt>
+ <span>m</span> <span>n</span>
+ <rb>o</rb> <rb>p</rb>
+ <span>q</span> <rtc><rt>r</rt></rtc>
+ <rb>s</rb> <rtc><rt>t</rt></rtc>
+ <span>u</span> <rt>v</rt>
+ <rt>w</rt> <rb>x</rb>
+ <rt>y</rt> <rbc><rb>z</rb></rbc>
+ </ruby>|</p>
+
+ <p>| <rbc><rb>a</rb></rbc> <rbc><rb>b</rb></rbc>
+ <rtc><rt>c</rt></rtc> <rtc><rt>d</rt></rtc>
+ <rbc><rb>e</rb></rbc> <span>f</span>
+ <rbc><rb>g</rb></rbc> <rb>h</rb>
+ <rbc><rb>i</rb></rbc> <rt>j</rt>
+ <rtc><rt>k</rt></rtc> <rt>l</rt>
+ <span>m</span> <span>n</span>
+ <rb>o</rb> <rb>p</rb>
+ <span>q</span> <rtc><rt>r</rt></rtc>
+ <rb>s</rb> <rtc><rt>t</rt></rtc>
+ <span>u</span> <rt>v</rt>
+ <rt>w</rt> <rb>x</rb>
+ <rt>y</rt> <rbc><rb>z</rb></rbc> |</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004-ref.html
new file mode 100644
index 00000000000..7a27622cac1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004-ref.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<body class="large">
+
+ <p>|<ruby><rbc></rbc
+ ><rtc><rt>a</rt></rtc><rtc><rt>b</rt></rtc><rbc><rb><span>
+ <span>c</span> <span>d</span>
+ </span></rb></rbc><rtc><rt>e</rt></rtc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc
+ ><rtc><rt>g</rt></rtc><rtc pseudo><rt>h</rt></rtc
+ ><rtc><rt>i</rt></rtc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>j</rb></rbc><rbc><rb><span>
+ <span>k</span> </span></rb></rbc><rbc><rb>l</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>m</rb><rb><span> </span></rb><rb>n</rb></rbc
+ ><rtc pseudo><rt>o</rt><rt pseudo><span> </span></rt><rt>p</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>q</rb><rb><span> <span>r</span>
+ </span></rb></rbc><rtc pseudo><rt>s</rt></rtc><rbc><rb><span> <span>t</span>
+ </span></rb></rbc><rbc><rb>u</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>v</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>w</rb></rbc><rtc pseudo><rt>x</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>y</rb></rbc><rtc><rt>z</rt></rtc
+ ></ruby>|</p>
+
+ <p>|<span> </span><ruby><rbc></rbc
+ ><rtc><rt>a</rt></rtc><rtc><rt>b</rt></rtc></ruby><span>
+ <span>c</span> <span>d</span>
+ </span><ruby><rbc></rbc><rtc><rt>e</rt></rtc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>f</rb></rbc
+ ><rtc><rt>g</rt></rtc><rtc pseudo><rt>h</rt></rtc
+ ><rtc><rt>i</rt></rtc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>j</rb></rbc></ruby><span>
+ <span>k</span> </span><ruby><rbc><rb>l</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>m</rb><rb><span> </span></rb><rb>n</rb></rbc
+ ><rtc pseudo><rt>o</rt><rt pseudo><span> </span></rt><rt>p</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>q</rb></rbc></ruby><span> <span>r</span>
+ </span><ruby><rbc></rbc><rtc pseudo><rt>s</rt></rtc></ruby><span> <span>t</span>
+ </span><ruby><rbc><rb>u</rb></rbc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>v</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>w</rb></rbc><rtc pseudo><rt>x</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>y</rb></rbc><rtc><rt>z</rt></rtc></ruby
+ ><span> </span>|</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004.html
new file mode 100644
index 00000000000..0f6ed72d717
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-004.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="stylesheet" href="support/ruby-common.css">
+<link rel="match" href="ruby-box-generation-004-ref.html">
+<body class="large">
+
+ <!--
+ The tests are written in this way:
+ there are five different elements may appear in a ruby container: rb, rt,
+ rbc, rtc, and inline content.
+
+ In each test file, there are two parts: all elements are wrapped inside a
+ <ruby> in one part, they are directly contained by a <p> in the other part.
+
+ In each part, all permutations of pairs of two adjacent elements are
+ presented, so there are 5*5+1=26 elements.
+
+ The five test files share the same structure, but with different element
+ type order.
+ -->
+
+ <p>|<ruby>
+ <rtc><rt>a</rt></rtc> <rtc><rt>b</rt></rtc>
+ <span>c</span> <span>d</span>
+ <rtc><rt>e</rt></rtc> <rb>f</rb>
+ <rtc><rt>g</rt></rtc> <rt>h</rt>
+ <rtc><rt>i</rt></rtc> <rbc><rb>j</rb></rbc>
+ <span>k</span> <rbc><rb>l</rb></rbc>
+ <rb>m</rb> <rb>n</rb>
+ <rt>o</rt> <rt>p</rt>
+ <rb>q</rb> <span>r</span>
+ <rt>s</rt> <span>t</span>
+ <rb>u</rb> <rbc><rb>v</rb></rbc>
+ <rbc><rb>w</rb></rbc> <rt>x</rt>
+ <rbc><rb>y</rb></rbc> <rtc><rt>z</rt></rtc>
+ </ruby>|</p>
+
+ <p>| <rtc><rt>a</rt></rtc> <rtc><rt>b</rt></rtc>
+ <span>c</span> <span>d</span>
+ <rtc><rt>e</rt></rtc> <rb>f</rb>
+ <rtc><rt>g</rt></rtc> <rt>h</rt>
+ <rtc><rt>i</rt></rtc> <rbc><rb>j</rb></rbc>
+ <span>k</span> <rbc><rb>l</rb></rbc>
+ <rb>m</rb> <rb>n</rb>
+ <rt>o</rt> <rt>p</rt>
+ <rb>q</rb> <span>r</span>
+ <rt>s</rt> <span>t</span>
+ <rb>u</rb> <rbc><rb>v</rb></rbc>
+ <rbc><rb>w</rb></rbc> <rt>x</rt>
+ <rbc><rb>y</rb></rbc> <rtc><rt>z</rt></rtc> |</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005-ref.html
new file mode 100644
index 00000000000..55ba7b2c73f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<body class="large">
+
+ <p>|<ruby><rbc><rb><span><span>a</span> <span>b</span>
+ </span></rb><rb>c</rb><rb><span> </span></rb><rb>d</rb><rb><span>
+ <span>e</span> </span></rb></rbc><rtc pseudo><rt>f</rt></rtc><rbc><rb><span>
+ <span>g</span> </span></rb></rbc><rbc><rb>h</rb></rbc><rbc><rb><span>
+ <span>i</span> </span></rb></rbc><rtc><rt>j</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>k</rb></rbc><rtc><rt>l</rt></rtc
+ ><rtc pseudo><rt>m</rt><rt pseudo><span> </span></rt><rt>n</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>o</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>p</rb></rbc
+ ><rtc pseudo><rt>q</rt></rtc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>r</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>s</rb></rbc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>t</rb></rbc
+ ><rtc pseudo><rt>u</rt></rtc><rtc><rt>v</rt></rtc
+ ><rtc><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc
+ ><rtc><rt>y</rt></rtc><rbc><rb><span> <span>z</span></span></rb></rbc
+ ></ruby>|</p>
+
+ <p>|<span> <span>a</span> <span>b</span>
+ </span><ruby
+ ><rbc><rb>c</rb><rb><span> </span></rb><rb>d</rb></rbc></ruby><span>
+ <span>e</span> </span><ruby><rbc></rbc><rtc pseudo><rt>f</rt></rtc></ruby><span>
+ <span>g</span> </span><ruby><rbc><rb>h</rb></rbc></ruby><span>
+ <span>i</span> </span><ruby><rbc></rbc><rtc><rt>j</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>k</rb></rbc><rtc><rt>l</rt></rtc
+ ><rtc pseudo><rt>m</rt><rt pseudo><span> </span></rt><rt>n</rt></rtc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>o</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc><rbc><rb>p</rb></rbc
+ ><rtc pseudo><rt>q</rt></rtc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>r</rb></rbc><rbc><rb><span>
+ </span></rb></rbc><rbc><rb>s</rb></rbc><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>t</rb></rbc
+ ><rtc pseudo><rt>u</rt></rtc><rtc><rt>v</rt></rtc
+ ><rtc><rt>w</rt></rtc><rbc><rb><span> </span></rb></rbc><rbc><rb>x</rb></rbc
+ ><rtc><rt>y</rt></rtc></ruby><span> <span>z</span> </span>|</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005.html
new file mode 100644
index 00000000000..c86b697bf9d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-box-generation-005.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for pseudo ruby box generation</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="stylesheet" href="support/ruby-common.css">
+<link rel="match" href="ruby-box-generation-005-ref.html">
+<body class="large">
+
+ <p>|<ruby>
+ <span>a</span> <span>b</span>
+ <rb>c</rb> <rb>d</rb>
+ <span>e</span> <rt>f</rt>
+ <span>g</span> <rbc><rb>h</rb></rbc>
+ <span>i</span> <rtc><rt>j</rt></rtc>
+ <rb>k</rb> <rtc><rt>l</rt></rtc>
+ <rt>m</rt> <rt>n</rt>
+ <rbc><rb>o</rb></rbc> <rbc><rb>p</rb></rbc>
+ <rt>q</rt> <rb>r</rb>
+ <rbc><rb>s</rb></rbc> <rb>t</rb>
+ <rt>u</rt> <rtc><rt>v</rt></rtc>
+ <rtc><rt>w</rt></rtc> <rbc><rb>x</rb></rbc>
+ <rtc><rt>y</rt></rtc> <span>z</span>
+ </ruby>|</p>
+
+ <p>| <span>a</span> <span>b</span>
+ <rb>c</rb> <rb>d</rb>
+ <span>e</span> <rt>f</rt>
+ <span>g</span> <rbc><rb>h</rb></rbc>
+ <span>i</span> <rtc><rt>j</rt></rtc>
+ <rb>k</rb> <rtc><rt>l</rt></rtc>
+ <rt>m</rt> <rt>n</rt>
+ <rbc><rb>o</rb></rbc> <rbc><rb>p</rb></rbc>
+ <rt>q</rt> <rb>r</rb>
+ <rbc><rb>s</rb></rbc> <rb>t</rb>
+ <rt>u</rt> <rtc><rt>v</rt></rtc>
+ <rtc><rt>w</rt></rtc> <rbc><rb>x</rb></rbc>
+ <rtc><rt>y</rt></rtc> <span>z</span> |</p>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001-ref.html
new file mode 100644
index 00000000000..0a09924c653
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+
+<p>One space should exist between 'a' and 'b':</p>
+
+<p>a<rbc><rb></rb> <rb></rb></rbc>b</p>
+<p>a<ruby><rb></rb> <rb></rb></ruby>b</p>
+<p>a<ruby><rbc></rbc> <rbc></rbc></ruby>b</p>
+<p>a<rtc><rt></rt> <rt></rt></rtc>b</p>
+<p>a<ruby><rt></rt> <rt></rt></ruby>b</p>
+
+<p>a<rbc><rb></rb> <rb></rb></rbc>b</p>
+<p>a<ruby><rb></rb> <rb></rb></ruby>b</p>
+<p>a<ruby><rbc></rbc> <rbc></rbc></ruby>b</p>
+<p>a<rtc><rt></rt> <rt></rt></rtc>b</p>
+<p>a<ruby><rt></rt> <rt></rt></ruby>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001.html
new file mode 100644
index 00000000000..be1c5ce5005
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-001.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-insertion-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-insertion.js"></script>
+<p>One space should exist between 'a' and 'b':</p>
+
+<!-- leading white space -->
+<!-- => inter-base white space -->
+<p>a<rbc data-insert="start" data-tag="rb"> <rb></rb></rbc>b</p>
+<p>a<ruby data-insert="start" data-tag="rb"> <rb></rb></ruby>b</p>
+<!-- => inter-segment white space -->
+<p>a<ruby data-insert="start" data-tag="rbc"> <rbc></rbc></ruby>b</p>
+<!-- => inter-annotation white space -->
+<p>a<rtc data-insert="start" data-tag="rt"> <rt></rt></rtc>b</p>
+<p>a<ruby data-insert="start" data-tag="rt"> <rt></rt></ruby>b</p>
+
+<!-- trailing white space -->
+<!-- => inter-base white space -->
+<p>a<rbc data-insert="end" data-tag="rb"><rb></rb> </rbc>b</p>
+<p>a<ruby data-insert="end" data-tag="rb"><rb></rb> </ruby>b</p>
+<!-- => inter-segment white space -->
+<p>a<ruby data-insert="end" data-tag="rbc"><rbc></rbc> </ruby>b</p>
+<!-- => inter-annotation white space -->
+<p>a<rtc data-insert="end" data-tag="rt"><rt></rt> </rtc>b</p>
+<p>a<ruby data-insert="end" data-tag="rt"><rt></rt> </ruby>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002-ref.html
new file mode 100644
index 00000000000..cd85db944e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+
+<p>One space should exist between 'a' and 'b':</p>
+
+<p>a<rb></rb><span></span> <rt></rt>b</p>
+<p>a<rb></rb> <span></span><rt></rt>b</p>
+<p>a<rb></rb> <rb></rb><rt></rt>b</p>
+<p>a<rt></rt><rb></rb> <rb></rb>b</p>
+<p>a<rbc></rbc> <rbc></rbc><rt></rt>b</p>
+<p>a<rb></rb><rt></rt> <rt></rt>b</p>
+<p>a<rt></rt> <rt></rt><rb></rb>b</p>
+
+<p>a<rb></rb> <rb></rb>b</p>
+<p>a<rbc></rbc> <rbc></rbc>b</p>
+<p>a<rt></rt> <rt></rt>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002.html
new file mode 100644
index 00000000000..c2a12a04195
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-002.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-insertion-002-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-insertion.js"></script>
+<p>One space should exist between 'a' and 'b':</p>
+
+<!-- inter-level white space -->
+<!-- => normal white space -->
+<p>a<rb data-insert="after" data-tag="span"></rb> <rt></rt>b</p>
+<p>a<rb></rb> <rt data-insert="before" data-tag="span"></rt>b</p>
+<!-- => inter-base white space -->
+<p>a<rb></rb> <rt data-insert="before" data-tag="rb"></rt>b</p>
+<p>a<rt data-insert="after" data-tag="rb"></rt> <rb></rb>b</p>
+<!-- => inter-segment white space -->
+<p>a<rbc></rbc> <rt data-insert="before" data-tag="rbc"></rt>b</p>
+<!-- => inter-annotation white space -->
+<p>a<rb data-insert="after" data-tag="rt"></rb> <rt></rt>b</p>
+<p>a<rt></rt> <rb data-insert="before" data-tag="rt"></rb>b</p>
+
+<!-- insert white space -->
+<!-- inter-base white space -->
+<p>a<rb data-insert="after" data-text=" "></rb><rb></rb>b</p>
+<!-- inter-segment white space -->
+<p>a<rbc data-insert="after" data-text=" "></rbc><rbc></rbc>b</p>
+<!-- inter-annotation white space -->
+<p>a<rt data-insert="after" data-text=" "></rt><rt></rt>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003-ref.html
new file mode 100644
index 00000000000..ef71525479d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p>No space should exist between 'a' and 'b':</p>
+
+<p><span>a</span><rb></rb> <rt></rt>b</p>
+<p>a<rb></rb> <rt></rt><span>b</span></p>
+<p>a<rb></rb> <rt></rt><rb></rb>b</p>
+<p>a<rbc></rbc> <rt></rt><rb></rb>b</p>
+<p>a<rt></rt><rb></rb> <rt></rt>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003.html
new file mode 100644
index 00000000000..68984b5568b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-003.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-insertion-003-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-insertion.js"></script>
+<p>No space should exist between 'a' and 'b':</p>
+
+<!-- inter-level white space -->
+<!-- <= normal white space -->
+<p><span data-insert="after" data-tag="rb">a</span> <rt></rt>b</p>
+<p>a<rb></rb> <span data-insert="before" data-tag="rt">b</span></p>
+<!-- <= inter-base white space -->
+<p>a<rb></rb> <rb data-insert="before" data-tag="rt"></rb>b</p>
+<!-- <= inter-segment white space -->
+<p>a<rbc></rbc> <rb data-insert="before" data-tag="rt"></rb>b</p>
+<!-- <= inter-annotation white space -->
+<p>a<rt data-insert="after" data-tag="rb"></rt> <rt></rt>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004-ref.html
new file mode 100644
index 00000000000..9c8120ee3fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p>No space should exist between 'a' and 'b':</p>
+
+<p>a<ruby> <rb></rb></ruby>b</p>
+<p>a<rbc> <rb></rb></rbc>b</p>
+<p>a<rtc> <rt></rt></rtc>b</p>
+<p>a<ruby><rb></rb> </ruby>b</p>
+<p>a<rbc><rb></rb> </rbc>b</p>
+<p>a<rtc><rt></rt> </rtc>b</p>
+<p>a<rb></rb> <rt></rt>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004.html
new file mode 100644
index 00000000000..9b3c36e3ac8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-004.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-insertion-004-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-insertion.js"></script>
+<p>No space should exist between 'a' and 'b':</p>
+
+<!-- insert white space -->
+<!-- leading white space -->
+<p>a<ruby data-insert="start" data-text=" "><rb></rb></ruby>b</p>
+<p>a<rbc data-insert="start" data-text=" "><rb></rb></rbc>b</p>
+<p>a<rtc data-insert="start" data-text=" "><rt></rt></rtc>b</p>
+<!-- trailing white space -->
+<p>a<ruby data-insert="end" data-text=" "><rb></rb></ruby>b</p>
+<p>a<rbc data-insert="end" data-text=" "><rb></rb></rbc>b</p>
+<p>a<rtc data-insert="end" data-text=" "><rt></rt></rtc>b</p>
+<!-- inter-level white space -->
+<p>a<rb data-insert="after" data-text=" "></rb><rt></rt>b</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005-ref.html
new file mode 100644
index 00000000000..03e5cabe55c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p>
+
+<p><rb></rb><span></span><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<p><rb></rb><rt></rt><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<p><rb>a</rb><rt>x</rt><rb>b</rb><rt>y</rt></p>
+<p><rbc><span>a</span><rb></rb>b</rbc><rt>x</rt><rt></rt><rt>y</rt></p>
+<p><rb>a</rb><rb></rb><rb>b</rb><rtc><span>x</span><rt></rt>y</rtc></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005.html
new file mode 100644
index 00000000000..a684d665c89
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-insertion-005.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic insertion of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-insertion-005-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-insertion.js"></script>
+<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p>
+
+<!-- split -->
+<!-- pseudo ruby -->
+<p><rb data-insert="after" data-tag="span"></rb><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<!-- pseudo ruby base container -->
+<p><rb data-insert="after" data-tag="rt"></rb><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<!-- pseudo ruby text container -->
+<p><rb>a</rb><rt data-insert="after" data-tag="rb" data-text="b">x</rt><rt>y</rt></p>
+<!-- pseudo ruby base -->
+<p><rbc><span data-insert="after" data-tag="rb">a</span>b</rbc><rt>x</rt><rt></rt><rt>y</rt></p>
+<!-- pseudo ruby text -->
+<p><rb>a</rb><rb></rb><rb>b</rb><rtc><span data-insert="after" data-tag="rt">x</span>y</rtc></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001-ref.html
new file mode 100644
index 00000000000..23beda28987
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic removal of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p>No space should exist between 'a' and 'b':</p>
+
+<p>a<ruby> <rb></rb></ruby>b</p>
+<p>a<ruby><rb></rb> </ruby>b</p>
+<p>a<ruby><rb></rb> <rt></rt></ruby>b</p>
+
+<p>a<ruby> <rbc></rbc></ruby>b</p>
+<p>a<ruby><rbc></rbc> </ruby>b</p>
+<p>a<rbc></rbc> <rtc></rtc>b</p>
+
+<p><rb>a</rb><rb>b</rb><rtc> <rt>x</rt></rtc></p>
+<p><rb>a</rb><rb>b</rb><rtc><rt>x</rt> </rtc></p>
+<p><rb>a</rb><rb>b</rb> <rt>x</rt></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001.html
new file mode 100644
index 00000000000..090ea43c79a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-001.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic removal of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-removal-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-removal.js"></script>
+<p>No space should exist between 'a' and 'b':</p>
+
+<!-- inter-base white space -->
+<!-- => leading white space -->
+<p>a<ruby><rb class="remove"></rb> <rb></rb></ruby>b</p>
+<!-- => trailing white space -->
+<p>a<ruby><rb></rb> <rb class="remove"></rb></ruby>b</p>
+<!-- => inter-level white space -->
+<p>a<ruby><rb></rb> <rb class="remove"></rb><rt></rt></ruby>b</p>
+
+<!-- inter-segment white space -->
+<!-- => leading white space -->
+<p>a<ruby><rbc class="remove"></rbc> <rbc></rbc></ruby>b</p>
+<!-- => trailing white space -->
+<p>a<ruby><rbc></rbc> <rbc class="remove"></rbc></ruby>b</p>
+<!-- => inter-level white space -->
+<p>a<rbc></rbc> <rbc class="remove"></rbc><rtc></rtc>b</p>
+
+<!-- inter-annotation white space -->
+<!-- => leading white space -->
+<p><rb>a</rb><rb>b</rb><rtc><rt class="remove"></rt> <rt>x</rt></rtc></p>
+<!-- => trailing white space -->
+<p><rb>a</rb><rb>b</rb><rtc><rt>x</rt> <rt class="remove"></rt></rtc></p>
+<!-- => inter-level white space -->
+<p><rb>a</rb><rb>b</rb><rt class="remove"></rt> <rt>x</rt></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002-ref.html
new file mode 100644
index 00000000000..f9d2fd7240d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic removal of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p>One space should exist between 'a' and 'b':</p>
+
+<p>a <rt></rt>b</p>
+<p>a<rb></rb> b</p>
+<p>a<rb></rb> <rb></rb>b</p>
+<p>a<rbc></rbc> <rbc></rbc>b</p>
+<p><rb>a</rb> <rb>b</rb><rt>x</rt> <rt>y</rt></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002.html
new file mode 100644
index 00000000000..76846e547bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-002.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic removal of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-removal-002-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-removal.js"></script>
+<p>One space should exist between 'a' and 'b':</p>
+
+<!-- inter-level white space -->
+<!-- => normal white space -->
+<p>a<rb class="remove"></rb> <rt></rt>b</p>
+<p>a<rb></rb> <rt class="remove"></rt>b</p>
+<!-- => inter-base white space -->
+<p>a<rb></rb> <rt class="remove"></rt><rb></rb>b</p>
+<!-- => inter-segment white space -->
+<p>a<rbc></rbc> <rtc class="remove"></rtc><rbc></rbc>b</p>
+<!-- => inter-annotation white space -->
+<p><rb>a</rb> <rb>b</rb><rt>x</rt><rb class="remove"></rb> <rt>y</rt></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003-ref.html
new file mode 100644
index 00000000000..0067c014f5d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic removal of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p>
+
+
+<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+
+<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<p><rb>a</rb><rb>b</rb><rt>x</rt><rt>y</rt></p>
+
+<p>'ab' should be paried with 'xy':</p>
+
+<p><rbc>ab</rbc><rt>xy</rt></p>
+<p><rb>ab</rb><rtc style="letter-spacing: 1px">xy</rtc></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003.html
new file mode 100644
index 00000000000..d35b2b968d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-dynamic-removal-003.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for dynamic removal of ruby frames</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-dynamic-removal-003-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<script src="support/ruby-dynamic-removal.js"></script>
+<p>'a' and 'b' should be paired with 'x' and 'y' respectively:</p>
+
+<!-- merge -->
+<!-- pseudo ruby -->
+<p><rb>a</rb><span class="remove"></span><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<!-- pseudo ruby base container -->
+<p><rb>a</rb><rt class="remove"></rt><rb>b</rb><rt>x</rt><rt>y</rt></p>
+<!-- pseudo ruby text container -->
+<p><rb>a</rb><rb>b</rb><rt>x</rt><rb class="remove"></rb><rt>y</rt></p>
+
+<!-- white space removal -->
+<!-- inter-base white space -->
+<p><rb class="remove-after">a</rb> <rb>b</rb><rt>x</rt><rt>y</rt></p>
+<!-- inter-annotation white space -->
+<p><rb>a</rb><rb>b</rb><rt class="remove-after">x</rt> <rt>y</rt></p>
+
+<p>'ab' should be paried with 'xy':</p>
+
+<!-- merge -->
+<!-- pseudo ruby base -->
+<p><rbc>a<rb class="remove"></rb>b</rbc><rt>xy</rt></p>
+<!-- pseudo ruby text -->
+<!-- letter-spacing is added here to avoid fuzzy on Windows. See bug 1111891 -->
+<p><rb>ab</rb><rtc style="letter-spacing: 1px">x<rt class="remove"></rt>y</rtc></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001-ref.html
new file mode 100644
index 00000000000..245a366172a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for float handling in ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ ruby div {
+ width: 10px; height: 10px;
+ background-color: grey;
+ margin: 2px;
+ }
+ .left { float: left; }
+ .right { float: right; }
+</style>
+<div><ruby><rb><div class="left"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div>
+<div><ruby><rb><div class="left"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div>
+<div><ruby><rb><div class="right"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div>
+<div><ruby><rb><div class="right"></div>HELLO WORLD</rb><rt>hello world</rt></ruby></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001.html
new file mode 100644
index 00000000000..5cb56e88aca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-float-handling-001.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for float handling in ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#formatting-context">
+<link rel="match" href="ruby-float-handling-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ ruby div {
+ width: 10px; height: 10px;
+ background-color: grey;
+ margin: 2px;
+ }
+ .left { float: left; }
+ .right { float: right; }
+</style>
+<div><ruby><rb>HELLO WORLD</rb><rt><div class="left"></div>hello world</rt></ruby></div>
+<div><ruby><rb>HELLO WORLD</rb><rt>hello<div class="left"></div> world</rt></ruby></div>
+<div><ruby><rb>HELLO WORLD</rb><rt><div class="right"></div>hello world</rt></ruby></div>
+<div><ruby><rb>HELLO WORLD</rb><rt>hello<div class="right"></div> world</rt></ruby></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001-ref.html
new file mode 100644
index 00000000000..1d9fbb344fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Intra-level whitespace pairing</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p><ruby>
+ <rb>a</rb><rb pseudo><span> </span></rb><rb>b</rb>
+ <rt>x</rt><rt pseudo><span> </span></rt><rt>y</rt>
+</ruby></p>
+<p><ruby>
+ <rb>a</rb><rb pseudo><span> </span></rb><rb>b</rb>
+ <rt>x</rt><rt></rt><rt>y</rt>
+</ruby></p>
+<p><ruby>
+ <rb>a</rb><rb pseudo></rb><rb>b</rb>
+ <rt>x</rt><rt pseudo><span> </span></rt><rt>y</rt>
+</ruby></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001.html
new file mode 100644
index 00000000000..4fceda1fb09
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-001.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Intra-level whitespace pairing</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing">
+<link rel="match" href="ruby-intra-level-whitespace-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<p><ruby>
+ <rb>a</rb> <rb>b</rb>
+ <rt>x</rt> <rt>y</rt>
+</ruby></p>
+<p><ruby>
+ <rb>a</rb> <rb>b</rb>
+ <rt>x</rt><rt>y</rt>
+</ruby></p>
+<p><ruby>
+ <rb>a</rb><rb>b</rb>
+ <rt>x</rt> <rt>y</rt>
+</ruby></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002-ref.html
new file mode 100644
index 00000000000..c5949dbeb50
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Intra-level whitespace pairing</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ body { font-family: monospace; }
+ .container { border: 1px solid blue; margin: 20px; }
+</style>
+<style id="style"></style>
+<span id="ref1">12345</span> <span id="ref2">12345 67890</span>
+<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt><rt>54321</rt></ruby></div>
+<div class="container"><ruby><rb>12345</rb><rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div>
+<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div>
+<script type="text/javascript">
+ var ref2 = document.getElementById('ref2');
+ var style = document.getElementById('style');
+ var width2 = ref2.getBoundingClientRect().width + 'px';
+ // This is the same as the script in the corresponding
+ // testcase, except that here we skip the intermediate
+ // size and jump straight to the final size.
+ style.textContent = '.container { width: ' + width2 + '; }';
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002.html
new file mode 100644
index 00000000000..67aab53bfb0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-002.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Intra-level whitespace pairing</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing">
+<link rel="match" href="ruby-intra-level-whitespace-002-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ body { font-family: monospace; }
+ .container { border: 1px solid blue; margin: 20px; }
+</style>
+<style id="style"></style>
+<span id="ref1">12345</span> <span id="ref2">12345 67890</span>
+<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt><rt>54321</rt></ruby></div>
+<div class="container"><ruby><rb>12345</rb><rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div>
+<div class="container"><ruby><rb>12345</rb> <rb>67890</rb><rt>09876</rt> <rt>54321</rt></ruby></div>
+<script type="text/javascript">
+ var ref1 = document.getElementById('ref1');
+ var ref2 = document.getElementById('ref2');
+ var style = document.getElementById('style');
+ var width1 = ref1.getBoundingClientRect().width + 'px';
+ var width2 = ref2.getBoundingClientRect().width + 'px';
+ // It changes the width of the containers to test incremental
+ // layout with intra-level whitespace columns being pushed and
+ // pulled up across a line-break.
+ style.textContent = '.container { width: ' + width1 + '; }';
+ document.body.offsetHeight; // force reflow
+ style.textContent = '.container { width: ' + width2 + '; }';
+ document.body.offsetHeight; // force reflow
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003-ref.html
new file mode 100644
index 00000000000..d1df82371c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003-ref.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Intra-level whitespace pairing</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+|<ruby>
+ <rbc><rb>before</rb><rb>base</rb><rb> </rb></rbc>
+ <rtc><rt> </rt><rt>text</rt><rt>after</rt></rtc>
+</ruby>|
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003.html
new file mode 100644
index 00000000000..716f2e3f0b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intra-level-whitespace-003.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Intra-level whitespace pairing</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing">
+<link rel="match" href="ruby-intra-level-whitespace-003-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ rbc::before {
+ display: ruby-base;
+ content: "before";
+ }
+ rbc::after {
+ display: ruby-base;
+ content: " ";
+ }
+ rtc::before {
+ display: ruby-text;
+ content: " ";
+ }
+ rtc::after {
+ display: ruby-text;
+ content: "after";
+ }
+</style>
+<!-- This test ensures that we don't treat all-whitespace
+ ::before/::after content as intra-level whitespace -->
+|<ruby>
+ <rbc><rb>base</rb></rbc>
+ <rtc><rt>text</rt></rtc>
+</ruby>|
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001-ref.html
new file mode 100644
index 00000000000..9d2889f8116
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001-ref.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Intrinsic ISize calculation of ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<style>
+ div {
+ display: inline-block;
+ border: 1px solid black;
+ font-kerning: none; /* disable kerning, because in the reference file
+ it might occur across <span> boundaries */
+ }
+ span {
+ white-space: nowrap;
+ }
+</style>
+<div style="width: min-content">
+ <span>ABC</span><span>DEF</span>
+</div>
+<div style="width: max-content">
+ <span>ABC</span><span>DEF</span>
+</div>
+<br>
+
+<div style="width: min-content">
+ XYZ<span>ABC</span><span>DEF</span>XYZ
+</div>
+<div style="width: max-content">
+ XYZ<span>ABC</span><span>DEF</span>XYZ
+</div>
+<br>
+
+<div style="width: min-content">
+ <span>あい</span><span>うえ</span>
+</div>
+<div style="width: max-content">
+ <span>あい</span><span>うえ</span>
+</div>
+<br>
+
+<div style="width: min-content">
+ お<span>あい</span><span>うえ</span>お
+</div>
+<div style="width: max-content">
+ お<span>あい</span><span>うえ</span>お
+</div>
+<br>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001.html
new file mode 100644
index 00000000000..84f48e2fc93
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-001.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Intrinsic ISize calculation of ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#line-breaks">
+<link rel="match" href="ruby-intrinsic-isize-001-ref.html">
+<style>
+ div {
+ display: inline-block;
+ border: 1px solid black;
+ font-kerning: none; /* disable kerning, because in the reference file
+ it might occur across <span> boundaries */
+ }
+</style>
+<div style="width: min-content">
+ <ruby><rb>ABC<rb>DEF</ruby>
+</div>
+<div style="width: max-content">
+ <ruby><rb>ABC<rb>DEF</ruby>
+</div>
+<br>
+
+<div style="width: min-content">
+ XYZ<ruby><rb>ABC<rb>DEF</ruby>XYZ
+</div>
+<div style="width: max-content">
+ XYZ<ruby><rb>ABC<rb>DEF</ruby>XYZ
+</div>
+<br>
+
+<div style="width: min-content">
+ <ruby><rb>あい<rb>うえ</ruby>
+</div>
+<div style="width: max-content">
+ <ruby><rb>あい<rb>うえ</ruby>
+</div>
+<br>
+
+<div style="width: min-content">
+ お<ruby><rb>あい<rb>うえ</ruby>お
+</div>
+<div style="width: max-content">
+ お<ruby><rb>あい<rb>うえ</ruby>お
+</div>
+<br>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002-ref.html
new file mode 100644
index 00000000000..d71de26a259
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Intrinsic ISize calculation of ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<style>
+ div {
+ display: inline-block;
+ border: 1px solid black;
+ }
+</style>
+<p>No line break should happen in any block, and the content should just fit in the block.</p>
+
+<div>
+ ABC DEF
+</div>
+<div>
+ XYZ ABCDEF XYZ
+</div>
+
+<div>
+ あい うえ
+</div>
+<div>
+ お あいうえ お
+</div>
+<br>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002.html
new file mode 100644
index 00000000000..741d41bec57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-intrinsic-isize-002.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Intrinsic ISize calculation of ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#line-breaks">
+<link rel="match" href="ruby-intrinsic-isize-002-ref.html">
+<style>
+ div {
+ display: inline-block;
+ border: 1px solid black;
+ }
+</style>
+<p>No line break should happen in any block, and the content should just fit in the block.</p>
+
+<div>
+ <ruby><rb>ABC</rb> <rb>DEF</rb></ruby>
+</div>
+<div>
+ XYZ <ruby><rb>ABC</rb><rb>DEF</rb></ruby> XYZ
+</div>
+
+<div>
+ <ruby><rb>あい</rb> <rb>うえ</rb></ruby>
+</div>
+<div>
+ お <ruby><rb>あい</rb><rb>うえ</rb></ruby> お
+</div>
+<br>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001-ref.html
new file mode 100644
index 00000000000..eaec8897133
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Justification with ruby span</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ body { line-height: 3; }
+</style>
+<div style="width: 200px; height: 100px; text-align-last: justify; overflow: auto;"><ruby>
+ <rb>a</rb><rb>b</rb>
+</ruby></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001.html
new file mode 100644
index 00000000000..edef72874b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-001.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Justification with ruby span</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#base-annotation-pairing">
+<link rel="match" href="ruby-justification-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ body { line-height: 3; }
+</style>
+<div style="width: 200px; height: 100px; text-align-last: justify; overflow: auto;"><ruby>
+ <rb>a</rb><rb>b</rb>
+ <rtc><div style="width: 100px;"></div></rtc>
+</ruby></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002-ref.html
new file mode 100644
index 00000000000..c61dae5c62d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Justification with ruby span</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ div {
+ ruby-position: under;
+ width: 300px; height: 100px;
+ text-align-last: justify;
+ overflow: auto;
+ text-decoration: underline;
+ }
+</style>
+<div><rb>仮</rb><rb>名</rb><rt>が</rt><rt>な</rt></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002.html
new file mode 100644
index 00000000000..979987c028b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-justification-002.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Justification with ruby span</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#base-annotation-pairing">
+<link rel="match" href="ruby-justification-002-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ div {
+ ruby-position: under;
+ width: 300px; height: 100px;
+ text-align-last: justify;
+ overflow: auto;
+ text-decoration: underline;
+ }
+</style>
+<div>
+ <rb>仮</rb><rb>名</rb>
+ <rt>が</rt><rt>な</rt>
+ <!-- -->
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001-ref.html
new file mode 100644
index 00000000000..c0655a5310b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for lang-specific default stylesheet for ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<body style="font: 200%/normal Ahem !important">
+<p><ruby><rb>base x x<rt style="ruby-align: space-around; font-size: 50%">text x x</ruby></p>
+<p><ruby><rb>base x x<rt style="ruby-align: space-around; font-size: 50%">text x x</ruby></p>
+<p><ruby><rb>base x x<rt style="ruby-align: center; font-size: 50%">text x x</ruby></p>
+<p><ruby><rb>base x x<rt style="ruby-align: center; font-size: 30%">text x x</ruby></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001.html
new file mode 100644
index 00000000000..3206514f0d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-lang-specific-style-001.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for lang-specific default stylesheet for ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#default-stylesheet">
+<link rel="match" href="ruby-lang-specific-style-001-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<body style="font: 200%/normal Ahem !important">
+<p lang="en"><ruby><rb>base x x<rt>text x x</ruby></p>
+<p lang="ja"><ruby><rb>base x x<rt>text x x</ruby></p>
+<p lang="zh-CN"><ruby><rb>base x x<rt>text x x</ruby></p>
+<p lang="zh-TW"><ruby><rb>base x x<rt>text x x</ruby></p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001-ref.html
new file mode 100644
index 00000000000..1cd43b80018
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for ruby line break suppression</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<ruby>ab</ruby><br>
+<rbc>ab</rbc><br>
+<rtc>ab</rtc><br>
+<rb>ab</rb><br>
+<rt>ab</rt>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001.html
new file mode 100644
index 00000000000..11d4d40d436
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-001.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for ruby line break suppression</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-line-break-suppression-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<ruby>a<br>b</ruby><br>
+<rbc>a<br>b</rbc><br>
+<rtc>a<br>b</rtc><br>
+<rb>a<br>b</rb><br>
+<rt>a<br>b</rt>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002-ref.html
new file mode 100644
index 00000000000..8281ea1d74f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for ruby line break suppression</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<div style="width: 1em; border: 1px solid">
+ <ruby>aaaaaaaaaabbbbbbbbbb</ruby><br>
+ <rbc>aaaaaaaaaabbbbbbbbbb</rbc><br>
+ <rtc>aaaaaaaaaabbbbbbbbbb</rtc><br>
+ <rb>aaaaaaaaaabbbbbbbbbb</rb><br>
+ <rt>aaaaaaaaaabbbbbbbbbb</rt><br>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002.html
new file mode 100644
index 00000000000..394b9c27e53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-002.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for ruby line break suppression</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-line-break-suppression-002-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<div style="width: 1em; border: 1px solid">
+ <ruby>aaaaaaaaaa<div></div>bbbbbbbbbb</ruby><br>
+ <rbc>aaaaaaaaaa<div></div>bbbbbbbbbb</rbc><br>
+ <rtc>aaaaaaaaaa<div></div>bbbbbbbbbb</rtc><br>
+ <rb>aaaaaaaaaa<div></div>bbbbbbbbbb</rb><br>
+ <rt>aaaaaaaaaa<div></div>bbbbbbbbbb</rt><br>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003-ref.html
new file mode 100644
index 00000000000..f8b1e168e11
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for ruby line break suppression</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<ruby><span>a
+b</span></ruby><br>
+<rbc><span>a
+b</span></rbc><br>
+<rtc><span>a
+b</span></rtc><br>
+<rb><span>a
+b</span></rb><br>
+<rt><span>a
+b</span></rt><br>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003.html
new file mode 100644
index 00000000000..dadfd562a45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-003.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Test for ruby line break suppression</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-line-break-suppression-003-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ span { white-space: pre; }
+</style>
+<ruby><span>a
+b</span></ruby><br>
+<rbc><span>a
+b</span></rbc><br>
+<rtc><span>a
+b</span></rtc><br>
+<rb><span>a
+b</span></rb><br>
+<rt><span>a
+b</span></rt><br>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004-ref.html
new file mode 100644
index 00000000000..5aa55829574
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Line break suppression on whitespaces wrapped but not contained in ruby boxes</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<span style="white-space: pre"><rb>a</rb><rb>
+</rb><rb>b</rb></span>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004.html
new file mode 100644
index 00000000000..0314237f07f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-004.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Line break suppression on whitespaces wrapped but not contained in ruby boxes</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-line-break-suppression-004-ref.html">
+<span style="white-space: pre"><rb>a</rb>
+<rb>b</rb></span>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005-ref.html
new file mode 100644
index 00000000000..c40780e37dd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Line break suppression with soft hyphen</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<body style="width: 1px">
+x<ruby>a</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005.html
new file mode 100644
index 00000000000..10d6690b3d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-break-suppression-005.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Line break suppression with soft hyphen</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#box-fixup">
+<link rel="match" href="ruby-line-break-suppression-005-ref.html">
+<body style="width: 1px">
+x<ruby>a&shy;</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001-ref.html
new file mode 100644
index 00000000000..1f3031c59ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Meet the specification for line breaking between ruby bases</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ body { line-height: 3; font-kerning: none; }
+ span { white-space: nowrap; }
+</style>
+<div style="width: .5em; border: 1px solid silver;">
+ <span>「</span><span>な</span><span>に</span><span>、</span><span>誰</span><span>?</span><span>」</span><span>「</span><span>私</span><span>です</span><span>」</span>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001.html
new file mode 100644
index 00000000000..b6b4d861e21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-001.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Meet the specification for line breaking between ruby bases</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#break-between">
+<link rel="match" href="ruby-line-breaking-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ body { line-height: 3; font-kerning: none; }
+</style>
+<div style="width: .5em; border: 1px solid silver;">
+ <ruby>
+ <rb>「<rb>な<rb>に<rb>、<rb>誰<rb>?<rb>」<rb>「<rb>私<rb>です<rb>」</rb>
+ <!-- Check if ruby text containers are skipped from the text run -->
+ <rtc><rt>
+ </ruby>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002-ref.html
new file mode 100644
index 00000000000..08510f7fb05
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Line breaking between ruby and preceeding open bracket</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<div style="width: 5em; border: 1px solid silver;">
+ の「<span style="font-family: Ahem; padding: 0 10rem;">X</span>」
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002.html
new file mode 100644
index 00000000000..dddf41f9309
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-002.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Line breaking between ruby and preceeding open bracket</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#break-between">
+<link rel="match" href="ruby-line-breaking-002-ref.html">
+<link rel="stylesheet" href="/fonts/ahem.css">
+<link rel="stylesheet" href="support/ruby-common.css">
+<div style="width: 5em; border: 1px solid silver;">
+ の「<ruby style="font-family: Ahem;">X<rt style="font-size: 0;"><div style="width: 21rem"></div></ruby>」
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003-ref.html
new file mode 100644
index 00000000000..4f3cecb27ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Dynamic break point change in ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ #test {
+ border: 1px solid;
+ text-align: center;
+ width: 2.5em;
+ }
+</style>
+<div id="test">
+ <p>一二三四五六七八</p>
+ <p>一二三四五六七八</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003.html
new file mode 100644
index 00000000000..27348d0cf11
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-line-breaking-003.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="ja">
+<meta charset="UTF-8">
+<title>Dynamic break point change in ruby</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#break-between">
+<link rel="match" href="ruby-line-breaking-003-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ #test {
+ border: 1px solid;
+ text-align: center;
+ }
+</style>
+<div id="test">
+ <p><ruby><rb>一<rb>二<rb>三<rb>四<rb>五<rb>六<rb>七<rb>八</ruby></p>
+ <p><ruby><rbc>一</rbc><rbc>二</rbc><rbc>三</rbc><rbc>四</rbc><rbc>五</rbc><rbc>六</rbc><rbc>七</rbc><rbc>八</rbc></ruby></p>
+</div>
+<script>
+ let div = document.getElementById("test");
+ document.body.offsetHeight;
+ test.style.width = "2.5em";
+ document.body.offsetHeight;
+ test.style.width = "4.5em";
+ document.body.offsetHeight;
+ test.style.width = "2.5em";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform-ref.html
new file mode 100644
index 00000000000..56afd9366fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform-ref.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby should not support transform</title>
+<link rel="author" title="L. David Baron" href="https://dbaron.org/">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<ruby>
+ <rbc><rb>a</rb><rb>b</rb></rbc>
+ <rtc><rt>A</rt><rt>B</rt></rtc>
+</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform.html
new file mode 100644
index 00000000000..1cdd4f3bbf5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-no-transform.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby should not support transform</title>
+<link rel="author" title="L. David Baron" href="https://dbaron.org/">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-transforms-1/#transform-property">
+<link rel="match" href="ruby-no-transform-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+ruby, rbc, rb, rtc, rt {
+ transform: translateX(50px);
+}
+</style>
+<ruby>
+ <rbc><rb>a</rb><rb>b</rb></rbc>
+ <rtc><rt>A</rt><rt>B</rt></rtc>
+</ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-noruby.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-noruby.html
new file mode 100644
index 00000000000..4c00573422b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-noruby.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html style="overflow:hidden;">
+<head>
+<title>CSS Test: Ruby Base Frames Reflowed</title>
+<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="http://www.w3.org/TR/2014/WD-css-ruby-1-20140805/">
+<meta name="assert" content="Test checks that ruby bases are reflowed.">
+<meta charset="UTF-8">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+body { line-height: 3; }
+</style>
+</head>
+<body>
+新幹線
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-opaqueruby.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-opaqueruby.html
new file mode 100644
index 00000000000..fe4a8042383
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-opaqueruby.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html style="overflow:hidden;">
+<head>
+<title>CSS Test: Ruby Text Frames Visible</title>
+<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="http://www.w3.org/TR/2014/WD-css-ruby-1-20140805/">
+<link rel="mismatch" href="ruby-reflow-001-noruby.html">
+<meta name="assert" content="Test checks that ruby text is rendered.">
+<meta charset="UTF-8">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+body { line-height: 3; }
+</style>
+</head>
+<body>
+<ruby>
+ <rbc><rb>新</rb><rb>幹</rb><rb>線</rb></rbc>
+ <rtc><rt>しん</rt><rt>かん</rt><rt>せん</rt></rtc>
+</ruby>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-transparentruby.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-transparentruby.html
new file mode 100644
index 00000000000..3e7112c4d61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-reflow-001-transparentruby.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html style="overflow:hidden;">
+<head>
+<title>CSS Test: Ruby Base Frames Reflowed</title>
+<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="http://www.w3.org/TR/2014/WD-css-ruby-1-20140805/">
+<link rel="match" href="ruby-reflow-001-noruby.html">
+<meta name="assert" content="Test checks that ruby bases are reflowed.">
+<meta charset="UTF-8">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+body { line-height: 3; }
+rtc { color: transparent; }
+</style>
+</head>
+<body>
+<ruby>
+ <rbc><rb>新</rb><rb>幹</rb><rb>線</rb></rbc>
+ <rtc><rt>しん</rt><rt>かん</rt><rt>せん</rt></rtc>
+</ruby>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001-ref.html
new file mode 100644
index 00000000000..3bf873453cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby span</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<ruby><rb>The Ruby Base</rb><rtc><rt>span</rt></rtc></ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001.html
new file mode 100644
index 00000000000..e7b19667aa9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-span-001.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby span</title>
+<link rel="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-pairing">
+<link rel="match" href="ruby-span-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<ruby><rb>The Ruby Base</rb><rtc>span</rtc></ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001-ref.html
new file mode 100644
index 00000000000..d24e207f867
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001-ref.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby whitespace handling</title>
+<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+body { line-height: 5em; }
+</style>
+
+<p>
+ <ruby><rbc><rb><span> </span></rb><rb><span> </span></rb><rb>Base three</rb></rbc
+ ><rtc><rt><span> </span></rt><rt><span> </span></rt><rt>Text three</rt></rtc
+ ><rtc><rt></rt></rtc
+ ><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>Segment two</rb></rbc
+ ><rtc><rt></rt></rtc></ruby>
+</p>
+
+<p>
+ <ruby><rbc><rb>Base one</rb><rb><span> </span></rb><rb>Base three</rb></rbc
+ ><rtc pseudo><rt>Text one</rt><rt pseudo><span> </span></rt><rt>Text three</rt></rtc></ruby>
+</p>
+
+<p>
+ <ruby><rbc><rb>Segment one</rb></rbc
+ ><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb><span> </span></rb><rb><span> </span></rb><rb>Base three</rb></rbc
+ ><rtc><rt><span> </span></rt><rt><span> </span></rt><rt>Text three</rt></rtc
+ ><rbc><rb><span> </span></rb></rbc
+ ><rbc><rb>Base one</rb><rb><span> </span></rb><rb>Base three</rb></rbc
+ ><rtc><rt>Text one</rt><rt></rt><rt>Text two/three</rt></rtc></ruby>
+</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001.html
new file mode 100644
index 00000000000..9df61585700
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-001.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby whitespace handling</title>
+<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#white-space">
+<link rel="match" href="ruby-whitespace-001-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+<style>
+body { line-height: 5em; }
+</style>
+
+<p>
+ <ruby>
+ <rbc> <rb> </rb> <rb>Base three</rb> </rbc>
+ <rtc> <rt> </rt> <rt>Text three</rt> </rtc> <rtc><rt></rt></rtc>
+ <rbc><rb>Segment two</rb></rbc><rtc><rt></rt></rtc>
+ </ruby>
+</p>
+
+<p>
+ <ruby>
+ <rb>Base one</rb> <rb>Base three</rb>
+ <rt>Text one</rt> <rt>Text three</rt>
+ </ruby>
+</p>
+
+<p>
+ <rb>Segment one</rb> <rbc> <rb> </rb> <rb>Base three</rb> </rbc
+ > <rtc><rt> </rt> <rt>Text three</rt></rtc>
+
+ <rb>Base one</rb> <rb>Base three</rb> <rt>Text one</rt><rt>Text two/three</rt>
+</p>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002-ref.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002-ref.html
new file mode 100644
index 00000000000..8aade200516
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby whitespace handling</title>
+<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="stylesheet" href="support/ruby-common.css">
+
+<!-- Unclear how this should render. See http://lists.w3.org/Archives/Public/www-style/2014Jul/0620.html //-->
+abcd<ruby><rbc><rb><span> BASE</span></rb></rbc><rtc pseudo><rt>TEXT</rt></rtc></ruby>
+
+abcd<ruby><rbc><rb><span>BASE</span></rb></rbc><rtc pseudo><rt>TEXT</rt></rtc></ruby>
+
+abcd<ruby><rbc><rb><span> BASE</span></rb></rbc><rtc pseudo><rt>TEXT</rt></rtc></ruby>
+
+<ruby><rbc></rbc></ruby>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002.html b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002.html
new file mode 100644
index 00000000000..bc84919a123
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/ruby-whitespace-002.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>Ruby whitespace handling</title>
+<link rel="author" title="Susanna Bowen" href="mailto:sgbowen8@gmail.com">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://drafts.csswg.org/css-ruby-1/#white-space">
+<link rel="match" href="ruby-whitespace-002-ref.html">
+<link rel="stylesheet" href="support/ruby-common.css">
+
+abcd<rbc> BASE</rbc><rt>TEXT</rt>
+
+abcd<rbc> <span>BASE</span></rbc><rt>TEXT</rt>
+
+abcd<rbc><span> BASE</span></rbc><rt>TEXT</rt>
+
+<rbc> </rbc>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-common.css b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-common.css
new file mode 100644
index 00000000000..cf83123281d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-common.css
@@ -0,0 +1,18 @@
+rbc {
+ display: ruby-base-container;
+ unicode-bidi: isolate;
+}
+[pseudo] {
+ font-size: inherit;
+ line-height: inherit;
+}
+[pseudo] > rt {
+ font-size: 50%;
+}
+[pseudo] > rt[pseudo] {
+ font-size: inherit;
+}
+
+.large {
+ font-size: 200%;
+}
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-insertion.js b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-insertion.js
new file mode 100644
index 00000000000..0bf6cd96977
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-insertion.js
@@ -0,0 +1,42 @@
+window.onload = function() {
+ // Force a reflow before any changes.
+ document.body.clientWidth;
+
+ var elems = document.querySelectorAll('[data-insert]');
+ Array.from(elems).forEach(function(e) {
+ var parent, ref;
+ switch (e.dataset.insert) {
+ case 'start':
+ parent = e;
+ ref = e.firstChild;
+ break;
+
+ case 'end':
+ parent = e;
+ ref = null;
+ break;
+
+ case 'before':
+ parent = e.parentNode;
+ ref = e;
+ break;
+
+ case 'after':
+ parent = e.parentNode;
+ ref = e.nextSibling;
+ break;
+ }
+
+ var elem, textnode;
+ if ('text' in e.dataset) {
+ textnode = document.createTextNode(e.dataset.text);
+ }
+ if ('tag' in e.dataset) {
+ elem = document.createElement(e.dataset.tag);
+ if (textnode) {
+ elem.appendChild(textnode);
+ }
+ }
+ parent.insertBefore(elem ? elem : textnode, ref);
+ });
+};
diff --git a/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-removal.js b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-removal.js
new file mode 100644
index 00000000000..c703e7601e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ruby/support/ruby-dynamic-removal.js
@@ -0,0 +1,14 @@
+function getElements(className) {
+ return Array.from(document.getElementsByClassName(className));
+}
+window.onload = function() {
+ // Force a reflow before any changes.
+ document.body.clientWidth;
+
+ getElements('remove').forEach(function(e) {
+ e.remove();
+ });
+ getElements('remove-after').forEach(function(e) {
+ e.parentNode.removeChild(e.nextSibling);
+ });
+};
diff --git a/tests/wpt/web-platform-tests/css/css-shadow-parts/style-sharing.html b/tests/wpt/web-platform-tests/css/css-shadow-parts/style-sharing.html
new file mode 100644
index 00000000000..4af1260b5e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shadow-parts/style-sharing.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<title>CSS Shadow Parts test: Parts don't incorrectly share style with other elements</title>
+<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/">
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org/" title="Mozilla">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>::part(part1) { color: green; }</style>
+<div id="host"></div>
+<script>
+"use strict";
+test(function() {
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <div></div>
+ <div part="part1"></div>
+ `;
+ assert_equals(
+ getComputedStyle(host.shadowRoot.querySelector("[part]")).color,
+ "rgb(0, 128, 0)",
+ "Part should be green",
+ );
+}, "Part in selected host does not incorrectly share style with non-part");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-margin-composition.html b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-margin-composition.html
new file mode 100644
index 00000000000..395bad063f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-margin-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>shape-margin composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-margin-property">
+<meta name="assert" content="shape-margin supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'shape-margin',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'shape-margin',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'shape-margin',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'shape-margin',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html
new file mode 100644
index 00000000000..0115148ec1a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes/animation/shape-outside-composition.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>shape-outside composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#shape-outside-property">
+<meta name="assert" content="shape-outside supports animation as <basic-shape> or discrete">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'shape-outside',
+ underlying: 'circle(100px at 25px 25%)',
+ addFrom: 'circle(10px at 25px 75%)',
+ addTo: 'circle(50px at 50px center)',
+}, [
+ {at: -0.3, expect: 'circle(98px at 42.5px 107.5%)'},
+ {at: 0, expect: 'circle(110px at 50px 100%)'},
+ {at: 0.3, expect: 'circle(122px at 57.5px 92.5%)'},
+ {at: 0.6, expect: 'circle(134px at 65px 85%)'},
+ {at: 1, expect: 'circle(150px at 75px 75%)'},
+ {at: 1.5, expect: 'circle(170px at 87.5px 62.5%)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'circle(100px at 20px 20%)',
+ addFrom: 'circle(50px at 50px 50%)',
+ replaceTo: 'circle(50% at 150px 150%)',
+}, [
+ {at: -0.3, expect: 'circle(calc(195px + -15%) at 46px 46%)'},
+ {at: 0, expect: 'circle(calc(150px + 0%) at 70px 70%)'},
+ {at: 0.3, expect: 'circle(calc(105px + 15%) at 94px 94%)'},
+ {at: 0.6, expect: 'circle(calc(60px + 30%) at 118px 118%)'},
+ {at: 1, expect: 'circle(50% at 150px 150%)'},
+ {at: 1.5, expect: 'circle(calc(-75px + 75%) at 190px 190%)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'circle(farthest-side at 25px 75%)',
+ addFrom: 'circle(farthest-side at 25px 75%)',
+ addTo: 'circle(farthest-side at 50px center)',
+}, [
+ {at: 0.25, expect: 'circle(farthest-side at 25px 75%)'},
+ {at: 0.75, expect: 'circle(farthest-side at 50px 50%)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'circle(50px at 10px 20px)',
+ addFrom: 'circle(50px at 10px 20px)',
+ addTo: 'circle(farthest-side at 30px 40px)',
+}, [
+ {at: 0.25, expect: 'circle(100px at 20px 40px)'},
+ {at: 0.75, expect: 'circle(farthest-side at 30px 40px)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'ellipse(10px 20px at 30px 40px)',
+ addFrom: 'ellipse(40px 30px at 20px 10px)',
+ addTo: 'ellipse(140px 130px at 120px 110px)',
+}, [
+ {at: -0.3, expect: 'ellipse(20px 20px at 20px 20px)'},
+ {at: 0, expect: 'ellipse(50px 50px at 50px 50px)'},
+ {at: 0.3, expect: 'ellipse(80px 80px at 80px 80px)'},
+ {at: 0.6, expect: 'ellipse(110px 110px at 110px 110px)'},
+ {at: 1, expect: 'ellipse(150px 150px at 150px 150px)'},
+ {at: 1.5, expect: 'ellipse(200px 200px at 200px 200px)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'ellipse(10px 20px at 30px 40px)',
+ replaceFrom: 'ellipse(40px 30px at 20px 10px)',
+ addTo: 'ellipse(40px 30px at 20px 10px)',
+}, [
+ {at: -0.3, expect: 'ellipse(37px 24px at 11px -2px)'},
+ {at: 0, expect: 'ellipse(40px 30px at 20px 10px)'},
+ {at: 0.3, expect: 'ellipse(43px 36px at 29px 22px)'},
+ {at: 0.6, expect: 'ellipse(46px 42px at 38px 34px)'},
+ {at: 1, expect: 'ellipse(50px 50px at 50px 50px)'},
+ {at: 1.5, expect: 'ellipse(55px 60px at 65px 70px)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'ellipse(25px 75%)',
+ addFrom: 'ellipse()',
+ addTo: 'ellipse(closest-side farthest-side)',
+}, [
+ {at: 0.25, expect: 'ellipse(at 50% 50%)'},
+ {at: 0.75, expect: 'ellipse(closest-side farthest-side at 50% 50%)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'inset(20px)',
+ addFrom: 'inset(20px)',
+ addTo: 'inset(40%)',
+}, [
+ {at: -0.3, expect: 'inset(calc(46px + -12%))'},
+ {at: 0, expect: 'inset(calc(40px + 0%))'},
+ {at: 0.3, expect: 'inset(calc(34px + 12%))'},
+ {at: 0.6, expect: 'inset(calc(28px + 24%))'},
+ {at: 1, expect: 'inset(calc(20px + 40%))'},
+ {at: 1.5, expect: 'inset(calc(10px + 60%))'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'inset(1px 2px 3px 4px round 10px 20px 30px 40px / 50px 60px 70px 80px)',
+ addFrom: 'inset(1px 2px 3px 4px round 10px 20px 30px 40px / 50px 60px 70px 80px)',
+ replaceTo: 'inset(102px 104px 106px 108px round 120px 140px 160px 180px / 200px 220px 240px 260px)',
+}, [
+ {at: -0.3, expect: 'inset(-28px -26px -24px -22px round 0px 10px 30px 50px / 70px 90px 110px 130px)'},
+ {at: 0, expect: 'inset(2px 4px 6px 8px round 20px 40px 60px 80px / 100px 120px 140px 160px)'},
+ {at: 0.25, expect: 'inset(27px 29px 31px 33px round 45px 65px 85px 105px / 125px 145px 165px 185px)'},
+ {at: 0.75, expect: 'inset(77px 79px 81px 83px round 95px 115px 135px 155px / 175px 195px 215px 235px)'},
+ {at: 1, expect: 'inset(102px 104px 106px 108px round 120px 140px 160px 180px / 200px 220px 240px 260px)'},
+ {at: 1.5, expect: 'inset(152px 154px 156px 158px round 170px 190px 210px 230px / 250px 270px 290px 310px)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'inset(1px 2px round 100px 200px)',
+ addFrom: 'inset(1px 2px round 100px 200px)',
+ addTo: 'inset(101px 102px 101px 102px)',
+}, [
+ {at: -0.3, expect: 'inset(-28px -26px round 230px 460px)'},
+ {at: 0, expect: 'inset(2px 4px round 200px 400px)'},
+ {at: 0.3, expect: 'inset(32px 34px round 170px 340px)'},
+ {at: 0.6, expect: 'inset(62px 64px round 140px 280px)'},
+ {at: 1, expect: 'inset(102px 104px round 100px 200px)'},
+ {at: 1.5, expect: 'inset(152px 154px round 50px 100px)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'polygon(10px 20%, 30px 40%)',
+ addFrom: 'polygon(10px 20%, 30px 40%)',
+ addTo: 'polygon(110px 120%, 130px 140%)',
+}, [
+ {at: -0.3, expect: 'polygon(-10px 10%, 30px 50%)'},
+ {at: 0, expect: 'polygon(20px 40%, 60px 80%)'},
+ {at: 0.3, expect: 'polygon(50px 70%, 90px 110%)'},
+ {at: 0.6, expect: 'polygon(80px 100%, 120px 140%)'},
+ {at: 1, expect: 'polygon(120px 140%, 160px 180%)'},
+ {at: 1.5, expect: 'polygon(170px 190%, 210px 230%)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'polygon(evenodd, 10px 20px)',
+ addFrom: 'polygon(evenodd, 10px 20px)',
+ addTo: 'polygon(evenodd, 110px 120px)',
+}, [
+ {at: -0.3, expect: 'polygon(evenodd, -10px 10px)'},
+ {at: 0, expect: 'polygon(evenodd, 20px 40px)'},
+ {at: 0.3, expect: 'polygon(evenodd, 50px 70px)'},
+ {at: 0.6, expect: 'polygon(evenodd, 80px 100px)'},
+ {at: 1, expect: 'polygon(evenodd, 120px 140px)'},
+ {at: 1.5, expect: 'polygon(evenodd, 170px 190px)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'polygon(evenodd, 10px 20px)',
+ addFrom: 'polygon(evenodd, 10px 20px)',
+ addTo: 'polygon(nonzero, 30px 40px)',
+}, [
+ {at: 0.25, expect: 'polygon(evenodd, 20px 40px)'},
+ {at: 0.75, expect: 'polygon(30px 40px)'},
+]);
+
+test_composition({
+ property: 'shape-outside',
+ underlying: 'polygon(10px 20px, 30px 40px)',
+ addFrom: 'polygon(10px 20px, 30px 40px)',
+ addTo: 'polygon(30px 40px)',
+}, [
+ {at: 0.25, expect: 'polygon(20px 40px, 60px 80px)'},
+ {at: 0.75, expect: 'polygon(30px 40px)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/height-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-composition.html
new file mode 100644
index 00000000000..094e247dcf2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>height composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-height">
+<meta name="assert" content="height supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'height',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'height',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'height',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'height',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'height',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-composition.html
new file mode 100644
index 00000000000..fb5b241d008
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>max-height composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-height">
+<meta name="assert" content="max-height supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'max-height',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'max-height',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'max-height',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'max-height',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'max-height',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'none',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 1.5, expect: 'none'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-composition.html
new file mode 100644
index 00000000000..8b6d8b704c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>max-width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-width">
+<meta name="assert" content="max-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'max-width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'max-width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'max-width',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'max-width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'max-width',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'none',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 1.5, expect: 'none'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-composition.html
new file mode 100644
index 00000000000..1e92b0ec2fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>min-height composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-height">
+<meta name="assert" content="min-height supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'min-height',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'min-height',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'min-height',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'min-height',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'min-height',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-composition.html
new file mode 100644
index 00000000000..e8bd41030bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>min-width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-width">
+<meta name="assert" content="min-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'min-width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'min-width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'min-width',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'min-width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'min-width',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/width-composition.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-composition.html
new file mode 100644
index 00000000000..bfe45cb3147
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-width">
+<meta name="assert" content="width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'width',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'width',
+ underlying: '100px',
+ addFrom: '100px',
+ addTo: 'auto',
+}, [
+ {at: -0.3, expect: '200px'},
+ {at: 0, expect: '200px'},
+ {at: 0.5, expect: 'auto'},
+ {at: 1, expect: 'auto'},
+ {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html
new file mode 100644
index 00000000000..c1b614b5eba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-composition.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>letter-spacing composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property">
+<meta name="test" content="letter-spacing supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+test_composition({
+ property: 'letter-spacing',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'letter-spacing',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'letter-spacing',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html
new file mode 100644
index 00000000000..57c528ca271
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-composition.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>letter-spacing composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#text-indent-property">
+<meta name="test" content="text-indent supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body></body>
+<script>
+test_composition({
+ property: 'text-indent',
+ underlying: '100%',
+ addFrom: '50px',
+ addTo: '150px',
+}, [
+ {at: -0.3, expect: 'calc(100% + 20px)'},
+ {at: 0, expect: 'calc(100% + 50px)'},
+ {at: 0.3, expect: 'calc(100% + 80px)'},
+ {at: 0.6, expect: 'calc(100% + 110px)'},
+ {at: 1, expect: 'calc(100% + 150px)'},
+ {at: 1.5, expect: 'calc(100% + 200px)'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '250px',
+ addFrom: '50px',
+ replaceTo: '100px',
+}, [
+ {at: -0.3, expect: '360px'},
+ {at: 0, expect: '300px'},
+ {at: 0.3, expect: '240px'},
+ {at: 0.6, expect: '180px'},
+ {at: 1, expect: '100px'},
+ {at: 1.5, expect: '0px'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '50%',
+ replaceFrom: '-100%',
+ addTo: '50%',
+}, [
+ {at: -0.3, expect: '-160%'},
+ {at: 0, expect: '-100%'},
+ {at: 0.3, expect: '-40%'},
+ {at: 0.5, expect: '0%'},
+ {at: 0.6, expect: '20%'},
+ {at: 1, expect: '100%'},
+ {at: 1.5, expect: '200%'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '250px',
+ addFrom: '50px each-line hanging',
+ replaceTo: '150px hanging each-line',
+}, [
+ {at: -0.3, expect: '20px hanging each-line'},
+ {at: 0, expect: '50px hanging each-line'},
+ {at: 0.3, expect: '80px hanging each-line'},
+ {at: 0.6, expect: '110px hanging each-line'},
+ {at: 1, expect: '150px hanging each-line'},
+ {at: 1.5, expect: '200px hanging each-line'},
+]);
+
+test_composition({
+ property: 'text-indent',
+ underlying: '250px each-line',
+ addFrom: '50px each-line',
+ replaceTo: '150px hanging',
+}, [
+ {at: -0.3, expect: '300px each-line'},
+ {at: 0, expect: '300px each-line'},
+ {at: 0.3, expect: '300px each-line'},
+ {at: 0.6, expect: '150px hanging'},
+ {at: 1, expect: '150px hanging'},
+ {at: 1.5, expect: '150px hanging'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html
new file mode 100644
index 00000000000..17aacaef150
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-composition.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>word-spacing composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#word-spacing-property">
+<meta name="test" content="word-spacing supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'word-spacing',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'word-spacing',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'word-spacing',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui/animation/caret-color-composition.html b/tests/wpt/web-platform-tests/css/css-ui/animation/caret-color-composition.html
new file mode 100644
index 00000000000..6c695786778
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui/animation/caret-color-composition.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>caret-color composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#propdef-caret-color">
+<meta name="assert" content="caret-color supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<style>
+.target {
+ display: inline-block;
+ font-size: 60pt;
+ color: rgb(50, 50, 50);
+}
+
+.expected {
+ margin-right: 15px;
+}
+</style>
+<body contenteditable>
+<template id="target-template">T</template>
+<script src="../interpolation/resources/interpolation-test.js"></script>
+<script>
+test_composition({
+ property: 'caret-color',
+ underlying: 'rgb(50, 50, 50)',
+ addFrom: 'rgb(100, 100, 100)',
+ addTo: 'rgb(200, 200, 200)',
+}, [
+ {at: -0.3, expect: 'rgb(120, 120, 120)'},
+ {at: 0, expect: 'rgb(150, 150, 150)'},
+ {at: 0.5, expect: 'rgb(200, 200, 200)'},
+ {at: 1, expect: 'rgb(250, 250, 250)'},
+ {at: 1.5, expect: 'rgb(255, 255, 255)'},
+]);
+
+test_composition({
+ property: 'caret-color',
+ underlying: 'auto',
+ addFrom: 'rgb(100, 100, 100)',
+ addTo: 'rgb(200, 200, 200)',
+}, [
+ {at: -0.3, expect: 'rgb(70, 70, 70)'},
+ {at: 0, expect: 'rgb(100, 100, 100)'},
+ {at: 0.5, expect: 'rgb(150, 150, 150)'},
+ {at: 1, expect: 'rgb(200, 200, 200)'},
+ {at: 1.5, expect: 'rgb(250, 250, 250)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui/animation/outline-offset-composition.html b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-offset-composition.html
new file mode 100644
index 00000000000..984a63fdc34
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-offset-composition.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>outline-offset composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#outline-offset">
+<meta name="assert" content="outline-offset supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'outline-offset',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'outline-offset',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'outline-offset',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'outline-offset',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui/animation/outline-width-composition.html b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-width-composition.html
new file mode 100644
index 00000000000..b770feda61c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui/animation/outline-width-composition.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>outline-width composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#outline-width">
+<meta name="assert" content="outline-width supports animation by computed value">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<style>
+.target {
+ /* If outline-style is none (the default), the computed style of outline-width is 0. */
+ outline-style: solid;
+}
+</style>
+<script>
+test_composition({
+ property: 'outline-width',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'outline-width',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+ property: 'outline-width',
+ underlying: '10em',
+ addFrom: '100px',
+ addTo: '20em',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4em)'},
+ {at: 0, expect: 'calc(100px + 10em)'},
+ {at: 0.5, expect: 'calc(50px + 20em)'},
+ {at: 1, expect: '30em'},
+ {at: 1.5, expect: 'calc(-50px + 40em)'},
+]);
+
+test_composition({
+ property: 'outline-width',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+ property: 'outline-width',
+ underlying: 'thick', // 5px
+ addFrom: '11px',
+ addTo: 'thin', // 1px
+}, [
+ {at: -0.3, expect: '19px'},
+ {at: 0, expect: '16px'},
+ {at: 0.5, expect: '11px'},
+ {at: 1, expect: '6px'},
+ {at: 1.5, expect: '1px'},
+ {at: 2, expect: '0px'}, // CSS outline-width can't be negative.
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht b/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht
index 3b1fef0f84e..dea13d4238d 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht
@@ -9,13 +9,14 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<meta name="DC.date.created" content="2016-12-22T09:54:03+11:00" scheme="W3CDTF" />
- <meta name="DC.date.modified" content="2016-12-30T09:54:03+11:00" scheme="W3CDTF" />
+ <meta name="DC.date.modified" content="2019-12-18T09:54:03+11:00" scheme="W3CDTF" />
<meta content="" name="flags" />
<style type="text/css"><![CDATA[
html
{
+ direction: rtl;
width: calc(52px + 100vw + 52px);
}
@@ -29,6 +30,7 @@
table
{
border-spacing: 0px;
+ direction: ltr;
position: absolute;
width: calc(52px + 100% + 52px);
}
@@ -55,6 +57,7 @@
display: block;
}
]]></style>
+
</head>
<body>
diff --git a/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html b/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html
new file mode 100644
index 00000000000..9a03ccdbccc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom-view/getClientRects-inline-inline-child.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#dom-element-getclientrects">
+<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+ <div>
+ <span>test</span>
+ <span id="vertical-align-sub-as-grand-child"
+ title="sub element in a child inline box should not be included">
+ <span>
+ <sub class="not-include" style="vertical-align: sub">subscript</sub>
+ </span>
+ </span>
+ <span>test</span>
+ </div>
+<script>
+testTargetDoesNotInclude('vertical-align-sub-as-grand-child');
+
+function testTargetDoesNotInclude(target) {
+ target = document.getElementById(target);
+ test(() => {
+ let target_rects = target.getClientRects();
+
+ let not_include_rects = [];
+ for (let element of target.querySelectorAll('.not-include')) {
+ for (let rect of element.getClientRects())
+ not_include_rects.push(rect);
+ }
+ for (let rect of target_rects) {
+ for (let not_include_rect of not_include_rects) {
+ assert_rect_not_equals(rect, not_include_rect);
+ }
+ }
+ }, target.title);
+}
+
+function assert_rect_not_equals(rect1, rect2) {
+ assert_false(rectEquals(rect1, rect2),
+ `${rectToString(rect1)} and ${rectToString(rect2)} are not equal`);
+}
+
+function rectEquals(rect1, rect2) {
+ return rect1.x === rect2.x && rect1.y === rect2.y &&
+ rect1.width === rect2.width && rect1.height === rect2.height;
+}
+
+function rectToString(rect) {
+ return `{${rect.x}, ${rect.y} ${rect.width}x${rect.height}}`;
+}
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html
new file mode 100644
index 00000000000..53210fdf38a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-anchor-composition.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-anchor composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-anchor-property">
+<meta name="assert" content="offset-anchor supports animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.target {
+ width: 200px;
+ height: 200px;
+}
+</style>
+<body>
+<script>
+test_composition({
+ property: 'offset-anchor',
+ underlying: '40px 60px',
+ addFrom: '60px 40px',
+ addTo: '160px 140px',
+}, [
+ {at: -0.25, expect: '75px 75px'},
+ {at: 0, expect: '100px 100px'},
+ {at: 0.25, expect: '125px 125px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 175px'},
+ {at: 1, expect: '200px 200px'},
+ {at: 1.25, expect: '225px 225px'},
+]);
+
+test_composition({
+ property: 'offset-anchor',
+ underlying: 'top 20% left 40%',
+ addFrom: 'left 60% top 80%',
+ addTo: 'right 80% bottom 40%',
+}, [
+ {at: -0.25, expect: '110% 105%'},
+ {at: 0, expect: '100% 100%'},
+ {at: 0.25, expect: '90% 95%'},
+ {at: 0.5, expect: '80% 90%'},
+ {at: 0.75, expect: '70% 85%'},
+ {at: 1, expect: '60% 80%'},
+ {at: 1.25, expect: '50% 75%'},
+]);
+
+test_composition({
+ property: 'offset-anchor',
+ underlying: '40px 60px',
+ replaceFrom: '100px 200px',
+ addTo: '160px 40px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+
+test_composition({
+ property: 'offset-anchor',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 100px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html
new file mode 100644
index 00000000000..4ff6e95b057
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-distance-composition.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>offset-distance composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property">
+<meta name="assert" content="offset-distance supports animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+ property: 'offset-distance',
+ underlying: '50px',
+ addFrom: '100px',
+ addTo: '200px',
+}, [
+ {at: -0.3, expect: '120px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '200px'},
+ {at: 1, expect: '250px'},
+ {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+ property: 'offset-distance',
+ underlying: '100px',
+ addFrom: '10px',
+ addTo: '2px',
+}, [
+ {at: -0.5, expect: '114px'},
+ {at: 0, expect: '110px'},
+ {at: 0.5, expect: '106px'},
+ {at: 1, expect: '102px'},
+ {at: 1.5, expect: '98px'},
+]);
+
+test_composition({
+ property: 'offset-distance',
+ underlying: '10%',
+ addFrom: '100px',
+ addTo: '20%',
+}, [
+ {at: -0.3, expect: 'calc(130px + 4%)'},
+ {at: 0, expect: 'calc(100px + 10%)'},
+ {at: 0.5, expect: 'calc(50px + 20%)'},
+ {at: 1, expect: '30%'},
+ {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+ property: 'offset-distance',
+ underlying: '50px',
+ addFrom: '100px',
+ replaceTo: '200px',
+}, [
+ {at: -0.3, expect: '135px'},
+ {at: 0, expect: '150px'},
+ {at: 0.5, expect: '175px'},
+ {at: 1, expect: '200px'},
+ {at: 1.5, expect: '225px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html
new file mode 100644
index 00000000000..eedd363efaf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-path-composition.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-distance composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property">
+<meta name="assert" content="offset-distance supports animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// TODO(ericwilligers) Support additive animation for path strings crbug.com/699308
+
+// Ray paths compose.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg sides)',
+ addFrom: 'ray(10deg sides)',
+ addTo: 'ray(20deg sides)',
+}, [
+ {at: -0.3, expect: 'ray(27deg sides)'},
+ {at: 0, expect: 'ray(30deg sides)'},
+ {at: 0.3, expect: 'ray(33deg sides)'},
+ {at: 0.6, expect: 'ray(36deg sides)'},
+ {at: 1, expect: 'ray(40deg sides)'},
+ {at: 1.5, expect: 'ray(45deg sides)'},
+]);
+
+// Ray paths without contain don't compose with underlying contain.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg closest-corner contain)',
+ addFrom: 'ray(10deg closest-corner)',
+ addTo: 'ray(20deg closest-corner)',
+}, [
+ {at: -0.3, expect: 'ray(7deg closest-corner)'},
+ {at: 0, expect: 'ray(10deg closest-corner)'},
+ {at: 0.3, expect: 'ray(13deg closest-corner)'},
+ {at: 0.6, expect: 'ray(16deg closest-corner)'},
+ {at: 1, expect: 'ray(20deg closest-corner)'},
+ {at: 1.5, expect: 'ray(25deg closest-corner)'},
+]);
+
+// Ray paths don't compose when underlying has different size.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg closest-side)',
+ addFrom: 'ray(10deg closest-corner)',
+ addTo: 'ray(20deg closest-corner)',
+}, [
+ {at: -0.3, expect: 'ray(7deg closest-corner)'},
+ {at: 0, expect: 'ray(10deg closest-corner)'},
+ {at: 0.3, expect: 'ray(13deg closest-corner)'},
+ {at: 0.6, expect: 'ray(16deg closest-corner)'},
+ {at: 1, expect: 'ray(20deg closest-corner)'},
+ {at: 1.5, expect: 'ray(25deg closest-corner)'},
+]);
+
+// Ray contain paths compose with underlying contain.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg farthest-side contain)',
+ addFrom: 'ray(190deg farthest-side contain)',
+ addTo: 'ray(20deg farthest-side contain)',
+}, [
+ {at: -0.3, expect: 'ray(261deg farthest-side contain)'},
+ {at: 0, expect: 'ray(210deg farthest-side contain)'},
+ {at: 0.3, expect: 'ray(159deg farthest-side contain)'},
+ {at: 0.6, expect: 'ray(108deg farthest-side contain)'},
+ {at: 1, expect: 'ray(40deg farthest-side contain)'},
+ {at: 1.5, expect: 'ray(-45deg farthest-side contain)'},
+]);
+
+// When we can't interpolate, we can't compose.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg farthest-corner)',
+ addFrom: 'ray(190deg farthest-corner contain)',
+ addTo: 'ray(20deg farthest-corner)',
+}, [
+ {at: -0.3, expect: 'ray(190deg farthest-corner contain)'},
+ {at: 0, expect: 'ray(190deg farthest-corner contain)'},
+ {at: 0.3, expect: 'ray(190deg farthest-corner contain)'},
+ {at: 0.6, expect: 'ray(40deg farthest-corner)'},
+ {at: 1, expect: 'ray(40deg farthest-corner)'},
+ {at: 1.5, expect: 'ray(40deg farthest-corner)'},
+]);
+
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg sides)',
+ replaceFrom: 'ray(190deg sides contain)',
+ addTo: 'ray(20deg sides)',
+}, [
+ {at: -0.3, expect: 'ray(190deg sides contain)'},
+ {at: 0, expect: 'ray(190deg sides contain)'},
+ {at: 0.3, expect: 'ray(190deg sides contain)'},
+ {at: 0.6, expect: 'ray(40deg sides)'},
+ {at: 1, expect: 'ray(40deg sides)'},
+ {at: 1.5, expect: 'ray(40deg sides)'},
+]);
+
+// Ray paths compose with underlying.
+test_composition({
+ property: 'offset-path',
+ underlying: 'ray(20deg closest-side)',
+ addFrom: 'ray(10deg closest-side)',
+ replaceTo: 'ray(10deg closest-side)',
+}, [
+ {at: -0.3, expect: 'ray(36deg closest-side)'},
+ {at: 0, expect: 'ray(30deg closest-side)'},
+ {at: 0.3, expect: 'ray(24deg closest-side)'},
+ {at: 0.6, expect: 'ray(18deg closest-side)'},
+ {at: 1, expect: 'ray(10deg closest-side)'},
+ {at: 1.5, expect: 'ray(0deg closest-side)'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html
new file mode 100644
index 00000000000..0ee517a73a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-position-composition.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-position composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-position-property">
+<meta name="assert" content="offset-position supports <position> animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.target {
+ width: 200px;
+ height: 200px;
+}
+</style>
+<body>
+<script>
+test_composition({
+ property: 'offset-position',
+ underlying: '40px 60px',
+ addFrom: '60px 40px',
+ addTo: '160px 140px',
+}, [
+ {at: -0.25, expect: '75px 75px'},
+ {at: 0, expect: '100px 100px'},
+ {at: 0.25, expect: '125px 125px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 175px'},
+ {at: 1, expect: '200px 200px'},
+ {at: 1.25, expect: '225px 225px'},
+]);
+
+test_composition({
+ property: 'offset-position',
+ underlying: 'top 20% left 40%',
+ addFrom: 'left 60% top 80%',
+ addTo: 'right 80% bottom 40%',
+}, [
+ {at: -0.25, expect: '110% 105%'},
+ {at: 0, expect: '100% 100%'},
+ {at: 0.25, expect: '90% 95%'},
+ {at: 0.5, expect: '80% 90%'},
+ {at: 0.75, expect: '70% 85%'},
+ {at: 1, expect: '60% 80%'},
+ {at: 1.25, expect: '50% 75%'},
+]);
+
+test_composition({
+ property: 'offset-position',
+ underlying: '40px 60px',
+ replaceFrom: '100px 200px',
+ addTo: '160px 40px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+
+test_composition({
+ property: 'offset-position',
+ underlying: '40px 60px',
+ addFrom: '60px 140px',
+ replaceTo: '200px 100px',
+}, [
+ {at: -0.25, expect: '75px 225px'},
+ {at: 0, expect: '100px 200px'},
+ {at: 0.25, expect: '125px 175px'},
+ {at: 0.5, expect: '150px 150px'},
+ {at: 0.75, expect: '175px 125px'},
+ {at: 1, expect: '200px 100px'},
+ {at: 1.25, expect: '225px 75px'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html b/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html
new file mode 100644
index 00000000000..bf60c19abef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion/animation/offset-rotate-composition.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>offset-rotate composition</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
+<meta name="assert" content="offset-rotate supports animation.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+// Angle rotations compose.
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ addFrom: '10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: '27deg'},
+ {at: 0, expect: '30deg'},
+ {at: 0.3, expect: '33deg'},
+ {at: 0.6, expect: '36deg'},
+ {at: 1, expect: '40deg'},
+ {at: 1.5, expect: '45deg'},
+]);
+
+// Angle rotations don't compose with underlying 'auto'.
+test_composition({
+ property: 'offset-rotate',
+ underlying: 'auto 20deg',
+ addFrom: '10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: '7deg'},
+ {at: 0, expect: '10deg'},
+ {at: 0.3, expect: '13deg'},
+ {at: 0.6, expect: '16deg'},
+ {at: 1, expect: '20deg'},
+ {at: 1.5, expect: '25deg'},
+]);
+
+// Auto rotations compose with underlying 'auto'.
+test_composition({
+ property: 'offset-rotate',
+ underlying: 'auto 20deg',
+ addFrom: 'reverse 10deg',
+ addTo: 'auto 20deg',
+}, [
+ {at: -0.3, expect: 'auto 261deg'},
+ {at: 0, expect: 'auto 210deg'},
+ {at: 0.3, expect: 'auto 159deg'},
+ {at: 0.6, expect: 'auto 108deg'},
+ {at: 1, expect: 'auto 40deg'},
+ {at: 1.5, expect: 'auto -45deg'},
+]);
+
+// When we can't interpolate, we can't compose.
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ addFrom: 'reverse 10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: 'auto 190deg'},
+ {at: 0, expect: 'auto 190deg'},
+ {at: 0.3, expect: 'auto 190deg'},
+ {at: 0.6, expect: '40deg'},
+ {at: 1, expect: '40deg'},
+ {at: 1.5, expect: '40deg'},
+]);
+
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ replaceFrom: 'reverse 10deg',
+ addTo: '20deg',
+}, [
+ {at: -0.3, expect: 'auto 190deg'},
+ {at: 0, expect: 'auto 190deg'},
+ {at: 0.3, expect: 'auto 190deg'},
+ {at: 0.6, expect: '40deg'},
+ {at: 1, expect: '40deg'},
+ {at: 1.5, expect: '40deg'},
+]);
+
+// Angle rotations compose with underlying angle.
+test_composition({
+ property: 'offset-rotate',
+ underlying: '20deg',
+ addFrom: '10deg',
+ replaceTo: '10deg',
+}, [
+ {at: -0.3, expect: '36deg'},
+ {at: 0, expect: '30deg'},
+ {at: 0.3, expect: '24deg'},
+ {at: 0.6, expect: '18deg'},
+ {at: 1, expect: '10deg'},
+ {at: 1.5, expect: '0deg'},
+]);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py
index dd823c78a68..12fb6a3ad85 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-line-height-tests.py
@@ -8,7 +8,7 @@ script outputs a list of all tests it generated in the format of Mozilla
reftest.list to the stdout.
"""
-from __future__ import unicode_literals
+from __future__ import unicode_literals, print_function, absolute_import
TEST_FILE = 'text-emphasis-line-height-{:03}{}.html'
TEST_TEMPLATE = '''<!DOCTYPE html>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py
index 62363a207bd..52795906876 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-position-property-tests.py
@@ -9,7 +9,7 @@ test files are generated by this script. It also outputs a list of all
tests it generated in the format of Mozilla reftest.list to the stdout.
"""
-from __future__ import unicode_literals
+from __future__ import unicode_literals, print_function, absolute_import
import itertools
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py
index b5c59e6f501..fdbaec052e4 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-ruby-tests.py
@@ -7,7 +7,7 @@ emphasis marks with ruby in four directions. It outputs a list of all
tests it generated in the format of Mozilla reftest.list to the stdout.
"""
-from __future__ import unicode_literals
+from __future__ import unicode_literals, print_function, absolute_import
TEST_FILE = 'text-emphasis-ruby-{:03}{}.html'
TEST_TEMPLATE = '''<!DOCTYPE html>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py
index 34e047ab003..1b1d6fc16f2 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/support/generate-text-emphasis-style-property-tests.py
@@ -8,7 +8,7 @@ and <string>, with horizontal writing mode. It outputs a list of all
tests it generated in the format of Mozilla reftest.list to the stdout.
"""
-from __future__ import unicode_literals
+from __future__ import unicode_literals, print_function, absolute_import
TEST_FILE = 'text-emphasis-style-property-{:03}{}.html'
TEST_TEMPLATE = '''<!DOCTYPE html>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py
index 75168420287..6e13861374a 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text3/support/generate-segment-break-transformation-rules-tests.py
@@ -18,7 +18,7 @@ So there are 49 different combinations. It outputs a list of all
tests it generated in the format of Mozilla reftest.list to the stdout.
"""
-from __future__ import unicode_literals
+from __future__ import unicode_literals, print_function, absolute_import
TEST_FILE = 'segment-break-transformation-rules-{:03}.html'
TEST_TEMPLATE = '''<!DOCTYPE html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html
index 60d88cffb51..24cb5fe4cd3 100644
--- a/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html
+++ b/tests/wpt/web-platform-tests/custom-elements/pseudo-class-defined.html
@@ -90,4 +90,22 @@ function test_defined(expected, element, description) {
assert_equals(style.color, expected ? defined : not_defined, 'getComputedStyle');
}, `${description} should ${expected ? 'be' : 'not be'} :defined`);
}
+
+test(function () {
+ var log = [];
+ var instance = document.createElement('my-custom-element-2');
+ document.body.appendChild(instance);
+ customElements.define('my-custom-element-2',class extends HTMLElement {
+ constructor() {
+ super();
+ log.push([this, 'begin']);
+ assert_false(this.matches(":defined"), "During construction, this should not match :defined");
+ log.push([this, 'end']);
+ }
+ });
+ assert_equals(log.length, 2);
+ assert_array_equals(log[0], [instance, 'begin']);
+ assert_array_equals(log[1], [instance, 'end']);
+}, 'this.matches(:defined) should not match during an upgrade');
+
</script>
diff --git a/tests/wpt/web-platform-tests/custom-elements/upgrading.html b/tests/wpt/web-platform-tests/custom-elements/upgrading.html
index d6b8ed38754..ac0fdff7a21 100644
--- a/tests/wpt/web-platform-tests/custom-elements/upgrading.html
+++ b/tests/wpt/web-platform-tests/custom-elements/upgrading.html
@@ -12,6 +12,9 @@
<script src="resources/custom-elements-helpers.js"></script>
</head>
<body>
+<infinite-cloning-element-1></infinite-cloning-element-1>
+<infinite-cloning-element-2 id="a"></infinite-cloning-element-2>
+<infinite-cloning-element-2 id="b"></infinite-cloning-element-2>
<div id="log"></div>
<script>
setup({allow_uncaught_exception:true});
@@ -203,6 +206,53 @@ test(() => {
}, 'If definition\'s disable shadow is true and element\'s shadow root is ' +
'non-null, then throw a "NotSupportedError" DOMException.');
+test(() => {
+ var log = [];
+
+ customElements.define('infinite-cloning-element-1',class extends HTMLElement {
+ constructor() {
+ super();
+ log.push([this, 'begin']);
+ // Potential infinite recursion:
+ customElements.upgrade(this);
+ log.push([this, 'end']);
+ }
+ });
+
+ assert_equals(log.length, 2);
+ const instance = document.querySelector("infinite-cloning-element-1");
+ assert_array_equals(log[0], [instance, 'begin']);
+ assert_array_equals(log[1], [instance, 'end']);
+}, 'Infinite constructor recursion with upgrade(this) should not be possible');
+
+test(() => {
+ var log = [];
+
+ customElements.define('infinite-cloning-element-2',class extends HTMLElement {
+ constructor() {
+ super();
+ log.push([this, 'begin']);
+ const b = document.querySelector("#b");
+ b.remove();
+ // While this constructor is running for "a", "b" is still
+ // undefined, and so inserting it into the document will enqueue a
+ // second upgrade reaction for "b" in addition to the one enqueued
+ // by defining x-foo.
+ document.body.appendChild(b);
+ log.push([this, 'end']);
+ }
+ });
+
+ assert_equals(log.length, 4);
+ const instanceA = document.querySelector("#a");
+ const instanceB = document.querySelector("#b");
+ assert_array_equals(log[0], [instanceA, 'begin']);
+ assert_array_equals(log[1], [instanceB, 'begin']);
+ assert_array_equals(log[2], [instanceB, 'end']);
+ assert_array_equals(log[3], [instanceA, 'end']);
+}, 'Infinite constructor recursion with appendChild should not be possible');
+
+
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html
new file mode 100644
index 00000000000..98de2b68836
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<title>DOM Test Reference</title>
+<p>You should see the word PASS below.</p>
+<div>PASS</div>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html
new file mode 100644
index 00000000000..612aed637df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/nodes/remove-from-shadow-host-and-adopt-into-iframe.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html class="reftest-wait">
+ <head>
+ <title>Adopting a shadow host child into an iframe</title>
+ <link rel="help" href="https://dom.spec.whatwg.org/#concept-node-adopt">
+ <link rel="match" href="remove-from-shadow-host-and-adopt-into-iframe-ref.html">
+ <style>
+ iframe { border: 0; }
+ </style>
+ <script src="/common/reftest-wait.js"></script>
+ <script>
+ onload = () => {
+ const root = host.attachShadow({mode:"open"});
+ root.innerHTML = "<slot>";
+ // force a layout
+ host.offsetTop;
+ iframe.contentWindow.document.body.style.margin = 0;
+ iframe.contentWindow.document.body.appendChild(adopted);
+ host.remove();
+ takeScreenshot();
+ }
+ </script>
+ </head>
+ <body>
+ <p>You should see the word PASS below.</p>
+ <iframe id="iframe"></iframe>
+ <div id="host"><span id="adopted">PASS</span></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/domxpath/booleans.html b/tests/wpt/web-platform-tests/domxpath/booleans.html
new file mode 100644
index 00000000000..41522edf05f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/booleans.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans">
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_true(evaluateBoolean('(./span)[4] or ./br[2]', context));
+}, '"or" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_true(evaluateBoolean('count((./span)[3]) = count(./br[2])', context));
+}, '"=" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_false(evaluateBoolean('count((./span)[3]) != count(./br[2])', context));
+}, '"!=" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_true(evaluateBoolean('count((./span)[3]) < count(./br)', context));
+}, '"<" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_false(evaluateBoolean('count((./span)[3]) > count(./br[2])', context));
+}, '">" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_false(evaluateBoolean('count((./span)[3]) >= count(./br)', context));
+}, '">=" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_true(evaluateBoolean('count((./span)[3]) <= count(./br[2])', context));
+}, '"<=" operator depending on the context node');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/fn-concat.html b/tests/wpt/web-platform-tests/domxpath/fn-concat.html
new file mode 100644
index 00000000000..fe160966aa7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/fn-concat.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-concat">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<body>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span>foo</span><span>bar</span><b>ber</b>';
+ assert_equals(evaluateString('concat((./span)[2], ./b)', context), 'barber');
+}, 'concat() arguments depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/fn-contains.html b/tests/wpt/web-platform-tests/domxpath/fn-contains.html
new file mode 100644
index 00000000000..a4d8bbfa7b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/fn-contains.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-contains">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<body>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span>bar bar</span><span>bar<b>ber</b></span><b>bar</b>';
+ assert_true(evaluateBoolean('contains((./span)[1], ./b)', context));
+}, 'contains() arguments depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/fn-starts-with.html b/tests/wpt/web-platform-tests/domxpath/fn-starts-with.html
new file mode 100644
index 00000000000..99d2df7db6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/fn-starts-with.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-starts-with">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<body>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span>foo</span><span>bar<b>ber</b></span><b>bar</b>';
+ assert_true(evaluateBoolean('starts-with((./span)[2], ./b)', context));
+}, 'starts-with() arguments depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/fn-substring-after.html b/tests/wpt/web-platform-tests/domxpath/fn-substring-after.html
new file mode 100644
index 00000000000..c290914d24b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/fn-substring-after.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-substring-after">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<body>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span>^^^bar$$$</span><span>bar<b>^</b></span><b>bar</b>';
+ assert_equals(evaluateString('substring-after((./span)[1], ./b)', context), '$$$');
+}, 'substring-after() arguments depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/fn-substring-before.html b/tests/wpt/web-platform-tests/domxpath/fn-substring-before.html
new file mode 100644
index 00000000000..69b3f1ef6e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/fn-substring-before.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-substring-before">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<body>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span>^^^bar$$$</span><span>bar<b>$</b></span><b>bar</b>';
+ assert_equals(evaluateString('substring-before((./span)[1], ./b)', context), '^^^');
+}, 'substring-before() arguments depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/fn-substring.html b/tests/wpt/web-platform-tests/domxpath/fn-substring.html
new file mode 100644
index 00000000000..3311a15061d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/fn-substring.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-substring">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<body>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span>^^^bar$$$</span><span></span><br><br><br><br>';
+ assert_equals(evaluateString('substring((./span)[1], count(./br))', context), 'bar$$$');
+}, 'substring() arguments depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/fn-translate.html b/tests/wpt/web-platform-tests/domxpath/fn-translate.html
new file mode 100644
index 00000000000..ee1700d1b42
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/fn-translate.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#function-translate">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<body>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span>^^^bar$$$</span><span><b>^^^</b></span><b>bar</b><b>foo</b>';
+ assert_equals(evaluateString('translate((./span)[1], (./b)[1], ./b[2])', context), '^^^foo$$$');
+}, 'translate() arguments depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/helpers.js b/tests/wpt/web-platform-tests/domxpath/helpers.js
new file mode 100644
index 00000000000..0805bd682b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/helpers.js
@@ -0,0 +1,14 @@
+function evaluateBoolean(expression, context) {
+ let doc = context.ownerDocument || context;
+ return doc.evaluate(expression, context, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;
+}
+
+function evaluateNumber(expression, context) {
+ let doc = context.ownerDocument || context;
+ return doc.evaluate(expression, context, null, XPathResult.NUMBER_TYPE, null).numberValue;
+}
+
+function evaluateString(expression, context) {
+ let doc = context.ownerDocument || context;
+ return doc.evaluate(expression, context, null, XPathResult.STRING_TYPE, null).stringValue;
+}
diff --git a/tests/wpt/web-platform-tests/domxpath/lexical-structure.html b/tests/wpt/web-platform-tests/domxpath/lexical-structure.html
new file mode 100644
index 00000000000..f93820b0e41
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/lexical-structure.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#exprlex">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+function parse(expression) {
+ document.evaluate(expression, document, null, XPathResult.ANY_TYPE, null);
+}
+
+// https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-Literal
+test(() => {
+ parse(' \'a"bc\' ');
+ parse(' "a\'bc" ');
+
+ assert_throws(new SyntaxError(), () => { parse(' \u2019xyz\u2019 '); });
+}, 'Literal: Only \' and " should be handled as literal quotes.');
+
+// https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-ExprWhitespace
+test(() => {
+ parse(' \t\r\n.\r\n\t ');
+
+ assert_throws(new SyntaxError(), () => { parse('\x0B\x0C .'); });
+ assert_throws(new SyntaxError(), () => { parse('\x0E\x0F .'); });
+ assert_throws(new SyntaxError(), () => { parse('\u3000 .'); });
+ assert_throws(new SyntaxError(), () => { parse('\u2029 .'); });
+}, 'ExprWhitespace: Only #x20 #x9 #xD or #xA must be handled as a whitespace.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domxpath/numbers.html b/tests/wpt/web-platform-tests/domxpath/numbers.html
new file mode 100644
index 00000000000..e847d6cd2e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/numbers.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/1999/REC-xpath-19991116/#numbers">
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<div id="context"></div>
+<script>
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_equals(evaluateNumber('count((./span)[1]) + count(./br)', context), 3);
+}, '"+" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_equals(evaluateNumber('count((./span)[1]) - count(./br)', context), -1);
+}, '"-" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_equals(evaluateNumber('count((./span)[1]) * count(./br)', context), 2);
+}, '"*" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_equals(evaluateNumber('count((./span)[1]) div count(./br)', context), 0.5);
+}, '"div" operator depending on the context node');
+
+test(() => {
+ const context = document.querySelector('#context');
+ context.innerHTML = '<span></span><span></span><span></span><br><br>';
+ assert_equals(evaluateNumber('count((./span)[1]) mod count(./br)', context), 1);
+}, '"mod" operator depending on the context node');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources-with-0x00-in-header.window.js b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources-with-0x00-in-header.window.js
new file mode 100644
index 00000000000..f1afeeb740b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources-with-0x00-in-header.window.js
@@ -0,0 +1,31 @@
+async_test(t => {
+ const script = document.createElement("script");
+ t.add_cleanup(() => script.remove());
+ script.src = "resources/script-with-0x00-in-header.py";
+ script.onerror = t.step_func_done();
+ script.onload = t.unreached_func();
+ document.body.append(script);
+}, "Expect network error for script with 0x00 in a header");
+
+async_test(t => {
+ const frame = document.createElement("iframe");
+ t.add_cleanup(() => frame.remove());
+ frame.src = "resources/document-with-0x00-in-header.py";
+ // If network errors result in load events for frames per
+ // https://github.com/whatwg/html/issues/125 and https://github.com/whatwg/html/issues/1230 this
+ // should be changed to use the load event instead.
+ t.step_timeout(() => {
+ assert_equals(frame.contentDocument, null);
+ t.done();
+ }, 1000);
+ document.body.append(frame);
+}, "Expect network error for frame navigation to resource with 0x00 in a header");
+
+async_test(t => {
+ const img = document.createElement("img");
+ t.add_cleanup(() => img.remove());
+ img.src = "resources/blue-with-0x00-in-a-header.asis";
+ img.onerror = t.step_func_done();
+ img.onload = t.unreached_func();
+ document.body.append(img);
+}, "Expect network error for image with 0x00 in a header");
diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/README.md b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/README.md
new file mode 100644
index 00000000000..2175d274088
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/README.md
@@ -0,0 +1,6 @@
+`blue-with-0x00-in-a-header.asis` is a copy from `../../images/blue.png` with the following prepended using Control Pictures to signify actual newlines and 0x00:
+```
+HTTP/1.1 200 AN IMAGE␍␊
+Content-Type: image/png␍␊
+Custom: ␀␍␊␍␊
+```
diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis
new file mode 100644
index 00000000000..102340a6313
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/document-with-0x00-in-header.py b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/document-with-0x00-in-header.py
new file mode 100644
index 00000000000..6e8db619591
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/document-with-0x00-in-header.py
@@ -0,0 +1,4 @@
+def main(request, response):
+ response.headers.set("Content-Type", "text/html")
+ response.headers.set("Custom", "\0")
+ return "<!doctype html><b>This is a document.</b>"
diff --git a/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/script-with-0x00-in-header.py b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/script-with-0x00-in-header.py
new file mode 100644
index 00000000000..f4a016a3698
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/h1-parsing/resources/script-with-0x00-in-header.py
@@ -0,0 +1,4 @@
+def main(request, response):
+ response.headers.set("Content-Type", "text/javascript")
+ response.headers.set("Custom", "\0")
+ return "var thisIsJavaScript = 0"
diff --git a/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html b/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html
index 533dd6a936f..9e557fed7b7 100644
--- a/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html
+++ b/tests/wpt/web-platform-tests/fetch/http-cache/split-cache.tentative.html
@@ -16,7 +16,7 @@ const host = get_host_info();
// We run this entire test twice: first with a same-origin then with a cross-origin popup
function performFullTest(is_same_origin_test) {
- const POPUP_HTTP_ORIGIN = is_same_origin_test ? host.HTTP_ORIGIN : host.HTTP_REMOTE_ORIGIN
+ const POPUP_HTTP_ORIGIN = is_same_origin_test ? host.HTTP_ORIGIN : host.HTTP_NOTSAMESITE_ORIGIN
const LOCAL_HTTP_ORIGIN = host.HTTP_ORIGIN
const popupBaseURL = POPUP_HTTP_ORIGIN + window.location.pathname.replace(/\/[^\/]*$/, '/') ;
diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html
new file mode 100644
index 00000000000..919a05ed2a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-due-to-document-domain-only.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<title>Cross-origin due to document.domain</title>
+<meta charset=utf-8>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<iframe src=resources/cross-origin-due-to-document-domain-only-helper.html></iframe>
+<script>
+async_test(t => {
+ onload = t.step_func_done(() => {
+ const frame = document.querySelector("iframe");
+ const innerSelf = self[0];
+ const innerLocation = innerSelf.location;
+ const innerDocument = innerSelf.document;
+ assert_equals(innerLocation.host, location.host);
+ assert_true(innerSelf.expandosForever);
+ assert_true(innerLocation.expandosForever);
+ assert_equals(frame.contentWindow, innerSelf);
+ assert_equals(frame.contentDocument, innerDocument);
+ innerSelf.setDocumentDomain();
+ assert_throws("SecurityError", () => innerSelf.expandosForever);
+ assert_throws("SecurityError", () => innerLocation.expandosForever);
+ assert_throws("SecurityError", () => innerLocation.host);
+ assert_equals(innerSelf.parent, self);
+ assert_throws("SecurityError", () => innerSelf.frameElement);
+ assert_throws("SecurityError", () => innerLocation.reload());
+ assert_equals(frame.contentWindow, innerSelf);
+ assert_equals(frame.contentDocument, null);
+ // Cross-origin Document object obtained before it became cross-origin has no protections
+ assert_equals(innerDocument.URL, frame.src);
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html
new file mode 100644
index 00000000000..10ac8ece0e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/resources/cross-origin-due-to-document-domain-only-helper.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<meta charset=utf-8>
+<script>
+self.expandosForever = true
+self.location.expandosForever = true
+function setDocumentDomain() {
+ document.domain = document.domain
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html
index 1d231d52cde..ab36eeede73 100644
--- a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html
+++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/canvas-aspect-ratio.html
@@ -1,5 +1,5 @@
<!doctype html>
-<title>Canvas width and height attributes are used to infer aspect-ratio</title>
+<title>Canvas width and height attributes are used as the surface size</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
@@ -11,7 +11,7 @@
</style>
<body>
<script>
-let t = async_test("Canvas width and height attributes are used to infer aspect-ratio");
+let t = async_test("Canvas width and height attributes are used as the surface size");
function assert_ratio(img, expected) {
let epsilon = 0.001;
assert_approx_equals(parseInt(getComputedStyle(img).width, 10) / parseInt(getComputedStyle(img).height, 10), expected, epsilon);
diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html
new file mode 100644
index 00000000000..42be8ce7a81
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/content-aspect-ratio.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>div with content style's width and height attributes are not used to infer aspect-ratio</title>
+<link rel="help" href="https://bugs.webkit.org/show_bug.cgi?id=201641#c22">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ video {
+ width: 100%;
+ max-width: 100px;
+ height: auto;
+ }
+</style>
+<body>
+<script>
+// Create and append a div with content style and immediately check the height.
+let t = test(function() {
+ var div = document.createElement("div");
+ div.setAttribute("style", "content: url('/images/blue.png')");
+ div.setAttribute("width", "250");
+ div.setAttribute("height", "100");
+ document.body.appendChild(div);
+ assert_equals(getComputedStyle(div).height, "0px");
+}, "div with content style's width and height attributes are not used to infer aspect-ratio");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html
index 5b155c1047d..30000329780 100644
--- a/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html
+++ b/tests/wpt/web-platform-tests/html/rendering/replaced-elements/attributes-for-embedded-content-and-images/img-aspect-ratio.html
@@ -12,6 +12,8 @@
<img src="/images/green.png">
<img src="/images/green.png" width=100 height=125>
<img src="" width=100 height=125>
+<img src="error.png" width=100 height=125>
+<img src="error.png">
<script>
let t = async_test("Image width and height attributes are used to infer aspect-ratio");
function assert_ratio(img, expected) {
@@ -47,9 +49,10 @@ t.step(function() {
onload = t.step_func_done(function() {
let images = document.querySelectorAll("img");
- assert_ratio(images[3], 1.266); // 1.266 is the original aspect ratio of blue.png
- assert_equals(getComputedStyle(images[2]).height, "0px"); // aspect-ratio doesn't override intrinsic size of images that don't have any src.
- assert_ratio(images[1], 2.0); // 2.0 is the original aspect ratio of green.png
assert_ratio(images[0], 2.0); // Loaded image's aspect ratio, at least by default, overrides width / height ratio.
+ assert_ratio(images[1], 2.0); // 2.0 is the original aspect ratio of green.png
+ assert_equals(getComputedStyle(images[2]).height, "0px"); // aspect-ratio doesn't override intrinsic size of images that don't have any src.
+ assert_equals(getComputedStyle(images[3]).height, getComputedStyle(images[4]).height); // aspect-ratio doesn't override intrinsic size of error images.
+ assert_ratio(images[5], 1.266); // 1.266 is the original aspect ratio of blue.png
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html
new file mode 100644
index 00000000000..f32472105d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute-ref.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html>
+<p>You should see a green rectangle below</p>
+<div style="width:100px;height:100px;background-color:green"></div>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute.html
new file mode 100644
index 00000000000..80acb9f3dcc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-link-element/link-type-attribute.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel=match href=link-type-attribute-ref.html>
+<link rel="stylesheet" type="application/javascript" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="ABCtext/css" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="text/cssDEF" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="text/invalid" href="data:text/css,div { background-color: red !important; }">
+<link rel="stylesheet" type="invalid" href="data:text/css,div { background-color: red !important; }">
+<p>You should see a green rectangle below</p>
+<div style="width:100px;height:100px;background-color:green"></div>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
index cec5dcbf0d5..03655ffd2f5 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
@@ -15,7 +15,7 @@
types: ["text", "search", "tel", "password"],
testData: [
{conditions: {pattern: "[A-Z]", value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -24,7 +24,7 @@
testData: [
{conditions: {pattern: "http://www.example.com", value: "http://www.example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
{conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -33,7 +33,7 @@
testData: [
{conditions: {pattern: "test@example.com", value: "test@example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
{conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -43,7 +43,7 @@
{conditions: {max: "2000-01-01T12:00:00", value: "2001-01-01T12:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "2001-01-01T12:00:00", value: "2000-01-01T12:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 60 * 1000, value: "2001-01-01T12:03:00"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -53,7 +53,7 @@
{conditions: {max: "2000-01-01", value: "2001-01-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "2001-01-01", value: "2000-01-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 1 * 86400000, value: "2000-01-03"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -64,7 +64,7 @@
{conditions: {min: "2001-01", value: "2000-01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
// Step checks that "months since Jan 1970" is evenly divisible by `step`
{conditions: {step: 3, value: "2001-02"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -74,7 +74,7 @@
{conditions: {max: "2000-W01", value: "2001-W01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "2001-W01", value: "2000-W01"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 1 * 604800000, value: "2001-W03"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -84,7 +84,7 @@
{conditions: {max: "12:00:00", value: "13:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "12:00:00", value: "11:00:00"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 60 * 1000, value: "12:03:00"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -94,7 +94,7 @@
{conditions: {max: "5", value: "6"}, expected: false, name: "[target] validity.valid must be false if validity.rangeOverflow is true"},
{conditions: {min: "5", value: "4"}, expected: false, name: "[target] validity.valid must be false if validity.rangeUnderflow is true"},
{conditions: {step: 2 * 1 * 1, value: "3"}, expected: false, name: "[target] validity.valid must be false if validity.stepMismatch is true"},
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
},
{
@@ -122,7 +122,7 @@
tag: "textarea",
types: [],
testData: [
- {conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
+ {conditions: {required: true, value: ""}, expected: false, expectedImmutable: true, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
}
];
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
index 3c9e4c4cb09..2e1c666436a 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valueMissing.html
@@ -16,7 +16,7 @@
testData: [
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "abc"}, expected: false, name: "[target] The value is not empty and required is true"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value is empty and required is true"}
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value is empty and required is true"}
]
},
{
@@ -27,13 +27,13 @@
{conditions: {required: true, value: "2000-12-10T12:00:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10T12:00:00)"},
{conditions: {required: true, value: "2000-12-10 12:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10 12:00)"},
{conditions: {required: true, value: "1979-10-14T12:00:00.001"}, expected: false, name: "[target] Valid local date and time string(1979-10-14T12:00:00.001)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "1979-10-99 99:99"}, expected: true, name: "[target] Invalid local date and time string(1979-10-99 99:99)"},
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "1979-10-99 99:99"}, expected: true, expectedImmutable: false, name: "[target] Invalid local date and time string(1979-10-99 99:99)"},
{conditions: {required: true, value: "1979-10-14 12:00:00"}, expected: false, name: "[target] Valid local date and time string(1979-10-14 12:00:00)"},
- {conditions: {required: true, value: "2001-12-21 12:00"}, expected: true, name: "[target] Invalid local date and time string(2001-12-21 12:00)-two white space"},
- {conditions: {required: true, value: "abc"}, expected: true, name: "[target] the value attribute is a string(abc)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: "2001-12-21 12:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid local date and time string(2001-12-21 12:00)-two white space"},
+ {conditions: {required: true, value: "abc"}, expected: true, expectedImmutable: false, name: "[target] the value attribute is a string(abc)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -43,12 +43,12 @@
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "2000-12-10"}, expected: false, name: "[target] Valid date string(2000-12-10)"},
{conditions: {required: true, value: "9999-01-01"}, expected: false, name: "[target] Valid date string(9999-01-01)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "9999-99-99"}, expected: true, name: "[target] Invalid date string(9999-99-99)"},
- {conditions: {required: true, value: "37/01/01"}, expected: true, name: "[target] Invalid date string(37-01-01)"},
- {conditions: {required: true, value: "2000/01/01"}, expected: true, name: "[target] Invalid date string(2000/01/01)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "9999-99-99"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(9999-99-99)"},
+ {conditions: {required: true, value: "37/01/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(37-01-01)"},
+ {conditions: {required: true, value: "2000/01/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid date string(2000/01/01)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -58,12 +58,12 @@
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "2000-12"}, expected: false, name: "[target] Valid month string(2000-12)"},
{conditions: {required: true, value: "9999-01"}, expected: false, name: "[target] Valid month string(9999-01)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "2000-99"}, expected: true, name: "[target] Invalid month string(2000-99)"},
- {conditions: {required: true, value: "37-01"}, expected: true, name: "[target] Invalid month string(37-01)"},
- {conditions: {required: true, value: "2000/01"}, expected: true, name: "[target] Invalid month string(2000/01)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "2000-99"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(2000-99)"},
+ {conditions: {required: true, value: "37-01"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(37-01)"},
+ {conditions: {required: true, value: "2000/01"}, expected: true, expectedImmutable: false, name: "[target] Invalid month string(2000/01)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -73,12 +73,12 @@
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "2000-W12"}, expected: false, name: "[target] Valid week string(2000-W12)"},
{conditions: {required: true, value: "9999-W01"}, expected: false, name: "[target] Valid week string(9999-W01)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a Date object"},
- {conditions: {required: true, value: "2000-W99"}, expected: true, name: "[target] Invalid week string(2000-W99)"},
- {conditions: {required: true, value: "2000-W00"}, expected: true, name: "[target] invalid week string(2000-W00)"},
- {conditions: {required: true, value: "2000-w01"}, expected: true, name: "[target] invalid week string(2000-w01)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a Date object"},
+ {conditions: {required: true, value: "2000-W99"}, expected: true, expectedImmutable: false, name: "[target] Invalid week string(2000-W99)"},
+ {conditions: {required: true, value: "2000-W00"}, expected: true, expectedImmutable: false, name: "[target] invalid week string(2000-W00)"},
+ {conditions: {required: true, value: "2000-w01"}, expected: true, expectedImmutable: false, name: "[target] invalid week string(2000-w01)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -91,13 +91,13 @@
{conditions: {required: true, value: "12:00:00.001"}, expected: false, name: "[target] Valid time string(12:00:60.001)"},
{conditions: {required: true, value: "12:00:00.01"}, expected: false, name: "[target] Valid time string(12:00:60.01)"},
{conditions: {required: true, value: "12:00:00.1"}, expected: false, name: "[target] Valid time string(12:00:60.1)"},
- {conditions: {required: true, value: 1234567}, expected: true, name: "[target] The value attribute is a number(1234567)"},
- {conditions: {required: true, value: new Date()}, expected: true, name: "[target] The value attribute is a time object"},
- {conditions: {required: true, value: "25:00:00"}, expected: true, name: "[target] Invalid time string(25:00:00)"},
- {conditions: {required: true, value: "12:60:00"}, expected: true, name: "[target] Invalid time string(12:60:00)"},
- {conditions: {required: true, value: "12:00:60"}, expected: true, name: "[target] Invalid time string(12:00:60)"},
- {conditions: {required: true, value: "12:00:00:001"}, expected: true, name: "[target] Invalid time string(12:00:00:001)"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: 1234567}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a number(1234567)"},
+ {conditions: {required: true, value: new Date()}, expected: true, expectedImmutable: false, name: "[target] The value attribute is a time object"},
+ {conditions: {required: true, value: "25:00:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(25:00:00)"},
+ {conditions: {required: true, value: "12:60:00"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:60:00)"},
+ {conditions: {required: true, value: "12:00:60"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:00:60)"},
+ {conditions: {required: true, value: "12:00:00:001"}, expected: true, expectedImmutable: false, name: "[target] Invalid time string(12:00:00:001)"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -110,11 +110,11 @@
{conditions: {required: true, value: "123.01e-10"}, expected: false, name: "[target] Value is a number in scientific notation form(e is in lowercase)"},
{conditions: {required: true, value: "123.01E+10"}, expected: false, name: "[target] Value is a number in scientific notation form(E is in uppercase)"},
{conditions: {required: true, value: "-0"}, expected: false, name: "[target] Value is -0"},
- {conditions: {required: true, value: " 123 "}, expected: true, name: "[target] Value is a number with some white spaces"},
- {conditions: {required: true, value: Math.pow(2, 1024)}, expected: true, name: "[target] Value is Math.pow(2, 1024)"},
- {conditions: {required: true, value: Math.pow(-2, 1024)}, expected: true, name: "[target] Value is Math.pow(-2, 1024)"},
- {conditions: {required: true, value: "abc"}, expected: true, name: "[target] Value is a string that cannot be converted to a number"},
- {conditions: {required: true, value: ""}, expected: true, name: "[target] The value attribute is empty string"}
+ {conditions: {required: true, value: " 123 "}, expected: true, expectedImmutable: false, name: "[target] Value is a number with some white spaces"},
+ {conditions: {required: true, value: Math.pow(2, 1024)}, expected: true, expectedImmutable: false, name: "[target] Value is Math.pow(2, 1024)"},
+ {conditions: {required: true, value: Math.pow(-2, 1024)}, expected: true, expectedImmutable: false, name: "[target] Value is Math.pow(-2, 1024)"},
+ {conditions: {required: true, value: "abc"}, expected: true, expectedImmutable: false, name: "[target] Value is a string that cannot be converted to a number"},
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value attribute is empty string"}
]
},
{
@@ -159,7 +159,7 @@
testData: [
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "abc"}, expected: false, name: "[target] The value is not empty"},
- {conditions: {required: true, value: ""}, expected: true , name: "[target] The value is empty"}
+ {conditions: {required: true, value: ""}, expected: true, expectedImmutable: false, name: "[target] The value is empty"}
]
}
];
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js
index 9b28b32309e..33508fb3289 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/support/validator.js
@@ -4,12 +4,9 @@ var validator = {
var self = this;
test(function() {
self.pre_check(ctl, 'tooLong');
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.dirty)
- self.set_dirty(ctl);
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.tooLong,
'The validity.tooLong should be true' + condStr);
@@ -25,12 +22,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "tooShort");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.dirty)
- self.set_dirty(ctl);
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.tooShort,
'The validity.tooShort should be true' + condStr);
@@ -46,10 +40,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "patternMismatch");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.patternMismatch,
'The validity.patternMismatch should be true' + condStr);
@@ -65,10 +58,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "valueMissing");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.valueMissing,
'The validity.valueMissing should be true' + condStr);
@@ -84,10 +76,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "typeMismatch");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.typeMismatch,
'The validity.typeMismatch should be true' + condStr);
@@ -103,10 +94,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "rangeOverflow");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.rangeOverflow,
'The validity.rangeOverflow should be true' + condStr);
@@ -122,10 +112,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "rangeUnderflow");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.rangeUnderflow,
'The validity.rangeUnderflow should be true' + condStr);
@@ -141,10 +130,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "stepMismatch");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.stepMismatch,
'The validity.stepMismatch should be true' + condStr);
@@ -160,10 +148,9 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "badInput");
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.badInput,
'The validity.badInput should be true' + condStr);
@@ -179,17 +166,24 @@ var validator = {
var self = this;
test(function () {
self.pre_check(ctl, "customError");
- ctl.setCustomValidity(data.conditions.message);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.expected) {
+ const {ctl, expected, condStr} = val;
+ if (expected) {
assert_true(
ctl.validity.customError,
'The validity.customError attribute should be true' + condStr);
- assert_equals(
- ctl.validationMessage, data.conditions.message,
- 'The validationMessage attribute should be \'' +
- data.conditions.message + '\'' + condStr);
+ // validationMessage returns the empty string if ctl is barred from
+ // constraint validation, which happens if ctl is disabled or readOnly.
+ if (ctl.disabled || ctl.readOnly) {
+ assert_equals(
+ ctl.validationMessage, '',
+ 'The validationMessage attribute must be empty' + condStr);
+ } else {
+ assert_equals(
+ ctl.validationMessage, data.conditions.message,
+ 'The validationMessage attribute should be \'' +
+ data.conditions.message + '\'' + condStr);
+ }
} else {
assert_false(
ctl.validity.customError,
@@ -205,12 +199,9 @@ var validator = {
test_isValid: function(ctl, data) {
var self = this;
test(function () {
- self.set_conditions(ctl, data.conditions);
self.iterate_over(ctl, data).forEach(function(val) {
- const {ctl, data, condStr} = val;
- if (data.dirty)
- self.set_dirty(ctl);
- if (data.expected)
+ const {ctl, expected, condStr} = val;
+ if (expected)
assert_true(
ctl.validity.valid,
'The validity.valid should be true' + condStr);
@@ -352,7 +343,9 @@ var validator = {
ctl.removeAttribute(item);
});
for (var attr in obj) {
- if (attr === "checked" || obj[attr] || obj[attr] === "")
+ if (attr === "message")
+ ctl.setCustomValidity(obj[attr]);
+ else if (attr === "checked" || obj[attr] || obj[attr] === "")
ctl[attr] = obj[attr];
}
},
@@ -396,24 +389,54 @@ var validator = {
},
iterate_over: function(ctl, data) {
- // Iterate over normal, disabled, readonly, and both.
+ // Iterate over normal, disabled, readonly, and both (if applicable).
+ var ctlNormal = ctl.cloneNode(true);
+ this.set_conditions(ctlNormal, data.conditions);
+ if (data.dirty)
+ this.set_dirty(ctlNormal);
+
var ctlDisabled = ctl.cloneNode(true);
+ this.set_conditions(ctlDisabled, data.conditions);
+ if (data.dirty)
+ this.set_dirty(ctlDisabled);
ctlDisabled.disabled = true;
- var ctlReadonly = ctl.cloneNode(true);
- ctlReadonly.readonly = true;
- var ctlBoth = ctl.cloneNode(true);
- ctlBoth.disabled = true;
- ctlBoth.readonly = true;
- return [
- {ctl: ctl, data: data, condStr: '.'},
- {ctl: ctlDisabled, data: data, condStr: ', when control is disabled.'},
- {ctl: ctlReadonly, data: data, condStr: ', when control is readonly.'},
- {
+
+ var expectedImmutable =
+ data.expectedImmutable !== undefined ? data.expectedImmutable : data.expected;
+
+ var variants = [
+ {ctl: ctlNormal, expected: data.expected, condStr: '.'},
+ {ctl: ctlDisabled, expected: expectedImmutable, condStr: ', when control is disabled.'},
+ ];
+
+ if ('readOnly' in ctl) {
+ var ctlReadonly = ctl.cloneNode(true);
+ this.set_conditions(ctlReadonly, data.conditions);
+ if (data.dirty)
+ this.set_dirty(ctlReadonly);
+ ctlReadonly.readOnly = true;
+
+ var ctlBoth = ctl.cloneNode(true);
+ this.set_conditions(ctlBoth, data.conditions);
+ if (data.dirty)
+ this.set_dirty(ctlBoth);
+ ctlBoth.disabled = true;
+ ctlBoth.readOnly = true;
+
+ variants.push({
+ ctl: ctlReadonly,
+ expected: expectedImmutable,
+ condStr: ', when control is readonly.'
+ });
+
+ variants.push({
ctl: ctlBoth,
- data: data,
+ expected: expectedImmutable,
condStr: ', when control is disabled & readonly.'
- },
- ]
+ });
+ }
+
+ return variants;
},
run_test: function(testee, method) {
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html
index ad4e38cbc74..ec815d4cb30 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/time.html
@@ -291,8 +291,11 @@ test(function(){
} , "stepDown stop so lower than the minimum value");
test(function(){
+ // Set min value to ensure that 15:01 - base is a multiple of 2 min (i.e., a
+ // valid value).
+ _StepTest.min = "14:01";
_StepTest.max = "15:01";
- this.add_cleanup(function() { _StepTest.max = ""; });
+ this.add_cleanup(function() { _StepTest.min = _StepTest.max = ""; });
_StepTest.value = "15:00";
_StepTest.step = "120";
_StepTest.stepUp();
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini
index d97432ed39c..c7b3482c786 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPoints.html.ini
@@ -1,5 +1,3 @@
[multiTouchPoints.html]
- disabled:
- if product == "chrome" and os != "mac": https://github.com/web-platform-tests/wpt/issues/20838
expected:
if product == "firefox" or product == "safari" or product == "epiphany" or product == "webkit": ERROR
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini
index 3adcbe68856..68ccafcec2a 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseFirstPoint.html.ini
@@ -1,5 +1,3 @@
[multiTouchPointsReleaseFirstPoint.html]
- disabled:
- if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838
expected:
if product == "firefox" or product == "safari": ERROR
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini
index d01525b3cfa..5d714dd7773 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsReleaseSecondPoint.html.ini
@@ -1,5 +1,3 @@
[multiTouchPointsReleaseSecondPoint.html]
- disabled:
- if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838
expected:
if product == "firefox" or product == "safari": ERROR
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini
index a87d9f936fd..40626b8193e 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html.ini
@@ -1,5 +1,3 @@
[multiTouchPointsTwoTouchStarts.html]
- disabled:
- if product == "chrome" and os != "mac": https://github.com/web-platform-tests/wpt/issues/20838
- expected:
- if product == "firefox" or product == "safari": ERROR
+ expected:
+ if product == "firefox" or product == "safari": ERROR
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini
index fe1bf469f4f..4f1939a431a 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/multiTouchPointsWithPause.html.ini
@@ -1,5 +1,3 @@
[multiTouchPointsWithPause.html]
- disabled:
- if product == "chrome": https://github.com/web-platform-tests/wpt/issues/20838
expected:
if product == "firefox" or product == "safari": ERROR
diff --git a/tests/wpt/web-platform-tests/interfaces/webaudio.idl b/tests/wpt/web-platform-tests/interfaces/webaudio.idl
index 674673d90b1..9491090337c 100644
--- a/tests/wpt/web-platform-tests/interfaces/webaudio.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webaudio.idl
@@ -26,28 +26,36 @@ interface BaseAudioContext : EventTarget {
AnalyserNode createAnalyser ();
BiquadFilterNode createBiquadFilter ();
- AudioBuffer createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate);
+ AudioBuffer createBuffer (unsigned long numberOfChannels,
+ unsigned long length,
+ float sampleRate);
AudioBufferSourceNode createBufferSource ();
ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);
- ChannelSplitterNode createChannelSplitter (optional unsigned long numberOfOutputs = 6);
+ ChannelSplitterNode createChannelSplitter (
+ optional unsigned long numberOfOutputs = 6);
ConstantSourceNode createConstantSource ();
ConvolverNode createConvolver ();
DelayNode createDelay (optional double maxDelayTime = 1.0);
DynamicsCompressorNode createDynamicsCompressor ();
GainNode createGain ();
- IIRFilterNode createIIRFilter (sequence<double> feedforward, sequence<double> feedback);
+ IIRFilterNode createIIRFilter (sequence<double> feedforward,
+ sequence<double> feedback);
OscillatorNode createOscillator ();
PannerNode createPanner ();
- PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints = {});
- ScriptProcessorNode createScriptProcessor(optional unsigned long bufferSize = 0,
- optional unsigned long numberOfInputChannels = 2,
- optional unsigned long numberOfOutputChannels = 2);
+ PeriodicWave createPeriodicWave (sequence<float> real,
+ sequence<float> imag,
+ optional PeriodicWaveConstraints constraints = {});
+ ScriptProcessorNode createScriptProcessor(
+ optional unsigned long bufferSize = 0,
+ optional unsigned long numberOfInputChannels = 2,
+ optional unsigned long numberOfOutputChannels = 2);
StereoPannerNode createStereoPanner ();
WaveShaperNode createWaveShaper ();
- Promise<AudioBuffer> decodeAudioData (ArrayBuffer audioData,
- optional DecodeSuccessCallback? successCallback,
- optional DecodeErrorCallback? errorCallback);
+ Promise<AudioBuffer> decodeAudioData (
+ ArrayBuffer audioData,
+ optional DecodeSuccessCallback? successCallback,
+ optional DecodeErrorCallback? errorCallback);
};
enum AudioContextLatencyCategory {
@@ -67,7 +75,8 @@ interface AudioContext : BaseAudioContext {
Promise<void> close ();
MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement);
MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream);
- MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (MediaStreamTrack mediaStreamTrack);
+ MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (
+ MediaStreamTrack mediaStreamTrack);
MediaStreamAudioDestinationNode createMediaStreamDestination ();
};
@@ -116,8 +125,14 @@ interface AudioBuffer {
readonly attribute double duration;
readonly attribute unsigned long numberOfChannels;
Float32Array getChannelData (unsigned long channel);
- void copyFromChannel (Float32Array destination, unsigned long channelNumber, optional unsigned long bufferOffset = 0);
- void copyToChannel (Float32Array source, unsigned long channelNumber, optional unsigned long bufferOffset = 0);
+ void copyFromChannel (Float32Array destination,
+ unsigned long channelNumber,
+ optional unsigned long bufferOffset = 0);
+ void copyToChannel (Float32Array source,
+
+ unsigned long channelNumber,
+
+ optional unsigned long bufferOffset = 0);
};
dictionary AudioBufferOptions {
@@ -136,7 +151,9 @@ interface AudioNode : EventTarget {
void disconnect (unsigned long output);
void disconnect (AudioNode destinationNode);
void disconnect (AudioNode destinationNode, unsigned long output);
- void disconnect (AudioNode destinationNode, unsigned long output, unsigned long input);
+ void disconnect (AudioNode destinationNode,
+ unsigned long output,
+ unsigned long input);
void disconnect (AudioParam destinationParam);
void disconnect (AudioParam destinationParam, unsigned long output);
readonly attribute BaseAudioContext context;
@@ -180,7 +197,11 @@ interface AudioParam {
AudioParam linearRampToValueAtTime (float value, double endTime);
AudioParam exponentialRampToValueAtTime (float value, double endTime);
AudioParam setTargetAtTime (float target, double startTime, float timeConstant);
- AudioParam setValueCurveAtTime (sequence<float> values, double startTime, double duration);
+ AudioParam setValueCurveAtTime (sequence<float> values,
+
+ double startTime,
+
+ double duration);
AudioParam cancelScheduledValues (double cancelTime);
AudioParam cancelAndHoldAtTime (double cancelTime);
};
@@ -215,7 +236,8 @@ dictionary AnalyserOptions : AudioNodeOptions {
[Exposed=Window]
interface AudioBufferSourceNode : AudioScheduledSourceNode {
- constructor (BaseAudioContext context, optional AudioBufferSourceOptions options = {});
+ constructor (BaseAudioContext context,
+ optional AudioBufferSourceOptions options = {});
attribute AudioBuffer? buffer;
readonly attribute AudioParam playbackRate;
readonly attribute AudioParam detune;
@@ -289,7 +311,9 @@ interface BiquadFilterNode : AudioNode {
readonly attribute AudioParam detune;
readonly attribute AudioParam Q;
readonly attribute AudioParam gain;
- void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
+ void getFrequencyResponse (Float32Array frequencyHz,
+ Float32Array magResponse,
+ Float32Array phaseResponse);
};
dictionary BiquadFilterOptions : AudioNodeOptions {
@@ -353,7 +377,8 @@ dictionary DelayOptions : AudioNodeOptions {
[Exposed=Window]
interface DynamicsCompressorNode : AudioNode {
- constructor (BaseAudioContext context, optional DynamicsCompressorOptions options = {});
+ constructor (BaseAudioContext context,
+ optional DynamicsCompressorOptions options = {});
readonly attribute AudioParam threshold;
readonly attribute AudioParam knee;
readonly attribute AudioParam ratio;
@@ -383,7 +408,9 @@ dictionary GainOptions : AudioNodeOptions {
[Exposed=Window]
interface IIRFilterNode : AudioNode {
constructor (BaseAudioContext context, IIRFilterOptions options);
- void getFrequencyResponse (Float32Array frequencyHz, Float32Array magResponse, Float32Array phaseResponse);
+ void getFrequencyResponse (Float32Array frequencyHz,
+ Float32Array magResponse,
+ Float32Array phaseResponse);
};
dictionary IIRFilterOptions : AudioNodeOptions {
@@ -555,7 +582,8 @@ callback AudioWorkletProcessorConstructor = AudioWorkletProcessor (object option
[Global=(Worklet, AudioWorklet), Exposed=AudioWorklet]
interface AudioWorkletGlobalScope : WorkletGlobalScope {
- void registerProcessor (DOMString name, AudioWorkletProcessorConstructor processorCtor);
+ void registerProcessor (DOMString name,
+ AudioWorkletProcessorConstructor processorCtor);
readonly attribute unsigned long long currentFrame;
readonly attribute double currentTime;
readonly attribute float sampleRate;
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc.idl b/tests/wpt/web-platform-tests/interfaces/webrtc.idl
index e30fc38fd00..49ed6bb0333 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc.idl
@@ -13,7 +13,7 @@ dictionary RTCConfiguration {
};
enum RTCIceCredentialType {
- "password",
+ "password"
};
dictionary RTCIceServer {
diff --git a/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html b/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html
index 0cfce2f7124..b6a33f579b4 100644
--- a/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html
+++ b/tests/wpt/web-platform-tests/layout-instability/buffer-layout-shift.html
@@ -8,38 +8,35 @@
<div id='myDiv'></div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<!-- Delay onload by inserting a slow image.-->
-<img src="resources/slow-image.py">
+<script src="resources/util.js"></script>
<script>
- async_test(function (t) {
- if (!window.LayoutShift)
- assert_unreached('LayoutShift entries are not supported');
- const startTime = performance.now();
- new PerformanceObserver(list => {
- const endTime = performance.now();
- assert_equals(list.getEntries().length, 1);
- const entry = list.getEntries()[0];
- assert_equals(entry.entryType, "layout-shift");
- assert_equals(entry.name, "");
- assert_greater_than_equal(entry.startTime, startTime)
- assert_less_than_equal(entry.startTime, endTime)
- assert_equals(entry.duration, 0.0);
- const maxDimension = Math.max(document.documentElement.clientWidth,
- document.documentElement.clientHeight);
- // The layout shift value should be:
- // 300 * (100 + 60) * (60 / maxDimension) / viewport size.
- assert_equals(entry.value, 300 * (100 + 60) * (60 / maxDimension) /
- (document.documentElement.clientWidth * document.documentElement.clientHeight));
+async_test(async function(t) {
+ assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported');
+ // Wait for the initial render to complete.
+ await waitForAnimationFrames(2);
- // The entry should not be available via getEntries* methods.
- assert_equals(performance.getEntriesByType('layout-shift').length, 0, 'getEntriesByType should have no layout-shift entries');
- assert_equals(performance.getEntriesByName('', 'layout-shift').length, 0, 'getEntriesByName should have no layout-shift entries');
- assert_equals(performance.getEntries().filter(e => e.entryType === 'layout-shift').length, 0, 'getEntries should have no layout-shift entries');
- t.done();
- }).observe({type: 'layout-shift'});
- // Modify the position of the div.
- document.getElementById('myDiv').style = "top: 60px";
- }, 'Layout shift before onload is not buffered into the performance timeline.');
+ const startTime = performance.now();
+ new PerformanceObserver(t.step_func_done(list => {
+ const endTime = performance.now();
+ assert_equals(list.getEntries().length, 1);
+ const entry = list.getEntries()[0];
+ assert_equals(entry.entryType, "layout-shift");
+ assert_equals(entry.name, "");
+ assert_greater_than_equal(entry.startTime, startTime);
+ assert_less_than_equal(entry.startTime, endTime);
+ assert_equals(entry.duration, 0.0);
+ // The layout shift value should be:
+ // 300 * (100 + 60) * (60 / maxDimension) / viewport size.
+ assert_equals(entry.value, computeExpectedScore(300 * (100 + 60), 60));
+
+ // The entry should not be available via getEntries* methods.
+ assert_equals(performance.getEntriesByType('layout-shift').length, 0, 'getEntriesByType should have no layout-shift entries');
+ assert_equals(performance.getEntriesByName('', 'layout-shift').length, 0, 'getEntriesByName should have no layout-shift entries');
+ assert_equals(performance.getEntries().filter(e => e.entryType === 'layout-shift').length, 0, 'getEntries should have no layout-shift entries');
+ })).observe({type: 'layout-shift'});
+ // Modify the position of the div.
+ document.getElementById('myDiv').style = "top: 60px";
+}, 'Layout shift before onload is not buffered into the performance timeline.');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html b/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html
index dabc8068931..cd1260e3613 100644
--- a/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html
+++ b/tests/wpt/web-platform-tests/layout-instability/buffered-flag.html
@@ -8,10 +8,13 @@
<div id='myDiv'></div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="resources/util.js"></script>
<script>
-async_test(t => {
- if (!window.LayoutShift)
- assert_unreached('LayoutShift entries are not supported');
+async_test(async function(t) {
+ assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported');
+ // Wait for the initial render to complete.
+ await waitForAnimationFrames(2);
+
const startTime = performance.now();
// First observer creates second in callback to ensure the entry has been dispatched by the time
// the second observer begins observing.
@@ -22,9 +25,10 @@ async_test(t => {
assert_equals(list.getEntries().length, 1);
const entry = list.getEntries()[0];
assert_equals(entry.entryType, "layout-shift");
- assert_greater_than_equal(entry.startTime, startTime)
- assert_less_than_equal(entry.startTime, endTime)
+ assert_greater_than_equal(entry.startTime, startTime);
+ assert_less_than_equal(entry.startTime, endTime);
assert_equals(entry.duration, 0.0);
+ assert_equals(entry.value, computeExpectedScore(300 * (100 + 60), 60));
})).observe({'type': 'layout-shift', buffered: true});
}).observe({type: 'layout-shift'});
// Modify the position of the div to cause a layout-shift entry.
diff --git a/tests/wpt/web-platform-tests/layout-instability/observe-layout-shift.html b/tests/wpt/web-platform-tests/layout-instability/observe-layout-shift.html
deleted file mode 100644
index 1c35fe2aa23..00000000000
--- a/tests/wpt/web-platform-tests/layout-instability/observe-layout-shift.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!DOCTYPE HTML>
-<meta charset=utf-8>
-<title>Layout Instability: observe layout shift value via PerformanceObserver</title>
-<body>
-<style>
-#myDiv { position: relative; width: 300px; height: 100px; }
-
-/* Disable the button's focus ring, which otherwise expands its visual rect by
- * 1px on all sides, triggering a layout shift event.
- */
-#button { outline: none; }
-</style>
-<div id='myDiv'></div>
-<button id='button'>Generate a 'click' event</button>
-<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>
- let timeAfterClick;
- function mainThreadBusy(duration) {
- const now = performance.now();
- while (performance.now() < now + duration);
- }
-
- function clickOnElement(id, callback) {
- const element = document.getElementById(id);
- const rect = element.getBoundingClientRect();
- const xCenter = rect.x + rect.width / 2;
- const yCenter = rect.y + rect.height / 2;
- const leftButton = 0;
- const clickHandler = () => {
- mainThreadBusy(120);
- if (callback)
- callback();
- element.removeEventListener("mousedown", clickHandler);
- };
- element.addEventListener("mousedown", clickHandler);
- test_driver.click(element);
- }
-
- function clickAndBlockMain(id) {
- return new Promise((resolve, reject) => {
- clickOnElement(id, resolve);
- });
- }
-
- async_test(function (t) {
- if (!window.LayoutShift)
- assert_unreached('LayoutShift entries are not supported');
- const startTime = performance.now();
- const observer = new PerformanceObserver(
- t.step_func_done(function(entryList) {
- const endTime = performance.now();
- assert_equals(entryList.getEntries().length, 1);
- const entry = entryList.getEntries()[0];
- assert_equals(entry.entryType, "layout-shift");
- assert_equals(entry.name, "");
- assert_greater_than_equal(entry.startTime, startTime)
- assert_less_than_equal(entry.startTime, endTime)
- assert_equals(entry.duration, 0.0);
- const maxDimension = Math.max(document.documentElement.clientWidth,
- document.documentElement.clientHeight);
- // The layout shift value should be:
- // 300 * (100 + 60) * (60 / maxDimension) / viewport size.
- assert_equals(entry.value, 300 * (100 + 60) * (60 / maxDimension) /
- (document.documentElement.clientWidth * document.documentElement.clientHeight));
- })
- );
- observer.observe({entryTypes: ['layout-shift']});
- window.onload = () => {
- // Modify the position of the div.
- document.getElementById('myDiv').style = "top: 60px";
- };
- }, 'Layout shift is observable via PerformanceObserver.');
-
- async_test(function (t) {
- const startTime = performance.now();
- const observer = new PerformanceObserver(
- t.step_func_done(function(entryList) {
- const endTime = performance.now();
- assert_equals(entryList.getEntries().length, 1);
- const entry = entryList.getEntries()[0];
- assert_equals(entry.entryType, "layout-shift");
- assert_equals(entry.name, "");
- assert_greater_than_equal(entry.startTime, startTime)
- assert_less_than_equal(entry.startTime, endTime)
- assert_equals(entry.duration, 0.0);
- const maxDimension = Math.max(document.documentElement.clientWidth,
- document.documentElement.clientHeight);
- // The layout shift value should be:
- // 300 * (100 + 60) * (60 / maxDimension) / viewport size.
- assert_equals(entry.value, 300 * (100 + 60) * (60 / maxDimension) /
- (document.documentElement.clientWidth * document.documentElement.clientHeight));
- // We should see that there was a click input entry
- assert_equals(entry.hadRecentInput, true);
- assert_greater_than_equal(timeAfterClick, entry.lastInputTime);
- })
- );
- observer.observe({entryTypes: ['layout-shift']});
- window.onload = () => {
- // User input event
- clickAndBlockMain('button').then( () => {
- timeAfterClick = performance.now();
- // Modify the position of the div.
- document.getElementById('myDiv').style = "top: 60px";
- });
- };
- }, 'Layout shift within user input is observable via PerformanceObserver.');
-</script>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/layout-instability/recent-input.html b/tests/wpt/web-platform-tests/layout-instability/recent-input.html
new file mode 100644
index 00000000000..a4fa0d8b0d9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/layout-instability/recent-input.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Layout Instability: observe after user input</title>
+<body>
+<style>
+#myDiv { position: relative; width: 300px; height: 100px; }
+
+/* Disable the button's focus ring, which otherwise expands its visual rect by
+ * 1px on all sides, triggering a layout shift event.
+ */
+#button { outline: none; }
+</style>
+<div id='myDiv'></div>
+<button id='button'>Generate a 'click' event</button>
+<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/util.js></script>
+<script src=/event-timing/resources/event-timing-test-utils.js></script>
+<script>
+let timeAfterClick;
+
+async_test(async function(t) {
+ assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported');
+ // Wait for the initial render to complete.
+ await waitForAnimationFrames(2);
+
+ const startTime = performance.now();
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ const endTime = performance.now();
+ assert_equals(entryList.getEntries().length, 1);
+ const entry = entryList.getEntries()[0];
+ assert_equals(entry.entryType, "layout-shift");
+ assert_equals(entry.name, "");
+ assert_greater_than_equal(entry.startTime, startTime);
+ assert_less_than_equal(entry.startTime, endTime);
+ assert_equals(entry.duration, 0.0);
+ // The layout shift value should be:
+ // 300 * (100 + 60) * (60 / maxDimension) / viewport size.
+ assert_equals(entry.value, computeExpectedScore(300 * (100 + 60), 60));
+ // We should see that there was a click input entry.
+ assert_equals(entry.hadRecentInput, true);
+ assert_greater_than_equal(timeAfterClick, entry.lastInputTime);
+ })
+ );
+ observer.observe({entryTypes: ['layout-shift']});
+ // User input event
+ clickAndBlockMain('button').then(() => {
+ timeAfterClick = performance.now();
+ // Modify the position of the div.
+ document.getElementById('myDiv').style = "top: 60px";
+ });
+}, 'Layout shift right after user input is observable via PerformanceObserver.');
+</script>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html b/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html
index 6ace93ad54c..61267a32648 100644
--- a/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html
+++ b/tests/wpt/web-platform-tests/layout-instability/shift-into-viewport.html
@@ -4,7 +4,7 @@
<style>
body { margin: 0; }
-#j { position: relative; width: 600px; height: 200px; top: 600px; }
+#j { position: absolute; width: 600px; height: 200px; top: 100%; }
</style>
<div id='j'></div>
@@ -19,7 +19,9 @@ promise_test(async () => {
// Wait for the initial render to complete.
await waitForAnimationFrames(2);
- document.querySelector("#j").style.top = "400px";
+ // Move div partially into viewport.
+ document.querySelector("#j").style.top =
+ document.documentElement.clientHeight - 200 + "px";
// The element moves from outside the viewport to within the viewport, which
// should generate a shift.
diff --git a/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html b/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html
index 49242913760..2d92835b889 100644
--- a/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html
+++ b/tests/wpt/web-platform-tests/layout-instability/shift-outside-viewport.html
@@ -4,7 +4,7 @@
<style>
body { margin: 0; }
-#j { position: relative; width: 600px; height: 200px; top: 600px; }
+#j { position: absolute; width: 600px; height: 200px; top: 100%; }
</style>
<div id='j'></div>
@@ -19,7 +19,9 @@ promise_test(async () => {
// Wait for the initial render to complete.
await waitForAnimationFrames(2);
- document.querySelector("#j").style.top = "800px";
+ // Move div even further out of viewport.
+ document.querySelector("#j").style.top =
+ document.documentElement.clientHeight + 200 + "px";
// Since the element moves entirely outside of the viewport, it shouldn't
// generate a score.
diff --git a/tests/wpt/web-platform-tests/layout-instability/toJSON.html b/tests/wpt/web-platform-tests/layout-instability/toJSON.html
index 3d39d623e13..374a7de0cd1 100644
--- a/tests/wpt/web-platform-tests/layout-instability/toJSON.html
+++ b/tests/wpt/web-platform-tests/layout-instability/toJSON.html
@@ -8,35 +8,38 @@
<div id='myDiv'></div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="resources/util.js"></script>
<script>
- async_test(function (t) {
- if (!window.LayoutShift)
- assert_unreached('LayoutShift entries are not supported');
- const observer = new PerformanceObserver(
- t.step_func_done(function(entryList) {
- const entry = entryList.getEntries()[0];
- assert_equals(typeof(entry.toJSON), 'function');
- const json = entry.toJSON();
- assert_equals(typeof(json), 'object');
- const keys = [
- // PerformanceEntry
- 'name',
- 'entryType',
- 'startTime',
- 'duration',
- // LayoutShift
- 'value',
- 'hadRecentInput',
- 'lastInputTime',
- ];
- for (const key of keys) {
- assert_equals(json[key], entry[key],
- 'LayoutShift ${key} entry does not match its toJSON value');
- }
- })
- );
- observer.observe({type: 'layout-shift'});
- document.getElementById('myDiv').style = "top: 60px";
- }, 'Test toJSON() in LayoutShift.');
+async_test(async function(t) {
+ assert_precondition(window.LayoutShift, 'LayoutShift entries are not supported');
+ // Wait for the initial render to complete.
+ await waitForAnimationFrames(2);
+
+ const observer = new PerformanceObserver(
+ t.step_func_done(function(entryList) {
+ const entry = entryList.getEntries()[0];
+ assert_equals(typeof(entry.toJSON), 'function');
+ const json = entry.toJSON();
+ assert_equals(typeof(json), 'object');
+ const keys = [
+ // PerformanceEntry
+ 'name',
+ 'entryType',
+ 'startTime',
+ 'duration',
+ // LayoutShift
+ 'value',
+ 'hadRecentInput',
+ 'lastInputTime',
+ ];
+ for (const key of keys) {
+ assert_equals(json[key], entry[key],
+ 'LayoutShift ${key} entry does not match its toJSON value');
+ }
+ })
+ );
+ observer.observe({type: 'layout-shift'});
+ document.getElementById('myDiv').style = "top: 60px";
+}, 'Test toJSON() in LayoutShift.');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index d06f4c59bca..b5a8f806870 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -77,6 +77,7 @@ AHEM COPY: css/vendor-imports/mozilla/mozilla-central-reftests/*/Ahem.ttf
# Intentional use of CRLF
CR AT EOL: WebIDL/valid/idl/documentation-dos.widl
CR AT EOL: cors/resources/cors-headers.asis
+CR AT EOL: fetch/h1-parsing/resources/blue-with-0x00-in-a-header.asis
CR AT EOL: html/semantics/forms/the-textarea-element/multiline-placeholder-cr.html
CR AT EOL: html/semantics/forms/the-textarea-element/multiline-placeholder-crlf.html
CR AT EOL: html/semantics/forms/the-input-element/multiline-placeholder-cr.html
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html
new file mode 100644
index 00000000000..a545410f978
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-below-viewport-dynamic.tentative.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<head>
+ <title>Below viewport images with loading='lazy' and changed to
+ loading='eager' load and do not block the window load event</title>
+ <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com">
+ <link rel="help" href="https://github.com/scott-little/lazyload">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+
+<!--
+Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
+-->
+
+<script>
+ const t = async_test("Test that below viewport images with loading='lazy' " +
+ "and changed to loading='eager' load and do not block " +
+ "the window load event.");
+
+ let has_below_viewport_loaded = false;
+ let has_window_loaded = false;
+
+ window.addEventListener("load", t.step_func(function() {
+ assert_false(has_window_loaded,
+ "The window.load() event should only fire once.");
+ has_window_loaded = true;
+ }));
+
+ const below_viewport_img_onload = t.step_func_done(function() {
+ assert_false(has_below_viewport_loaded,
+ "The in_viewport element should load only once.");
+ assert_true(has_window_loaded,
+ "The window.load() event should have fired before " +
+ "below_viewport loaded.");
+ has_below_viewport_loaded = true;
+ });
+</script>
+
+<body>
+ <div style="height:10000px;"></div>
+ <img id="below_viewport" src="resources/image.png?pipe=trickle(d2)"
+ loading="lazy" onload="below_viewport_img_onload();">
+ <script>
+ assert_false(has_window_loaded,
+ "The window.load() event should not fire before " +
+ "changing below_viewport to loading='eager'.");
+ document.getElementById("below_viewport").loading = 'eager';
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html
new file mode 100644
index 00000000000..d316a6ae22b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/image-loading-lazy-in-viewport-dynamic.tentative.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<head>
+ <title>In viewport images with loading='lazy' and changed to loading='eager'
+ do not block the window load event</title>
+ <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com">
+ <link rel="help" href="https://github.com/scott-little/lazyload">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+
+<!--
+Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
+-->
+
+<script>
+ const t = async_test("Test that in viewport images with loading='lazy' and " +
+ "changed to loading='eager' do not block the window " +
+ "load event.");
+
+ let has_in_viewport_loaded = false;
+ let has_window_loaded = false;
+
+ const in_viewport_img_onload = t.step_func_done(function() {
+ assert_false(has_in_viewport_loaded,
+ "The in_viewport element should load only once.");
+ assert_true(has_window_loaded,
+ "The window.load() event should fire before in_viewport image loads.");
+ has_in_viewport_loaded = true;
+ });
+
+ window.addEventListener("load", t.step_func(function() {
+ assert_false(has_window_loaded,
+ "The window.load() event should only fire once.");
+ has_window_loaded = true;
+ }));
+</script>
+
+<body>
+ <img id="in_viewport" src="resources/image.png?pipe=trickle(d2)"
+ loading="lazy" onload="in_viewport_img_onload();">
+ <script>
+ document.getElementById("in_viewport").loading = 'eager';
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/move-element-and-scroll.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/move-element-and-scroll.tentative.html
new file mode 100644
index 00000000000..f9d89807b8c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/move-element-and-scroll.tentative.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<head>
+ <title>Images with loading='lazy' load being moved to another document
+ and then scrolled to</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="common.js"></script>
+</head>
+
+<!--
+Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
+-->
+
+<body>
+ <div id="tall_div" style="height:1000vh"></div>
+ <div id="below_viewport_div"></div>
+ <img id="below_viewport" src='resources/image.png?below_viewport' loading="lazy">
+
+ <script>
+ const tall_div = document.getElementById("tall_div");
+ const below_viewport_element = document.getElementById("below_viewport");
+ const below_viewport_div = document.getElementById("below_viewport_div");
+
+ async_test(function(t) {
+ below_viewport_element.onload =
+ t.unreached_func("The below viewport image should not load");
+ t.step_timeout(t.step_func_done(), 1000);
+ const iframe = document.createElement('iframe');
+ iframe.setAttribute("style", "display:none");
+ iframe.srcdoc = "<body></body>";
+ iframe.onload = () => {
+ const adopted_img = iframe.contentDocument.adoptNode(below_viewport_element);
+ iframe.contentDocument.body.appendChild(adopted_img);
+ below_viewport_div.scrollIntoView();
+ };
+ document.body.insertBefore(iframe, tall_div);
+ }, "Test that <img> below viewport is not loaded when moved to another " +
+ "document and then scrolled to");
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/loading/lazyload/remove-element-and-scroll.tentative.html b/tests/wpt/web-platform-tests/loading/lazyload/remove-element-and-scroll.tentative.html
new file mode 100644
index 00000000000..53708ceac75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/loading/lazyload/remove-element-and-scroll.tentative.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<head>
+ <title>Images with loading='lazy' load being removed and then scrolled to</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="common.js"></script>
+</head>
+
+<!--
+Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
+-->
+
+<body>
+ <img id="in_viewport" src='resources/image.png?in_viewport&pipe=trickle(d1)'>
+ <div style="height:1000vh"></div>
+ <div id="below_viewport_div"></div>
+ <img id="below_viewport" src='resources/image.png?below_viewport' loading="lazy">
+
+ <script>
+ const in_viewport_element = document.getElementById("in_viewport");
+ const below_viewport_element = document.getElementById("below_viewport");
+ const below_viewport_div = document.getElementById("below_viewport_div");
+
+ async_test(t => {
+ below_viewport_element.onload = t.unreached_func("Removed loading=lazy image " +
+ "should not load when its old position is scrolled to.");
+ below_viewport_element.remove();
+
+ in_viewport_element.onload = () => {
+ below_viewport_div.scrollIntoView();
+ t.step_timeout(t.step_func_done(), 2000);
+ };
+ }, "Test that <img> below viewport is not loaded when removed from the " +
+ "document and then scrolled to");
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js
new file mode 100644
index 00000000000..2c0299df12e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped.tentative.https.manual.window.js
@@ -0,0 +1,4 @@
+// META: script=/resources/testdriver.js
+// META: script=resources/test-helpers.js
+// META: script=resources/native-fs-test-helpers.js
+// META: script=script-tests/FileSystemWritableFileStream-piped.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js
new file mode 100644
index 00000000000..0efacf9e607
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write.tentative.https.manual.window.js
@@ -0,0 +1,4 @@
+// META: script=/resources/testdriver.js
+// META: script=resources/test-helpers.js
+// META: script=resources/native-fs-test-helpers.js
+// META: script=script-tests/FileSystemWritableFileStream-write.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js
new file mode 100644
index 00000000000..caf6fbd1c52
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream.tentative.https.manual.window.js
@@ -0,0 +1,4 @@
+// META: script=/resources/testdriver.js
+// META: script=resources/test-helpers.js
+// META: script=resources/native-fs-test-helpers.js
+// META: script=script-tests/FileSystemWritableFileStream.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js b/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js
index 5ad8c04724b..bcdfd484cf2 100644
--- a/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js
+++ b/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js
@@ -14,7 +14,7 @@ const directory_promise = (async () => {
await window.test_driver.bless(
'show a file picker.<br />Please select an empty directory');
- const entries = await self.chooseFileSystemEntries({type: 'openDirectory'});
+ const entries = await self.chooseFileSystemEntries({type: 'open-directory'});
assert_true(entries instanceof FileSystemHandle);
assert_true(entries instanceof FileSystemDirectoryHandle);
for await (const entry of entries.getEntries()) {
diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html b/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html
index 937a6c385de..07301af1cfa 100644
--- a/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html
+++ b/tests/wpt/web-platform-tests/native-file-system/resources/opaque-origin-sandbox.html
@@ -16,7 +16,7 @@
}
try {
- window.chooseFileSystemEntries({ type: 'openDirectory' })
+ window.chooseFileSystemEntries({ type: 'open-directory' })
.then(() => {
post_message('chooseFileSystemEntries(): FULFILLED');
}).catch(error => {
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js
new file mode 100644
index 00000000000..eed6a561dc4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js
@@ -0,0 +1,4 @@
+// META: script=resources/test-helpers.js
+// META: script=resources/sandboxed-fs-test-helpers.js
+// META: script=../streams/resources/recording-streams.js
+// META: script=script-tests/FileSystemWritableFileStream-piped.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js
new file mode 100644
index 00000000000..7ef0ea0ef82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js
@@ -0,0 +1,3 @@
+// META: script=resources/test-helpers.js
+// META: script=resources/sandboxed-fs-test-helpers.js
+// META: script=script-tests/FileSystemWritableFileStream-write.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js
new file mode 100644
index 00000000000..16dbbe6a808
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js
@@ -0,0 +1,3 @@
+// META: script=resources/test-helpers.js
+// META: script=resources/sandboxed-fs-test-helpers.js
+// META: script=script-tests/FileSystemWritableFileStream.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-piped.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-piped.js
new file mode 100644
index 00000000000..59fc1e3d136
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-piped.js
@@ -0,0 +1,135 @@
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'foo_string.txt', root);
+ const wfs = await handle.createWritable();
+
+ const rs = recordingReadableStream({
+ start(controller) {
+ controller.enqueue('foo_string');
+ controller.close();
+ }
+ });
+
+ await rs.pipeTo(wfs, { preventCancel: true });
+ assert_equals(await getFileContents(handle), 'foo_string');
+ assert_equals(await getFileSize(handle), 10);
+}, 'can be piped to with a string');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'foo_arraybuf.txt', root);
+ const wfs = await handle.createWritable();
+ const buf = new ArrayBuffer(3);
+ const intView = new Uint8Array(buf);
+ intView[0] = 0x66;
+ intView[1] = 0x6f;
+ intView[2] = 0x6f;
+
+ const rs = recordingReadableStream({
+ start(controller) {
+ controller.enqueue(buf);
+ controller.close();
+ }
+ });
+
+ await rs.pipeTo(wfs, { preventCancel: true });
+ assert_equals(await getFileContents(handle), 'foo');
+ assert_equals(await getFileSize(handle), 3);
+}, 'can be piped to with an ArrayBuffer');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'foo_blob.txt', root);
+ const wfs = await handle.createWritable();
+
+ const rs = recordingReadableStream({
+ start(controller) {
+ controller.enqueue(new Blob(['foo']));
+ controller.close();
+ }
+ });
+
+ await rs.pipeTo(wfs, { preventCancel: true });
+ assert_equals(await getFileContents(handle), 'foo');
+ assert_equals(await getFileSize(handle), 3);
+}, 'can be piped to with a Blob');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'foo_write_param.txt', root);
+ const wfs = await handle.createWritable();
+
+ const rs = recordingReadableStream({
+ start(controller) {
+ controller.enqueue({type: 'write', data: 'foobar'});
+ controller.close();
+ }
+ });
+
+ await rs.pipeTo(wfs, { preventCancel: true });
+ assert_equals(await getFileContents(handle), 'foobar');
+ assert_equals(await getFileSize(handle), 6);
+}, 'can be piped to with a param object with write command');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'foo_write_param.txt', root);
+ const wfs = await handle.createWritable();
+
+ const rs = recordingReadableStream({
+ start(controller) {
+ controller.enqueue({type: 'write', data: 'foobar'});
+ controller.enqueue({type: 'truncate', size: 10});
+ controller.enqueue({type: 'write', position: 0, data: 'baz'});
+ controller.close();
+ }
+ });
+
+ await rs.pipeTo(wfs, { preventCancel: true });
+ assert_equals(await getFileContents(handle), 'bazbar\0\0\0\0');
+ assert_equals(await getFileSize(handle), 10);
+}, 'can be piped to with a param object with multiple commands');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'foo_write_queued.txt', root);
+ const wfs = await handle.createWritable();
+
+ const rs = recordingReadableStream({
+ start(controller) {
+ controller.enqueue('foo');
+ controller.enqueue('bar');
+ controller.enqueue('baz');
+ controller.close();
+ }
+ });
+
+ await rs.pipeTo(wfs, { preventCancel: true });
+ assert_equals(await getFileContents(handle), 'foobarbaz');
+ assert_equals(await getFileSize(handle), 9);
+}, 'multiple operations can be queued');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'fetched.txt', root);
+ const wfs = await handle.createWritable();
+
+ const response = await fetch('data:text/plain,fetched from far');
+ const body = await response.body;
+ await body.pipeTo(wfs, { preventCancel: true });
+ assert_equals(await getFileContents(handle), 'fetched from far');
+ assert_equals(await getFileSize(handle), 16);
+}, 'plays well with fetch');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'aborted should_be_empty.txt', root);
+ const wfs = await handle.createWritable();
+
+ const response = await fetch('data:text/plain,fetched from far');
+ const body = await response.body;
+
+ const abortController = new AbortController();
+ const signal = abortController.signal;
+
+ const promise = body.pipeTo(wfs, { signal });
+ await abortController.abort();
+
+ await promise_rejects(t, 'AbortError', promise, 'stream is aborted');
+ await promise_rejects(t, TypeError(), wfs.close(), 'stream cannot be closed to flush writes');
+
+ assert_equals(await getFileContents(handle), '');
+ assert_equals(await getFileSize(handle), 0);
+}, 'abort() aborts write');
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js
new file mode 100644
index 00000000000..f14d79fd040
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js
@@ -0,0 +1,337 @@
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'empty_blob', root);
+ const stream = await handle.createWritable();
+
+ await stream.write(new Blob([]));
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '');
+ assert_equals(await getFileSize(handle), 0);
+}, 'write() with an empty blob to an empty file');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'valid_blob', root);
+ const stream = await handle.createWritable();
+
+ await stream.write(new Blob(['1234567890']));
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234567890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() a blob to an empty file');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'write_param_empty', root);
+ const stream = await handle.createWritable();
+
+ await stream.write({type: 'write', data: '1234567890'});
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234567890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() with WriteParams without position to an empty file');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'string_zero_offset', root);
+ const stream = await handle.createWritable();
+
+ await stream.write({type: 'write', position: 0, data: '1234567890'});
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234567890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() a string to an empty file with zero offset');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'blob_zero_offset', root);
+ const stream = await handle.createWritable();
+
+ await stream.write({type: 'write', position: 0, data: new Blob(['1234567890'])});
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234567890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() a blob to an empty file with zero offset');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'write_appends', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('12345');
+ await stream.write('67890');
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234567890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() called consecutively appends');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'write_appends_object_string', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('12345');
+ await stream.write({type: 'write', data: '67890'});
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234567890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() WriteParams without position and string appends');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'write_appends_object_blob', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('12345');
+ await stream.write({type: 'write', data: new Blob(['67890'])});
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234567890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() WriteParams without position and blob appends');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'string_with_offset', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('1234567890');
+ await stream.write({type: 'write', position: 4, data: 'abc'});
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '1234abc890');
+ assert_equals(await getFileSize(handle), 10);
+}, 'write() called with a string and a valid offset');
+
+directory_test(async (t, root) => {
+const handle = await createEmptyFile(t, 'blob_with_offset', root);
+const stream = await handle.createWritable();
+
+await stream.write('1234567890');
+await stream.write({type: 'write', position: 4, data: new Blob(['abc'])});
+await stream.close();
+
+assert_equals(await getFileContents(handle), '1234abc890');
+assert_equals(await getFileSize(handle), 10);
+}, 'write() called with a blob and a valid offset');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'bad_offset', root);
+ const stream = await handle.createWritable();
+
+ await promise_rejects(
+ t, 'InvalidStateError', stream.write({type: 'write', position: 4, data: new Blob(['abc'])}));
+ await promise_rejects(
+ t, TypeError(), stream.close(), 'stream is already closed');
+
+ assert_equals(await getFileContents(handle), '');
+ assert_equals(await getFileSize(handle), 0);
+}, 'write() called with an invalid offset');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'empty_string', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('');
+ await stream.close();
+ assert_equals(await getFileContents(handle), '');
+ assert_equals(await getFileSize(handle), 0);
+}, 'write() with an empty string to an empty file');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'valid_utf8_string', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('foo🤘');
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foo🤘');
+ assert_equals(await getFileSize(handle), 7);
+}, 'write() with a valid utf-8 string');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'string_with_unix_line_ending', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('foo\n');
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foo\n');
+ assert_equals(await getFileSize(handle), 4);
+}, 'write() with a string with unix line ending preserved');
+
+directory_test(async (t, root) => {
+ const handle =
+ await createEmptyFile(t, 'string_with_windows_line_ending', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('foo\r\n');
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foo\r\n');
+ assert_equals(await getFileSize(handle), 5);
+}, 'write() with a string with windows line ending preserved');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'empty_array_buffer', root);
+ const stream = await handle.createWritable();
+
+ const buf = new ArrayBuffer(0);
+ await stream.write(buf);
+ await stream.close();
+ assert_equals(await getFileContents(handle), '');
+ assert_equals(await getFileSize(handle), 0);
+}, 'write() with an empty array buffer to an empty file');
+
+directory_test(async (t, root) => {
+ const handle =
+ await createEmptyFile(t, 'valid_string_typed_byte_array', root);
+ const stream = await handle.createWritable();
+
+ const buf = new ArrayBuffer(3);
+ const intView = new Uint8Array(buf);
+ intView[0] = 0x66;
+ intView[1] = 0x6f;
+ intView[2] = 0x6f;
+ await stream.write(buf);
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foo');
+ assert_equals(await getFileSize(handle), 3);
+}, 'write() with a valid typed array buffer');
+
+directory_test(async (t, root) => {
+ const dir = await createDirectory(t, 'parent_dir', root);
+ const file_name = 'close_fails_when_dir_removed.txt';
+ const handle = await createEmptyFile(t, file_name, dir);
+ const stream = await handle.createWritable();
+ await stream.write('foo');
+
+ await root.removeEntry('parent_dir', {recursive: true});
+ await promise_rejects(t, 'NotFoundError', stream.close());
+}, 'atomic writes: close() fails when parent directory is removed');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'atomic_writes.txt', root);
+ const stream = await handle.createWritable();
+ await stream.write('foox');
+
+ const stream2 = await handle.createWritable();
+ await stream2.write('bar');
+
+ assert_equals(await getFileSize(handle), 0);
+
+ await stream2.close();
+ assert_equals(await getFileContents(handle), 'bar');
+ assert_equals(await getFileSize(handle), 3);
+
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foox');
+ assert_equals(await getFileSize(handle), 4);
+}, 'atomic writes: writable file streams make atomic changes on close');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'atomic_write_after_close.txt', root);
+ const stream = await handle.createWritable();
+ await stream.write('foo');
+
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foo');
+ assert_equals(await getFileSize(handle), 3);
+
+ await promise_rejects(
+ t, TypeError(), stream.write('abc'));
+}, 'atomic writes: write() after close() fails');
+
+directory_test(async (t, root) => {
+ const handle =
+ await createEmptyFile(t, 'atomic_truncate_after_close.txt', root);
+ const stream = await handle.createWritable();
+ await stream.write('foo');
+
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foo');
+ assert_equals(await getFileSize(handle), 3);
+
+ await promise_rejects(t, TypeError(), stream.truncate(0));
+}, 'atomic writes: truncate() after close() fails');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'atomic_close_after_close.txt', root);
+ const stream = await handle.createWritable();
+ await stream.write('foo');
+
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'foo');
+ assert_equals(await getFileSize(handle), 3);
+
+ await promise_rejects(t, TypeError(), stream.close());
+}, 'atomic writes: close() after close() fails');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'there_can_be_only_one.txt', root);
+ const stream = await handle.createWritable();
+ await stream.write('foo');
+
+ // This test might be flaky if there is a race condition allowing
+ // close() to be called multiple times.
+ const success_promises =
+ [...Array(100)].map(() => stream.close().then(() => 1).catch(() => 0));
+ const close_attempts = await Promise.all(success_promises);
+ const success_count = close_attempts.reduce((x, y) => x + y);
+ assert_equals(success_count, 1);
+}, 'atomic writes: only one close() operation may succeed');
+
+directory_test(async (t, root) => {
+ const dir = await createDirectory(t, 'parent_dir', root);
+ const file_name = 'atomic_writable_file_stream_persists_removed.txt';
+ const handle = await createFileWithContents(t, file_name, 'foo', dir);
+
+ const stream = await handle.createWritable();
+ await stream.write('bar');
+
+ await dir.removeEntry(file_name);
+ await promise_rejects(t, 'NotFoundError', getFileContents(handle));
+
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'bar');
+ assert_equals(await getFileSize(handle), 3);
+}, 'atomic writes: writable file stream persists file on close, even if file is removed');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'writer_written', root);
+ const stream = await handle.createWritable();
+ const writer = stream.getWriter();
+
+ await writer.write('foo');
+ await writer.write(new Blob(['bar']));
+ await writer.write({type: 'seek', position: 0});
+ await writer.write({type: 'write', data: 'baz'});
+ await writer.close();
+
+ assert_equals(await getFileContents(handle), 'bazbar');
+ assert_equals(await getFileSize(handle), 6);
+}, 'getWriter() can be used');
+
+directory_test(async (t, root) => {
+ const handle = await createFileWithContents(
+ t, 'content.txt', 'very long string', root);
+ const stream = await handle.createWritable();
+
+ await promise_rejects(
+ t, SyntaxError(), stream.write({type: 'truncate'}), 'truncate without size');
+
+}, 'WriteParams: truncate missing size param');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'content.txt', root);
+ const stream = await handle.createWritable();
+
+ await promise_rejects(
+ t, SyntaxError(), stream.write({type: 'write'}), 'write without data');
+
+}, 'WriteParams: write missing data param');
+
+directory_test(async (t, root) => {
+ const handle = await createFileWithContents(
+ t, 'content.txt', 'seekable', root);
+ const stream = await handle.createWritable();
+
+ await promise_rejects(
+ t, SyntaxError(), stream.write({type: 'seek'}), 'seek without position');
+
+}, 'WriteParams: seek missing position param');
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js
new file mode 100644
index 00000000000..5acf93aec8c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js
@@ -0,0 +1,117 @@
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'trunc_shrink', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('1234567890');
+ await stream.truncate(5);
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '12345');
+ assert_equals(await getFileSize(handle), 5);
+}, 'truncate() to shrink a file');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'trunc_grow', root);
+ const stream = await handle.createWritable();
+
+ await stream.write('abc');
+ await stream.truncate(5);
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), 'abc\0\0');
+ assert_equals(await getFileSize(handle), 5);
+}, 'truncate() to grow a file');
+
+directory_test(async (t, root) => {
+ const dir = await createDirectory(t, 'parent_dir', root);
+ const file_name = 'create_writable_fails_when_dir_removed.txt';
+ const handle = await createEmptyFile(t, file_name, dir);
+
+ await root.removeEntry('parent_dir', {recursive: true});
+ await promise_rejects(t, 'NotFoundError', handle.createWritable());
+}, 'createWritable() fails when parent directory is removed');
+
+directory_test(async (t, root) => {
+ const dir = await createDirectory(t, 'parent_dir', root);
+ const file_name = 'write_fails_when_dir_removed.txt';
+ const handle = await createEmptyFile(t, file_name, dir);
+ const stream = await handle.createWritable();
+
+ await root.removeEntry('parent_dir', {recursive: true});
+ await promise_rejects(t, 'NotFoundError', stream.write('foo'));
+}, 'write() fails when parent directory is removed');
+
+directory_test(async (t, root) => {
+ const dir = await createDirectory(t, 'parent_dir', root);
+ const file_name = 'truncate_fails_when_dir_removed.txt';
+ const handle = await createEmptyFile(t, file_name, dir);
+ const stream = await handle.createWritable();
+
+ await root.removeEntry('parent_dir', {recursive: true});
+ await promise_rejects(t, 'NotFoundError', stream.truncate(0));
+}, 'truncate() fails when parent directory is removed');
+
+directory_test(async (t, root) => {
+ const handle = await createFileWithContents(
+ t, 'atomic_file_is_copied.txt', 'fooks', root);
+ const stream = await handle.createWritable({keepExistingData: true});
+
+ await stream.write('bar');
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'barks');
+ assert_equals(await getFileSize(handle), 5);
+}, 'createWritable({keepExistingData: true}): atomic writable file stream initialized with source contents');
+
+directory_test(async (t, root) => {
+ const handle = await createFileWithContents(
+ t, 'atomic_file_is_not_copied.txt', 'very long string', root);
+ const stream = await handle.createWritable({keepExistingData: false});
+
+ await stream.write('bar');
+ assert_equals(await getFileContents(handle), 'very long string');
+ await stream.close();
+ assert_equals(await getFileContents(handle), 'bar');
+ assert_equals(await getFileSize(handle), 3);
+}, 'createWritable({keepExistingData: false}): atomic writable file stream initialized with empty file');
+
+directory_test(async (t, root) => {
+ const handle = await createFileWithContents(
+ t, 'trunc_smaller_offset.txt', '1234567890', root);
+ const stream = await handle.createWritable({keepExistingData: true});
+
+ await stream.truncate(5);
+ await stream.write('abc');
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), 'abc45');
+ assert_equals(await getFileSize(handle), 5);
+}, 'cursor position: truncate size > offset');
+
+directory_test(async (t, root) => {
+ const handle = await createFileWithContents(
+ t, 'trunc_bigger_offset.txt', '1234567890', root);
+ const stream = await handle.createWritable({keepExistingData: true});
+
+ await stream.seek(6);
+ await stream.truncate(5);
+ await stream.write('abc');
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), '12345abc');
+ assert_equals(await getFileSize(handle), 8);
+}, 'cursor position: truncate size < offset');
+
+directory_test(async (t, root) => {
+ const handle = await createEmptyFile(t, 'contents', root);
+ const stream = await handle.createWritable();
+
+ stream.write('abc');
+ stream.write('def');
+ stream.truncate(9);
+ stream.seek(0);
+ stream.write('xyz');
+ await stream.close();
+
+ assert_equals(await getFileContents(handle), 'xyzdef\0\0\0');
+ assert_equals(await getFileSize(handle), 9);
+}, 'commands are queued');
diff --git a/tests/wpt/web-platform-tests/portals/predecessor-fires-unload.html b/tests/wpt/web-platform-tests/portals/predecessor-fires-unload.html
new file mode 100644
index 00000000000..6512195eaf6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/portals/predecessor-fires-unload.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/open-blank-host.js"></script>
+<script>
+function nextEvent(target, type) {
+ return new Promise((resolve, reject) => target.addEventListener(type, e => resolve(e), {once: true}));
+}
+
+function timePasses(delay) {
+ return new Promise((resolve, reject) => step_timeout(() => resolve(), delay));
+}
+
+promise_test(async () => {
+ const w = await openBlankPortalHost();
+ try {
+ const portal = w.document.createElement('portal');
+ portal.src = new URL('resources/simple-portal.html', location.href);
+ w.document.body.appendChild(portal);
+ const pagehideFired = nextEvent(w, 'pagehide');
+ const unloadFired = nextEvent(w, 'unload');
+ await portal.activate();
+ assert_true((await pagehideFired) instanceof w.PageTransitionEvent);
+ assert_true((await unloadFired) instanceof w.Event);
+ } finally {
+ w.close();
+ }
+}, "pagehide and unload should fire if the predecessor is not adopted");
+
+promise_test(async () => {
+ localStorage.setItem('predecessor-fires-unload-events', '');
+ window.open('resources/predecessor-fires-unload-watch-unload.html', '_blank', 'noopener');
+ while (localStorage.getItem('predecessor-fires-unload-events') != 'pagehide unload') {
+ await timePasses(50);
+ }
+}, "pagehide and unload should fire if the predecessor is not adopted, even without a window/opener association");
+</script>
diff --git a/tests/wpt/web-platform-tests/portals/resources/predecessor-fires-unload-watch-unload.html b/tests/wpt/web-platform-tests/portals/resources/predecessor-fires-unload-watch-unload.html
new file mode 100644
index 00000000000..ada5a64967e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/portals/resources/predecessor-fires-unload-watch-unload.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<body>
+<script>
+function nextEvent(target, type) {
+ return new Promise((resolve, reject) => target.addEventListener(type, e => resolve(e), {once: true}));
+}
+
+onload = function() {
+ const portal = document.createElement('portal');
+ portal.src = new URL('simple-portal.html', location.href);
+ document.body.appendChild(portal);
+
+ let firedEvents = [];
+ for (let type of ['pagehide', 'unload']) {
+ nextEvent(window, type).then(() => {
+ firedEvents.push(type);
+ localStorage.setItem('predecessor-fires-unload-events', firedEvents.join(' '));
+ });
+ }
+
+ portal.activate();
+}
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
index 7eee8ce04c4..2c1724b7592 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js
@@ -24,6 +24,14 @@ function toMojoNDEFMessage(message) {
function toMojoNDEFRecord(record) {
let nfcRecord = new device.mojom.NDEFRecord();
+ if (record.recordType.search(':') != -1) {
+ // Simply checks the existence of ':' to decide whether it's an external
+ // type. As a mock, no need to really implement the validation algo at
+ // https://w3c.github.io/web-nfc/#dfn-validate-external-type.
+ nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kExternal;
+ } else {
+ nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kStandardized;
+ }
nfcRecord.recordType = record.recordType;
nfcRecord.mediaType = record.mediaType;
nfcRecord.id = record.id;
@@ -162,6 +170,7 @@ var WebNFCTest = (() => {
this.reading_messages_ = [];
this.operations_suspended_ = false;
this.is_formatted_tag_ = false;
+ this.data_transfer_failed_ = false;
}
// NFC delegate functions.
@@ -184,6 +193,9 @@ var WebNFCTest = (() => {
// Resolves with NotAllowedError if there are NDEF records on the device
// and overwrite is false.
resolve(createNDEFError(device.mojom.NDEFErrorType.NOT_ALLOWED));
+ } else if (this.data_transfer_failed_) {
+ // Resolves with NetworkError if data transfer fails.
+ resolve(createNDEFError(device.mojom.NDEFErrorType.IO_ERROR));
} else {
resolve(createNDEFError(null));
}
@@ -282,6 +294,7 @@ var WebNFCTest = (() => {
this.operations_suspended_ = false;
this.cancelPendingPushOperation();
this.is_formatted_tag_ = false;
+ this.data_transfer_failed_ = false;
}
cancelPendingPushOperation() {
@@ -357,6 +370,10 @@ var WebNFCTest = (() => {
setIsFormattedTag(isFormatted) {
this.is_formatted_tag_ = isFormatted;
}
+
+ simulateDataTransferFails() {
+ this.data_transfer_failed_ = true;
+ }
}
let testInternal = {
diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
index a819a3b425b..b45ff20dbc4 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
@@ -228,7 +228,7 @@ class MockRuntime {
this.framesOfReference = {};
- this.input_sources_ = [];
+ this.input_sources_ = new Map();
this.next_input_source_index_ = 1;
let supportedModes = [];
@@ -421,7 +421,7 @@ class MockRuntime {
this.next_input_source_index_++;
let source = new MockXRInputSource(fakeInputSourceInit, index, this);
- this.input_sources_.push(source);
+ this.input_sources_.set(index, source);
return source;
}
@@ -540,17 +540,13 @@ class MockRuntime {
// These methods are intended to be used by MockXRInputSource only.
addInputSource(source) {
- let index = this.input_sources_.indexOf(source);
- if (index == -1) {
- this.input_sources_.push(source);
+ if(!this.input_sources_.has(source.source_id_)) {
+ this.input_sources_.set(source.source_id_, source);
}
}
removeInputSource(source) {
- let index = this.input_sources_.indexOf(source);
- if (index >= 0) {
- this.input_sources_.splice(index, 1);
- }
+ this.input_sources_.delete(source.source_id_);
}
// Mojo function implementations.
@@ -561,7 +557,6 @@ class MockRuntime {
this.send_mojo_space_reset_ = false;
if (this.pose_) {
this.pose_.poseIndex++;
-
}
// Setting the input_state to null tests a slightly different path than
@@ -569,10 +564,10 @@ class MockRuntime {
// code always sends up an empty array, but it's also valid mojom to send
// up a null array.
let input_state = null;
- if (this.input_sources_.length > 0) {
+ if (this.input_sources_.size > 0) {
input_state = [];
- for (let i = 0; i < this.input_sources_.length; i++) {
- input_state.push(this.input_sources_[i].getInputSourceState());
+ for (let input_source of this.input_sources_.values()) {
+ input_state.push(input_source.getInputSourceState());
}
}
@@ -739,12 +734,14 @@ class MockXRInputSource {
}
setGripOrigin(transform, emulatedPosition = false) {
+ // grip_origin was renamed to mojo_from_input in mojo
this.mojo_from_input_ = new gfx.mojom.Transform();
this.mojo_from_input_.matrix = getMatrixFromTransform(transform);
this.emulated_position_ = emulatedPosition;
}
clearGripOrigin() {
+ // grip_origin was renamed to mojo_from_input in mojo
if (this.mojo_from_input_ != null) {
this.mojo_from_input_ = null;
this.emulated_position_ = false;
@@ -752,6 +749,7 @@ class MockXRInputSource {
}
setPointerOrigin(transform, emulatedPosition = false) {
+ // pointer_origin was renamed to input_from_pointer in mojo
this.desc_dirty_ = true;
this.input_from_pointer_ = new gfx.mojom.Transform();
this.input_from_pointer_.matrix = getMatrixFromTransform(transform);
diff --git a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt
index 50afed2bb2d..f3a56a6dd71 100644
--- a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt
+++ b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt
@@ -1,3 +1,3 @@
-mypy==0.760
+mypy==0.761
mypy-extensions==0.4.3
typed-ast==1.4.0
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py
index 65534458197..fef052dd5ab 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py
@@ -3,6 +3,7 @@ import platform
import socket
from abc import ABCMeta, abstractmethod
from copy import deepcopy
+from six import iteritems
from ..wptcommandline import require_arg # noqa: F401
@@ -199,5 +200,5 @@ class ExecutorBrowser(object):
up the browser from the runner process.
"""
def __init__(self, **kwargs):
- for k, v in kwargs.iteritems():
+ for k, v in iteritems(kwargs):
setattr(self, k, v)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py
index 8a0e5f578b2..f6c4c602a38 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/epiphany.py
@@ -2,7 +2,8 @@ from .base import get_timeout_multiplier, maybe_add_args, certificate_domain_lis
from .webkit import WebKitBrowser
from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
- WebDriverRefTestExecutor) # noqa: F401
+ WebDriverRefTestExecutor, # noqa: F401
+ WebDriverCrashtestExecutor) # noqa: F401
from ..executors.executorwebkit import WebKitDriverWdspecExecutor # noqa: F401
__wptrunner__ = {"product": "epiphany",
@@ -11,7 +12,8 @@ __wptrunner__ = {"product": "epiphany",
"browser_kwargs": "browser_kwargs",
"executor": {"testharness": "WebDriverTestharnessExecutor",
"reftest": "WebDriverRefTestExecutor",
- "wdspec": "WebKitDriverWdspecExecutor"},
+ "wdspec": "WebKitDriverWdspecExecutor",
+ "crashtest": "WebDriverCrashtestExecutor"},
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
"env_options": "env_options",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
index 0f807533781..b6ee0f4998e 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -168,17 +168,13 @@ def run_info_extras(**kwargs):
"wasm": kwargs.get("wasm", True),
"verify": kwargs["verify"],
"headless": kwargs.get("headless", False) or "MOZ_HEADLESS" in os.environ,
+ "sw-e10s": True,
"fission": get_bool_pref("fission.autostart")}
# The value of `sw-e10s` defaults to whether the "parent_intercept"
# implementation is enabled for the current build. This value, however,
# can be overridden by explicitly setting the pref with the `--setpref` CLI
- # flag, which is checked here. If not supplied, the default value of
- # `sw-e10s` will be filled in in `RunInfo`'s constructor.
- #
- # We can't capture the default value right now because (currently), it
- # defaults to the value of `nightly_build`, which isn't known until
- # `RunInfo`'s constructor.
+ # flag, which is checked here.
sw_e10s_override = get_bool_pref_if_exists("dom.serviceWorkers.parent_intercept")
if sw_e10s_override is not None:
rv["sw-e10s"] = sw_e10s_override
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
index 33b5d51e54e..fee528071f6 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -8,7 +8,8 @@ from .base import (get_free_port,
cmd_arg,
browser_command)
from ..executors.executormarionette import (MarionetteTestharnessExecutor, # noqa: F401
- MarionetteRefTestExecutor) # noqa: F401
+ MarionetteRefTestExecutor, # noqa: F401
+ MarionetteCrashtestExecutor) # noqa: F401
from .firefox import (get_timeout_multiplier, # noqa: F401
run_info_extras as fx_run_info_extras,
update_properties, # noqa: F401
@@ -20,7 +21,8 @@ __wptrunner__ = {"product": "firefox_android",
"check_args": "check_args",
"browser": "FirefoxAndroidBrowser",
"executor": {"testharness": "MarionetteTestharnessExecutor",
- "reftest": "MarionetteRefTestExecutor"},
+ "reftest": "MarionetteRefTestExecutor",
+ "crashtest": "MarionetteCrashtestExecutor"},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py
index aa286213945..1be683ed26e 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkit.py
@@ -2,7 +2,8 @@ from .base import Browser, ExecutorBrowser, require_arg
from .base import get_timeout_multiplier, certificate_domain_list # noqa: F401
from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
- WebDriverRefTestExecutor) # noqa: F401
+ WebDriverRefTestExecutor, # noqa: F401
+ WebDriverCrashtestExecutor) # noqa: F401
from ..executors.executorwebkit import WebKitDriverWdspecExecutor # noqa: F401
from ..webdriver_server import WebKitDriverServer
@@ -13,7 +14,8 @@ __wptrunner__ = {"product": "webkit",
"browser_kwargs": "browser_kwargs",
"executor": {"testharness": "WebDriverTestharnessExecutor",
"reftest": "WebDriverRefTestExecutor",
- "wdspec": "WebKitDriverWdspecExecutor"},
+ "wdspec": "WebKitDriverWdspecExecutor",
+ "crashtest": "WebDriverCrashtestExecutor"},
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
"env_options": "env_options",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
index d735f3c0792..d8b9744bd74 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
@@ -2,7 +2,8 @@ from .base import get_timeout_multiplier, maybe_add_args, certificate_domain_lis
from .webkit import WebKitBrowser
from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401
- WebDriverRefTestExecutor) # noqa: F401
+ WebDriverRefTestExecutor, # noqa: F401
+ WebDriverCrashtestExecutor) # noqa: F401
from ..executors.executorwebkit import WebKitDriverWdspecExecutor # noqa: F401
__wptrunner__ = {"product": "webkitgtk_minibrowser",
@@ -11,7 +12,8 @@ __wptrunner__ = {"product": "webkitgtk_minibrowser",
"browser_kwargs": "browser_kwargs",
"executor": {"testharness": "WebDriverTestharnessExecutor",
"reftest": "WebDriverRefTestExecutor",
- "wdspec": "WebKitDriverWdspecExecutor"},
+ "wdspec": "WebKitDriverWdspecExecutor",
+ "crashtest": "WebDriverCrashtestExecutor"},
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
"env_options": "env_options",
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
index e79ae375064..7dcea4aeafa 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
@@ -5,6 +5,7 @@ import signal
import socket
import sys
import time
+from six import iteritems
from mozlog import get_default_logger, handlers, proxy
@@ -98,7 +99,7 @@ class TestEnvironment(object):
def __exit__(self, exc_type, exc_val, exc_tb):
self.process_interrupts()
- for scheme, servers in self.servers.iteritems():
+ for scheme, servers in iteritems(self.servers):
for port, server in servers:
server.kill()
for cm in self.env_extras_cms:
@@ -194,7 +195,7 @@ class TestEnvironment(object):
route_builder.add_handler(b"GET", b"/resources/testdriver.js",
StringHandler(data, "text/javascript"))
- for url_base, paths in self.test_paths.iteritems():
+ for url_base, paths in iteritems(self.test_paths):
if url_base == "/":
continue
route_builder.add_mount_point(url_base, paths["tests_path"])
@@ -220,7 +221,7 @@ class TestEnvironment(object):
def test_servers(self):
failed = []
host = self.config["server_host"]
- for scheme, servers in self.servers.iteritems():
+ for scheme, servers in iteritems(self.servers):
for port, server in servers:
if self.test_server_port:
s = socket.socket()
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index 59f7e865a5b..01306397db7 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -991,15 +991,16 @@ class MarionetteCrashtestExecutor(CrashtestExecutor):
if not success:
status = data[0]
+ extra = None
if self.debug and (success or status not in ("CRASH", "INTERNAL-ERROR")):
assertion_count = self.protocol.asserts.get()
if assertion_count is not None:
- data["extra"] = {"assertion_count": assertion_count}
+ extra = {"assertion_count": assertion_count}
if success:
return self.convert_result(test, data)
- return (test.result_cls(**data), [])
+ return (test.result_cls(extra=extra, *data), [])
def do_crashtest(self, protocol, url, timeout):
if self.protocol.coverage.is_enabled:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
index 9cef1fb2d7f..9eebfa59feb 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
@@ -7,6 +7,7 @@ import tempfile
import threading
import traceback
import uuid
+from six import iteritems
from mozprocess import ProcessHandler
@@ -45,7 +46,7 @@ def build_servo_command(test, test_url_func, browser, binary, pause_after_test,
args += ["-Z", debug_opts]
for stylesheet in browser.user_stylesheets:
args += ["--user-stylesheet", stylesheet]
- for pref, value in test.environment.get('prefs', {}).iteritems():
+ for pref, value in iteritems(test.environment.get('prefs', {})):
args += ["--pref", "%s=%s" % (pref, value)]
if browser.ca_certificate_path:
args += ["--certificate-path", browser.ca_certificate_path]
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js
index 8a7edb79d62..ad08ad7d76f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/test-wait.js
@@ -32,7 +32,8 @@ function wait_paints() {
}
function screenshot_if_ready() {
- if (root.classList.contains("%(classname)s") &&
+ if (root &&
+ root.classList.contains("%(classname)s") &&
observer === null) {
observer = new MutationObserver(wait_paints);
observer.observe(root, {attributes: true});
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py
index 4d505086bd8..7521f25b134 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/expectedtree.py
@@ -1,5 +1,6 @@
from math import log
from collections import defaultdict
+from six import iteritems, itervalues
class Node(object):
def __init__(self, prop, value):
@@ -33,7 +34,7 @@ def entropy(results):
result_counts = defaultdict(int)
total = float(len(results))
- for values in results.itervalues():
+ for values in itervalues(results):
# Not sure this is right, possibly want to treat multiple values as
# distinct from multiple of the same value?
for value in values:
@@ -41,7 +42,7 @@ def entropy(results):
entropy_sum = 0
- for count in result_counts.itervalues():
+ for count in itervalues(result_counts):
prop = float(count) / total
entropy_sum -= prop * log(prop, 2)
@@ -52,7 +53,7 @@ def split_results(prop, results):
"""Split a dictionary of results into a dictionary of dictionaries where
each sub-dictionary has a specific value of the given property"""
by_prop = defaultdict(dict)
- for run_info, value in results.iteritems():
+ for run_info, value in iteritems(results):
by_prop[run_info[prop]][run_info] = value
return by_prop
@@ -77,13 +78,13 @@ def build_tree(properties, dependent_props, results, tree=None):
prop_index = {prop: i for i, prop in enumerate(properties)}
all_results = defaultdict(int)
- for result_values in results.itervalues():
- for result_value, count in result_values.iteritems():
+ for result_values in itervalues(results):
+ for result_value, count in iteritems(result_values):
all_results[result_value] += count
# If there is only one result we are done
if not properties or len(all_results) == 1:
- for value, count in all_results.iteritems():
+ for value, count in iteritems(all_results):
tree.result_values[value] += count
tree.run_info |= set(results.keys())
return tree
@@ -99,7 +100,7 @@ def build_tree(properties, dependent_props, results, tree=None):
continue
new_entropy = 0.
results_sets_entropy = []
- for prop_value, result_set in result_sets.iteritems():
+ for prop_value, result_set in iteritems(result_sets):
results_sets_entropy.append((entropy(result_set), prop_value, result_set))
new_entropy += (float(len(result_set)) / len(results)) * results_sets_entropy[-1][0]
@@ -109,7 +110,7 @@ def build_tree(properties, dependent_props, results, tree=None):
# In the case that no properties partition the space
if not results_partitions:
- for value, count in all_results.iteritems():
+ for value, count in iteritems(all_results):
tree.result_values[value] += count
tree.run_info |= set(results.keys())
return tree
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
index 6647a8580be..daf0a1c1bfa 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
@@ -1,5 +1,4 @@
import ctypes
-import logging
import os
import platform
import plistlib
@@ -12,7 +11,8 @@ SYSTEM = platform.system().lower()
class FontInstaller(object):
- def __init__(self, font_dir=None, **fonts):
+ def __init__(self, logger, font_dir=None, **fonts):
+ self.logger = logger
self.font_dir = font_dir
self.installed_fonts = False
self.created_dir = False
@@ -26,14 +26,13 @@ class FontInstaller(object):
font_name = font_path.split('/')[-1]
install = getattr(self, 'install_%s_font' % SYSTEM, None)
if not install:
- logging.warning('Font installation not supported on %s',
- SYSTEM)
+ self.logger.warning('Font installation not supported on %s' % SYSTEM)
return False
if install(font_name, font_path):
self.installed_fonts = True
- logging.info('Installed font: %s', font_name)
+ self.logger.info('Installed font: %s' % font_name)
else:
- logging.warning('Unable to install font: %s', font_name)
+ self.logger.warning('Unable to install font: %s' % font_name)
def __exit__(self, exc_type, exc_val, exc_tb):
if not self.installed_fonts:
@@ -43,12 +42,12 @@ class FontInstaller(object):
font_name = font_path.split('/')[-1]
remove = getattr(self, 'remove_%s_font' % SYSTEM, None)
if not remove:
- logging.warning('Font removal not supported on %s', SYSTEM)
+ self.logger.warning('Font removal not supported on %s' % SYSTEM)
return False
if remove(font_name, font_path):
- logging.info('Removed font: %s', font_name)
+ self.logger.info('Removed font: %s' % font_name)
else:
- logging.warning('Unable to remove font: %s', font_name)
+ self.logger.warning('Unable to remove font: %s' % font_name)
def install_linux_font(self, font_name, font_path):
if not self.font_dir:
@@ -62,7 +61,7 @@ class FontInstaller(object):
fc_cache_returncode = call('fc-cache')
return not fc_cache_returncode
except OSError: # If fontconfig doesn't exist, return False
- logging.error('fontconfig not available on this Linux system.')
+ self.logger.error('fontconfig not available on this Linux system.')
return False
def install_darwin_font(self, font_name, font_path):
@@ -110,7 +109,7 @@ class FontInstaller(object):
fc_cache_returncode = call('fc-cache')
return not fc_cache_returncode
except OSError: # If fontconfig doesn't exist, return False
- logging.error('fontconfig not available on this Linux system.')
+ self.logger.error('fontconfig not available on this Linux system.')
return False
def remove_darwin_font(self, font_name, _):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py
index eae85b1f666..65b53f0ab97 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestexpected.py
@@ -1,6 +1,7 @@
import os
from six.moves.urllib.parse import urljoin
from collections import deque
+from six import text_type
from .wptmanifest.backends import static
from .wptmanifest.backends.base import ManifestItem
@@ -57,7 +58,7 @@ def tags(node):
"""Set of tags that have been applied to the test"""
try:
value = node.get("tags")
- if isinstance(value, (str, unicode)):
+ if isinstance(value, text_type):
return {value}
return set(value)
except KeyError:
@@ -66,7 +67,7 @@ def tags(node):
def prefs(node):
def value(ini_value):
- if isinstance(ini_value, (str, unicode)):
+ if isinstance(ini_value, text_type):
return tuple(pref_piece.strip() for pref_piece in ini_value.split(':', 1))
else:
# this should be things like @Reset, which are apparently type 'object'
@@ -74,7 +75,7 @@ def prefs(node):
try:
node_prefs = node.get("prefs")
- if type(node_prefs) in (str, unicode):
+ if isinstance(node_prefs, text_type):
rv = dict(value(node_prefs))
else:
rv = dict(value(item) for item in node_prefs)
@@ -86,7 +87,7 @@ def prefs(node):
def set_prop(name, node):
try:
node_items = node.get(name)
- if isinstance(node_items, (str, unicode)):
+ if isinstance(node_items, text_type):
rv = {node_items}
else:
rv = set(node_items)
@@ -99,7 +100,7 @@ def leak_threshold(node):
rv = {}
try:
node_items = node.get("leak-threshold")
- if isinstance(node_items, (str, unicode)):
+ if isinstance(node_items, text_type):
node_items = [node_items]
for item in node_items:
process, value = item.rsplit(":", 1)
@@ -156,7 +157,7 @@ def fuzzy_prop(node):
if not isinstance(value, list):
value = [value]
for item in value:
- if not isinstance(item, (str, unicode)):
+ if not isinstance(item, text_type):
rv.append(item)
continue
parts = item.rsplit(":", 1)
@@ -478,7 +479,7 @@ def get_manifest(metadata_root, test_path, url_base, run_info):
"""
manifest_path = expected.expected_path(metadata_root, test_path)
try:
- with open(manifest_path) as f:
+ with open(manifest_path, "rb") as f:
return static.compile(f,
run_info,
data_cls_getter=data_cls_getter,
@@ -497,7 +498,7 @@ def get_dir_manifest(path, run_info):
values should be computed.
"""
try:
- with open(path) as f:
+ with open(path, "rb") as f:
return static.compile(f,
run_info,
data_cls_getter=lambda x,y: DirectoryManifest)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py
index d302831a57a..79b5b19b3a3 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py
@@ -6,6 +6,7 @@ be included or excluded.
"""
import glob
import os
+from six import iteritems
from six.moves.urllib.parse import urlparse, urlsplit
from .wptmanifest.node import DataNode
@@ -94,7 +95,7 @@ class IncludeManifest(ManifestItem):
if paths:
urls = []
for path in paths:
- for manifest, data in test_manifests.iteritems():
+ for manifest, data in iteritems(test_manifests):
found = False
rel_path = os.path.relpath(path, data["tests_path"])
iterator = manifest.iterpath if os.path.isfile(path) else manifest.iterdir
@@ -150,5 +151,5 @@ class IncludeManifest(ManifestItem):
def get_manifest(manifest_path):
- with open(manifest_path) as f:
+ with open(manifest_path, "rb") as f:
return conditional.compile(f, data_cls_getter=lambda x, y: IncludeManifest)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
index af9af18d907..3cb1b510792 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestupdate.py
@@ -3,7 +3,7 @@ import os
from six.moves.urllib.parse import urljoin, urlsplit
from collections import namedtuple, defaultdict, deque
from math import ceil
-from six import iterkeys, itervalues, iteritems
+from six import integer_types, iterkeys, itervalues, iteritems, string_types, text_type
from .wptmanifest import serialize
from .wptmanifest.node import (DataNode, ConditionalNode, BinaryExpressionNode,
@@ -411,7 +411,7 @@ class PropertyUpdate(object):
for e in errors:
if disable_intermittent:
condition = e.cond.children[0] if e.cond else None
- msg = disable_intermittent if isinstance(disable_intermittent, (str, unicode)) else "unstable"
+ msg = disable_intermittent if isinstance(disable_intermittent, string_types+(text_type,)) else "unstable"
self.node.set("disabled", msg, condition)
self.node.new_disabled = True
else:
@@ -513,7 +513,7 @@ class PropertyUpdate(object):
top_level_props, dependent_props = self.node.root.run_info_properties
update_properties = set(top_level_props)
for item in itervalues(dependent_props):
- update_properties |= set(dependent_props)
+ update_properties |= set(item)
for condition in current_conditions:
if ((not condition.variables.issubset(update_properties) and
not run_info_by_condition[condition])):
@@ -774,7 +774,7 @@ class AppendOnlyListUpdate(PropertyUpdate):
for item in new:
if item is None:
continue
- elif isinstance(item, (str, unicode)):
+ elif isinstance(item, text_type):
rv.add(item)
else:
rv |= item
@@ -897,10 +897,10 @@ def make_expr(prop_set, rhs):
def make_node(value):
- if type(value) in (int, float, long):
+ if isinstance(value, integer_types+(float,)):
node = NumberNode(value)
- elif type(value) in (str, unicode):
- node = StringNode(unicode(value))
+ elif isinstance(value, text_type):
+ node = StringNode(text_type(value))
elif hasattr(value, "__iter__"):
node = ListNode()
for item in value:
@@ -909,10 +909,10 @@ def make_node(value):
def make_value_node(value):
- if type(value) in (int, float, long):
+ if isinstance(value, integer_types+(float,)):
node = ValueNode(value)
- elif type(value) in (str, unicode):
- node = ValueNode(unicode(value))
+ elif isinstance(value, text_type):
+ node = ValueNode(text_type(value))
elif hasattr(value, "__iter__"):
node = ListNode()
for item in value:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
index c328dcefa72..aafc7d52250 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
@@ -4,6 +4,7 @@ import os
from collections import defaultdict, namedtuple
from mozlog import structuredlog
+from six import ensure_str, ensure_text, iteritems, iterkeys, itervalues, text_type
from six.moves import intern
from . import manifestupdate
@@ -43,11 +44,11 @@ class RunInfo(object):
return self.canonical_repr == other.canonical_repr
def iteritems(self):
- for key, value in self.data.iteritems():
+ for key, value in iteritems(self.data):
yield key, value
def items(self):
- return list(self.iteritems())
+ return list(iteritems(self))
def update_expected(test_paths, serve_root, log_file_names,
@@ -238,7 +239,7 @@ def pack_result(data):
def unpack_result(data):
if isinstance(data, int):
return (status_intern.get(data), None)
- if isinstance(data, unicode):
+ if isinstance(data, text_type):
return (data, None)
# Unpack multiple statuses into a tuple to be used in the Results named tuple below,
# separating `status` and `known_intermittent`.
@@ -285,10 +286,10 @@ def update_results(id_test_map,
disable_intermittent,
update_intermittent,
remove_intermittent):
- test_file_items = set(id_test_map.itervalues())
+ test_file_items = set(itervalues(id_test_map))
default_expected_by_type = {}
- for test_type, test_cls in wpttest.manifest_test_cls.iteritems():
+ for test_type, test_cls in iteritems(wpttest.manifest_test_cls):
if test_cls.result_cls:
default_expected_by_type[(test_type, False)] = test_cls.result_cls.default_expected
if test_cls.subtest_result_cls:
@@ -426,7 +427,7 @@ class ExpectedUpdater(object):
action_map["lsan_leak"](item)
mozleak_data = data.get("mozleak", {})
- for scope, scope_data in mozleak_data.iteritems():
+ for scope, scope_data in iteritems(mozleak_data):
for key, action in [("objects", "mozleak_object"),
("total", "mozleak_total")]:
for item in scope_data.get(key, []):
@@ -438,7 +439,7 @@ class ExpectedUpdater(object):
self.run_info = run_info_intern.store(RunInfo(data["run_info"]))
def test_start(self, data):
- test_id = intern(data["test"].encode("utf8"))
+ test_id = intern(ensure_str(data["test"]))
try:
self.id_test_map[test_id]
except KeyError:
@@ -448,8 +449,8 @@ class ExpectedUpdater(object):
self.tests_visited[test_id] = set()
def test_status(self, data):
- test_id = intern(data["test"].encode("utf8"))
- subtest = intern(data["subtest"].encode("utf8"))
+ test_id = intern(ensure_str(data["test"]))
+ subtest = intern(ensure_str(data["subtest"]))
test_data = self.id_test_map.get(test_id)
if test_data is None:
return
@@ -466,7 +467,7 @@ class ExpectedUpdater(object):
if data["status"] == "SKIP":
return
- test_id = intern(data["test"].encode("utf8"))
+ test_id = intern(ensure_str(data["test"]))
test_data = self.id_test_map.get(test_id)
if test_data is None:
return
@@ -479,7 +480,7 @@ class ExpectedUpdater(object):
del self.tests_visited[test_id]
def assertion_count(self, data):
- test_id = intern(data["test"].encode("utf8"))
+ test_id = intern(ensure_str(data["test"]))
test_data = self.id_test_map.get(test_id)
if test_data is None:
return
@@ -490,7 +491,7 @@ class ExpectedUpdater(object):
def test_for_scope(self, data):
dir_path = data.get("scope", "/")
- dir_id = intern(os.path.join(dir_path, "__dir__").replace(os.path.sep, "/").encode("utf8"))
+ dir_id = intern(ensure_str(os.path.join(dir_path, "__dir__").replace(os.path.sep, "/")))
if dir_id.startswith("/"):
dir_id = dir_id[1:]
return dir_id, self.id_test_map[dir_id]
@@ -529,13 +530,13 @@ def create_test_tree(metadata_path, test_manifest):
assert all_types > exclude_types
include_types = all_types - exclude_types
for item_type, test_path, tests in test_manifest.itertypes(*include_types):
- test_file_data = TestFileData(intern(test_manifest.url_base.encode("utf8")),
- intern(item_type.encode("utf8")),
+ test_file_data = TestFileData(intern(ensure_str(test_manifest.url_base)),
+ intern(ensure_str(item_type)),
metadata_path,
test_path,
tests)
for test in tests:
- id_test_map[intern(test.id.encode("utf8"))] = test_file_data
+ id_test_map[intern(ensure_str(test.id))] = test_file_data
dir_path = os.path.split(test_path)[0].replace(os.path.sep, "/")
while True:
@@ -543,9 +544,9 @@ def create_test_tree(metadata_path, test_manifest):
dir_id = dir_path + "/__dir__"
else:
dir_id = "__dir__"
- dir_id = intern((test_manifest.url_base + dir_id).lstrip("/").encode("utf8"))
+ dir_id = intern(ensure_str((test_manifest.url_base + dir_id).lstrip("/")))
if dir_id not in id_test_map:
- test_file_data = TestFileData(intern(test_manifest.url_base.encode("utf8")),
+ test_file_data = TestFileData(intern(ensure_str(test_manifest.url_base)),
None,
metadata_path,
dir_id,
@@ -614,7 +615,7 @@ class TestFileData(object):
self.item_type = item_type
self.test_path = test_path
self.metadata_path = metadata_path
- self.tests = {intern(item.id.encode("utf8")) for item in tests}
+ self.tests = {intern(ensure_str(item.id)) for item in tests}
self._requires_update = False
self.data = defaultdict(lambda: defaultdict(PackedResultList))
@@ -655,11 +656,11 @@ class TestFileData(object):
# Return subtest nodes present in the expected file, but missing from the data
rv = []
- for test_id, subtests in self.data.iteritems():
- test = expected.get_test(test_id.decode("utf8"))
+ for test_id, subtests in iteritems(self.data):
+ test = expected.get_test(ensure_text(test_id))
if not test:
continue
- seen_subtests = set(item.decode("utf8") for item in subtests.iterkeys() if item is not None)
+ seen_subtests = set(ensure_text(item) for item in iterkeys(subtests) if item is not None)
missing_subtests = set(test.subtests.keys()) - seen_subtests
for item in missing_subtests:
expected_subtest = test.get_subtest(item)
@@ -673,6 +674,29 @@ class TestFileData(object):
return rv
+ def filter_unknown_props(self, update_properties, subtests):
+ # Remove subtests which have some conditions that aren't in update_properties
+ # since removing these may be inappropriate
+ top_level_props, dependent_props = update_properties
+ all_properties = set(top_level_props)
+ for item in itervalues(dependent_props):
+ all_properties |= set(item)
+
+ filtered = []
+ for subtest in subtests:
+ include = True
+ for key, _ in subtest.iter_properties():
+ conditions = subtest.get_conditions(key)
+ for condition in conditions:
+ if not condition.variables.issubset(all_properties):
+ include = False
+ break
+ if not include:
+ break
+ if include:
+ filtered.append(subtest)
+ return filtered
+
def update(self, default_expected_by_type, update_properties,
full_update=False, disable_intermittent=None, update_intermittent=False,
remove_intermittent=False):
@@ -687,6 +711,7 @@ class TestFileData(object):
if full_update:
orphans = self.orphan_subtests(expected)
+ orphans = self.filter_unknown_props(update_properties, orphans)
if not self.requires_update and not orphans:
return
@@ -704,9 +729,9 @@ class TestFileData(object):
test_expected = expected.get_test(test_id)
expected_by_test[test_id] = test_expected
- for test_id, test_data in self.data.iteritems():
- test_id = test_id.decode("utf8")
- for subtest_id, results_list in test_data.iteritems():
+ for test_id, test_data in iteritems(self.data):
+ test_id = ensure_str(test_id)
+ for subtest_id, results_list in iteritems(test_data):
for prop, run_info, value in results_list:
# Special case directory metadata
if subtest_id is None and test_id.endswith("__dir__"):
@@ -722,8 +747,7 @@ class TestFileData(object):
if subtest_id is None:
item_expected = test_expected
else:
- if isinstance(subtest_id, str):
- subtest_id = subtest_id.decode("utf8")
+ subtest_id = ensure_text(subtest_id)
item_expected = test_expected.get_subtest(subtest_id)
if prop == "status":
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py
index e3117042709..abd84094bb3 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/products.py
@@ -1,5 +1,6 @@
import importlib
import imp
+from six import iteritems
from .browsers import product_list
@@ -44,7 +45,7 @@ class Product(object):
self.get_timeout_multiplier = getattr(module, data["timeout_multiplier"])
self.executor_classes = {}
- for test_type, cls_name in data["executor"].iteritems():
+ for test_type, cls_name in iteritems(data["executor"]):
cls = getattr(module, cls_name)
self.executor_classes[test_type] = cls
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
index fa54ca36157..8fcf66d64ed 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
@@ -5,6 +5,8 @@ from abc import ABCMeta, abstractmethod
from six.moves.queue import Empty
from collections import defaultdict, deque
from multiprocessing import Queue
+from six import ensure_binary, iteritems
+from six.moves import xrange
from . import manifestinclude
from . import manifestexpected
@@ -49,7 +51,7 @@ class HashChunker(TestChunker):
def __call__(self, manifest):
chunk_index = self.chunk_number - 1
for test_type, test_path, tests in manifest:
- h = int(hashlib.md5(test_path).hexdigest(), 16)
+ h = int(hashlib.md5(ensure_binary(test_path)).hexdigest(), 16)
if h % self.total_chunks == chunk_index:
yield test_type, test_path, tests
@@ -63,7 +65,7 @@ class DirectoryHashChunker(TestChunker):
def __call__(self, manifest):
chunk_index = self.chunk_number - 1
for test_type, test_path, tests in manifest:
- h = int(hashlib.md5(os.path.dirname(test_path)).hexdigest(), 16)
+ h = int(hashlib.md5(ensure_binary(os.path.dirname(test_path))).hexdigest(), 16)
if h % self.total_chunks == chunk_index:
yield test_type, test_path, tests
@@ -124,7 +126,7 @@ class ManifestLoader(object):
def load(self):
rv = {}
- for url_base, paths in self.test_paths.iteritems():
+ for url_base, paths in iteritems(self.test_paths):
manifest_file = self.load_manifest(url_base=url_base,
**paths)
path_data = {"url_base": url_base}
@@ -236,7 +238,7 @@ class TestLoader(object):
manifest_items = self.chunker(manifest_items)
for test_type, test_path, tests in manifest_items:
- manifest_file = manifests_by_url_base[iter(tests).next().url_base]
+ manifest_file = manifests_by_url_base[next(iter(tests)).url_base]
metadata_path = self.manifests[manifest_file]["metadata_path"]
inherit_metadata, test_metadata = self.load_metadata(manifest_file, metadata_path, test_path)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py
index 2308be9590e..d71237a42da 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_expectedtree.py
@@ -1,7 +1,3 @@
-import sys
-
-import pytest
-
from .. import expectedtree, metadata
from collections import defaultdict
@@ -32,8 +28,6 @@ def results_object(results):
return results_obj
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_build_tree_0():
# Pass if debug
results = [({"os": "linux", "version": "18.04", "debug": True}, "FAIL"),
@@ -53,8 +47,6 @@ def test_build_tree_0():
assert dump_tree(tree) == expected
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_build_tree_1():
# Pass if linux or windows 10
results = [({"os": "linux", "version": "18.04", "debug": True}, "PASS"),
@@ -77,8 +69,6 @@ def test_build_tree_1():
assert dump_tree(tree) == expected
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_build_tree_2():
# Fails in a specific configuration
results = [({"os": "linux", "version": "18.04", "debug": True}, "PASS"),
@@ -104,8 +94,6 @@ def test_build_tree_2():
assert dump_tree(tree) == expected
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_build_tree_3():
results = [({"os": "linux", "version": "18.04", "debug": True, "unused": False}, "PASS"),
@@ -118,8 +106,6 @@ def test_build_tree_3():
assert dump_tree(tree) == expected
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_build_tree_4():
# Check counts for multiple statuses
results = [({"os": "linux", "version": "18.04", "debug": False}, "FAIL"),
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py
index 525915d1832..f3e4ce796a4 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_manifestexpected.py
@@ -1,4 +1,3 @@
-import sys
from io import BytesIO
import pytest
@@ -6,8 +5,6 @@ import pytest
from .. import manifestexpected
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
@pytest.mark.parametrize("fuzzy, expected", [
(b"ref.html:1;200", [("ref.html", ((1, 1), (200, 200)))]),
(b"ref.html:0-1;100-200", [("ref.html", ((0, 1), (100, 200)))]),
@@ -25,7 +22,7 @@ from .. import manifestexpected
((u"test.html", u"ref1.html", "=="), ((5,10), (100, 100)))]),
])
def test_fuzzy(fuzzy, expected):
- data = """
+ data = b"""
[test.html]
fuzzy: %s""" % fuzzy
f = BytesIO(data)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
index e857cd43db6..836003d1060 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
@@ -20,8 +20,6 @@ skip: true
@pytest.mark.xfail(sys.platform == "win32",
reason="NamedTemporaryFile cannot be reopened on Win32")
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="wptmanifest.parser doesn't support py3")
def test_filter_unicode():
tests = make_mock_manifest(("test", "a", 10), ("test", "a/b", 10),
("test", "c", 10))
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py
index 5f199390b64..a24e4a733da 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py
@@ -66,7 +66,7 @@ def update(tests, *logs, **kwargs):
updater.update_from_log(log)
update_properties = (["debug", "os", "version", "processor"],
- {"os": ["version"], "processor": "bits"})
+ {"os": ["version"], "processor": ["bits"]})
expected_data = {}
metadata.load_expected = lambda _, __, test_path, *args: expected_data.get(test_path)
@@ -108,7 +108,7 @@ def create_log(entries):
getattr(logger, action)(**kwargs)
logger.remove_handler(handler)
else:
- json.dump(entries, data)
+ data.write(json.dumps(entries).encode())
data.seek(0)
return data
@@ -132,11 +132,9 @@ def create_test_manifest(tests, url_base="/"):
return m
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_0():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: FAIL""")]
@@ -154,11 +152,9 @@ def test_update_0():
assert updated[0][1].is_empty
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_1():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: ERROR""")]
@@ -177,11 +173,9 @@ def test_update_1():
assert new_manifest.get_test(test_id).children[0].get("expected", default_run_info) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_known_intermittent_1():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: PASS""")]
@@ -218,11 +212,9 @@ def test_update_known_intermittent_1():
"expected", default_run_info) == ["PASS", "FAIL"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_known_intermittent_2():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: PASS""")]
@@ -243,11 +235,9 @@ def test_update_known_intermittent_2():
"expected", default_run_info) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_existing_known_intermittent():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: [PASS, FAIL]""")]
@@ -286,11 +276,9 @@ def test_update_existing_known_intermittent():
"expected", default_run_info) == ["PASS", "ERROR", "FAIL"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_remove_previous_intermittent():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: [PASS, FAIL]""")]
@@ -334,8 +322,6 @@ def test_update_remove_previous_intermittent():
"expected", default_run_info) == ["PASS", "ERROR"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_new_test_with_intermittent():
tests = [("path/to/test.htm", [test_id], "testharness", None)]
@@ -373,8 +359,6 @@ def test_update_new_test_with_intermittent():
"expected", default_run_info) == ["PASS", "FAIL"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_expected_tie_resolution():
tests = [("path/to/test.htm", [test_id], "testharness", None)]
@@ -402,11 +386,9 @@ def test_update_expected_tie_resolution():
"expected", default_run_info) == ["PASS", "FAIL"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_reorder_expected():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: [PASS, FAIL]""")]
@@ -445,10 +427,8 @@ def test_update_reorder_expected():
"expected", default_run_info) == ["FAIL", "PASS"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_and_preserve_unchanged_expected_intermittent():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected:
if os == "android": [PASS, FAIL]
@@ -488,11 +468,9 @@ def test_update_and_preserve_unchanged_expected_intermittent():
"expected", default_run_info) == "PASS"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_test_with_intermittent_to_one_expected_status():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: [PASS, FAIL]""")]
@@ -513,10 +491,8 @@ def test_update_test_with_intermittent_to_one_expected_status():
"expected", default_run_info) == "ERROR"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_intermittent_with_conditions():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected:
if os == "android": [PASS, FAIL]""")]
@@ -548,10 +524,8 @@ def test_update_intermittent_with_conditions():
"expected", run_info_1) == ["PASS", "TIMEOUT", "FAIL"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_and_remove_intermittent_with_conditions():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected:
if os == "android": [PASS, FAIL]""")]
@@ -583,11 +557,9 @@ def test_update_and_remove_intermittent_with_conditions():
"expected", run_info_1) == ["PASS", "TIMEOUT"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_intermittent_full():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected:
if os == "mac": [FAIL, TIMEOUT]
@@ -623,11 +595,9 @@ def test_update_intermittent_full():
"expected", default_run_info) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_intermittent_full_remove():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected:
if os == "mac": [FAIL, TIMEOUT, PASS]
@@ -674,11 +644,9 @@ def test_update_intermittent_full_remove():
"expected", default_run_info) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_full_update():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected:
if os == "mac": [FAIL, TIMEOUT]
@@ -714,11 +682,9 @@ def test_full_update():
"expected", default_run_info) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_full_orphan():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: FAIL
[subsub test]
@@ -747,11 +713,9 @@ def test_full_orphan():
assert len(new_manifest.get_test(test_id).children) == 1
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_reorder_expected_full_conditions():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected:
if os == "mac": [FAIL, TIMEOUT]
@@ -808,11 +772,9 @@ def test_update_reorder_expected_full_conditions():
"expected", default_run_info) == ["PASS", "FAIL"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_skip_0():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: FAIL""")]
@@ -828,10 +790,8 @@ def test_skip_0():
assert not updated
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_new_subtest():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected: FAIL""")]
@@ -853,10 +813,8 @@ def test_new_subtest():
assert new_manifest.get_test(test_id).children[1].get("expected", default_run_info) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_multiple_0():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected: FAIL""")]
@@ -892,10 +850,8 @@ def test_update_multiple_0():
"expected", {"debug": False, "os": "linux"}) == "TIMEOUT"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_multiple_1():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected: FAIL""")]
@@ -936,10 +892,8 @@ def test_update_multiple_1():
"expected", run_info_3) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_multiple_2():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected: FAIL""")]
@@ -976,10 +930,8 @@ def test_update_multiple_2():
"expected", run_info_2) == "TIMEOUT"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_multiple_3():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected:
if debug: FAIL
@@ -1018,10 +970,8 @@ def test_update_multiple_3():
"expected", run_info_2) == "TIMEOUT"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_ignore_existing():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected:
if debug: TIMEOUT
@@ -1060,8 +1010,6 @@ def test_update_ignore_existing():
"expected", run_info_2) == "NOTRUN"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_new_test():
tests = [("path/to/test.htm", [test_id], "testharness", None)]
@@ -1084,10 +1032,8 @@ def test_update_new_test():
"expected", run_info_1) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_duplicate():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected: ERROR""")]
@@ -1106,10 +1052,8 @@ def test_update_duplicate():
"expected", run_info_1) == "ERROR"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_disable_intermittent():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected: ERROR""")]
@@ -1128,10 +1072,8 @@ def test_update_disable_intermittent():
"disabled", run_info_1) == "Some message"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_stability_conditional_instability():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected: ERROR""")]
@@ -1164,10 +1106,8 @@ def test_update_stability_conditional_instability():
"expected", run_info_2) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_full():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected:
if debug: TIMEOUT
@@ -1216,10 +1156,8 @@ def test_update_full():
"expected", run_info_2) == "ERROR"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_full_unknown():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected:
if release_or_beta: ERROR
@@ -1259,11 +1197,29 @@ def test_update_full_unknown():
"expected", run_info_2) == "ERROR"
+def test_update_full_unknown_missing():
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
+ [subtest_deleted]
+ expected:
+ if release_or_beta: ERROR
+ FAIL
+""")]
+
+ log_0 = suite_log([("test_start", {"test": test_id}),
+ ("test_status", {"test": test_id,
+ "subtest": "test1",
+ "status": "PASS",
+ "expected": "PASS"}),
+ ("test_end", {"test": test_id,
+ "status": "OK"})],
+ run_info={"debug": False, "release_or_beta": False})
+
+ updated = update(tests, log_0, full_update=True)
+ assert len(updated) == 0
+
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_default():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
[test1]
expected:
if os == "mac": FAIL
@@ -1293,10 +1249,8 @@ def test_update_default():
assert new_manifest.is_empty
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_default_1():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected:
if os == "mac": TIMEOUT
@@ -1325,10 +1279,8 @@ def test_update_default_1():
"expected", run_info_2) == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_default_2():
- tests = [("path/to/test.htm", [test_id], "testharness", """
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""
[test.htm]
expected:
if os == "mac": TIMEOUT
@@ -1357,10 +1309,8 @@ def test_update_default_2():
"expected", run_info_2) == "TIMEOUT"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_assertion_count_0():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
max-asserts: 4
min-asserts: 2
""")]
@@ -1381,10 +1331,8 @@ def test_update_assertion_count_0():
assert new_manifest.get_test(test_id).get("min-asserts") == "2"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_assertion_count_1():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
max-asserts: 4
min-asserts: 2
""")]
@@ -1405,10 +1353,8 @@ def test_update_assertion_count_1():
assert new_manifest.get_test(test_id).has_key("min-asserts") is False
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_assertion_count_2():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
max-asserts: 4
min-asserts: 2
""")]
@@ -1425,10 +1371,8 @@ def test_update_assertion_count_2():
assert not updated
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_assertion_count_3():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]
max-asserts: 4
min-asserts: 2
""")]
@@ -1459,10 +1403,8 @@ def test_update_assertion_count_3():
assert new_manifest.get_test(test_id).get("min-asserts") == "2"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_assertion_count_4():
- tests = [("path/to/test.htm", [test_id], "testharness", """[test.htm]""")]
+ tests = [("path/to/test.htm", [test_id], "testharness", b"""[test.htm]""")]
log_0 = suite_log([("test_start", {"test": test_id}),
("assertion_count", {"test": test_id,
@@ -1490,11 +1432,9 @@ def test_update_assertion_count_4():
assert new_manifest.get_test(test_id).has_key("min-asserts") is False
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_lsan_0():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, "")]
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"")]
log_0 = suite_log([("lsan_leak", {"scope": "path/to/",
"frames": ["foo", "bar"]})])
@@ -1507,11 +1447,9 @@ def test_update_lsan_0():
assert new_manifest.get("lsan-allowed") == ["foo"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_lsan_1():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, """
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"""
lsan-allowed: [foo]""")]
log_0 = suite_log([("lsan_leak", {"scope": "path/to/",
@@ -1527,13 +1465,11 @@ lsan-allowed: [foo]""")]
assert new_manifest.get("lsan-allowed") == ["baz", "foo"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_lsan_2():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/__dir__", ["path/__dir__"], None, """
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/__dir__", ["path/__dir__"], None, b"""
lsan-allowed: [foo]"""),
- ("path/to/__dir__", [dir_id], None, "")]
+ ("path/to/__dir__", [dir_id], None, b"")]
log_0 = suite_log([("lsan_leak", {"scope": "path/to/",
"frames": ["foo", "bar"],
@@ -1549,11 +1485,9 @@ lsan-allowed: [foo]"""),
assert new_manifest.get("lsan-allowed") == ["baz"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_lsan_3():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, "")]
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"")]
log_0 = suite_log([("lsan_leak", {"scope": "path/to/",
"frames": ["foo", "bar"]})],
@@ -1571,11 +1505,9 @@ def test_update_lsan_3():
assert new_manifest.get("lsan-allowed") == ["baz", "foo"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_wptreport_0():
tests = [("path/to/test.htm", [test_id], "testharness",
- """[test.htm]
+ b"""[test.htm]
[test1]
expected: FAIL""")]
@@ -1593,11 +1525,9 @@ def test_update_wptreport_0():
assert updated[0][1].is_empty
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_wptreport_1():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, "")]
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"")]
log = {"run_info": default_run_info.copy(),
"results": [],
@@ -1610,11 +1540,9 @@ def test_update_wptreport_1():
assert updated[0][1].get("lsan-allowed") == ["baz"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_leak_total_0():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, "")]
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"")]
log_0 = suite_log([("mozleak_total", {"scope": "path/to/",
"process": "default",
@@ -1629,11 +1557,9 @@ def test_update_leak_total_0():
assert new_manifest.get("leak-threshold") == ['default:51200']
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_leak_total_1():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, "")]
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"")]
log_0 = suite_log([("mozleak_total", {"scope": "path/to/",
"process": "default",
@@ -1645,11 +1571,9 @@ def test_update_leak_total_1():
assert not updated
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_leak_total_2():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, """
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"""
leak-total: 110""")]
log_0 = suite_log([("mozleak_total", {"scope": "path/to/",
@@ -1662,11 +1586,9 @@ leak-total: 110""")]
assert not updated
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_leak_total_3():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, """
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"""
leak-total: 100""")]
log_0 = suite_log([("mozleak_total", {"scope": "path/to/",
@@ -1682,11 +1604,9 @@ leak-total: 100""")]
assert new_manifest.get("leak-threshold") == ['default:51200']
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="metadata doesn't support py3")
def test_update_leak_total_4():
- tests = [("path/to/test.htm", [test_id], "testharness", ""),
- ("path/to/__dir__", [dir_id], None, """
+ tests = [("path/to/test.htm", [test_id], "testharness", b""),
+ ("path/to/__dir__", [dir_id], None, b"""
leak-total: 110""")]
log_0 = suite_log([
@@ -1715,8 +1635,6 @@ class UpdateRunner(StepRunner):
steps = [TestStep]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="update.state doesn't support py3")
def test_update_pickle():
logger = structuredlog.StructuredLogger("expected_test")
args = {
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py
index 9bb3e1fd34e..1a94a2f3303 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py
@@ -1,5 +1,3 @@
-import pytest
-import sys
from io import BytesIO
from mock import Mock
@@ -7,29 +5,29 @@ from manifest import manifest as wptmanifest
from manifest.item import TestharnessTest
from .. import manifestexpected, wpttest
-dir_ini_0 = """\
+dir_ini_0 = b"""\
prefs: [a:b]
"""
-dir_ini_1 = """\
+dir_ini_1 = b"""\
prefs: [@Reset, b:c]
max-asserts: 2
min-asserts: 1
tags: [b, c]
"""
-dir_ini_2 = """\
+dir_ini_2 = b"""\
lsan-max-stack-depth: 42
"""
-test_0 = """\
+test_0 = b"""\
[0.html]
prefs: [c:d]
max-asserts: 3
tags: [a, @Reset]
"""
-test_1 = """\
+test_1 = b"""\
[1.html]
prefs:
if os == 'win': [a:b, c:d]
@@ -37,12 +35,12 @@ test_1 = """\
if os == 'win': FAIL
"""
-test_2 = """\
+test_2 = b"""\
[2.html]
lsan-max-stack-depth: 42
"""
-test_3 = """\
+test_3 = b"""\
[3.html]
[subtest1]
expected: [PASS, FAIL]
@@ -54,32 +52,32 @@ test_3 = """\
expected: FAIL
"""
-test_4 = """\
+test_4 = b"""\
[4.html]
expected: FAIL
"""
-test_5 = """\
+test_5 = b"""\
[5.html]
"""
-test_6 = """\
+test_6 = b"""\
[6.html]
expected: [OK, FAIL]
"""
-test_7 = """\
+test_7 = b"""\
[7.html]
blink_expect_any_subtest_status: yep
"""
-test_fuzzy = """\
+test_fuzzy = b"""\
[fuzzy.html]
fuzzy: fuzzy-ref.html:1;200
"""
-testharness_test = """<script src="/resources/testharness.js"></script>
+testharness_test = b"""<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>"""
@@ -117,8 +115,6 @@ def make_test_object(test_name,
return wpttest.from_manifest(tests, test, inherit_metadata, test_metadata.get_test(test.id))
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_metadata_inherit():
items = [("test", "a", 10), ("test", "a/b", 10), ("test", "c", 10)]
inherit_metadata = [
@@ -136,8 +132,6 @@ def test_metadata_inherit():
assert test_obj.tags == {"a", "dir:a"}
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_conditional():
items = [("test", "a", 10), ("test", "a/b", 10), ("test", "c", 10)]
@@ -147,8 +141,6 @@ def test_conditional():
assert test_obj.expected() == "FAIL"
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_metadata_lsan_stack_depth():
items = [("test", "a", 10), ("test", "a/b", 10)]
@@ -172,8 +164,6 @@ def test_metadata_lsan_stack_depth():
assert test_obj.lsan_max_stack_depth == 42
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_subtests():
test_obj = make_test_object(test_3, "a/3.html", 3, ("test", "a", 4), None, False)
assert test_obj.expected("subtest1") == "PASS"
@@ -184,40 +174,30 @@ def test_subtests():
assert test_obj.known_intermittent("subtest3") == []
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_expected_fail():
test_obj = make_test_object(test_4, "a/4.html", 4, ("test", "a", 5), None, False)
assert test_obj.expected() == "FAIL"
assert test_obj.known_intermittent() == []
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_no_expected():
test_obj = make_test_object(test_5, "a/5.html", 5, ("test", "a", 6), None, False)
assert test_obj.expected() == "OK"
assert test_obj.known_intermittent() == []
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_known_intermittent():
test_obj = make_test_object(test_6, "a/6.html", 6, ("test", "a", 7), None, False)
assert test_obj.expected() == "OK"
assert test_obj.known_intermittent() == ["FAIL"]
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_expect_any_subtest_status():
test_obj = make_test_object(test_7, "a/7.html", 7, ("test", "a", 8), None, False)
assert test_obj.expected() == "OK"
assert test_obj.expect_any_subtest_status() is True
-@pytest.mark.xfail(sys.version[0] == "3",
- reason="bytes/text confusion in py3")
def test_metadata_fuzzy():
manifest_data = {
"items": {"reftest": {"a/fuzzy.html": [["a/fuzzy.html",
@@ -234,7 +214,7 @@ def test_metadata_fuzzy():
test_path="a/fuzzy.html",
url_base="/")
- test = manifest.iterpath("a/fuzzy.html").next()
+ test = next(manifest.iterpath("a/fuzzy.html"))
test_obj = wpttest.from_manifest(manifest, test, [], test_metadata.get_test(test.id))
assert test_obj.fuzzy == {('/a/fuzzy.html', '/a/fuzzy-ref.html', '=='): [[2, 3], [10, 15]]}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py
index 64dbf118060..f8a83525cbd 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/state.py
@@ -11,7 +11,7 @@ class BaseState(object):
return rv
logger.debug("No existing state found")
- return object.__new__(cls, logger)
+ return super(BaseState, cls).__new__(cls)
def __init__(self, logger):
"""Object containing state variables created when running Steps.
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
index 923bdaa5585..91f1161b01b 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -37,7 +37,7 @@ def require_arg(kwargs, name, value_func=None):
def create_parser(product_choices=None):
from mozlog import commandline
- import products
+ from . import products
if product_choices is None:
config_data = config.load()
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py
index 69cee744879..444d1d962d2 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptlogging.py
@@ -14,7 +14,7 @@ def setup(args, defaults, formatter_defaults=None):
formatter_defaults=formatter_defaults)
setup_stdlib_logger()
- for name in args.keys():
+ for name in list(args.keys()):
if name.startswith("log_"):
args.pop(name)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
index a81ad9d06a1..3b11e83012a 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
@@ -381,6 +381,10 @@ class ManifestItem(object):
for item in iterkeys(self._flatten()):
yield item
+ def iter_properties(self):
+ for item in self._data:
+ yield item, self._data[item]
+
def remove_value(self, key, value):
if key not in self._data:
return
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
index cac172a5940..75ce104c7ce 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
@@ -3,19 +3,20 @@ from __future__ import print_function, unicode_literals
import json
import os
import sys
+from six import iteritems, itervalues
from wptserve import sslutils
-import environment as env
-import products
-import testloader
-import wptcommandline
-import wptlogging
-import wpttest
+from . import environment as env
+from . import products
+from . import testloader
+from . import wptcommandline
+from . import wptlogging
+from . import wpttest
from mozlog import capture, handlers
-from font import FontInstaller
-from testrunner import ManagerGroup
-from browsers.base import NullBrowser
+from .font import FontInstaller
+from .testrunner import ManagerGroup
+from .browsers.base import NullBrowser
here = os.path.split(__file__)[0]
@@ -102,7 +103,7 @@ def list_disabled(test_paths, product, **kwargs):
run_info, test_loader = get_loader(test_paths, product,
run_info_extras=run_info_extras, **kwargs)
- for test_type, tests in test_loader.disabled_tests.iteritems():
+ for test_type, tests in iteritems(test_loader.disabled_tests):
for test in tests:
rv.append({"test": test.id, "reason": test.disabled()})
print(json.dumps(rv, indent=2))
@@ -127,7 +128,7 @@ def get_pause_after_test(test_loader, **kwargs):
if kwargs["headless"]:
return False
tests = test_loader.tests
- is_single_testharness = (sum(len(item) for item in tests.itervalues()) == 1 and
+ is_single_testharness = (sum(len(item) for item in itervalues(tests)) == 1 and
len(tests.get("testharness", [])) == 1)
if kwargs["repeat"] == 1 and kwargs["rerun"] == 1 and is_single_testharness:
return True
@@ -149,6 +150,7 @@ def run_tests(config, test_paths, product, **kwargs):
if kwargs["install_fonts"]:
env_extras.append(FontInstaller(
+ logger,
font_dir=kwargs["font_dir"],
ahem=os.path.join(test_paths["/"]["tests_path"], "fonts/Ahem.ttf")
))
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
index 67b57583424..d650e98dfbf 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
@@ -2,6 +2,7 @@ import os
import subprocess
from six.moves.urllib.parse import urljoin
from collections import defaultdict
+from six import string_types
from .wptmanifest.parser import atoms
@@ -118,18 +119,6 @@ class RunInfo(dict):
if extras is not None:
self.update(extras)
- # Until the test harness can understand default pref values,
- # (https://bugzilla.mozilla.org/show_bug.cgi?id=1577912) this value
- # should by synchronized with the default pref value indicated in
- # StaticPrefList.yaml.
- #
- # Currently for automation, the pref (and `sw-e10s`) defaults to true in
- # nightly builds and false otherwise but can be overridden with
- # `--setpref`. If overridden, the value would be initialized in
- # `run_info_extras` and be supplied in the `extras` parameter.
- if "sw-e10s" not in self:
- self["sw-e10s"] = self.get("nightly_build", False)
-
self["headless"] = extras.get("headless", False)
self["webrender"] = enable_webrender
@@ -337,7 +326,7 @@ class Test(object):
try:
expected = metadata.get("expected")
- if isinstance(expected, (basestring)):
+ if isinstance(expected, string_types):
return expected
elif isinstance(expected, list):
return expected[0]
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
index ca5118009cf..efc1a16a932 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
@@ -1,4 +1,7 @@
-import cgi
+try:
+ import html
+except ImportError:
+ import cgi as html
import json
import os
import sys
@@ -76,7 +79,7 @@ class DirectoryHandler(object):
<ul>
%(items)s
</ul>
-""" % {"path": cgi.escape(url_path),
+""" % {"path": html.escape(url_path),
"items": "\n".join(self.list_items(url_path, path))} # noqa: E122
def list_items(self, base_path, path):
@@ -93,14 +96,14 @@ class DirectoryHandler(object):
yield ("""<li class="dir"><a href="%(link)s">%(name)s</a></li>""" %
{"link": link, "name": ".."})
for item in sorted(os.listdir(path)):
- link = cgi.escape(quote(item))
+ link = html.escape(quote(item))
if os.path.isdir(os.path.join(path, item)):
link += "/"
class_ = "dir"
else:
class_ = "file"
yield ("""<li class="%(class)s"><a href="%(link)s">%(name)s</a></li>""" %
- {"link": link, "name": cgi.escape(item), "class": class_})
+ {"link": link, "name": html.escape(item), "class": class_})
def wrap_pipeline(path, request, response):
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py
index ceb34cc3f4f..e5d6e1c96db 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/pipes.py
@@ -1,4 +1,7 @@
-from cgi import escape
+try:
+ from html import escape
+except ImportError:
+ from cgi import escape
from collections import deque
import base64
import gzip as gzip_module
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js
index 7fbac5b24f1..2c53e3611e0 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/constructor/multi-value.any.js
@@ -10,8 +10,8 @@ promise_test(async () => {
builder
.addFunction("swap", type_if_fi)
.addBody([
- kExprGetLocal, 1,
- kExprGetLocal, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 0,
kExprReturn,
])
.exportFunc();
@@ -31,8 +31,8 @@ promise_test(async () => {
const swap = builder
.addFunction("swap", type_if_fi)
.addBody([
- kExprGetLocal, 1,
- kExprGetLocal, 0,
+ kExprLocalGet, 1,
+ kExprLocalGet, 0,
kExprReturn,
]);
builder
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js b/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js
index 7ccf06c234a..c81672f208b 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/instanceTestFactory.js
@@ -183,7 +183,7 @@ const instanceTestFactory = [
builder
.addFunction("fn", kSig_i_v)
.addBody([
- kExprGetGlobal,
+ kExprGlobalGet,
index,
kExprReturn,
])
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js
index 8e9732e5512..09355979d84 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/module/customSections.any.js
@@ -81,22 +81,10 @@ test(() => {
const bytes1 = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121];
const bytes2 = [74, 83, 65, 80, 73];
- const binary = new Binary;
- binary.emit_section(kUnknownSectionCode, section => {
- section.emit_string("name");
- section.emit_bytes(bytes1);
- });
- binary.emit_section(kUnknownSectionCode, section => {
- section.emit_string("name");
- section.emit_bytes(bytes2);
- });
- binary.emit_section(kUnknownSectionCode, section => {
- section.emit_string("foo");
- section.emit_bytes(bytes1);
- });
-
const builder = new WasmModuleBuilder();
- builder.addExplicitSection(binary.trunc_buffer());
+ builder.addCustomSection("name", bytes1);
+ builder.addCustomSection("name", bytes2);
+ builder.addCustomSection("foo", bytes1);
const buffer = builder.toBuffer()
const module = new WebAssembly.Module(buffer);
@@ -119,14 +107,8 @@ test(() => {
const bytes = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121];
const name = "yee\uD801\uDC37eey"
- const binary = new Binary;
- binary.emit_section(kUnknownSectionCode, section => {
- section.emit_string(name);
- section.emit_bytes(bytes);
- });
-
const builder = new WasmModuleBuilder();
- builder.addExplicitSection(binary.trunc_buffer());
+ builder.addCustomSection(name, bytes);
const buffer = builder.toBuffer();
const module = new WebAssembly.Module(buffer);
@@ -140,14 +122,8 @@ test(() => {
test(() => {
const bytes = [87, 101, 98, 65, 115, 115, 101, 109, 98, 108, 121];
- const binary = new Binary;
- binary.emit_section(kUnknownSectionCode, section => {
- section.emit_string("na\uFFFDme");
- section.emit_bytes(bytes);
- });
-
const builder = new WasmModuleBuilder();
- builder.addExplicitSection(binary.trunc_buffer());
+ builder.addCustomSection("na\uFFFDme", bytes);
const buffer = builder.toBuffer();
const module = new WebAssembly.Module(buffer);
diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js b/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js
index 09ff891f52e..82c6e04135f 100644
--- a/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js
+++ b/tests/wpt/web-platform-tests/wasm/jsapi/wasm-module-builder.js
@@ -66,6 +66,8 @@ let kStartSectionCode = 8; // Start function declaration
let kElementSectionCode = 9; // Elements section
let kCodeSectionCode = 10; // Function code
let kDataSectionCode = 11; // Data segments
+let kDataCountSectionCode = 12; // Data segment count (between Element & Code)
+let kExceptionSectionCode = 13; // Exception section (between Global & Export)
// Name section types
let kModuleNameCode = 0;
@@ -76,7 +78,13 @@ let kWasmFunctionTypeForm = 0x60;
let kWasmAnyFunctionTypeForm = 0x70;
let kHasMaximumFlag = 1;
-let kResizableMaximumFlag = 1;
+let kSharedHasMaximumFlag = 3;
+
+// Segment flags
+let kActiveNoIndex = 0;
+let kPassive = 1;
+let kActiveWithIndex = 2;
+let kPassiveWithElements = 5;
// Function declaration flags
let kDeclFunctionName = 0x01;
@@ -91,14 +99,21 @@ let kWasmI64 = 0x7e;
let kWasmF32 = 0x7d;
let kWasmF64 = 0x7c;
let kWasmS128 = 0x7b;
+let kWasmAnyRef = 0x6f;
+let kWasmAnyFunc = 0x70;
+let kWasmExnRef = 0x68;
let kExternalFunction = 0;
let kExternalTable = 1;
let kExternalMemory = 2;
let kExternalGlobal = 3;
+let kExternalException = 4;
let kTableZero = 0;
let kMemoryZero = 0;
+let kSegmentZero = 0;
+
+let kExceptionAttribute = 0;
// Useful signatures
let kSig_i_i = makeSig([kWasmI32], [kWasmI32]);
@@ -123,11 +138,30 @@ let kSig_v_l = makeSig([kWasmI64], []);
let kSig_v_d = makeSig([kWasmF64], []);
let kSig_v_dd = makeSig([kWasmF64, kWasmF64], []);
let kSig_v_ddi = makeSig([kWasmF64, kWasmF64, kWasmI32], []);
+let kSig_ii_v = makeSig([], [kWasmI32, kWasmI32]);
+let kSig_iii_v = makeSig([], [kWasmI32, kWasmI32, kWasmI32]);
+let kSig_ii_i = makeSig([kWasmI32], [kWasmI32, kWasmI32]);
+let kSig_iii_i = makeSig([kWasmI32], [kWasmI32, kWasmI32, kWasmI32]);
+let kSig_ii_ii = makeSig([kWasmI32, kWasmI32], [kWasmI32, kWasmI32]);
+let kSig_iii_ii = makeSig([kWasmI32, kWasmI32], [kWasmI32, kWasmI32, kWasmI32]);
let kSig_v_f = makeSig([kWasmF32], []);
let kSig_f_f = makeSig([kWasmF32], [kWasmF32]);
let kSig_f_d = makeSig([kWasmF64], [kWasmF32]);
let kSig_d_d = makeSig([kWasmF64], [kWasmF64]);
+let kSig_r_r = makeSig([kWasmAnyRef], [kWasmAnyRef]);
+let kSig_a_a = makeSig([kWasmAnyFunc], [kWasmAnyFunc]);
+let kSig_e_e = makeSig([kWasmExnRef], [kWasmExnRef]);
+let kSig_i_r = makeSig([kWasmAnyRef], [kWasmI32]);
+let kSig_v_r = makeSig([kWasmAnyRef], []);
+let kSig_v_a = makeSig([kWasmAnyFunc], []);
+let kSig_v_e = makeSig([kWasmExnRef], []);
+let kSig_v_rr = makeSig([kWasmAnyRef, kWasmAnyRef], []);
+let kSig_v_aa = makeSig([kWasmAnyFunc, kWasmAnyFunc], []);
+let kSig_r_v = makeSig([], [kWasmAnyRef]);
+let kSig_a_v = makeSig([], [kWasmAnyFunc]);
+let kSig_a_i = makeSig([kWasmI32], [kWasmAnyFunc]);
+let kSig_e_v = makeSig([], [kWasmExnRef]);
function makeSig(params, results) {
return {params: params, results: results};
@@ -163,6 +197,8 @@ let kExprElse = 0x05;
let kExprTry = 0x06;
let kExprCatch = 0x07;
let kExprThrow = 0x08;
+let kExprRethrow = 0x09;
+let kExprBrOnExn = 0x0a;
let kExprEnd = 0x0b;
let kExprBr = 0x0c;
let kExprBrIf = 0x0d;
@@ -170,13 +206,17 @@ let kExprBrTable = 0x0e;
let kExprReturn = 0x0f;
let kExprCallFunction = 0x10;
let kExprCallIndirect = 0x11;
+let kExprReturnCall = 0x12;
+let kExprReturnCallIndirect = 0x13;
let kExprDrop = 0x1a;
let kExprSelect = 0x1b;
-let kExprGetLocal = 0x20;
-let kExprSetLocal = 0x21;
-let kExprTeeLocal = 0x22;
-let kExprGetGlobal = 0x23;
-let kExprSetGlobal = 0x24;
+let kExprLocalGet = 0x20;
+let kExprLocalSet = 0x21;
+let kExprLocalTee = 0x22;
+let kExprGlobalGet = 0x23;
+let kExprGlobalSet = 0x24;
+let kExprTableGet = 0x25;
+let kExprTableSet = 0x26;
let kExprI32LoadMem = 0x28;
let kExprI64LoadMem = 0x29;
let kExprF32LoadMem = 0x2a;
@@ -329,6 +369,108 @@ let kExprI32ReinterpretF32 = 0xbc;
let kExprI64ReinterpretF64 = 0xbd;
let kExprF32ReinterpretI32 = 0xbe;
let kExprF64ReinterpretI64 = 0xbf;
+let kExprI32SExtendI8 = 0xc0;
+let kExprI32SExtendI16 = 0xc1;
+let kExprI64SExtendI8 = 0xc2;
+let kExprI64SExtendI16 = 0xc3;
+let kExprI64SExtendI32 = 0xc4;
+let kExprRefNull = 0xd0;
+let kExprRefIsNull = 0xd1;
+let kExprRefFunc = 0xd2;
+
+// Prefix opcodes
+let kNumericPrefix = 0xfc;
+let kSimdPrefix = 0xfd;
+let kAtomicPrefix = 0xfe;
+
+// Numeric opcodes.
+let kExprMemoryInit = 0x08;
+let kExprDataDrop = 0x09;
+let kExprMemoryCopy = 0x0a;
+let kExprMemoryFill = 0x0b;
+let kExprTableInit = 0x0c;
+let kExprElemDrop = 0x0d;
+let kExprTableCopy = 0x0e;
+let kExprTableGrow = 0x0f;
+let kExprTableSize = 0x10;
+let kExprTableFill = 0x11;
+
+// Atomic opcodes.
+let kExprAtomicNotify = 0x00;
+let kExprI32AtomicWait = 0x01;
+let kExprI64AtomicWait = 0x02;
+let kExprI32AtomicLoad = 0x10;
+let kExprI32AtomicLoad8U = 0x12;
+let kExprI32AtomicLoad16U = 0x13;
+let kExprI32AtomicStore = 0x17;
+let kExprI32AtomicStore8U = 0x19;
+let kExprI32AtomicStore16U = 0x1a;
+let kExprI32AtomicAdd = 0x1e;
+let kExprI32AtomicAdd8U = 0x20;
+let kExprI32AtomicAdd16U = 0x21;
+let kExprI32AtomicSub = 0x25;
+let kExprI32AtomicSub8U = 0x27;
+let kExprI32AtomicSub16U = 0x28;
+let kExprI32AtomicAnd = 0x2c;
+let kExprI32AtomicAnd8U = 0x2e;
+let kExprI32AtomicAnd16U = 0x2f;
+let kExprI32AtomicOr = 0x33;
+let kExprI32AtomicOr8U = 0x35;
+let kExprI32AtomicOr16U = 0x36;
+let kExprI32AtomicXor = 0x3a;
+let kExprI32AtomicXor8U = 0x3c;
+let kExprI32AtomicXor16U = 0x3d;
+let kExprI32AtomicExchange = 0x41;
+let kExprI32AtomicExchange8U = 0x43;
+let kExprI32AtomicExchange16U = 0x44;
+let kExprI32AtomicCompareExchange = 0x48;
+let kExprI32AtomicCompareExchange8U = 0x4a;
+let kExprI32AtomicCompareExchange16U = 0x4b;
+
+let kExprI64AtomicLoad = 0x11;
+let kExprI64AtomicLoad8U = 0x14;
+let kExprI64AtomicLoad16U = 0x15;
+let kExprI64AtomicLoad32U = 0x16;
+let kExprI64AtomicStore = 0x18;
+let kExprI64AtomicStore8U = 0x1b;
+let kExprI64AtomicStore16U = 0x1c;
+let kExprI64AtomicStore32U = 0x1d;
+let kExprI64AtomicAdd = 0x1f;
+let kExprI64AtomicAdd8U = 0x22;
+let kExprI64AtomicAdd16U = 0x23;
+let kExprI64AtomicAdd32U = 0x24;
+let kExprI64AtomicSub = 0x26;
+let kExprI64AtomicSub8U = 0x29;
+let kExprI64AtomicSub16U = 0x2a;
+let kExprI64AtomicSub32U = 0x2b;
+let kExprI64AtomicAnd = 0x2d;
+let kExprI64AtomicAnd8U = 0x30;
+let kExprI64AtomicAnd16U = 0x31;
+let kExprI64AtomicAnd32U = 0x32;
+let kExprI64AtomicOr = 0x34;
+let kExprI64AtomicOr8U = 0x37;
+let kExprI64AtomicOr16U = 0x38;
+let kExprI64AtomicOr32U = 0x39;
+let kExprI64AtomicXor = 0x3b;
+let kExprI64AtomicXor8U = 0x3e;
+let kExprI64AtomicXor16U = 0x3f;
+let kExprI64AtomicXor32U = 0x40;
+let kExprI64AtomicExchange = 0x42;
+let kExprI64AtomicExchange8U = 0x45;
+let kExprI64AtomicExchange16U = 0x46;
+let kExprI64AtomicExchange32U = 0x47;
+let kExprI64AtomicCompareExchange = 0x49
+let kExprI64AtomicCompareExchange8U = 0x4c;
+let kExprI64AtomicCompareExchange16U = 0x4d;
+let kExprI64AtomicCompareExchange32U = 0x4e;
+
+// Simd opcodes.
+let kExprS128LoadMem = 0x00;
+let kExprS128StoreMem = 0x01;
+let kExprI32x4Splat = 0x0c;
+let kExprI32x4Eq = 0x2c;
+let kExprS1x4AllTrue = 0x75;
+let kExprF32x4Min = 0x9e;
class Binary {
constructor() {
@@ -346,7 +488,7 @@ class Binary {
}
trunc_buffer() {
- return this.buffer = this.buffer.slice(0, this.length);
+ return new Uint8Array(this.buffer.buffer, 0, this.length);
}
reset() {
@@ -372,7 +514,7 @@ class Binary {
this.buffer[this.length++] = val >> 24;
}
- emit_leb(val, max_len) {
+ emit_leb_u(val, max_len) {
this.ensure_space(max_len);
for (let i = 0; i < max_len; ++i) {
let v = val & 0xff;
@@ -387,11 +529,11 @@ class Binary {
}
emit_u32v(val) {
- this.emit_leb(val, kMaxVarInt32Size);
+ this.emit_leb_u(val, kMaxVarInt32Size);
}
emit_u64v(val) {
- this.emit_leb(val, kMaxVarInt64Size);
+ this.emit_leb_u(val, kMaxVarInt64Size);
}
emit_bytes(data) {
@@ -443,6 +585,16 @@ class WasmFunctionBuilder {
this.name = name;
this.type_index = type_index;
this.body = [];
+ this.locals = [];
+ this.local_names = [];
+ }
+
+ numLocalNames() {
+ let num_local_names = 0;
+ for (let loc_name of this.local_names) {
+ if (loc_name !== undefined) ++num_local_names;
+ }
+ return num_local_names;
}
exportAs(name) {
@@ -456,9 +608,14 @@ class WasmFunctionBuilder {
}
addBody(body) {
- const bodyCopy = body.slice();
- bodyCopy.push(kExprEnd);
- return this.addBodyWithEnd(bodyCopy);
+ for (let b of body) {
+ if (typeof b !== 'number' || (b & (~0xFF)) !== 0 )
+ throw new Error('invalid body (entries must be 8 bit numbers): ' + body);
+ }
+ this.body = body.slice();
+ // Automatically add the end for the function block to the body.
+ this.body.push(kExprEnd);
+ return this;
}
addBodyWithEnd(body) {
@@ -466,8 +623,23 @@ class WasmFunctionBuilder {
return this;
}
- addLocals(locals) {
- this.locals = locals;
+ getNumLocals() {
+ let total_locals = 0;
+ for (let l of this.locals) {
+ for (let type of ["i32", "i64", "f32", "f64", "s128"]) {
+ total_locals += l[type + "_count"] || 0;
+ }
+ }
+ return total_locals;
+ }
+
+ addLocals(locals, names) {
+ const old_num_locals = this.getNumLocals();
+ this.locals.push(locals);
+ if (names) {
+ const missing_names = old_num_locals - this.local_names.length;
+ this.local_names.push(...new Array(missing_names), ...names);
+ }
return this;
}
@@ -491,21 +663,38 @@ class WasmGlobalBuilder {
}
}
+class WasmTableBuilder {
+ constructor(module, type, initial_size, max_size) {
+ this.module = module;
+ this.type = type;
+ this.initial_size = initial_size;
+ this.has_max = max_size != undefined;
+ this.max_size = max_size;
+ }
+
+ exportAs(name) {
+ this.module.exports.push({name: name, kind: kExternalTable,
+ index: this.index});
+ return this;
+ }
+}
+
class WasmModuleBuilder {
constructor() {
this.types = [];
this.imports = [];
this.exports = [];
this.globals = [];
+ this.tables = [];
+ this.exceptions = [];
this.functions = [];
- this.table_length_min = 0;
- this.table_length_max = undefined;
this.element_segments = [];
this.data_segments = [];
- this.segments = [];
this.explicit = [];
this.num_imported_funcs = 0;
this.num_imported_globals = 0;
+ this.num_imported_tables = 0;
+ this.num_imported_exceptions = 0;
return this;
}
@@ -514,8 +703,8 @@ class WasmModuleBuilder {
return this;
}
- addMemory(min, max, exp) {
- this.memory = {min: min, max: max, exp: exp};
+ addMemory(min, max, exp, shared) {
+ this.memory = {min: min, max: max, exp: exp, shared: shared};
return this;
}
@@ -524,6 +713,26 @@ class WasmModuleBuilder {
return this;
}
+ stringToBytes(name) {
+ var result = new Binary();
+ result.emit_string(name);
+ return result.trunc_buffer()
+ }
+
+ createCustomSection(name, bytes) {
+ name = this.stringToBytes(name);
+ var section = new Binary();
+ section.emit_u8(kUnknownSectionCode);
+ section.emit_u32v(name.length + bytes.length);
+ section.emit_bytes(name);
+ section.emit_bytes(bytes);
+ return section.trunc_buffer();
+ }
+
+ addCustomSection(name, bytes) {
+ this.explicit.push(this.createCustomSection(name, bytes));
+ }
+
addType(type) {
this.types.push(type);
var pl = type.params.length; // should have params
@@ -538,6 +747,24 @@ class WasmModuleBuilder {
return glob;
}
+ addTable(type, initial_size, max_size = undefined) {
+ if (type != kWasmAnyRef && type != kWasmAnyFunc && type != kWasmExnRef) {
+ throw new Error(
+ 'Tables must be of type kWasmAnyRef, kWasmAnyFunc, or kWasmExnRef');
+ }
+ let table = new WasmTableBuilder(this, type, initial_size, max_size);
+ table.index = this.tables.length + this.num_imported_tables;
+ this.tables.push(table);
+ return table;
+ }
+
+ addException(type) {
+ let type_index = (typeof type) == "number" ? type : this.addType(type);
+ let except_index = this.exceptions.length + this.num_imported_exceptions;
+ this.exceptions.push(type_index);
+ return except_index;
+ }
+
addFunction(name, type) {
let type_index = (typeof type) == "number" ? type : this.addType(type);
let func = new WasmFunctionBuilder(this, name, type_index);
@@ -547,6 +774,9 @@ class WasmModuleBuilder {
}
addImport(module, name, type) {
+ if (this.functions.length != 0) {
+ throw new Error('Imported functions must be declared before local ones');
+ }
let type_index = (typeof type) == "number" ? type : this.addType(type);
this.imports.push({module: module, name: name, kind: kExternalFunction,
type: type_index});
@@ -554,23 +784,40 @@ class WasmModuleBuilder {
}
addImportedGlobal(module, name, type, mutable = false) {
+ if (this.globals.length != 0) {
+ throw new Error('Imported globals must be declared before local ones');
+ }
let o = {module: module, name: name, kind: kExternalGlobal, type: type,
mutable: mutable};
this.imports.push(o);
return this.num_imported_globals++;
}
- addImportedMemory(module, name, initial = 0, maximum) {
+ addImportedMemory(module, name, initial = 0, maximum, shared) {
let o = {module: module, name: name, kind: kExternalMemory,
- initial: initial, maximum: maximum};
+ initial: initial, maximum: maximum, shared: shared};
this.imports.push(o);
return this;
}
- addImportedTable(module, name, initial, maximum) {
+ addImportedTable(module, name, initial, maximum, type) {
+ if (this.tables.length != 0) {
+ throw new Error('Imported tables must be declared before local ones');
+ }
let o = {module: module, name: name, kind: kExternalTable, initial: initial,
- maximum: maximum};
+ maximum: maximum, type: type || kWasmAnyFunctionTypeForm};
+ this.imports.push(o);
+ return this.num_imported_tables++;
+ }
+
+ addImportedException(module, name, type) {
+ if (this.exceptions.length != 0) {
+ throw new Error('Imported exceptions must be declared before local ones');
+ }
+ let type_index = (typeof type) == "number" ? type : this.addType(type);
+ let o = {module: module, name: name, kind: kExternalException, type: type_index};
this.imports.push(o);
+ return this.num_imported_exceptions++;
}
addExport(name, index) {
@@ -585,7 +832,12 @@ class WasmModuleBuilder {
addDataSegment(addr, data, is_global = false) {
this.data_segments.push(
- {addr: addr, data: data, is_global: is_global});
+ {addr: addr, data: data, is_global: is_global, is_active: true});
+ return this.data_segments.length - 1;
+ }
+
+ addPassiveDataSegment(data) {
+ this.data_segments.push({data: data, is_active: false});
return this.data_segments.length - 1;
}
@@ -593,18 +845,14 @@ class WasmModuleBuilder {
this.exports.push({name: name, kind: kExternalMemory, index: 0});
}
- addElementSegment(base, is_global, array, is_import = false) {
- this.element_segments.push({base: base, is_global: is_global,
- array: array});
- if (!is_global) {
- var length = base + array.length;
- if (length > this.table_length_min && !is_import) {
- this.table_length_min = length;
- }
- if (length > this.table_length_max && !is_import) {
- this.table_length_max = length;
- }
- }
+ addElementSegment(table, base, is_global, array) {
+ this.element_segments.push({table: table, base: base, is_global: is_global,
+ array: array, is_active: true});
+ return this;
+ }
+
+ addPassiveElementSegment(array, is_import = false) {
+ this.element_segments.push({array: array, is_active: false});
return this;
}
@@ -613,12 +861,30 @@ class WasmModuleBuilder {
if (typeof n != 'number')
throw new Error('invalid table (entries have to be numbers): ' + array);
}
- return this.addElementSegment(this.table_length_min, false, array);
+ if (this.tables.length == 0) {
+ this.addTable(kWasmAnyFunc, 0);
+ }
+ // Adjust the table to the correct size.
+ let table = this.tables[0];
+ const base = table.initial_size;
+ const table_size = base + array.length;
+ table.initial_size = table_size;
+ if (table.has_max && table_size > table.max_size) {
+ table.max_size = table_size;
+ }
+ return this.addElementSegment(0, base, false, array);
}
setTableBounds(min, max = undefined) {
- this.table_length_min = min;
- this.table_length_max = max;
+ if (this.tables.length != 0) {
+ throw new Error("The table bounds of table '0' have already been set.");
+ }
+ this.addTable(kWasmAnyFunc, min, max);
+ return this;
+ }
+
+ setName(name) {
+ this.name = name;
return this;
}
@@ -664,15 +930,23 @@ class WasmModuleBuilder {
section.emit_u8(imp.mutable);
} else if (imp.kind == kExternalMemory) {
var has_max = (typeof imp.maximum) != "undefined";
- section.emit_u8(has_max ? 1 : 0); // flags
+ var is_shared = (typeof imp.shared) != "undefined";
+ if (is_shared) {
+ section.emit_u8(has_max ? 3 : 2); // flags
+ } else {
+ section.emit_u8(has_max ? 1 : 0); // flags
+ }
section.emit_u32v(imp.initial); // initial
if (has_max) section.emit_u32v(imp.maximum); // maximum
} else if (imp.kind == kExternalTable) {
- section.emit_u8(kWasmAnyFunctionTypeForm);
+ section.emit_u8(imp.type);
var has_max = (typeof imp.maximum) != "undefined";
section.emit_u8(has_max ? 1 : 0); // flags
section.emit_u32v(imp.initial); // initial
if (has_max) section.emit_u32v(imp.maximum); // maximum
+ } else if (imp.kind == kExternalException) {
+ section.emit_u32v(kExceptionAttribute);
+ section.emit_u32v(imp.type);
} else {
throw new Error("unknown/unsupported import kind " + imp.kind);
}
@@ -681,31 +955,27 @@ class WasmModuleBuilder {
}
// Add functions declarations
- let has_names = false;
- let names = false;
if (wasm.functions.length > 0) {
if (debug) print("emitting function decls @ " + binary.length);
binary.emit_section(kFunctionSectionCode, section => {
section.emit_u32v(wasm.functions.length);
for (let func of wasm.functions) {
- has_names = has_names || (func.name != undefined &&
- func.name.length > 0);
section.emit_u32v(func.type_index);
}
});
}
// Add table section
- if (wasm.table_length_min > 0) {
- if (debug) print("emitting table @ " + binary.length);
+ if (wasm.tables.length > 0) {
+ if (debug) print ("emitting tables @ " + binary.length);
binary.emit_section(kTableSectionCode, section => {
- section.emit_u8(1); // one table entry
- section.emit_u8(kWasmAnyFunctionTypeForm);
- const max = wasm.table_length_max;
- const has_max = max !== undefined;
- section.emit_u8(has_max ? kHasMaximumFlag : 0);
- section.emit_u32v(wasm.table_length_min);
- if (has_max) section.emit_u32v(max);
+ section.emit_u32v(wasm.tables.length);
+ for (let table of wasm.tables) {
+ section.emit_u8(table.type);
+ section.emit_u8(table.has_max);
+ section.emit_u32v(table.initial_size);
+ if (table.has_max) section.emit_u32v(table.max_size);
+ }
});
}
@@ -715,7 +985,13 @@ class WasmModuleBuilder {
binary.emit_section(kMemorySectionCode, section => {
section.emit_u8(1); // one memory entry
const has_max = wasm.memory.max !== undefined;
- section.emit_u8(has_max ? 1 : 0);
+ const is_shared = wasm.memory.shared !== undefined;
+ // Emit flags (bit 0: reszeable max, bit 1: shared memory)
+ if (is_shared) {
+ section.emit_u8(has_max ? kSharedHasMaximumFlag : 2);
+ } else {
+ section.emit_u8(has_max ? kHasMaximumFlag : 0);
+ }
section.emit_u32v(wasm.memory.min);
if (has_max) section.emit_u32v(wasm.memory.max);
});
@@ -738,7 +1014,7 @@ class WasmModuleBuilder {
break;
case kWasmI64:
section.emit_u8(kExprI64Const);
- section.emit_u8(global.init);
+ section.emit_u64v(global.init);
break;
case kWasmF32:
section.emit_u8(kExprF32Const);
@@ -750,10 +1026,22 @@ class WasmModuleBuilder {
f64_view[0] = global.init;
section.emit_bytes(f64_bytes_view);
break;
+ case kWasmAnyFunc:
+ case kWasmAnyRef:
+ if (global.function_index !== undefined) {
+ section.emit_u8(kExprRefFunc);
+ section.emit_u32v(global.function_index);
+ } else {
+ section.emit_u8(kExprRefNull);
+ }
+ break;
+ case kWasmExnRef:
+ section.emit_u8(kExprRefNull);
+ break;
}
} else {
// Emit a global-index initializer.
- section.emit_u8(kExprGetGlobal);
+ section.emit_u8(kExprGlobalGet);
section.emit_u32v(global.init_index);
}
section.emit_u8(kExprEnd); // end of init expression
@@ -761,6 +1049,18 @@ class WasmModuleBuilder {
});
}
+ // Add exceptions.
+ if (wasm.exceptions.length > 0) {
+ if (debug) print("emitting exceptions @ " + binary.length);
+ binary.emit_section(kExceptionSectionCode, section => {
+ section.emit_u32v(wasm.exceptions.length);
+ for (let type of wasm.exceptions) {
+ section.emit_u32v(kExceptionAttribute);
+ section.emit_u32v(type);
+ }
+ });
+ }
+
// Add export table.
var mem_export = (wasm.memory !== undefined && wasm.memory.exp);
var exports_count = wasm.exports.length + (mem_export ? 1 : 0);
@@ -797,22 +1097,55 @@ class WasmModuleBuilder {
section.emit_u32v(inits.length);
for (let init of inits) {
- section.emit_u8(0); // table index / flags
- if (init.is_global) {
- section.emit_u8(kExprGetGlobal);
+ if (init.is_active) {
+ // Active segment.
+ if (init.table == 0) {
+ section.emit_u32v(kActiveNoIndex);
+ } else {
+ section.emit_u32v(kActiveWithIndex);
+ section.emit_u32v(init.table);
+ }
+ if (init.is_global) {
+ section.emit_u8(kExprGlobalGet);
+ } else {
+ section.emit_u8(kExprI32Const);
+ }
+ section.emit_u32v(init.base);
+ section.emit_u8(kExprEnd);
+ if (init.table != 0) {
+ section.emit_u8(kExternalFunction);
+ }
+ section.emit_u32v(init.array.length);
+ for (let index of init.array) {
+ section.emit_u32v(index);
+ }
} else {
- section.emit_u8(kExprI32Const);
- }
- section.emit_u32v(init.base);
- section.emit_u8(kExprEnd);
- section.emit_u32v(init.array.length);
- for (let index of init.array) {
- section.emit_u32v(index);
+ // Passive segment.
+ section.emit_u8(kPassiveWithElements); // flags
+ section.emit_u8(kWasmAnyFunc);
+ section.emit_u32v(init.array.length);
+ for (let index of init.array) {
+ if (index === null) {
+ section.emit_u8(kExprRefNull);
+ section.emit_u8(kExprEnd);
+ } else {
+ section.emit_u8(kExprRefFunc);
+ section.emit_u32v(index);
+ section.emit_u8(kExprEnd);
+ }
+ }
}
}
});
}
+ // If there are any passive data segments, add the DataCount section.
+ if (wasm.data_segments.some(seg => !seg.is_active)) {
+ binary.emit_section(kDataCountSectionCode, section => {
+ section.emit_u32v(wasm.data_segments.length);
+ });
+ }
+
// Add function bodies.
if (wasm.functions.length > 0) {
// emit function bodies
@@ -824,9 +1157,7 @@ class WasmModuleBuilder {
header.reset();
// Function body length will be patched later.
let local_decls = [];
- let l = func.locals;
- if (l != undefined) {
- let local_decls_count = 0;
+ for (let l of func.locals || []) {
if (l.i32_count > 0) {
local_decls.push({count: l.i32_count, type: kWasmI32});
}
@@ -839,6 +1170,18 @@ class WasmModuleBuilder {
if (l.f64_count > 0) {
local_decls.push({count: l.f64_count, type: kWasmF64});
}
+ if (l.s128_count > 0) {
+ local_decls.push({count: l.s128_count, type: kWasmS128});
+ }
+ if (l.anyref_count > 0) {
+ local_decls.push({count: l.anyref_count, type: kWasmAnyRef});
+ }
+ if (l.anyfunc_count > 0) {
+ local_decls.push({count: l.anyfunc_count, type: kWasmAnyFunc});
+ }
+ if (l.except_count > 0) {
+ local_decls.push({count: l.except_count, type: kWasmExnRef});
+ }
}
header.emit_u32v(local_decls.length);
@@ -860,17 +1203,21 @@ class WasmModuleBuilder {
binary.emit_section(kDataSectionCode, section => {
section.emit_u32v(wasm.data_segments.length);
for (let seg of wasm.data_segments) {
- section.emit_u8(0); // linear memory index 0 / flags
- if (seg.is_global) {
- // initializer is a global variable
- section.emit_u8(kExprGetGlobal);
- section.emit_u32v(seg.addr);
+ if (seg.is_active) {
+ section.emit_u8(0); // linear memory index 0 / flags
+ if (seg.is_global) {
+ // initializer is a global variable
+ section.emit_u8(kExprGlobalGet);
+ section.emit_u32v(seg.addr);
+ } else {
+ // initializer is a constant
+ section.emit_u8(kExprI32Const);
+ section.emit_u32v(seg.addr);
+ }
+ section.emit_u8(kExprEnd);
} else {
- // initializer is a constant
- section.emit_u8(kExprI32Const);
- section.emit_u32v(seg.addr);
+ section.emit_u8(kPassive); // flags
}
- section.emit_u8(kExprEnd);
section.emit_u32v(seg.data.length);
section.emit_bytes(seg.data);
}
@@ -883,21 +1230,50 @@ class WasmModuleBuilder {
binary.emit_bytes(exp);
}
- // Add function names.
- if (has_names) {
- if (debug) print("emitting names @ " + binary.length);
+ // Add names.
+ let num_function_names = 0;
+ let num_functions_with_local_names = 0;
+ for (let func of wasm.functions) {
+ if (func.name !== undefined) ++num_function_names;
+ if (func.numLocalNames() > 0) ++num_functions_with_local_names;
+ }
+ if (num_function_names > 0 || num_functions_with_local_names > 0 ||
+ wasm.name !== undefined) {
+ if (debug) print('emitting names @ ' + binary.length);
binary.emit_section(kUnknownSectionCode, section => {
- section.emit_string("name");
- var count = wasm.functions.length + wasm.num_imported_funcs;
- section.emit_u32v(count);
- for (var i = 0; i < wasm.num_imported_funcs; i++) {
- section.emit_u8(0); // empty string
- section.emit_u8(0); // local names count == 0
+ section.emit_string('name');
+ // Emit module name.
+ if (wasm.name !== undefined) {
+ section.emit_section(kModuleNameCode, name_section => {
+ name_section.emit_string(wasm.name);
+ });
}
- for (let func of wasm.functions) {
- var name = func.name == undefined ? "" : func.name;
- section.emit_string(name);
- section.emit_u8(0); // local names count == 0
+ // Emit function names.
+ if (num_function_names > 0) {
+ section.emit_section(kFunctionNamesCode, name_section => {
+ name_section.emit_u32v(num_function_names);
+ for (let func of wasm.functions) {
+ if (func.name === undefined) continue;
+ name_section.emit_u32v(func.index);
+ name_section.emit_string(func.name);
+ }
+ });
+ }
+ // Emit local names.
+ if (num_functions_with_local_names > 0) {
+ section.emit_section(kLocalNamesCode, name_section => {
+ name_section.emit_u32v(num_functions_with_local_names);
+ for (let func of wasm.functions) {
+ if (func.numLocalNames() == 0) continue;
+ name_section.emit_u32v(func.index);
+ name_section.emit_u32v(func.numLocalNames());
+ for (let i = 0; i < func.local_names.length; ++i) {
+ if (func.local_names[i] === undefined) continue;
+ name_section.emit_u32v(i);
+ name_section.emit_string(func.local_names[i]);
+ }
+ }
+ });
}
});
}
@@ -925,13 +1301,24 @@ class WasmModuleBuilder {
}
}
-function wasmI32Const(val) {
- let bytes = [kExprI32Const];
- for (let i = 0; i < 4; ++i) {
- bytes.push(0x80 | ((val >> (7 * i)) & 0x7f));
+function wasmSignedLeb(val, max_len = 5) {
+ let res = [];
+ for (let i = 0; i < max_len; ++i) {
+ let v = val & 0x7f;
+ // If {v} sign-extended from 7 to 32 bits is equal to val, we are done.
+ if (((v << 25) >> 25) == val) {
+ res.push(v);
+ return res;
+ }
+ res.push(v | 0x80);
+ val = val >> 7;
}
- bytes.push((val >> (7 * 4)) & 0x7f);
- return bytes;
+ throw new Error(
+ 'Leb value <' + val + '> exceeds maximum length of ' + max_len);
+}
+
+function wasmI32Const(val) {
+ return [kExprI32Const, ...wasmSignedLeb(val, 5)];
}
function wasmF32Const(f) {
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html
index c5179a72c9d..65f89b3e04c 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/reverse-running-animation.html
@@ -5,6 +5,7 @@
<title>reverse running animation</title>
<link rel="match" href="reverse-running-animation-ref.html">
<script src="/common/reftest-wait.js"></script>
+<script src="../../testcommon.js"></script>
<style>
#box, #overlay {
/* Add a border to ensure that anti-aliasing does not leak blue pixels
@@ -44,24 +45,25 @@
</p>
</body>
<script>
- onload = function() {
+ onload = async function() {
// Double rAF to ensure that we are not bogged down during initialization
// and the compositor is ready.
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- const elem = document.getElementById('box');
- const anim = elem.animate([
- { transform: 'translateX(100px)' },
- { transform: 'translateX(100px)' },
- { transform: 'translateX(200px)' },
- { transform: 'translateX(200px)' }
- ], {
- duration: 1000
- });
- setTimeout(() => {
+ waitForAnimationFrames(2).then(() => {
+ const elem = document.getElementById('box');
+ const anim = elem.animate([
+ { transform: 'translateX(100px)' },
+ { transform: 'translateX(100px)', offset: 0.49 },
+ { transform: 'translateX(200px)', offset: 0.51 },
+ { transform: 'translateX(200px)' }
+ ], {
+ duration: 10000,
+ });
+ anim.ready.then(() => {
+ anim.currentTime = 5000;
+ requestAnimationFrame(() => {
anim.reverse();
- }, 500);
- takeScreenshotDelayed(900);
+ takeScreenshotDelayed(1000);
+ });
});
});
};
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html
index 0522c43b16a..a1f9e4f3ace 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/setting-the-playback-rate-of-an-animation.html
@@ -97,8 +97,8 @@ promise_test(async t => {
promise_test(async t => {
const animation = createDiv(t).animate(null, 100 * MS_PER_SEC);
- animation.currentTime = 50 * MS_PER_SEC;
await animation.ready;
+ animation.currentTime = 50 * MS_PER_SEC;
animation.playbackRate = 0;
// Ensure that current time does not drift.
assert_equals(animation.playState, 'running');
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
index 1c842f5c7b6..4e53828c310 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html
@@ -12,11 +12,21 @@
}, 'NDEFMessage constructor without init dict');
test(() => {
- const message = new NDEFMessage(null);
- assert_equals(message.records.length, 0, 'empty records');
+ assert_throws(new TypeError, () => new NDEFMessage(null),
+ 'NDEFMessageInit#records is a required field.');
}, 'NDEFMessage constructor with null init dict');
test(() => {
+ assert_throws(new TypeError, () => new NDEFMessage({dummy_key: 'dummy_value'}),
+ 'NDEFMessageInit#records is a required field.');
+ }, 'NDEFMessage constructor without NDEFMessageInit#records field');
+
+ test(() => {
+ assert_throws(new TypeError, () => new NDEFMessage({records: []}),
+ 'NDEFMessageInit#records should not be empty.');
+ }, 'NDEFMessage constructor with NDEFMessageInit#records being empty');
+
+ test(() => {
const message = new NDEFMessage(
createMessage([createTextRecord(test_text_data)]));
assert_equals(message.records.length, 1, 'one text record');
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html
index a9b1d751617..17b9fdb8569 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFReader_scan.https.html
@@ -207,4 +207,27 @@ nfc_test(async (t, mockNFC) => {
}, "Test that NDEFReader.onreading should be fired on an unformatted NFC tag \
with empty records array for NDEFMessage.");
+nfc_test(async (t, mockNFC) => {
+ const reader = new NDEFReader();
+ const controller = new AbortController();
+ const message = createMessage([createTextRecord(test_text_data),
+ createMimeRecordFromJson(test_json_data),
+ createMimeRecord(test_buffer_data),
+ createUnknownRecord(test_buffer_data),
+ createUrlRecord(test_url_data),
+ createUrlRecord(test_url_data, true),
+ createRecord('w3.org:xyz', test_buffer_data)],
+ test_message_origin);
+ const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]);
+ const promise = readerWatcher.wait_for("reading").then(event => {
+ assert_equals(event.serialNumber, fake_tag_serial_number);
+ assertWebNDEFMessagesEqual(event.message, new NDEFMessage(message));
+ controller.abort();
+ });
+ await reader.scan({signal : controller.signal});
+
+ mockNFC.setReadingMessage(message);
+ await promise;
+}, "Test that reading message with multiple records should succeed.");
+
</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html
index cc56f8a18bd..5427b75ae2b 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFReadingEvent_constructor.https.html
@@ -12,6 +12,12 @@
}, 'NDEFReadingEvent constructor without init dict');
test(() => {
+ assert_throws(new TypeError, () => new NDEFReadingEvent('type',
+ {serialNumber: '', message: null}),
+ 'NDEFMessageInit#records is a required field.');
+ }, 'NDEFReadingEvent constructor failed to construct its NDEFMessage');
+
+ test(() => {
const message = createMessage([createMimeRecordFromJson(test_buffer_data)]);
const event = new NDEFReadingEvent('type', {serialNumber: null, message: message});
assert_equals(event.serialNumber, '', 'serialNumber');
@@ -24,11 +30,6 @@
}, 'NDEFReadingEvent constructor with serialNumber not present');
test(() => {
- const event = new NDEFReadingEvent('type', {serialNumber: '', message: null});
- assert_equals(0, event.message.records.length, 'no records');
- }, 'NDEFReadingEvent constructor with null message');
-
- test(() => {
const message = createMessage([createMimeRecord(test_buffer_data)]);
const event = new NDEFReadingEvent('type', {serialNumber: '', message: message});
assert_equals(event.type, 'type', 'type');
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
index d46503ab172..2da7ca91078 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html
@@ -13,10 +13,15 @@
test(() => {
assert_throws(new TypeError, () => new NDEFRecord(null),
- 'The record has neither type nor data.');
+ 'NDEFRecordInit#recordType is a required field.');
}, 'NDEFRecord constructor with null init dict');
test(() => {
+ assert_throws(new TypeError, () => new NDEFRecord({id: test_record_id, data: test_text_data}),
+ 'NDEFRecordInit#recordType is a required field.');
+ }, 'NDEFRecord constructor without NDEFRecordInit#recordType field');
+
+ test(() => {
assert_throws(new TypeError, () => new NDEFRecord(
createRecord('empty', test_text_data, test_record_id)),
'id does not apply for empty record type.');
@@ -260,15 +265,15 @@
test(() => {
assert_throws(new TypeError, () => new NDEFRecord(
- createRecord('foo.eXamPle.coM:bAr*-', "A string is not a BufferSource or NDEFMessage")),
+ createRecord('foo.eXamPle.com:bAr*-', "A string is not a BufferSource or NDEFMessage")),
'Only BufferSource and NDEFMessage are allowed to be the record data.');
let buffer = new ArrayBuffer(4);
new Uint8Array(buffer).set([1, 2, 3, 4]);
// Feed ArrayBuffer.
{
- const record = new NDEFRecord(createRecord('foo.eXamPle.coM:bAr*-', buffer, test_record_id));
- assert_equals(record.recordType, 'foo.example.com:bAr*-', 'recordType');
+ const record = new NDEFRecord(createRecord('foo.eXamPle.com:bAr*-', buffer, test_record_id));
+ assert_equals(record.recordType, 'foo.eXamPle.com:bAr*-', 'recordType');
assert_equals(record.mediaType, null, 'mediaType');
assert_equals(record.id, test_record_id, 'id');
assert_array_equals(new Uint8Array(record.data.buffer), [1, 2, 3, 4],
@@ -280,8 +285,8 @@
{
let buffer_view = new Uint8Array(buffer, 1);
const record = new NDEFRecord(createRecord(
- 'foo.eXamPle.coM:bAr*-', buffer_view, test_record_id));
- assert_equals(record.recordType, 'foo.example.com:bAr*-', 'recordType');
+ 'foo.eXamPle.com:bAr*-', buffer_view, test_record_id));
+ assert_equals(record.recordType, 'foo.eXamPle.com:bAr*-', 'recordType');
assert_equals(record.mediaType, null, 'mediaType');
assert_equals(record.id, test_record_id, 'id');
assert_array_equals(new Uint8Array(record.data.buffer), [2, 3, 4],
@@ -305,13 +310,23 @@
}, 'NDEFRecord constructor with record type string being treated as case sensitive');
test(() => {
+ // Length of the external type is 255, OK.
+ const record = new NDEFRecord(createRecord(
+ [...Array(251)].map(_ => 'a').join('') + ':xyz', test_buffer_data));
+ // Exceeding 255, Throws.
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
- ':xyz', test_buffer_data)), 'The domain should not be empty.');
+ [...Array(252)].map(_ => 'a').join('') + ':xyz', test_buffer_data)),
+ 'The external type should not be longer than 255.');
+
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
- '[:xyz', test_buffer_data)), '"[" is not a valid FQDN.');
+ 'xyz', test_buffer_data)), 'The external type must have a \':\'.');
+ assert_throws(new TypeError, () => new NDEFRecord(createRecord(
+ ':xyz', test_buffer_data)), 'The domain should not be empty.');
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
'example.com:', test_buffer_data)), 'The type should not be empty.');
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
+ 'example.com:xyz[', test_buffer_data)), 'The type should not contain \'[\'.');
+ assert_throws(new TypeError, () => new NDEFRecord(createRecord(
'example.com:xyz~', test_buffer_data)), 'The type should not contain \'~\'.');
assert_throws(new TypeError, () => new NDEFRecord(createRecord(
'example.com:xyz/', test_buffer_data)), 'The type should not contain \'/\'.');
diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
index a6050b8ff71..cb6b3941410 100644
--- a/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
+++ b/tests/wpt/web-platform-tests/web-nfc/NDEFWriter_push.https.html
@@ -35,9 +35,6 @@ const invalid_type_messages =
// "utf-16", "utf-16le" or "utf-16be".
createMessage([createTextRecord(test_text_data, "chinese")]),
- // NDEFRecord.lang length for 'text' record must be lower than 64.
- createMessage([createTextRecord(test_text_data, undefined /* encoding */, [...Array(64)].map(_ => 'a'))]),
-
// https://w3c.github.io/web-nfc/#dfn-map-a-url-to-ndef
// NDEFRecord must have data.
createMessage([createUrlRecord()]),
@@ -91,6 +88,10 @@ const invalid_syntax_messages =
// Data for 'url' or 'absolute-url' record, must be a valid URL.
createMessage([createUrlRecord('Invalid URL:// Data')]),
createMessage([createUrlRecord('Invalid URL:// Data', true)]),
+
+ // NDEFRecord.lang length for 'text' record must be lower than 64.
+ createMessage([createTextRecord(test_text_data, undefined /* encoding */,
+ [...Array(64)].map(_ => 'a'))]),
];
const invalid_signals = [
@@ -275,7 +276,7 @@ nfc_test(async () => {
nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
- let message = createMessage([createTextRecord(test_text_data),
+ const message = createMessage([createTextRecord(test_text_data),
createMimeRecordFromJson(test_json_data),
createMimeRecord(test_buffer_data),
createUnknownRecord(test_buffer_data),
@@ -307,9 +308,12 @@ nfc_test(async (t, mockNFC) => {
assertNDEFMessagesEqual(buffer_view, mockNFC.pushedMessage());
}, "Test that NDEFWriter.push succeeds when message is ArrayBufferView.");
-nfc_test(async () => {
+nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
await writer.push(createMessage([createRecord('empty')]));
+ const receivedMessage = mockNFC.pushedMessage();
+ assert_equals(receivedMessage.data.length, 1);
+ assert_equals(receivedMessage.data[0].recordType, 'empty', 'recordType');
}, "NDEFWriter.push with 'empty' record should succeed.");
nfc_test(async (t, mockNFC) => {
@@ -387,20 +391,6 @@ nfc_test(async (t, mockNFC) => {
nfc_test(async (t, mockNFC) => {
const writer = new NDEFWriter();
- await writer.push({ records: [{ data: test_text_data}] });
- assertNDEFMessagesEqual(test_text_data, mockNFC.pushedMessage());
-}, "Test that recordType should be set to 'text' if NDEFRecordInit.record's \
-recordType is undefined and NDEFRecordInit.record's data is DOMString.");
-
-nfc_test(async (t, mockNFC) => {
- const writer = new NDEFWriter();
- await writer.push({ records: [{ data: test_buffer_data}] });
- assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
-}, "Test that recordType should be set to 'mime' if NDEFRecordInit.record's \
-recordType is undefined and NDEFRecordInit.record's data is not DOMString.");
-
-nfc_test(async (t, mockNFC) => {
- const writer = new NDEFWriter();
await writer.push({ records: [{ recordType: "mime", data: test_buffer_data }] });
assertNDEFMessagesEqual(test_buffer_data, mockNFC.pushedMessage());
}, "Test that mediaType should be set to 'application/octet-stream' if \
@@ -446,4 +436,11 @@ nfc_test(async (t, mockNFC) => {
await promise_rejects(t, 'NotAllowedError', p);
}, "NDEFWriter.push should fail when there are NDEF records on the NFC device \
and NDEFPushOptions.overwrite is false.");
+
+nfc_test(async (t, mockNFC) => {
+ const writer = new NDEFWriter();
+ mockNFC.simulateDataTransferFails();
+ await promise_rejects(t, 'NetworkError', writer.push(test_text_data));
+}, "NDEFWriter.push should fail with NetworkError when NFC data transfer fails.");
+
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDataChannel-close.html b/tests/wpt/web-platform-tests/webrtc/RTCDataChannel-close.html
new file mode 100644
index 00000000000..9f43dc93c5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCDataChannel-close.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>RTCDataChannel.prototype.close</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+'use strict';
+
+promise_test(async t => {
+ let pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ let [channel1, channel2] = await createDataChannelPair(pc1);
+ let close_handler = new Promise(resolve => {
+ channel2.onclose = event => {
+ resolve();
+ };
+ });
+ channel2.addEventListener('error', t.unreached_func());
+ channel1.close();
+ await close_handler;
+}, 'Close datachannel causes onclose to be called');
+
+promise_test(async t => {
+ // This is the same test as above, but using addEventListener
+ // rather than the "onclose" attribute.
+ let pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ let [channel1, channel2] = await createDataChannelPair(pc1);
+ let close_handler = new Promise(resolve => {
+ channel2.addEventListener('close', event => {
+ resolve();
+ });
+ });
+ channel2.addEventListener('error', t.unreached_func());
+ channel1.close();
+ await close_handler;
+}, 'Close datachannel causes close event to be called');
+
+promise_test(async t => {
+ let pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ let [channel1, channel2] = await createDataChannelPair(pc1);
+ let events = [];
+ let error = null;
+ let close_handler = new Promise(resolve => {
+ channel2.addEventListener('close', event => {
+ events.push('close');
+ resolve();
+ });
+ });
+ let error_handler = new Promise((resolve, reject) => {
+ channel2.addEventListener('error', event => {
+ events.push('error');
+ try {
+ assert_true(event instanceof RTCErrorEvent);
+ error = event.error;
+ } catch (e) {
+ // Prevent test from hanging when an assert in the error handler fails.
+ reject('Error event wrong: ' + e);
+ }
+ resolve();
+ });
+ });
+ pc1.close();
+ await error_handler;
+ await close_handler;
+ // Error should fire before close.
+ assert_array_equals(['error', 'close'], events);
+ assert_true(error instanceof RTCError);
+ assert_equals(error.name, 'OperationError');
+}, 'Close peerconnection causes close event and error to be called');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCError.html b/tests/wpt/web-platform-tests/webrtc/RTCError.html
index 4d0726093c1..9c7227521ed 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCError.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCError.html
@@ -35,8 +35,8 @@ test(() => {
test(() => {
const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
- assert_equals(error.name, 'RTCError');
-}, 'RTCError.name is \'RTCError\'');
+ assert_equals(error.name, 'OperationError');
+}, 'RTCError.name is \'OperationError\'');
test(() => {
const error = new RTCError({errorDetail:'data-channel-failure'}, 'message');
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-close.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-close.html
new file mode 100644
index 00000000000..74f816bf3fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-close.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.close</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+ promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ pc.onsignalingstatechange = t.unreached_func();
+ pc.close();
+ assert_true(pc.signalingState === 'closed');
+ await new Promise(r => t.step_timeout(r, 100));
+ }, 'RTCPeerConnection.close() does not fire signalingstatechange event.');
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html
index 9ed5808727a..a054a1e8ccc 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-connectionState.https.html
@@ -270,4 +270,22 @@
assert_array_equals(states, ['connecting', 'connected']);
}, 'connectionState transitions to connected via connecting');
+
+ promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ const pc2 = new RTCPeerConnection();
+ const stream = await getNoiseStream({ audio: true });
+ t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
+
+ stream.getTracks().forEach(track => pc1.addTrack(track, stream));
+ exchangeIceCandidates(pc1, pc2);
+ doSignalingHandshake(pc1, pc2);
+ await listenToIceConnected(pc2);
+
+ pc2.onconnectionstatechange = t.unreached_func();
+ pc2.close();
+ assert_true(pc2.connectionState === 'closed');
+ await new Promise(r => t.step_timeout(r, 100));
+ }, 'Closing a PeerConnection should not fire connectionstatechange event');
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html
index 67571895175..af84fe2498c 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver.https.html
@@ -1205,14 +1205,27 @@
// Wait a little, just in case some stray events fire
await new Promise(r => t.step_timeout(r, 100));
- assert_equals(1, countMuteAudio1.count, "Got 1 mute event for pc1's audio track");
- assert_equals(1, countMuteVideo1.count, "Got 1 mute event for pc1's video track");
- assert_equals(1, countMuteAudio2.count, "Got 1 mute event for pc2's audio track");
- assert_equals(1, countMuteVideo2.count, "Got 1 mute event for pc2's video track");
- assert_equals(2, countUnmuteAudio1.count, "Got 2 unmute events for pc1's audio track");
- assert_equals(2, countUnmuteVideo1.count, "Got 2 unmute events for pc1's video track");
- assert_equals(2, countUnmuteAudio2.count, "Got 2 unmute events for pc2's audio track");
- assert_equals(2, countUnmuteVideo2.count, "Got 2 unmute events for pc2's video track");
+ // Receiving an RTCP bye should generate a mute event. How often this
+ // happens depends upon the browser and on timing. Rather than try to
+ // match an individual browser's current behaviour, this checks to see
+ // that we receive at least the minimum number of expected mute and
+ // unmute events.
+ assert_greater_than_equal(countMuteAudio1.count, 1,
+ "Expect 1 mute event for pc1's audio track");
+ assert_greater_than_equal(countMuteVideo1.count, 1,
+ "Expect 1 mute event for pc1's video track");
+ assert_greater_than_equal(countMuteAudio2.count, 1,
+ "Expect 1 mute event for pc2's audio track");
+ assert_greater_than_equal(countMuteVideo2.count, 1,
+ "Expect 1 mute event for pc2's video track");
+ assert_greater_than_equal(countUnmuteAudio1.count, 2,
+ "Expect 2 unmute events for pc1's audio track");
+ assert_greater_than_equal(countUnmuteVideo1.count, 2,
+ "Expect 2 unmute events for pc1's video track");
+ assert_greater_than_equal(countUnmuteAudio2.count, 2,
+ "Expect 2 unmute events for pc2's audio track");
+ assert_greater_than_equal(countUnmuteVideo2.count, 2,
+ "Expect 2 unmute events for pc2's video track");
};
const checkStop = async t => {
diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js
index 863b9945724..38f1364ce03 100644
--- a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js
+++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_asserts.js
@@ -5,7 +5,7 @@
// |p1|, |p2| - objects with x, y, z, w components that are floating point numbers
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
-let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
+const assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
if (p1 == null && p2 == null) {
return;
}
@@ -33,7 +33,7 @@ let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefi
// |p1|, |p2| - objects with x, y, z, w components that are floating point numbers
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
-let assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
+const assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") {
assert_not_equals(p1, null, prefix + "p1 must be non-null");
assert_not_equals(p2, null, prefix + "p2 must be non-null");
@@ -55,10 +55,25 @@ let assert_point_significantly_not_equals = function(p1, p2, epsilon = FLOAT_EPS
}
};
+// |t1|, |t2| - objects containing position and orientation.
+// |epsilon| - float specifying precision
+// |prefix| - string used as a prefix for logging
+const assert_transform_approx_equals = function(t1, t2, epsilon = FLOAT_EPSILON, prefix = "") {
+ if (t1 == null && t2 == null) {
+ return;
+ }
+
+ assert_not_equals(t1, null, prefix + "t1 must be non-null");
+ assert_not_equals(t2, null, prefix + "t2 must be non-null");
+
+ assert_point_approx_equals(t1.position, t2.position, epsilon, prefix + "positions must be equal");
+ assert_point_approx_equals(t1.orientation, t2.orientation, epsilon, prefix + "orientations must be equal");
+};
+
// |m1|, |m2| - arrays of floating point numbers
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
-let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
+const assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
if (m1 == null && m2 == null) {
return;
}
@@ -89,13 +104,12 @@ let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, pref
m1[mismatched_element], m2[mismatched_element], epsilon,
error_message);
}
-}
-
+};
// |m1|, |m2| - arrays of floating point numbers
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
-let assert_matrix_significantly_not_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
+const assert_matrix_significantly_not_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") {
if (m1 == null && m2 == null) {
return;
}
@@ -133,13 +147,13 @@ let assert_matrix_significantly_not_equals = function(m1, m2, epsilon = FLOAT_EP
assert_unreached(error_message);
}
-}
+};
// |r1|, |r2| - XRRay objects
// |epsilon| - float specifying precision
// |prefix| - string used as a prefix for logging
-let assert_ray_approx_equals = function(r1, r2, epsilon = FLOAT_EPSILON, prefix = "") {
+const assert_ray_approx_equals = function(r1, r2, epsilon = FLOAT_EPSILON, prefix = "") {
assert_point_approx_equals(r1.origin, r2.origin, epsilon, prefix + "origin:");
assert_point_approx_equals(r1.direction, r2.direction, epsilon, prefix + "direction:");
assert_matrix_approx_equals(r1.matrix, r2.matrix, epsilon, prefix + "matrix:");
-}
+};
diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants_fake_world.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants_fake_world.js
new file mode 100644
index 00000000000..0601f54fce9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants_fake_world.js
@@ -0,0 +1,75 @@
+'use strict';
+
+// This file introduces constants used to mock fake world for the purposes of hit test.
+
+// Generates FakeXRWorldInit dictionary with given dimensions.
+// The generated fake world will have floor and front wall treated as planes,
+// side walls treated as meshes, and ceiling treated as points.
+// width - X axis, in meters
+// height - Y axis, in meters
+// length - Z axis, in meters
+function createFakeWorld(width, height, length) {
+ // Vertices:
+ const BOTTOM_LEFT_FRONT = { x: -width/2, y: 0, z: -length/2, w: 1};
+ const BOTTOM_RIGHT_FRONT = { x: width/2, y: 0, z: -length/2, w: 1};
+
+ const TOP_LEFT_FRONT = { x: -width/2, y: height, z: -length/2, w: 1};
+ const TOP_RIGHT_FRONT = { x: width/2, y: height, z: -length/2, w: 1};
+
+ const BOTTOM_LEFT_BACK = { x: -width/2, y: 0, z: length/2, w: 1};
+ const BOTTOM_RIGHT_BACK = { x: width/2, y: 0, z: length/2, w: 1};
+
+ const TOP_LEFT_BACK = { x: -width/2, y: height, z: length/2, w: 1};
+ const TOP_RIGHT_BACK = { x: width/2, y: height, z: length/2, w: 1};
+
+ // Faces:
+ const FRONT_WALL_AND_FLOOR_FACES = [
+ // Front wall:
+ [BOTTOM_LEFT_FRONT, BOTTOM_RIGHT_FRONT, TOP_RIGHT_FRONT],
+ [BOTTOM_LEFT_FRONT, TOP_RIGHT_FRONT, TOP_LEFT_FRONT],
+ // Floor:
+ [BOTTOM_LEFT_FRONT, BOTTOM_RIGHT_FRONT, BOTTOM_RIGHT_BACK],
+ [BOTTOM_LEFT_FRONT, BOTTOM_LEFT_BACK, BOTTOM_RIGHT_BACK],
+ ];
+
+ const CEILING_FACES = [
+ // Ceiling:
+ [TOP_LEFT_FRONT, TOP_RIGHT_FRONT, TOP_RIGHT_BACK],
+ [TOP_LEFT_FRONT, TOP_LEFT_BACK, TOP_RIGHT_BACK],
+ ];
+
+ const SIDE_WALLS_FACES = [
+ // Left:
+ [BOTTOM_LEFT_FRONT, TOP_LEFT_FRONT, TOP_LEFT_BACK],
+ [BOTTOM_LEFT_FRONT, BOTTOM_LEFT_BACK, TOP_LEFT_BACK],
+ // Right:
+ [BOTTOM_RIGHT_FRONT, TOP_RIGHT_FRONT, TOP_RIGHT_BACK],
+ [BOTTOM_RIGHT_FRONT, BOTTOM_RIGHT_BACK, TOP_RIGHT_BACK],
+ ];
+
+ // Regions:
+ const FRONT_WALL_AND_FLOOR_REGION = {
+ type: "plane",
+ faces: FRONT_WALL_AND_FLOOR_FACES,
+ };
+
+ const SIDE_WALLS_REGION = {
+ type: "mesh",
+ faces: SIDE_WALLS_FACES,
+ };
+
+ const CEILING_REGION = {
+ type: "point",
+ faces: CEILING_FACES,
+ };
+
+ return {
+ hitTestRegions : [
+ FRONT_WALL_AND_FLOOR_REGION,
+ SIDE_WALLS_REGION,
+ CEILING_REGION,
+ ]
+ };
+}
+
+const VALID_FAKE_WORLD = createFakeWorld(5.0, 2.0, 5.0);
diff --git a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html
index a314f6b55a2..3098fb64936 100644
--- a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html
+++ b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_inverse.https.html
@@ -3,6 +3,7 @@
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants.js"></script>
+<script src="resources/webxr_test_asserts.js"></script>
<canvas id="webgl-canvas"></canvas>
<script>
@@ -12,18 +13,6 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
let testFunction =
(session, fakeDeviceController, t) => new Promise((resolve, reject) => {
- function assert_point_approx_equals(a, b) {
- assert_approx_equals(a.x, b.x, FLOAT_EPSILON);
- assert_approx_equals(a.y, b.y, FLOAT_EPSILON);
- assert_approx_equals(a.z, b.z, FLOAT_EPSILON);
- assert_approx_equals(a.w, b.w, FLOAT_EPSILON);
- };
-
- function assert_transform_approx_equals(a, b) {
- assert_point_approx_equals(a.position, b.position);
- assert_point_approx_equals(a.orientation, b.orientation);
- };
-
// An identity transform should be equal to it's inverse.
let identity_transform = new XRRigidTransform();
t.step(() => {
diff --git a/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py b/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py
index fdc626539e8..c661f22c3e9 100644
--- a/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py
+++ b/tests/wpt/web-platform-tests/xhr/resources/parse-headers.py
@@ -1,10 +1,6 @@
-import json
-
def main(request, response):
-
content = ""
if "my-custom-header" in request.GET:
val = request.GET.first("my-custom-header")
response.headers.set("My-Custom-Header", val)
-
return content