aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/linux.yml10
-rw-r--r--.github/workflows/mac.yml9
-rw-r--r--.github/workflows/nightly.yml63
-rw-r--r--.github/workflows/scheduled-wpt-import.yml (renamed from .github/workflows/wpt-nightly.yml)8
-rw-r--r--.github/workflows/windows.yml9
-rw-r--r--components/layout_2020/positioned.rs3
-rw-r--r--components/script/dom/headers.rs4
-rw-r--r--components/script/dom/request.rs154
-rw-r--r--components/script/dom/response.rs36
-rw-r--r--etc/ci/upstream-wpt-changes/test.py22
-rw-r--r--etc/ci/upstream-wpt-changes/tests/add-non-utf8-file.diff7
-rw-r--r--etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py13
-rw-r--r--etc/ci/upstream-wpt-changes/wptupstreamer/step.py6
-rwxr-xr-xetc/ci/wpt-scheduled-update.sh (renamed from etc/ci/wpt-nightly-update.sh)0
-rw-r--r--python/requirements.txt4
-rw-r--r--python/servo/build_commands.py165
-rw-r--r--python/servo/devenv_commands.py7
-rw-r--r--python/servo/package_commands.py56
-rw-r--r--python/servo/win32_toast.py45
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/backgrounds/background-position-152.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/height-percentage-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/bottom-offset-percentage-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/left-offset-percentage-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-animations/display-none-dont-cancel.tentative.html.ini15
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini156
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/justify-content-007.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-flex-item-max-content.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini1
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-computed.html.ini18
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-transition-property.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-valid.html.ini18
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini12
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/position-absolute-fit-content.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini24
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini150
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini1
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-011.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-012.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini1
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini270
-rw-r--r--tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode.html.ini24
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini9
-rw-r--r--tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini9
-rw-r--r--tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini9
-rw-r--r--tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini6
-rw-r--r--tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini12
-rw-r--r--tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini15
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini6
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-charset.window.js.ini4
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json1991
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-001.html.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini3
-rw-r--r--tests/wpt/metadata/css/CSS2/normal-flow/hit-test-anonymous-block.html.ini3
-rw-r--r--tests/wpt/metadata/css/css-animations/display-none-dont-cancel.tentative.html.ini15
-rw-r--r--tests/wpt/metadata/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-flexbox/hittest-anonymous-box.html.ini3
-rw-r--r--tests/wpt/metadata/css/css-flexbox/hittest-before-pseudo.html.ini3
-rw-r--r--tests/wpt/metadata/css/css-flexbox/justify-content-007.html.ini3
-rw-r--r--tests/wpt/metadata/css/css-flexbox/table-as-flex-item-max-content.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-position/overlay/overlay-computed.html.ini18
-rw-r--r--tests/wpt/metadata/css/css-position/overlay/overlay-transition-property.html.ini3
-rw-r--r--tests/wpt/metadata/css/css-position/overlay/overlay-valid.html.ini18
-rw-r--r--tests/wpt/metadata/css/css-transforms/inline-with-filter-and-hidden-backface.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-float-in-table.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini12
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-subpixel.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPoint-visibility-hidden-resizer.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini6
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini6
-rw-r--r--tests/wpt/metadata/css/mediaqueries/scripting-print-noscript.html.ini2
-rw-r--r--tests/wpt/metadata/css/mediaqueries/scripting-print-script.html.ini2
-rw-r--r--tests/wpt/metadata/css/mediaqueries/scripting.html.ini27
-rw-r--r--tests/wpt/metadata/css/selectors/selectors-4/lang-011.html.ini2
-rw-r--r--tests/wpt/metadata/css/selectors/selectors-4/lang-012.html.ini2
-rw-r--r--tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini1
-rw-r--r--tests/wpt/metadata/fetch/api/body/mime-type.any.js.ini39
-rw-r--r--tests/wpt/metadata/fetch/api/redirect/redirect-keepalive.any.js.ini2
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini3
-rw-r--r--tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini9
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini3
-rw-r--r--tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini2
-rw-r--r--tests/wpt/metadata/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini2
-rw-r--r--tests/wpt/metadata/html/dom/idlharness.https.html.ini267
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini1
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini4
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini3
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini9
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini9
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini9
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini6
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini5
-rw-r--r--tests/wpt/metadata/resource-timing/content-type-parsing.html.ini4
-rw-r--r--tests/wpt/metadata/resource-timing/idlharness.any.js.ini12
-rw-r--r--tests/wpt/metadata/selection/idlharness.window.js.ini15
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini1
-rw-r--r--tests/wpt/metadata/webmessaging/with-ports/017.html.ini4
-rw-r--r--tests/wpt/metadata/webmessaging/without-ports/018.html.ini4
-rw-r--r--tests/wpt/metadata/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini3
-rw-r--r--tests/wpt/metadata/webxr/idlharness.https.window.js.ini6
-rw-r--r--tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/mozilla/meta/mozilla/scrollBy.html.ini3
-rw-r--r--tests/wpt/web-platform-tests/.github/workflows/interfaces.yml2
-rw-r--r--tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml2
-rw-r--r--tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py16
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic_async.tentative.https.window.js)21
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.window.js35
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js12
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html32
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.window.js)16
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.window.js)16
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.js)28
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.window.js)9
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.window.js)8
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.window.js)19
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.js40
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.js19
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.js16
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.window.js)10
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.window.js)2
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js10
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js14
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.window.js)2
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.window.js)14
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.window.js)8
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.any.js (renamed from tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.window.js)6
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-dedicated-worker.js10
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-shared-worker.js21
-rw-r--r--tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-non-oof-inherit.html117
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html61
-rw-r--r--tests/wpt/web-platform-tests/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-animations/display-none-dont-cancel.tentative.html146
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-break/overflow-clip-014.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-break/overflow-clip-015.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-break/overflow-clip-016.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-break/overflow-clip-017.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html72
-rw-r--r--tests/wpt/web-platform-tests/css/css-cascade/parsing/supports-import-parsing.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/abspos/dynamic-align-self-001.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/fieldset-as-container-justify-center.tentative.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-row-017.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/grandchild-span-height.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/grid-flex-item-007.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/justify-content-007.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/table-as-flex-item-max-content.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html22
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html48
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/overlay/overlay-computed.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/overlay/overlay-invalid.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/overlay/overlay-transition-property.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/overlay/overlay-valid.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-view-transitions/root-element-cv-hidden-crash.html11
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript.html13
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script.html17
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries/scripting.html26
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html4
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000-ref.html11
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000.html13
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-001.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-002.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-003.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-004.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-005.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-006.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-007.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-008.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-009.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-010.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-011.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-012.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-013.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-014.html14
-rw-r--r--tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-015.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html233
-rw-r--r--tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js8
-rw-r--r--tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js24
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-screen-size.https.html63
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html12
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html34
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html92
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html42
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html10
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html12
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js12
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html34
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js34
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js8
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html92
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html42
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html42
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html10
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js10
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js32
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml310
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html (renamed from tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html)11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html13
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html14
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js12
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini22
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/EXT_clip_cull_distance.idl20
-rw-r--r--tests/wpt/web-platform-tests/interfaces/FedCM.idl62
-rw-r--r--tests/wpt/web-platform-tests/interfaces/WEBGL_clip_cull_distance.idl20
-rw-r--r--tests/wpt/web-platform-tests/interfaces/WEBGL_provoking_vertex.idl13
-rw-r--r--tests/wpt/web-platform-tests/interfaces/anchors.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/badging.idl10
-rw-r--r--tests/wpt/web-platform-tests/interfaces/compression.idl10
-rw-r--r--tests/wpt/web-platform-tests/interfaces/compute-pressure.idl7
-rw-r--r--tests/wpt/web-platform-tests/interfaces/contact-picker.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cookie-store.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl10
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-contain.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-typed-om.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl8
-rw-r--r--tests/wpt/web-platform-tests/interfaces/device-posture.idl3
-rw-r--r--tests/wpt/web-platform-tests/interfaces/dom.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/edit-context.idl40
-rw-r--r--tests/wpt/web-platform-tests/interfaces/fenced-frame.idl54
-rw-r--r--tests/wpt/web-platform-tests/interfaces/fetch.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/fs.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/gpc-spec.idl10
-rw-r--r--tests/wpt/web-platform-tests/interfaces/html.idl32
-rw-r--r--tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl10
-rw-r--r--tests/wpt/web-platform-tests/interfaces/navigation-api.idl158
-rw-r--r--tests/wpt/web-platform-tests/interfaces/notifications.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/orientation-event.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/permissions-policy.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/priority-hints.idl20
-rw-r--r--tests/wpt/web-platform-tests/interfaces/requestStorageAccessFor.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/resource-timing.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/scroll-animations.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl11
-rw-r--r--tests/wpt/web-platform-tests/interfaces/selection-api.idl3
-rw-r--r--tests/wpt/web-platform-tests/interfaces/trust-token-api.idl29
-rw-r--r--tests/wpt/web-platform-tests/interfaces/turtledove.idl109
-rw-r--r--tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl7
-rw-r--r--tests/wpt/web-platform-tests/interfaces/url.idl4
-rw-r--r--tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/web-animations-2.idl11
-rw-r--r--tests/wpt/web-platform-tests/interfaces/web-animations.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webauthn.idl42
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webcodecs-vp9-codec-registration.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webcodecs.idl16
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webgpu.idl68
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webidl.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webnn.idl25
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc.idl55
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webtransport.idl20
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webxr.idl1
-rw-r--r--tests/wpt/web-platform-tests/interfaces/window-management.idl (renamed from tests/wpt/web-platform-tests/interfaces/window-placement.idl)2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/xhr.idl2
-rw-r--r--tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-blocking-duration.html57
-rw-r--r--tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html4
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-after-detach.html33
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-dynamic-index.html34
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html4
-rw-r--r--tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html4
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js20
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html62
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js43
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js7
-rw-r--r--tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html167
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html6
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html2
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html7
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html296
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html47
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html5
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html1
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html1
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html338
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html1
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html5
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html12
-rw-r--r--tests/wpt/web-platform-tests/secure-payment-confirmation/authentication-disallowed-when-hidden.https.html57
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html7
-rw-r--r--tests/wpt/web-platform-tests/shared-storage/insecure-context.tentative.http.html10
-rw-r--r--tests/wpt/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https.html51
-rw-r--r--tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html55
-rw-r--r--tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html35
-rw-r--r--tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js44
-rw-r--r--tests/wpt/web-platform-tests/svg/text/reftests/opacity-ref.svg26
-rw-r--r--tests/wpt/web-platform-tests/svg/text/reftests/opacity.svg31
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/requirements_build.txt2
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt2
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/run_tc.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/lint.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/XMLParser.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/item.py12
-rw-r--r--tests/wpt/web-platform-tests/tools/mypy.ini1
-rw-r--r--tests/wpt/web-platform-tests/tools/requirements_mypy.txt18
-rw-r--r--tests/wpt/web-platform-tests/tools/requirements_pytest.txt4
-rw-r--r--tests/wpt/web-platform-tests/tools/requirements_tests.txt6
-rw-r--r--tests/wpt/web-platform-tests/tools/tox.ini2
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py17
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py45
-rw-r--r--tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py7
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py135
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/install.py12
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/run.py13
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt5
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py1
-rw-r--r--tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html26
-rw-r--r--tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html24
-rw-r--r--tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js2
-rw-r--r--tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html4
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py11
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py11
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py22
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/__init__.py28
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/conftest.py21
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/__init__.py0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/invalid.py22
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py57
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/__init__.py0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/context.py42
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/invalid.py16
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/release.py28
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/sequence.py84
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py9
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py15
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py14
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py6
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py2
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py34
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py2
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py8
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py2
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/test_actions_wdspec.html197
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py14
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py10
-rw-r--r--tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json83
-rw-r--r--tests/wpt/web-platform-tests/webnn/resources/test_data/softsign.json400
-rw-r--r--tests/wpt/web-platform-tests/webnn/resources/utils.js1
-rw-r--r--tests/wpt/web-platform-tests/webnn/softsign.https.any.js10
-rw-r--r--tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html229
-rw-r--r--tests/wpt/web-platform-tests/webtransport/close.https.any.js.ini19
-rw-r--r--tests/wpt/web-platform-tests/webtransport/connect.https.any.js.ini19
-rw-r--r--tests/wpt/web-platform-tests/webtransport/csp-fail.https.window.js.ini3
-rw-r--r--tests/wpt/web-platform-tests/webtransport/csp-pass.https.window.js.ini3
-rw-r--r--tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js103
-rw-r--r--tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js.ini19
-rw-r--r--tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js17
-rw-r--r--tests/wpt/web-platform-tests/webtransport/streams-close.https.any.js.ini19
-rw-r--r--tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js80
-rw-r--r--tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js.ini19
-rw-r--r--tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini3
-rw-r--r--tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini3
495 files changed, 8588 insertions, 3529 deletions
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 66149b5b86e..517691d2e85 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -16,6 +16,9 @@ on:
required: false
default: false
type: boolean
+ github-release-id:
+ required: false
+ type: string
workflow_dispatch:
inputs:
layout:
@@ -82,9 +85,14 @@ jobs:
path: target/release/servo-tech-demo.tar.gz
- name: Upload
if: ${{ inputs.upload }}
- run: python3 ./mach upload-nightly ${{ env.PACKAGE }} --secret-from-environment
+ run: |
+ python3 ./mach upload-nightly ${{ env.PACKAGE }} \
+ --secret-from-environment \
+ --github-release-id ${{ inputs.github-release-id }}
env:
S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }}
+ NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }}
+ NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds
- name: Package binary
run: tar -czf target.tar.gz target/release/servo resources
- name: Archive binary
diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml
index 933683c713c..f8348df28ba 100644
--- a/.github/workflows/mac.yml
+++ b/.github/workflows/mac.yml
@@ -14,6 +14,9 @@ on:
required: false
default: false
type: boolean
+ github-release-id:
+ required: false
+ type: string
workflow_dispatch:
inputs:
layout:
@@ -91,10 +94,14 @@ jobs:
path: target/release/servo-tech-demo.dmg
- name: Upload
if: ${{ inputs.upload }}
- run: python3 ./mach upload-nightly mac --secret-from-environment
+ run: |
+ python3 ./mach upload-nightly mac --secret-from-environment \
+ --github-release-id ${{ inputs.github-release-id }}
env:
S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }}
GITHUB_HOMEBREW_TOKEN: ${{ secrets.HOMEBREW_TOKEN }}
+ NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }}
+ NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds
- name: Package binary
run: gtar -czf target.tar.gz target/release/servo target/release/*.dylib resources
- name: Archive binary
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 12aec1ea428..a09de65c789 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -11,42 +11,105 @@ env:
SHELL: /bin/bash
jobs:
+ create-draft-release:
+ # This job is only useful when run on upstream servo.
+ if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch'
+ name: Create Draft GH Release
+ runs-on: ubuntu-20.04
+ steps:
+ - id: create-release
+ run: |
+ NIGHTLY_TAG=$(date "+%F")
+ RELEASE_URL=$(gh release create "${NIGHTLY_TAG}" \
+ --draft \
+ --title "${NIGHTLY_TAG}" \
+ --notes 'Nightly builds based on servo/servo@${{ github.sha }}' \
+ --repo ${NIGHTLY_REPO})
+ TEMP_TAG=$(basename "$RELEASE_URL")
+ RELEASE_ID=$( \
+ gh api -H "Accept: application/vnd.github+json" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ "/repos/${NIGHTLY_REPO}/releases/tags/${TEMP_TAG}" \
+ | jq '.id' \
+ )
+ echo "RELEASE_ID=${RELEASE_ID}" >> ${GITHUB_OUTPUT}
+ env:
+ GITHUB_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }}
+ NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds
+ outputs:
+ release-id: ${{ steps.create-release.outputs.RELEASE_ID }}
+
+ publish-nightly-release:
+ # This job is only useful when run on upstream servo.
+ if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch'
+ name: Publish GH Release for nightly
+ runs-on: ubuntu-20.04
+ steps:
+ - run: |
+ gh api \
+ --method PATCH \
+ -H "Accept: application/vnd.github+json" \
+ -H "X-GitHub-Api-Version: 2022-11-28" \
+ /repos/${NIGHTLY_REPO}/releases/${RELEASE_ID} \
+ -F draft=false
+ env:
+ GITHUB_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }}
+ NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds
+ RELEASE_ID: ${{ needs.create-draft-release.outputs.release-id }}
+ needs:
+ - create-draft-release
+ - upload-linux
+ - upload-win
+ - upload-mac
+
upload-win:
# This job is only useful when run on upstream servo.
if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch'
name: Upload nightly (Windows)
+ needs:
+ - create-draft-release
uses: ./.github/workflows/windows.yml
with:
layout: '2013'
upload: true
+ github-release-id: ${{ needs.create-draft-release.outputs.release-id }}
secrets: inherit
upload-mac:
# This job is only useful when run on upstream servo.
if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch'
name: Upload nightly (macOS)
+ needs:
+ - create-draft-release
uses: ./.github/workflows/mac.yml
with:
layout: '2013'
upload: true
+ github-release-id: ${{ needs.create-draft-release.outputs.release-id }}
secrets: inherit
upload-linux:
# This job is only useful when run on upstream servo.
if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch'
name: Upload nightly (Linux)
+ needs:
+ - create-draft-release
uses: ./.github/workflows/linux.yml
with:
layout: '2013'
upload: true
+ github-release-id: ${{ needs.create-draft-release.outputs.release-id }}
secrets: inherit
upload-linux-2020:
# This job is only useful when run on upstream servo.
if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch'
name: Upload nightly (Linux layout2020)
+ needs:
+ - create-draft-release
uses: ./.github/workflows/linux.yml
with:
layout: '2020'
upload: true
+ github-release-id: ${{ needs.create-draft-release.outputs.release-id }}
secrets: inherit
diff --git a/.github/workflows/wpt-nightly.yml b/.github/workflows/scheduled-wpt-import.yml
index 1240e13b439..49bdda984e7 100644
--- a/.github/workflows/wpt-nightly.yml
+++ b/.github/workflows/scheduled-wpt-import.yml
@@ -1,9 +1,9 @@
-name: WPT import
+name: Scheduled WPT import
on:
schedule:
- # Run this job at 00:00 everyday
- - cron: "0 0 * * *"
+ # Run this job every Sunday at 00:00.
+ - cron: "0 0 * * 0"
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
@@ -66,7 +66,7 @@ jobs:
export CURRENT_DATE=$(date +"%d-%m-%Y")
echo $CURRENT_DATE
echo "CURRENT_DATE=$CURRENT_DATE" >> $GITHUB_ENV
- ./etc/ci/wpt-nightly-update.sh
+ ./etc/ci/wpt-scheduled-update.sh
- name: Push changes
uses: ad-m/github-push-action@master
with:
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 634f462a1da..9ce880a88f8 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -14,6 +14,9 @@ on:
required: false
default: false
type: boolean
+ github-release-id:
+ required: false
+ type: string
workflow_dispatch:
inputs:
layout:
@@ -94,9 +97,13 @@ jobs:
- name: Upload
if: ${{ inputs.upload }}
working-directory: "C:\\a\\${{ github.event.repository.name }}\\${{ github.event.repository.name }}"
- run: python mach upload-nightly windows-msvc --secret-from-environment
+ run: |
+ python mach upload-nightly windows-msvc --secret-from-environment `
+ --github-release-id ${{ inputs.github-release-id }}
env:
S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }}
+ NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }}
+ NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds
build_result:
name: homu build finished
diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs
index 4527de651d6..2580d4af9bc 100644
--- a/components/layout_2020/positioned.rs
+++ b/components/layout_2020/positioned.rs
@@ -458,8 +458,7 @@ impl HoistedAbsolutelyPositionedBox {
};
let solve_block_axis = |computed_size| {
solve_axis(
- // TODO(delan) shouldn’t this be cbbs?
- cbis,
+ cbbs,
pbm.padding_border_sums.block,
pbm.margin.block_start,
pbm.margin.block_end,
diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs
index de81bd7dc4c..6d466ea0c61 100644
--- a/components/script/dom/headers.rs
+++ b/components/script/dom/headers.rs
@@ -272,10 +272,6 @@ impl Headers {
self.guard.get()
}
- pub fn empty_header_list(&self) {
- *self.header_list.borrow_mut() = HyperHeaders::new();
- }
-
pub fn set_headers(&self, hyper_headers: HyperHeaders) {
*self.header_list.borrow_mut() = hyper_headers;
}
diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs
index e301d360cc4..9bb857736a4 100644
--- a/components/script/dom/request.rs
+++ b/components/script/dom/request.rs
@@ -50,7 +50,6 @@ pub struct Request {
request: DomRefCell<NetTraitsRequest>,
body_stream: MutNullableDom<ReadableStream>,
headers: MutNullableDom<Headers>,
- mime_type: DomRefCell<Vec<u8>>,
}
impl Request {
@@ -60,7 +59,6 @@ impl Request {
request: DomRefCell::new(net_request_from_global(global, url)),
body_stream: MutNullableDom::new(None),
headers: Default::default(),
- mime_type: DomRefCell::new("".to_string().into_bytes()),
}
}
@@ -81,69 +79,71 @@ impl Request {
// Step 2
let mut fallback_mode: Option<NetTraitsRequestMode> = None;
- // Step 3
+ // FIXME(cybai): As the spec changed in https://github.com/whatwg/fetch/pull/1153,
+ // we will need to change the default value of credentials for
+ // NetTraitsRequest and then remove fallback here.
let mut fallback_credentials: Option<NetTraitsRequestCredentials> = None;
- // Step 4
+ // Step 3
let base_url = global.api_base_url();
- // Step 5 TODO: "Let signal be null."
+ // Step 4 TODO: "Let signal be null."
match input {
- // Step 6
+ // Step 5
RequestInfo::USVString(USVString(ref usv_string)) => {
- // Step 6.1
+ // Step 5.1
let parsed_url = base_url.join(&usv_string);
- // Step 6.2
+ // Step 5.2
if parsed_url.is_err() {
return Err(Error::Type("Url could not be parsed".to_string()));
}
- // Step 6.3
+ // Step 5.3
let url = parsed_url.unwrap();
if includes_credentials(&url) {
return Err(Error::Type("Url includes credentials".to_string()));
}
- // Step 6.4
+ // Step 5.4
temporary_request = net_request_from_global(global, url);
- // Step 6.5
+ // Step 5.5
fallback_mode = Some(NetTraitsRequestMode::CorsMode);
- // Step 6.6
+ // FIXME(cybai): remove this line when we can remove the fallback of credentials
fallback_credentials = Some(NetTraitsRequestCredentials::CredentialsSameOrigin);
},
- // Step 7
+ // Step 6
RequestInfo::Request(ref input_request) => {
// This looks like Step 38
// TODO do this in the right place to not mask other errors
if request_is_disturbed(input_request) || request_is_locked(input_request) {
return Err(Error::Type("Input is disturbed or locked".to_string()));
}
- // Step 7.1
+ // Step 6.1
temporary_request = input_request.request.borrow().clone();
- // Step 7.2 TODO: "Set signal to input's signal."
+ // Step 6.2 TODO: "Set signal to input's signal."
},
}
- // Step 8
+ // Step 7
// TODO: `entry settings object` is not implemented yet.
let origin = base_url.origin();
- // Step 9
+ // Step 8
let mut window = Window::Client;
- // Step 10
+ // Step 9
// TODO: `environment settings object` is not implemented in Servo yet.
- // Step 11
+ // Step 10
if !init.window.handle().is_null_or_undefined() {
return Err(Error::Type("Window is present and is not null".to_string()));
}
- // Step 12
+ // Step 11
if !init.window.handle().is_undefined() {
window = Window::NoWindow;
}
- // Step 13
+ // Step 12
let mut request: NetTraitsRequest;
request = net_request_from_global(global, temporary_request.current_url());
request.method = temporary_request.method;
@@ -160,7 +160,7 @@ impl Request {
request.redirect_mode = temporary_request.redirect_mode;
request.integrity_metadata = temporary_request.integrity_metadata;
- // Step 14
+ // Step 13
if init.body.is_some() ||
init.cache.is_some() ||
init.credentials.is_some() ||
@@ -173,33 +173,33 @@ impl Request {
init.referrerPolicy.is_some() ||
!init.window.handle().is_undefined()
{
- // Step 14.1
+ // Step 13.1
if request.mode == NetTraitsRequestMode::Navigate {
request.mode = NetTraitsRequestMode::SameOrigin;
}
- // Step 14.2 TODO: "Unset request's reload-navigation flag."
- // Step 14.3 TODO: "Unset request's history-navigation flag."
- // Step 14.4
+ // Step 13.2 TODO: "Unset request's reload-navigation flag."
+ // Step 13.3 TODO: "Unset request's history-navigation flag."
+ // Step 13.4
request.referrer = global.get_referrer();
- // Step 14.5
+ // Step 13.5
request.referrer_policy = None;
}
- // Step 15
+ // Step 14
if let Some(init_referrer) = init.referrer.as_ref() {
- // Step 15.1
+ // Step 14.1
let ref referrer = init_referrer.0;
- // Step 15.2
+ // Step 14.2
if referrer.is_empty() {
request.referrer = NetTraitsRequestReferrer::NoReferrer;
} else {
- // Step 15.3.1
+ // Step 14.3.1
let parsed_referrer = base_url.join(referrer);
- // Step 15.3.2
+ // Step 14.3.2
if parsed_referrer.is_err() {
return Err(Error::Type("Failed to parse referrer url".to_string()));
}
- // Step 15.3.3
+ // Step 14.3.3
if let Ok(parsed_referrer) = parsed_referrer {
if (parsed_referrer.cannot_be_a_base() &&
parsed_referrer.scheme() == "about" &&
@@ -208,55 +208,54 @@ impl Request {
{
request.referrer = global.get_referrer();
} else {
- // Step 15.3.4
+ // Step 14.3.4
request.referrer = NetTraitsRequestReferrer::ReferrerUrl(parsed_referrer);
}
}
}
}
- // Step 16
+ // Step 15
if let Some(init_referrerpolicy) = init.referrerPolicy.as_ref() {
let init_referrer_policy = init_referrerpolicy.clone().into();
request.referrer_policy = Some(init_referrer_policy);
}
- // Step 17
+ // Step 16
let mode = init
.mode
.as_ref()
.map(|m| m.clone().into())
.or(fallback_mode);
- // Step 18
+ // Step 17
if let Some(NetTraitsRequestMode::Navigate) = mode {
return Err(Error::Type("Request mode is Navigate".to_string()));
}
- // Step 19
+ // Step 18
if let Some(m) = mode {
request.mode = m;
}
- // Step 20
+ // Step 19
let credentials = init
.credentials
.as_ref()
.map(|m| m.clone().into())
.or(fallback_credentials);
- // Step 21
if let Some(c) = credentials {
request.credentials_mode = c;
}
- // Step 22
+ // Step 20
if let Some(init_cache) = init.cache.as_ref() {
let cache = init_cache.clone().into();
request.cache_mode = cache;
}
- // Step 23
+ // Step 21
if request.cache_mode == NetTraitsRequestCache::OnlyIfCached {
if request.mode != NetTraitsRequestMode::SameOrigin {
return Err(Error::Type(
@@ -265,44 +264,46 @@ impl Request {
}
}
- // Step 24
+ // Step 22
if let Some(init_redirect) = init.redirect.as_ref() {
let redirect = init_redirect.clone().into();
request.redirect_mode = redirect;
}
- // Step 25
+ // Step 23
if let Some(init_integrity) = init.integrity.as_ref() {
let integrity = init_integrity.clone().to_string();
request.integrity_metadata = integrity;
}
- // Step 26 TODO: "If init["keepalive"] exists..."
+ // Step 24 TODO: "If init["keepalive"] exists..."
- // Step 27.1
+ // Step 25.1
if let Some(init_method) = init.method.as_ref() {
- // Step 27.2
if !is_method(&init_method) {
return Err(Error::Type("Method is not a method".to_string()));
}
+ // Step 25.2
if is_forbidden_method(&init_method) {
return Err(Error::Type("Method is forbidden".to_string()));
}
- // Step 27.3
+ // Step 25.3
let method = match init_method.as_str() {
Some(s) => normalize_method(s)
.map_err(|e| Error::Type(format!("Method is not valid: {:?}", e)))?,
None => return Err(Error::Type("Method is not a valid UTF8".to_string())),
};
- // Step 27.4
+ // Step 25.4
request.method = method;
}
- // Step 28 TODO: "If init["signal"] exists..."
+ // Step 26 TODO: "If init["signal"] exists..."
+ // Step 27 TODO: "If init["priority"] exists..."
- // Step 29
+ // Step 28
let r = Request::from_net_request(global, request);
+ // Step 29 TODO: "Set this's signal to new AbortSignal object..."
// Step 30 TODO: "If signal is not null..."
// Step 31
@@ -310,7 +311,7 @@ impl Request {
// hasn't had any other way to initialize its headers
r.headers.or_init(|| Headers::for_request(&r.global()));
- // Step 32 - but spec says this should only be when non-empty init?
+ // Step 33 - but spec says this should only be when non-empty init?
let headers_copy = init
.headers
.as_ref()
@@ -323,30 +324,30 @@ impl Request {
},
});
- // Step 32.3
+ // Step 33.3
// We cannot empty `r.Headers().header_list` because
- // we would undo the Step 27 above. One alternative is to set
+ // we would undo the Step 25 above. One alternative is to set
// `headers_copy` as a deep copy of `r.Headers()`. However,
// `r.Headers()` is a `DomRoot<T>`, and therefore it is difficult
// to obtain a mutable reference to `r.Headers()`. Without the
// mutable reference, we cannot mutate `r.Headers()` to be the
- // deep copied headers in Step 27.
+ // deep copied headers in Step 25.
- // Step 32.4
+ // Step 32
if r.request.borrow().mode == NetTraitsRequestMode::NoCors {
let borrowed_request = r.request.borrow();
- // Step 32.4.1
+ // Step 32.1
if !is_cors_safelisted_method(&borrowed_request.method) {
return Err(Error::Type(
"The mode is 'no-cors' but the method is not a cors-safelisted method"
.to_string(),
));
}
- // Step 32.4.2
+ // Step 32.2
r.Headers().set_guard(Guard::RequestNoCors);
}
- // Step 32.5
+ // Step 33.5
match headers_copy {
None => {
// This is equivalent to the specification's concept of
@@ -360,11 +361,11 @@ impl Request {
Some(headers_copy) => r.Headers().fill(Some(headers_copy))?,
}
- // Step 32.5-6 depending on how we got here
+ // Step 33.5 depending on how we got here
// Copy the headers list onto the headers of net_traits::Request
r.request.borrow_mut().headers = r.Headers().get_headers_list();
- // Step 33
+ // Step 34
let mut input_body = if let RequestInfo::Request(ref mut input_request) = input {
let mut input_request_request = input_request.request.borrow_mut();
input_request_request.body.take()
@@ -372,7 +373,7 @@ impl Request {
None
};
- // Step 34
+ // Step 35
if let Some(init_body_option) = init.body.as_ref() {
if init_body_option.is_some() || input_body.is_some() {
let req = r.request.borrow();
@@ -393,14 +394,14 @@ impl Request {
}
}
- // Step 35-36
+ // Step 36-37
if let Some(Some(ref init_body)) = init.body {
- // Step 36.2 TODO "If init["keepalive"] exists and is true..."
+ // Step 37.1 TODO "If init["keepalive"] exists and is true..."
- // Step 36.3
+ // Step 37.2
let mut extracted_body = init_body.extract(global)?;
- // Step 36.4
+ // Step 37.3
if let Some(contents) = extracted_body.content_type.take() {
let ct_header_name = b"Content-Type";
if !r
@@ -414,6 +415,7 @@ impl Request {
ByteString::new(ct_header_val.to_vec()),
)?;
+ // Step 37.4
// In Servo r.Headers's header list isn't a pointer to
// the same actual list as r.request's, and so we need to
// append to both lists to keep them in sync.
@@ -431,21 +433,16 @@ impl Request {
input_body = Some(net_body);
}
- // Step 37 "TODO if body is non-null and body's source is null..."
- // This looks like where we need to set the use-preflight flag
- // if the request has a body and nothing else has set the flag.
-
// Step 38 is done earlier
- // Step 39
- // TODO: `ReadableStream` object is not implemented in Servo yet.
+ // Step 39 "TODO if body is non-null and body's source is null..."
+ // This looks like where we need to set the use-preflight flag
+ // if the request has a body and nothing else has set the flag.
- // Step 40
- r.request.borrow_mut().body = input_body;
+ // Step 40 is done earlier
// Step 41
- let extracted_mime_type = r.Headers().extract_mime_type();
- *r.mime_type.borrow_mut() = extracted_mime_type;
+ r.request.borrow_mut().body = input_body;
// Step 42
Ok(r)
@@ -462,7 +459,6 @@ impl Request {
fn clone_from(r: &Request) -> Fallible<DomRoot<Request>> {
let req = r.request.borrow();
let url = req.url();
- let mime_type = r.mime_type.borrow().clone();
let headers_guard = r.Headers().get_guard();
let r_clone = Request::new(&r.global(), url);
r_clone.request.borrow_mut().pipeline_id = req.pipeline_id;
@@ -471,7 +467,6 @@ impl Request {
borrowed_r_request.origin = req.origin.clone();
}
*r_clone.request.borrow_mut() = req.clone();
- *r_clone.mime_type.borrow_mut() = mime_type;
r_clone.Headers().copy_from_headers(r.Headers())?;
r_clone.Headers().set_guard(headers_guard);
Ok(r_clone)
@@ -682,7 +677,8 @@ impl BodyMixin for Request {
}
fn get_mime_type(&self) -> Vec<u8> {
- self.mime_type.borrow().clone()
+ let headers = self.Headers();
+ headers.extract_mime_type()
}
}
diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs
index ef183340a97..11f51b75414 100644
--- a/components/script/dom/response.rs
+++ b/components/script/dom/response.rs
@@ -37,7 +37,6 @@ use url::Position;
pub struct Response {
reflector_: Reflector,
headers_reflector: MutNullableDom<Headers>,
- mime_type: DomRefCell<Vec<u8>>,
/// `None` can be considered a StatusCode of `0`.
#[ignore_malloc_size_of = "Defined in hyper"]
status: DomRefCell<Option<StatusCode>>,
@@ -62,7 +61,6 @@ impl Response {
Response {
reflector_: Reflector::new(),
headers_reflector: Default::default(),
- mime_type: DomRefCell::new("".to_string().into_bytes()),
status: DomRefCell::new(Some(StatusCode::OK)),
raw_status: DomRefCell::new(Some((200, b"".to_vec()))),
response_type: DomRefCell::new(DOMResponseType::Default),
@@ -79,6 +77,7 @@ impl Response {
reflect_dom_object(Box::new(Response::new_inherited(global)), global)
}
+ // https://fetch.spec.whatwg.org/#initialize-a-response
pub fn Constructor(
global: &GlobalScope,
body: Option<BodyInit>,
@@ -100,34 +99,29 @@ impl Response {
));
}
- // Step 3
let r = Response::new(global);
- // Step 4
+ // Step 3
*r.status.borrow_mut() = Some(StatusCode::from_u16(init.status).unwrap());
- // Step 5
+ // Step 4
*r.raw_status.borrow_mut() = Some((init.status, init.statusText.clone().into()));
- // Step 6
+ // Step 5
if let Some(ref headers_member) = init.headers {
- // Step 6.1
- r.Headers().empty_header_list();
-
- // Step 6.2
r.Headers().fill(Some(headers_member.clone()))?;
}
- // Step 7
+ // Step 6
if let Some(ref body) = body {
- // Step 7.1
+ // Step 6.1
if is_null_body_status(init.status) {
return Err(Error::Type(
"Body is non-null but init's status member is a null body status".to_string(),
));
};
- // Step 7.3
+ // Step 6.2
let ExtractedBody {
stream,
total_bytes: _,
@@ -137,7 +131,7 @@ impl Response {
r.body_stream.set(Some(&*stream));
- // Step 7.4
+ // Step 6.3
if let Some(content_type_contents) = content_type {
if !r
.Headers()
@@ -152,16 +146,6 @@ impl Response {
};
}
- // Step 8
- *r.mime_type.borrow_mut() = r.Headers().extract_mime_type();
-
- // Step 9
- // TODO: `entry settings object` is not implemented in Servo yet.
-
- // Step 10
- // TODO: Write this step once Promises are merged in
-
- // Step 11
Ok(r)
}
@@ -242,7 +226,8 @@ impl BodyMixin for Response {
}
fn get_mime_type(&self) -> Vec<u8> {
- self.mime_type.borrow().clone()
+ let headers = self.Headers();
+ headers.extract_mime_type()
}
}
@@ -404,7 +389,6 @@ impl Response {
Some(hyper_headers) => hyper_headers.into_inner(),
None => HyperHeaders::new(),
});
- *self.mime_type.borrow_mut() = self.Headers().extract_mime_type();
}
pub fn set_raw_status(&self, status: Option<(u16, Vec<u8>)>) {
diff --git a/etc/ci/upstream-wpt-changes/test.py b/etc/ci/upstream-wpt-changes/test.py
index c56831360ba..3ecf3afbb3c 100644
--- a/etc/ci/upstream-wpt-changes/test.py
+++ b/etc/ci/upstream-wpt-changes/test.py
@@ -229,7 +229,7 @@ class TestApplyCommitsToWPT(unittest.TestCase):
def run_test(self, pr_number: int, commit_data: dict):
def make_commit(data):
- with open(os.path.join(TESTS_DIR, data[2]), encoding="utf-8") as file:
+ with open(os.path.join(TESTS_DIR, data[2]), "rb") as file:
return {"author": data[0], "message": data[1], "diff": file.read()}
commits = [make_commit(data) for data in commit_data]
@@ -272,6 +272,15 @@ class TestApplyCommitsToWPT(unittest.TestCase):
[
["test author <test@author>", "test commit message", "18746.diff"],
["another person <two@author>", "a different message", "wpt.diff"],
+ ["another person <two@author>", "adding some non-utf8 chaos", "add-non-utf8-file.diff"],
+ ],
+ )
+
+ def test_non_utf8_commit(self):
+ self.run_test(
+ 100,
+ [
+ ["test author <nonutf8@author>", "adding some non-utf8 chaos", "add-non-utf8-file.diff"],
],
)
@@ -455,6 +464,17 @@ class TestFullSyncRun(unittest.TestCase):
]
)
+ def test_opened_upstreamable_pr_with_non_utf8_file_contents(self):
+ self.assertListEqual(
+ self.run_test("opened.json", ["add-non-utf8-file.diff"]),
+ [
+ "CreateOrUpdateBranchForPRStep:1:servo-wpt-sync/wpt/servo_export_18746",
+ "OpenPRStep:servo-wpt-sync/wpt/servo_export_18746→wpt/wpt#1",
+ "CommentStep:servo/servo#18746:🤖 Opened new upstream WPT pull request "
+ "(wpt/wpt#1) with upstreamable changes.",
+ ],
+ )
+
def test_open_new_upstreamable_pr_with_preexisting_upstream_pr_not_apply_cleanly_to_upstream(
self,
):
diff --git a/etc/ci/upstream-wpt-changes/tests/add-non-utf8-file.diff b/etc/ci/upstream-wpt-changes/tests/add-non-utf8-file.diff
new file mode 100644
index 00000000000..bd3b755d87d
--- /dev/null
+++ b/etc/ci/upstream-wpt-changes/tests/add-non-utf8-file.diff
@@ -0,0 +1,7 @@
+diff --git a/tests/wpt/web-platform-tests/non-utf8-file.txt b/tests/wpt/web-platform-tests/non-utf8-file.txt
+new file mode 100644
+index 0000000..5a992e0
+--- /dev/null
++++ b/tests/wpt/web-platform-tests/non-utf8-file.txt
+@@ -0,0 +1 @@
++foo bér ÿ "
diff --git a/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py b/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py
index 156bb108c5a..1ca65c56321 100644
--- a/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py
+++ b/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py
@@ -50,7 +50,7 @@ class LocalGitRepo:
self.path = path
self.sync = sync
- def run(self, *args, env: dict = {}):
+ def run_without_encoding(self, *args, env: dict = {}):
command_line = ["git"] + list(args)
logging.info(" → Execution (cwd='%s'): %s",
self.path, " ".join(command_line))
@@ -63,12 +63,19 @@ class LocalGitRepo:
try:
return subprocess.check_output(
command_line, cwd=self.path, env=env, stderr=subprocess.STDOUT
- ).decode("utf-8")
+ )
except subprocess.CalledProcessError as exception:
logging.warning("Process execution failed with output:\n%s",
- exception.output.decode("utf-8"))
+ exception.output.decode("utf-8", errors="surrogateescape"))
raise exception
+ def run(self, *args, env: dict = {}):
+ return (
+ self
+ .run_without_encoding(*args, env=env)
+ .decode("utf-8", errors="surrogateescape")
+ )
+
@dataclasses.dataclass()
class SyncRun:
diff --git a/etc/ci/upstream-wpt-changes/wptupstreamer/step.py b/etc/ci/upstream-wpt-changes/wptupstreamer/step.py
index 8c9d5c9a93b..9781353ce15 100644
--- a/etc/ci/upstream-wpt-changes/wptupstreamer/step.py
+++ b/etc/ci/upstream-wpt-changes/wptupstreamer/step.py
@@ -114,7 +114,9 @@ class CreateOrUpdateBranchForPRStep(Step):
# TODO: If we could cleverly parse and manipulate the full commit diff
# we could avoid cloning the servo repository altogether and only
# have to fetch the commit diffs from GitHub.
- diff = local_servo_repo.run(
+ # NB: The output of git show might include binary files or non-UTF8 text,
+ # so store the content of the diff as a `bytes`.
+ diff = local_servo_repo.run_without_encoding(
"show", "--binary", "--format=%b", sha, "--", UPSTREAMABLE_PATH
)
@@ -140,7 +142,7 @@ class CreateOrUpdateBranchForPRStep(Step):
strip_count = UPSTREAMABLE_PATH.count("/") + 1
try:
- with open(patch_path, "w", encoding="utf-8") as file:
+ with open(patch_path, "wb") as file:
file.write(commit["diff"])
run.sync.local_wpt_repo.run(
"apply", PATCH_FILE_NAME, "-p", str(strip_count)
diff --git a/etc/ci/wpt-nightly-update.sh b/etc/ci/wpt-scheduled-update.sh
index 2b75869f5c1..2b75869f5c1 100755
--- a/etc/ci/wpt-nightly-update.sh
+++ b/etc/ci/wpt-scheduled-update.sh
diff --git a/python/requirements.txt b/python/requirements.txt
index b58140060e3..7df9b1978db 100644
--- a/python/requirements.txt
+++ b/python/requirements.txt
@@ -23,6 +23,7 @@ colorama == 0.3.7
# For package uploading
boto3 == 1.17.27
+PyGithub == 1.58.1
# Default root CAs on Windows CI do not trust CloudFront certificates,
# connecting to https://static.rust-lang.org would fail:
@@ -32,4 +33,7 @@ certifi
# For Python3 compatibility
six == 1.15
+# For sending build notifications.
+notify-py == 0.3.42
+
-e python/tidy
diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py
index 1a9ee339b1a..2b0624d3a1d 100644
--- a/python/servo/build_commands.py
+++ b/python/servo/build_commands.py
@@ -23,6 +23,8 @@ import zipfile
from time import time
+import notifypy
+
from mach.decorators import (
CommandArgument,
CommandProvider,
@@ -36,113 +38,6 @@ from servo.gstreamer import windows_dlls, windows_plugins, macos_dylibs, macos_p
from servo.util import host_triple
-def format_duration(seconds):
- return str(datetime.timedelta(seconds=int(seconds)))
-
-
-def notify_linux(title, text):
- try:
- import dbus
- bus = dbus.SessionBus()
- notify_obj = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
- method = notify_obj.get_dbus_method("Notify", "org.freedesktop.Notifications")
- method(title, 0, "", text, "", [], {"transient": True}, -1)
- except ImportError:
- raise Exception("Optional Python module 'dbus' is not installed.")
-
-
-def notify_win(title, text):
- try:
- from servo.win32_toast import WindowsToast
- w = WindowsToast()
- w.balloon_tip(title, text)
- except WindowsError:
- from ctypes import Structure, windll, POINTER, sizeof
- from ctypes.wintypes import DWORD, HANDLE, WINFUNCTYPE, BOOL, UINT
-
- class FLASHWINDOW(Structure):
- _fields_ = [("cbSize", UINT),
- ("hwnd", HANDLE),
- ("dwFlags", DWORD),
- ("uCount", UINT),
- ("dwTimeout", DWORD)]
-
- FlashWindowExProto = WINFUNCTYPE(BOOL, POINTER(FLASHWINDOW))
- FlashWindowEx = FlashWindowExProto(("FlashWindowEx", windll.user32))
- FLASHW_CAPTION = 0x01
- FLASHW_TRAY = 0x02
- FLASHW_TIMERNOFG = 0x0C
-
- params = FLASHWINDOW(sizeof(FLASHWINDOW),
- windll.kernel32.GetConsoleWindow(),
- FLASHW_CAPTION | FLASHW_TRAY | FLASHW_TIMERNOFG, 3, 0)
- FlashWindowEx(params)
-
-
-def notify_darwin(title, text):
- try:
- import Foundation
-
- bundleDict = Foundation.NSBundle.mainBundle().infoDictionary()
- bundleIdentifier = 'CFBundleIdentifier'
- if bundleIdentifier not in bundleDict:
- bundleDict[bundleIdentifier] = 'mach'
-
- note = Foundation.NSUserNotification.alloc().init()
- note.setTitle_(title)
- note.setInformativeText_(text)
-
- now = Foundation.NSDate.dateWithTimeInterval_sinceDate_(0, Foundation.NSDate.date())
- note.setDeliveryDate_(now)
-
- centre = Foundation.NSUserNotificationCenter.defaultUserNotificationCenter()
- centre.scheduleNotification_(note)
- except ImportError:
- raise Exception("Optional Python module 'pyobjc' is not installed.")
-
-
-def notify_with_command(command):
- def notify(title, text):
- if call([command, title, text]) != 0:
- raise Exception("Could not run '%s'." % command)
- return notify
-
-
-def notify_build_done(config, elapsed, success=True):
- """Generate desktop notification when build is complete and the
- elapsed build time was longer than 30 seconds."""
- if elapsed > 30:
- notify(config, "Servo build",
- "%s in %s" % ("Completed" if success else "FAILED", format_duration(elapsed)))
-
-
-def notify(config, title, text):
- """Generate a desktop notification using appropriate means on
- supported platforms Linux, Windows, and Mac OS. On unsupported
- platforms, this function acts as a no-op.
-
- If notify-command is set in the [tools] section of the configuration,
- that is used instead."""
- notify_command = config["tools"].get("notify-command")
- if notify_command:
- func = notify_with_command(notify_command)
- else:
- platforms = {
- "linux": notify_linux,
- "linux2": notify_linux,
- "win32": notify_win,
- "darwin": notify_darwin
- }
- func = platforms.get(sys.platform)
-
- if func is not None:
- try:
- func(title, text)
- except Exception as e:
- extra = getattr(e, "message", "")
- print("[Warning] Could not generate notification! %s" % extra, file=sys.stderr)
-
-
@CommandProvider
class MachCommands(CommandBase):
@Command('build',
@@ -752,9 +647,12 @@ class MachCommands(CommandBase):
pass
# Generate Desktop Notification if elapsed-time > some threshold value
- notify_build_done(self.config, elapsed, status == 0)
- print("Build %s in %s" % ("Completed" if status == 0 else "FAILED", format_duration(elapsed)))
+ elapsed_delta = datetime.timedelta(seconds=int(elapsed))
+ build_message = f"{'Succeeded' if status == 0 else 'Failed'} in {elapsed_delta}"
+ self.notify("Servo build", build_message)
+ print(build_message)
+
return status
@Command('clean',
@@ -814,6 +712,55 @@ class MachCommands(CommandBase):
else:
os.remove(artifact)
+ def notify(self, title: str, message: str):
+ """Generate desktop notification when build is complete and the
+ elapsed build time was longer than 30 seconds.
+
+ If notify-command is set in the [tools] section of the configuration,
+ that is used instead."""
+ notify_command = self.config["tools"].get("notify-command")
+
+ # notifypy does not know how to send transient notifications, so we use a custom
+ # notifier on Linux. If transient notifications are not used, then notifications
+ # pile up in the notification center and must be cleared manually.
+ class LinuxNotifier(notifypy.BaseNotifier):
+ def __init__(self, **kwargs):
+ pass
+
+ def send_notification(self, **kwargs):
+ try:
+ import dbus
+ bus = dbus.SessionBus()
+ notify_obj = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
+ method = notify_obj.get_dbus_method("Notify", "org.freedesktop.Notifications")
+ method(
+ kwargs.get("application_name"),
+ 0, # Don't replace previous notification.
+ kwargs.get("notification_icon", ""),
+ kwargs.get("notification_title"),
+ kwargs.get("notification_subtitle"),
+ [], # actions
+ {"transient": True}, # hints
+ -1 # timeout
+ )
+ except ImportError:
+ print("[Warning] Could not generate notification: "
+ "Optional Python module 'dbus' is not installed.",
+ file=sys.stderr)
+ return True
+
+ if notify_command:
+ if call([notify_command, title, message]) != 0:
+ print("[Warning] Could not generate notification: "
+ f"Could not run '{notify_command}'.", file=sys.stderr)
+ else:
+ notifier = LinuxNotifier if sys.platform.startswith("linux") else None
+ notification = notifypy.Notify(use_custom_notifier=notifier)
+ notification.title = title
+ notification.message = message
+ notification.icon = path.join(self.get_top_dir(), "resources", "servo_64.png")
+ notification.send(block=False)
+
def angle_root(target, nuget_env):
arch = {
diff --git a/python/servo/devenv_commands.py b/python/servo/devenv_commands.py
index 5570aae50b7..47df6599b92 100644
--- a/python/servo/devenv_commands.py
+++ b/python/servo/devenv_commands.py
@@ -9,7 +9,6 @@
from __future__ import print_function, unicode_literals
from os import path, listdir, getcwd
-from time import time
import json
import signal
@@ -25,7 +24,6 @@ from mach.decorators import (
)
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
@@ -53,12 +51,7 @@ class MachCommands(CommandBase):
self.ensure_clobbered()
env = self.build_env()
- build_start = time()
status = self.run_cargo_build_like_command("check", params, env=env, features=features, **kwargs)
- elapsed = time() - build_start
-
- notify_build_done(self.config, elapsed, status == 0)
-
if status == 0:
print('Finished checking, binary NOT updated. Consider ./mach build before ./mach run')
diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py
index 53910dcd644..c5b9fb69726 100644
--- a/python/servo/package_commands.py
+++ b/python/servo/package_commands.py
@@ -10,6 +10,8 @@
from __future__ import absolute_import, print_function, unicode_literals
from datetime import datetime
+from github import Github
+
import base64
import hashlib
import io
@@ -594,7 +596,11 @@ class PackageCommands(CommandBase):
@CommandArgument('--secret-from-environment',
action='store_true',
help='Retrieve the appropriate secrets from the environment.')
- def upload_nightly(self, platform, secret_from_environment):
+ @CommandArgument('--github-release-id',
+ default=None,
+ type=int,
+ help='The github release to upload the nightly builds.')
+ def upload_nightly(self, platform, secret_from_environment, github_release_id):
import boto3
def get_s3_secret():
@@ -612,7 +618,28 @@ class PackageCommands(CommandBase):
path.basename(package)
)
- def upload_to_s3(platform, package, timestamp):
+ def upload_to_github_release(platform, package, package_hash):
+ if not github_release_id:
+ return
+
+ extension = path.basename(package).partition('.')[2]
+ g = Github(os.environ['NIGHTLY_REPO_TOKEN'])
+ nightly_repo = g.get_repo(os.environ['NIGHTLY_REPO'])
+ release = nightly_repo.get_release(github_release_id)
+ package_hash_fileobj = io.BytesIO(package_hash.encode('utf-8'))
+
+ if '2020' in platform:
+ asset_name = f'servo-latest-layout-2020.{extension}'
+ else:
+ asset_name = f'servo-latest.{extension}'
+
+ release.upload_asset(package, name=asset_name)
+ release.upload_asset_from_memory(
+ package_hash_fileobj,
+ package_hash_fileobj.getbuffer().nbytes,
+ name=f'{asset_name}.sha256')
+
+ def upload_to_s3(platform, package, package_hash, timestamp):
(aws_access_key, aws_secret_access_key) = get_s3_secret()
s3 = boto3.client(
's3',
@@ -635,16 +662,6 @@ class PackageCommands(CommandBase):
extension = path.basename(package).partition('.')[2]
latest_upload_key = '{}/servo-latest.{}'.format(nightly_dir, extension)
- # Compute the hash
- SHA_BUF_SIZE = 1048576 # read in 1 MiB chunks
- sha256_digest = hashlib.sha256()
- with open(package, 'rb') as package_file:
- while True:
- data = package_file.read(SHA_BUF_SIZE)
- if not data:
- break
- sha256_digest.update(data)
- package_hash = sha256_digest.hexdigest()
package_hash_fileobj = io.BytesIO(package_hash.encode('utf-8'))
latest_hash_upload_key = f'{latest_upload_key}.sha256'
@@ -763,7 +780,20 @@ class PackageCommands(CommandBase):
package
), file=sys.stderr)
return 1
- upload_to_s3(platform, package, timestamp)
+
+ # Compute the hash
+ SHA_BUF_SIZE = 1048576 # read in 1 MiB chunks
+ sha256_digest = hashlib.sha256()
+ with open(package, 'rb') as package_file:
+ while True:
+ data = package_file.read(SHA_BUF_SIZE)
+ if not data:
+ break
+ sha256_digest.update(data)
+ package_hash = sha256_digest.hexdigest()
+
+ upload_to_s3(platform, package, package_hash, timestamp)
+ upload_to_github_release(platform, package, package_hash)
if platform == 'maven':
for package in PACKAGES[platform]:
diff --git a/python/servo/win32_toast.py b/python/servo/win32_toast.py
deleted file mode 100644
index 22a7ccd917f..00000000000
--- a/python/servo/win32_toast.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2013 The Servo Project Developers. See the COPYRIGHT
-# file at the top-level directory of this distribution.
-#
-# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-# option. This file may not be copied, modified, or distributed
-# except according to those terms.
-
-from win32api import GetModuleHandle
-from win32gui import WNDCLASS, RegisterClass, CreateWindow, UpdateWindow
-from win32gui import DestroyWindow, LoadIcon, NIF_ICON, NIF_MESSAGE, NIF_TIP
-from win32gui import Shell_NotifyIcon, NIM_ADD, NIM_MODIFY, NIF_INFO, NIIF_INFO
-import win32con
-
-
-class WindowsToast:
- def __init__(self):
- # Register window class; it's okay to do this multiple times
- wc = WNDCLASS()
- wc.lpszClassName = 'ServoTaskbarNotification'
- wc.lpfnWndProc = {win32con.WM_DESTROY: self.OnDestroy, }
- self.classAtom = RegisterClass(wc)
- self.hinst = wc.hInstance = GetModuleHandle(None)
-
- def OnDestroy(self, hwnd, msg, wparam, lparam):
- # We don't have to Shell_NotifyIcon to delete it, since
- # we destroyed
- pass
-
- def balloon_tip(self, title, msg):
- style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
- hwnd = CreateWindow(self.classAtom, "Taskbar", style, 0, 0,
- win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT,
- 0, 0, self.hinst, None)
- UpdateWindow(hwnd)
-
- hicon = LoadIcon(0, win32con.IDI_APPLICATION)
-
- nid = (hwnd, 0, NIF_ICON | NIF_MESSAGE | NIF_TIP, win32con.WM_USER + 20, hicon, 'Tooltip')
- Shell_NotifyIcon(NIM_ADD, nid)
- nid = (hwnd, 0, NIF_INFO, win32con.WM_USER + 20, hicon, 'Balloon Tooltip', msg, 200, title, NIIF_INFO)
- Shell_NotifyIcon(NIM_MODIFY, nid)
-
- DestroyWindow(hwnd)
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/backgrounds/background-position-152.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/backgrounds/background-position-152.xht.ini
deleted file mode 100644
index 1b384364eb1..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/backgrounds/background-position-152.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[background-position-152.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/height-percentage-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/height-percentage-003.xht.ini
deleted file mode 100644
index 030729ac98f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/height-percentage-003.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[height-percentage-003.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini
new file mode 100644
index 00000000000..a7c02218dae
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-height-003.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini
new file mode 100644
index 00000000000..d5edb75b0ee
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-height-004.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini
new file mode 100644
index 00000000000..acbe4a16f4d
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-height-005.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini
new file mode 100644
index 00000000000..ffa0aa5f51d
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-height-010.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini
new file mode 100644
index 00000000000..ff562b47bae
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-height-011.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini
new file mode 100644
index 00000000000..5cd0779a01b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-height-012.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini
new file mode 100644
index 00000000000..520f8f51740
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-max-height-004.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini
new file mode 100644
index 00000000000..f0a70485254
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-max-height-005.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini
new file mode 100644
index 00000000000..b49a7b20e06
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-max-height-006.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini
new file mode 100644
index 00000000000..26bf546864a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-max-height-010.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini
new file mode 100644
index 00000000000..bbeee78f08a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini
@@ -0,0 +1,2 @@
+[absolute-non-replaced-max-height-012.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/bottom-offset-percentage-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/bottom-offset-percentage-001.xht.ini
deleted file mode 100644
index 4f0220cbfd5..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/bottom-offset-percentage-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[bottom-offset-percentage-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/left-offset-percentage-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/left-offset-percentage-002.xht.ini
deleted file mode 100644
index 1da7d09df26..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/left-offset-percentage-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[left-offset-percentage-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-001.xht.ini
deleted file mode 100644
index c9007fc8873..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[top-offset-percentage-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-002.xht.ini
deleted file mode 100644
index a3cf8681178..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[top-offset-percentage-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht.ini
deleted file mode 100644
index 2a0ad5f976c..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[position-absolute-percentage-inherit-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-animations/display-none-dont-cancel.tentative.html.ini b/tests/wpt/metadata-layout-2020/css/css-animations/display-none-dont-cancel.tentative.html.ini
new file mode 100644
index 00000000000..0ac75b5ef27
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-animations/display-none-dont-cancel.tentative.html.ini
@@ -0,0 +1,15 @@
+[display-none-dont-cancel.tentative.html]
+ [display:none animating to display:inline should be inline for the whole animation.]
+ expected: FAIL
+
+ [A CSS variable of display:none animating to display:inline should be inline for the whole animation.]
+ expected: FAIL
+
+ [Animating from display:none to display:none should not cancel the animation.]
+ expected: FAIL
+
+ [Animating from display:none to display:none with an intermediate variable should not cancel the animation.]
+ expected: FAIL
+
+ [Animating a variable of "none" which gets set to display elsewhere should not cancel the animation.]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini
new file mode 100644
index 00000000000..2789084260c
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini
@@ -0,0 +1,2 @@
+[background-attachment-fixed-inline-scrolled.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini
index d4f9786638e..0c429395c15 100644
--- a/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini
@@ -964,159 +964,3 @@
[.flexbox 129]
expected: FAIL
-
- [.flexbox 10]
- expected: FAIL
-
- [.flexbox 12]
- expected: FAIL
-
- [.flexbox 20]
- expected: FAIL
-
- [.flexbox 31]
- expected: FAIL
-
- [.flexbox 33]
- expected: FAIL
-
- [.flexbox 47]
- expected: FAIL
-
- [.flexbox 58]
- expected: FAIL
-
- [.flexbox 60]
- expected: FAIL
-
- [.flexbox 68]
- expected: FAIL
-
- [.flexbox 79]
- expected: FAIL
-
- [.flexbox 81]
- expected: FAIL
-
- [.flexbox 95]
- expected: FAIL
-
- [.flexbox 107]
- expected: FAIL
-
- [.flexbox 115]
- expected: FAIL
-
- [.flexbox 117]
- expected: FAIL
-
- [.flexbox 128]
- expected: FAIL
-
- [.flexbox 142]
- expected: FAIL
-
- [.flexbox 144]
- expected: FAIL
-
- [.flexbox 155]
- expected: FAIL
-
- [.flexbox 167]
- expected: FAIL
-
- [.flexbox 176]
- expected: FAIL
-
- [.flexbox 188]
- expected: FAIL
-
- [.flexbox 203]
- expected: FAIL
-
- [.flexbox 215]
- expected: FAIL
-
- [.flexbox 224]
- expected: FAIL
-
- [.flexbox 236]
- expected: FAIL
-
- [.flexbox 250]
- expected: FAIL
-
- [.flexbox 252]
- expected: FAIL
-
- [.flexbox 262]
- expected: FAIL
-
- [.flexbox 264]
- expected: FAIL
-
- [.flexbox 271]
- expected: FAIL
-
- [.flexbox 273]
- expected: FAIL
-
- [.flexbox 283]
- expected: FAIL
-
- [.flexbox 285]
- expected: FAIL
-
- [.flexbox 298]
- expected: FAIL
-
- [.flexbox 300]
- expected: FAIL
-
- [.flexbox 308]
- expected: FAIL
-
- [.flexbox 319]
- expected: FAIL
-
- [.flexbox 321]
- expected: FAIL
-
- [.flexbox 335]
- expected: FAIL
-
- [.flexbox 346]
- expected: FAIL
-
- [.flexbox 348]
- expected: FAIL
-
- [.flexbox 356]
- expected: FAIL
-
- [.flexbox 367]
- expected: FAIL
-
- [.flexbox 369]
- expected: FAIL
-
- [.flexbox 383]
- expected: FAIL
-
- [.flexbox 395]
- expected: FAIL
-
- [.flexbox 403]
- expected: FAIL
-
- [.flexbox 405]
- expected: FAIL
-
- [.flexbox 416]
- expected: FAIL
-
- [.flexbox 430]
- expected: FAIL
-
- [.flexbox 432]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/justify-content-007.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/justify-content-007.html.ini
new file mode 100644
index 00000000000..ea29b95ecec
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/justify-content-007.html.ini
@@ -0,0 +1,3 @@
+[justify-content-007.html]
+ [.flexitem + .flexitem 1]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-flex-item-max-content.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-flex-item-max-content.html.ini
new file mode 100644
index 00000000000..0757e0f9b55
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-flex-item-max-content.html.ini
@@ -0,0 +1,2 @@
+[table-as-flex-item-max-content.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini b/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini
index 5aa97a62ffc..2aa858c8719 100644
--- a/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini
@@ -40,4 +40,3 @@
[Test @font-face matching for weight 420]
expected: FAIL
-
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-computed.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-computed.html.ini
new file mode 100644
index 00000000000..cc0692d0132
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-computed.html.ini
@@ -0,0 +1,18 @@
+[overlay-computed.html]
+ [Property overlay value 'none']
+ expected: FAIL
+
+ [Property overlay value 'auto']
+ expected: FAIL
+
+ [Property overlay value 'inherit']
+ expected: FAIL
+
+ [Property overlay value 'initial']
+ expected: FAIL
+
+ [Property overlay value 'revert']
+ expected: FAIL
+
+ [Property overlay value 'unset']
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-transition-property.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-transition-property.html.ini
new file mode 100644
index 00000000000..aacfbd3b035
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-transition-property.html.ini
@@ -0,0 +1,3 @@
+[overlay-transition-property.html]
+ [Property transition value 'overlay 1s']
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-valid.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-valid.html.ini
new file mode 100644
index 00000000000..5c27614af3c
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-valid.html.ini
@@ -0,0 +1,18 @@
+[overlay-valid.html]
+ [e.style['overlay'\] = "none" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "auto" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "inherit" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "initial" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "revert" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "unset" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini
index b70e581ff49..f5ed122006b 100644
--- a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini
@@ -1,16 +1,4 @@
[position-absolute-dynamic-containing-block.html]
- [abs containing block moves from outer to intermediate]
- expected: FAIL
-
- [abs containing block moves from intermediate to outer]
- expected: FAIL
-
- [target is no longer absolute]
- expected: FAIL
-
- [target becomes absolute]
- expected: FAIL
-
[fixed containing block moves from outer to intermediate]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-fit-content.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-fit-content.html.ini
new file mode 100644
index 00000000000..c8b541f3150
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-fit-content.html.ini
@@ -0,0 +1,2 @@
+[position-absolute-fit-content.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini
index 56b0fa56d4b..17c3b71eca7 100644
--- a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini
@@ -4,3 +4,27 @@
[vertical-align vertical(keyword) / events]
expected: FAIL
+
+ [margin-bottom percentage(%) / values]
+ expected: FAIL
+
+ [margin-left percentage(%) / values]
+ expected: FAIL
+
+ [margin-right percentage(%) / values]
+ expected: FAIL
+
+ [margin-top percentage(%) / values]
+ expected: FAIL
+
+ [padding-bottom percentage(%) / values]
+ expected: FAIL
+
+ [padding-left percentage(%) / values]
+ expected: FAIL
+
+ [padding-right percentage(%) / values]
+ expected: FAIL
+
+ [padding-top percentage(%) / values]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini
index 1f5e357c51f..719b9b6ff15 100644
--- a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini
@@ -544,153 +544,3 @@
[margin-right length(mm) / events]
expected: FAIL
-
- [margin-right length(cm) / events]
- expected: FAIL
-
- [margin-right length(in) / events]
- expected: FAIL
-
- [margin-top length(pt) / events]
- expected: FAIL
-
- [margin-top length(pc) / events]
- expected: FAIL
-
- [margin-top length(px) / events]
- expected: FAIL
-
- [margin-top length(em) / events]
- expected: FAIL
-
- [margin-top length(ex) / events]
- expected: FAIL
-
- [margin-top length(mm) / events]
- expected: FAIL
-
- [margin-top length(cm) / events]
- expected: FAIL
-
- [margin-top length(in) / events]
- expected: FAIL
-
- [height length(pt) / events]
- expected: FAIL
-
- [height length(pc) / events]
- expected: FAIL
-
- [height length(px) / events]
- expected: FAIL
-
- [height length(em) / events]
- expected: FAIL
-
- [height length(ex) / events]
- expected: FAIL
-
- [height length(mm) / events]
- expected: FAIL
-
- [height length(cm) / events]
- expected: FAIL
-
- [height length(in) / events]
- expected: FAIL
-
- [height percentage(%) / events]
- expected: FAIL
-
- [width length(pt) / events]
- expected: FAIL
-
- [width length(pc) / events]
- expected: FAIL
-
- [width length(px) / events]
- expected: FAIL
-
- [width length(em) / events]
- expected: FAIL
-
- [width length(ex) / events]
- expected: FAIL
-
- [width length(mm) / events]
- expected: FAIL
-
- [width length(cm) / events]
- expected: FAIL
-
- [width length(in) / events]
- expected: FAIL
-
- [width percentage(%) / events]
- expected: FAIL
-
- [min-height length(pt) / events]
- expected: FAIL
-
- [min-height length(pc) / events]
- expected: FAIL
-
- [min-height length(px) / events]
- expected: FAIL
-
- [min-height length(em) / events]
- expected: FAIL
-
- [min-height length(ex) / events]
- expected: FAIL
-
- [min-height length(mm) / events]
- expected: FAIL
-
- [min-height length(cm) / events]
- expected: FAIL
-
- [min-height length(in) / events]
- expected: FAIL
-
- [min-height percentage(%) / events]
- expected: FAIL
-
- [min-width length(pt) / events]
- expected: FAIL
-
- [min-width length(pc) / events]
- expected: FAIL
-
- [min-width length(px) / events]
- expected: FAIL
-
- [min-width length(em) / events]
- expected: FAIL
-
- [min-width length(ex) / events]
- expected: FAIL
-
- [min-width length(mm) / events]
- expected: FAIL
-
- [min-width length(cm) / events]
- expected: FAIL
-
- [min-width length(in) / events]
- expected: FAIL
-
- [min-width percentage(%) / events]
- expected: FAIL
-
- [max-height length(pt) / events]
- expected: FAIL
-
- [max-height length(pc) / events]
- expected: FAIL
-
- [max-height length(px) / events]
- expected: FAIL
-
- [max-height length(em) / events]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini
index cf67b5d03dd..80ed711305d 100644
--- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini
@@ -1,3 +1,4 @@
[elementFromPoint-dynamic-anon-box.html]
+ expected: CRASH
[Link should be clickable after hiding a scrollbox with an anonymous table inside]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini
index fef9ce7fc04..1a06450c5c1 100644
--- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini
@@ -16,3 +16,6 @@
[test some point of the element: top left corner]
expected: FAIL
+
+ [test the top of layer]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini
index 314c2710dc9..78f6aab8d85 100644
--- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini
+++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini
@@ -1,3 +1,6 @@
[elementsFromPoint-iframes.html]
[elementsFromPoint on the root document for points in iframe elements]
expected: FAIL
+
+ [elementsFromPoint on inner documents]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-011.html.ini b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-011.html.ini
new file mode 100644
index 00000000000..b168bf5cd3a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-011.html.ini
@@ -0,0 +1,2 @@
+[lang-011.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-012.html.ini b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-012.html.ini
new file mode 100644
index 00000000000..cdc6bafba43
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-012.html.ini
@@ -0,0 +1,2 @@
+[lang-012.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini
index 8edde75f4d0..df1b6f0e51b 100644
--- a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini
@@ -186,9 +186,6 @@
[fetch(): separate response Content-Type: text/plain;charset=gbk text/plain]
expected: NOTRUN
- [Request: combined response Content-Type: text/plain]
- expected: FAIL
-
[<iframe>: combined response Content-Type: text/plain ]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini b/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini
index 3b66eaffa45..3ec67be350a 100644
--- a/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini
+++ b/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini
@@ -4,10 +4,10 @@
expected: FAIL
[sec-fetch-site - Not sent to non-trustworthy same-site destination, no attributes]
- expected: FAIL
+ expected: TIMEOUT
[sec-fetch-site - Not sent to non-trustworthy cross-site destination, no attributes]
- expected: TIMEOUT
+ expected: NOTRUN
[sec-fetch-mode - Not sent to non-trustworthy same-origin destination, no attributes]
expected: NOTRUN
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini
index 33efcdbcf48..f7ee5361549 100644
--- a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini
@@ -1,3 +1,4 @@
[005.html]
+ expected: TIMEOUT
[Link with onclick navigation and href navigation ]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
index 856bb1c9901..dc1144214ef 100644
--- a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini
@@ -1,10 +1,9 @@
[iframe-src-aboutblank-navigate-immediately.html]
- expected: TIMEOUT
[Navigating to a different document with window.open]
expected: FAIL
[Navigating to a different document with form submission]
- expected: TIMEOUT
+ expected: FAIL
[Navigating to a different document with link click]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
index 78240a2f463..8ae58f9f1e2 100644
--- a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
@@ -16,3 +16,6 @@
[D83D DE0D set in href="" targeting a frame and clicked]
expected: FAIL
+
+ [DE0D 0041 set in href="" targeting a frame and clicked]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
new file mode 100644
index 00000000000..60a4fa51f8a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
@@ -0,0 +1,3 @@
+[a-click.html]
+ [aElement.click() before the load event must NOT replace]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini
index 9df06805f99..613bed9352d 100644
--- a/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini
@@ -1,5 +1,5 @@
[embedded-opener-remove-frame.html]
- expected: TIMEOUT
+ expected: CRASH
[opener of discarded nested browsing context]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini b/tests/wpt/metadata-layout-2020/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini
deleted file mode 100644
index 5ff0d0fdbbc..00000000000
--- a/tests/wpt/metadata-layout-2020/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[2d.filter.canvasFilterObject.dropShadow.tentative.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini
index 53443fb1a84..a96b906711a 100644
--- a/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini
@@ -1463,6 +1463,45 @@
[SVGElement interface: attribute onscrollend]
expected: FAIL
+ [ToggleEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ToggleEvent interface object length]
+ expected: FAIL
+
+ [ToggleEvent interface object name]
+ expected: FAIL
+
+ [ToggleEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ToggleEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [ToggleEvent interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ToggleEvent interface: attribute oldState]
+ expected: FAIL
+
+ [ToggleEvent interface: attribute newState]
+ expected: FAIL
+
+ [ToggleEvent must be primary interface of new ToggleEvent("beforetoggle")]
+ expected: FAIL
+
+ [Stringification of new ToggleEvent("beforetoggle")]
+ expected: FAIL
+
+ [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "oldState" with the proper type]
+ expected: FAIL
+
+ [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "newState" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute onbeforetoggle]
+ expected: FAIL
+
[idlharness.https.html?include=(Document|Window)]
[Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type]
@@ -1567,9 +1606,6 @@
[Document interface: documentWithHandlers must inherit property "onsecuritypolicyviolation" with the proper type]
expected: FAIL
- [Window interface: existence and properties of interface prototype object]
- expected: FAIL
-
[Window interface: operation focus()]
expected: FAIL
@@ -2047,6 +2083,24 @@
[Window interface: window must inherit property "onpaste" with the proper type]
expected: FAIL
+ [Window interface: attribute onbeforetoggle]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute onbeforetoggle]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
[idlharness.https.html?include=HTML.*]
[HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type]
@@ -4025,3 +4079,213 @@
[HTMLScriptElement interface: document.createElement("script") must inherit property "blocking" with the proper type]
expected: FAIL
+
+ [HTMLElement interface: operation showPopover()]
+ expected: FAIL
+
+ [HTMLElement interface: operation hidePopover()]
+ expected: FAIL
+
+ [HTMLElement interface: operation togglePopover(optional boolean)]
+ expected: FAIL
+
+ [HTMLElement interface: attribute popover]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onbeforetoggle]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "showPopover()" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "hidePopover()" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "togglePopover(optional boolean)" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: calling togglePopover(optional boolean) on document.createElement("noscript") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "popover" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [HTMLLinkElement interface: attribute fetchPriority]
+ expected: FAIL
+
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute fetchPriority]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute popoverTargetElement]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute popoverTargetAction]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: attribute popoverTargetElement]
+ expected: FAIL
+
+ [HTMLButtonElement interface: attribute popoverTargetAction]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLScriptElement interface: attribute fetchPriority]
+ expected: FAIL
+
+ [HTMLScriptElement interface: document.createElement("script") must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini
index 59e7bc11784..a10be12e8cc 100644
--- a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini
@@ -1,7 +1,7 @@
[document-with-fragment-nonexistent.html]
+ expected: TIMEOUT
[Autofocus elements in iframed documents with non-existent fragments should work.]
expected: FAIL
[Autofocus elements in top-level browsing context's documents with non-existent fragments should work.]
- expected: FAIL
-
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini
new file mode 100644
index 00000000000..27c12573f11
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini
@@ -0,0 +1,3 @@
+[http-equiv-and-name-1.html]
+ [<meta> set the color-scheme to dark]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini
new file mode 100644
index 00000000000..def16bc1f29
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini
@@ -0,0 +1,3 @@
+[http-equiv-and-name-2.html]
+ [<meta> set the content-language to de-DE]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini
new file mode 100644
index 00000000000..09c049e4b58
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini
@@ -0,0 +1,3 @@
+[media_fragment_seek.html]
+ [Video should seek to time specified in media fragment syntax]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
index 7d28d586f51..24903b5f66f 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_escaping-1.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-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
index 26704422bbe..841bafc6eca 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -1,4 +1,3 @@
[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: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index 6a420504feb..7da2bc5ac80 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,3 +1,4 @@
[iframe_sandbox_popups_escaping-3.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-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
index d5fd800f09d..ff6467094b8 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
@@ -1,4 +1,3 @@
[iframe_sandbox_popups_nonescaping-3.html]
- expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode.html.ini
deleted file mode 100644
index 79c296a8aef..00000000000
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode.html.ini
+++ /dev/null
@@ -1,24 +0,0 @@
-[parse-a-sizes-attribute-quirks-mode.html]
- [<img srcset="/images/green-1x1.png?e38 50w, /images/green-16x16.png?e38 51w" sizes="(min-width:calc(0)) 1px"> ref sizes="1px" (quirks mode)]
- expected: FAIL
-
- [<img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (quirks mode)]
- expected: FAIL
-
- [<img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (quirks mode)]
- expected: FAIL
-
- [<img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (quirks mode)]
- expected: FAIL
-
- [<img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown &quot;general-enclosed&quot;) 1px"> ref sizes="1px" (quirks mode)]
- expected: FAIL
-
- [<img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (quirks mode)]
- expected: FAIL
-
- [<img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (quirks mode)]
- expected: FAIL
-
- [<img srcset="/images/green-1x1.png?e45 50w, /images/green-16x16.png?e45 51w" sizes="(min-width:-1px) 1px, 100vw"> ref sizes="1px" (quirks mode)]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini
index b4b7cecba9e..7682a4830bf 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini
@@ -1,4 +1,4 @@
[reparent-form-during-planned-navigation-task.html]
+ expected: TIMEOUT
[reparent-form-during-planned-navigation-task]
- expected: FAIL
-
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini
deleted file mode 100644
index 2212b9d731f..00000000000
--- a/tests/wpt/metadata-layout-2020/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[async-script.html?reload]
- expected: ERROR
-
-[async-script.html]
diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
index 3a164593266..bcba06a84cf 100644
--- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
@@ -484,3 +484,12 @@
[onpaste: the default value must be null]
expected: FAIL
+
+ [onbeforetoggle: must be on the appropriate locations for GlobalEventHandlers]
+ expected: FAIL
+
+ [onbeforetoggle: the default value must be null]
+ expected: FAIL
+
+ [onbeforetoggle: the content attribute must be compiled into a function as the corresponding property]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
index 7092165e1a6..e1909af3d2f 100644
--- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
@@ -124,3 +124,12 @@
[not shadowed scrollend (window)]
expected: FAIL
+
+ [not shadowed beforetoggle (document.body)]
+ expected: FAIL
+
+ [not shadowed beforetoggle (document.createElement("body"))]
+ expected: FAIL
+
+ [not shadowed beforetoggle (window)]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
index e25a998db27..4bb3869ad9d 100644
--- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
@@ -124,3 +124,12 @@
[not shadowed scrollend (window)]
expected: FAIL
+
+ [not shadowed beforetoggle (document.body)]
+ expected: FAIL
+
+ [not shadowed beforetoggle (document.createElement("frameset"))]
+ expected: FAIL
+
+ [not shadowed beforetoggle (window)]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
index 3fa6f190d8f..04f99b6b367 100644
--- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
@@ -70,3 +70,9 @@
[scrollend is unaffected on a windowless frameset]
expected: FAIL
+
+ [beforetoggle is unaffected on a windowless body]
+ expected: FAIL
+
+ [beforetoggle is unaffected on a windowless frameset]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini
index 410876e8c47..080c16f6755 100644
--- a/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini
+++ b/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini
@@ -20,6 +20,12 @@
[PerformanceResourceTiming interface: default toJSON operation on resource]
expected: FAIL
+ [PerformanceResourceTiming interface: attribute deliveryType]
+ expected: FAIL
+
+ [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type]
+ expected: FAIL
+
[idlharness.any.worker.html]
[PerformanceResourceTiming interface: attribute workerStart]
@@ -42,3 +48,9 @@
[PerformanceResourceTiming interface: default toJSON operation on resource]
expected: FAIL
+
+ [PerformanceResourceTiming interface: attribute deliveryType]
+ expected: FAIL
+
+ [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini b/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini
index 7890db33546..adc033c4f6d 100644
--- a/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini
@@ -16,3 +16,18 @@
[Selection interface: calling getComposedRange(ShadowRoot...) on getSelection() with too few arguments must throw TypeError]
expected: FAIL
+
+ [Selection interface: attribute direction]
+ expected: FAIL
+
+ [Selection interface: operation getComposedRanges(ShadowRoot...)]
+ expected: FAIL
+
+ [Selection interface: getSelection() must inherit property "direction" with the proper type]
+ expected: FAIL
+
+ [Selection interface: getSelection() must inherit property "getComposedRanges(ShadowRoot...)" with the proper type]
+ expected: FAIL
+
+ [Selection interface: calling getComposedRanges(ShadowRoot...) on getSelection() with too few arguments must throw TypeError]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini b/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini
index 4bec6189b7a..b79ea99423a 100644
--- a/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini
@@ -61,3 +61,6 @@
[XRSession interface: operation deletePersistentAnchor(DOMString)]
expected: FAIL
+
+ [XRSession interface: attribute persistentAnchors]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini
index bf65c4fbaee..042608beeba 100644
--- a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini
@@ -328,3 +328,9 @@
[XRSession interface: xrSession must inherit property "enabledFeatures" with the proper type]
expected: FAIL
+
+ [XRSession interface: attribute isSystemKeyboardSupported]
+ expected: FAIL
+
+ [XRSession interface: xrSession must inherit property "isSystemKeyboardSupported" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata/FileAPI/url/url-charset.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-charset.window.js.ini
new file mode 100644
index 00000000000..08ab7bd35cd
--- /dev/null
+++ b/tests/wpt/metadata/FileAPI/url/url-charset.window.js.ini
@@ -0,0 +1,4 @@
+[url-charset.window.html]
+ expected: TIMEOUT
+ [Blob charset should override any auto-detected charset.]
+ expected: TIMEOUT
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 282ab0b2525..cdeaf7f7080 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: FAIL
+ expected: TIMEOUT
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 5ccc20c18d0..267e26130f0 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -3891,6 +3891,13 @@
{}
]
],
+ "root-element-cv-hidden-crash.html": [
+ "890194b7c171ea7a42fd083567637aacee4fd877",
+ [
+ null,
+ {}
+ ]
+ ],
"root-element-display-none-crash.html": [
"fc55719c7e87bccb9d2862464b19e19112e02711",
[
@@ -30168,7 +30175,7 @@
]
],
"scroll-timeline-specified-scroller-print.html": [
- "7e5b6607b6e9e99705022e10310816f2862732d8",
+ "05fab3e46ad22d01d26d5fe5ba90edb4dab798f3",
[
null,
[
@@ -128120,6 +128127,19 @@
{}
]
],
+ "anchor-scroll-composited-scrolling-006.html": [
+ "6b5f268f5548b3e6db472d4939f7076bed09a64d",
+ [
+ null,
+ [
+ [
+ "/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"anchor-scroll-fixedpos.tentative.html": [
"ee7d22608b65570fe075e02542dbd877cd38cd82",
[
@@ -129031,6 +129051,19 @@
{}
]
],
+ "background-attachment-fixed-inline-scrolled.html": [
+ "746997d6057ba1d2c109dafdfe7730ef149cd21e",
+ [
+ null,
+ [
+ [
+ "/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"background-attachment-fixed-inside-transform-1.html": [
"9dae31aaccd1d281d05e43c3160000a53914d279",
[
@@ -145645,6 +145678,58 @@
{}
]
],
+ "overflow-clip-014.html": [
+ "4edf112e43265cd13465b6e86e9e1c2f288cf78c",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "overflow-clip-015.html": [
+ "1eb114458c1bf5a1a69620a6ea3a1f746248d610",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "overflow-clip-016.html": [
+ "4314c0135e26e6afe8659ce74fe24c14cf46281a",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "overflow-clip-017.html": [
+ "1ab3cdd194f21f90699fe7f27c34a5614228ebb7",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"overflowed-block-with-no-room-after-000.html": [
"084e16fb38de072fb83f92ba01302a2e404cdd97",
[
@@ -148122,7 +148207,7 @@
]
],
"import-conditional-001.html": [
- "9bdbbcb5a32b638d2275cd86f0b9f2bbd026ebdc",
+ "a841f265457a3f7bba741143d586e98f8e0354ef",
[
null,
[
@@ -165458,6 +165543,19 @@
{}
]
],
+ "dynamic-align-self-001.html": [
+ "208c006d2d056888dba662ea593410970e848ca9",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"flex-abspos-staticpos-align-self-safe-001.html": [
"b7302cb962dbff9bfc99592ac7a2d2f2aae52b21",
[
@@ -167592,6 +167690,19 @@
{}
]
],
+ "flex-aspect-ratio-img-row-017.html": [
+ "b2408159b5af0c445333b4a3e6ab0d9d4353d78f",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"flex-basis-001.html": [
"85e3bc69c435da542f520bc0e5b9b0afe911f0ad",
[
@@ -175026,6 +175137,19 @@
{}
]
],
+ "grandchild-span-height.html": [
+ "c087edb68d48036f5b3a45114a62d9db03a5a86e",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"grid-flex-item-001.html": [
"67ee0fb001d7b136f026190bfee0940aeb4ff849",
[
@@ -175104,6 +175228,19 @@
{}
]
],
+ "grid-flex-item-007.html": [
+ "bdea17d0692981c4742448f1c429e90236418858",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"image-items-flake-001.html": [
"90319f1ad83d26d414d8ddcd4a9ab59042a4bd62",
[
@@ -176410,6 +176547,19 @@
{}
]
],
+ "table-as-flex-item-max-content.html": [
+ "c7316aab950ddb1ceb6f05933ae9f1cec481f191",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"table-as-item-auto-min-width.html": [
"66a77327f0f25e07db87e342ebb590358d045f7a",
[
@@ -188918,7 +189068,7 @@
]
],
"auto-track-sizing-001.html": [
- "0fdb9b0b7e2ed8855b02dcfb9baceeb61b7d05d3",
+ "4a946e6feb4dbf4c9c348896ad69a2c81232c17c",
[
null,
[
@@ -189152,7 +189302,7 @@
]
],
"independent-formatting-context.html": [
- "888b23c2f621e1abfa027a4f42cbebb00db89656",
+ "5a76ac2d6dea91a0d13de29d9192aaf8df3ae350",
[
null,
[
@@ -191552,7 +191702,7 @@
]
],
"image-orientation-none-cross-origin.html": [
- "e36c1295d31d43e48a6745021be3346838431158",
+ "ec139d4e229224de8c9953ecf748af2cf28cb197",
[
null,
[
@@ -300261,6 +300411,32 @@
{}
]
],
+ "scripting-print-noscript.html": [
+ "1d1af708fd7e746ef991d2067a5a32b150672893",
+ [
+ null,
+ [
+ [
+ "/css/mediaqueries/scripting-print-noscript-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "scripting-print-script.html": [
+ "e80dba4d83f586df8ba48fde04356a0361861b69",
+ [
+ null,
+ [
+ [
+ "/css/mediaqueries/scripting-print-script-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"viewport-script-dynamic.html": [
"7433877972b09b3a03cd9f8a11dcd3efd1aa01d6",
[
@@ -304188,6 +304364,216 @@
{}
]
],
+ "selectors-4": {
+ "lang-000.html": [
+ "1d66bebbc6b53706ae782eec7b6a70cbaba3ec7f",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-001.html": [
+ "908643fca81d533e76869c6af874fb3797991bfc",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-002.html": [
+ "0be426c66e7d4e1e12de1778db3256752a7a560a",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-003.html": [
+ "a3e5340b6e915d32963261669991d4040df7f096",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-004.html": [
+ "d592997270746bb0cbfa286dad65d3539e519ecb",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-005.html": [
+ "816dfc9b5034e8d9787be254660012e70b60c55d",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-006.html": [
+ "d249a4c8c06a5e9a10b40df6a9bab68f367a69d2",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-007.html": [
+ "a21506d94c1125da970792b3e2da5a542f96e332",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-008.html": [
+ "77f77a884ac5088c360c34971eec637e48c42cff",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-009.html": [
+ "bf2e9883916ea0e219a968b7dd6b0457e312d794",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-010.html": [
+ "081c9207add489896a7db13d946658d249bd893b",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-011.html": [
+ "5620317a14be99de361c456dbea873bdd294562f",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-012.html": [
+ "f299e22eaecd2bde8351b01fca62ed8eaf2eab49",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-013.html": [
+ "34303d97805386d7ca1ece6a61ebcdf1977f748d",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-014.html": [
+ "2d064c8d29b60fbb0d3351c6c019cbc3aca85521",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "lang-015.html": [
+ "4d90b080f39607f09a63fe28756a6a51542094af",
+ [
+ null,
+ [
+ [
+ "/css/selectors/selectors-4/lang-000-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ]
+ },
"selectors-attr-many.html": [
"b38b8f52cfa7ef4290ecaa271b5bec95f676011d",
[
@@ -305541,7 +305927,7 @@
},
"filters": {
"2d.filter.canvasFilterObject.dropShadow.tentative.html": [
- "22c6a6547f23650f1f2f3d8a0cd57816386066a5",
+ "712716d9f01e8384c8a616d8d832c4fcbc94b7f0",
[
null,
[
@@ -306813,7 +307199,7 @@
"offscreen": {
"filters": {
"2d.filter.canvasFilterObject.dropShadow.tentative.html": [
- "04cf86d204ce8e143c6056eaf6499a3f768a4dec",
+ "043265279054d6d6852626700f6692a8b2413a6c",
[
null,
[
@@ -306826,7 +307212,7 @@
]
],
"2d.filter.canvasFilterObject.dropShadow.tentative.w.html": [
- "8d5e2da1586a56943588f9d343e96e7c32233386",
+ "de72f5fe3d9fa07c4a12906fc0fef2ac909ba6ed",
[
null,
[
@@ -312628,7 +313014,7 @@
]
],
"selectmenu-option-arbitrary-content-displayed.tentative.html": [
- "0fad1a1918f45b8144ec5aa50a7479aa45c0351e",
+ "05bc651cb7cb3468e4c8e8e5fdda7e47aaaed874",
[
null,
[
@@ -321679,6 +322065,19 @@
{}
]
],
+ "opacity.svg": [
+ "949de0cbf0c8aeaf779a94aa01c2688698e756f6",
+ [
+ null,
+ [
+ [
+ "/svg/text/reftests/opacity-ref.svg",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"text-clipped-offscreen-move-onscreen.html": [
"c29f790326537395d40f251d3a0be746014fbb5e",
[
@@ -325544,7 +325943,7 @@
[]
],
"interfaces.yml": [
- "91aecaa12f15429858e3f94c57accf3472d99baf",
+ "2e55ab28e1804b8800c0e4a1adbf43b5be014afa",
[]
],
"manifest.yml": [
@@ -325552,7 +325951,7 @@
[]
],
"regen_certs.yml": [
- "4e29171ff27357f4fbbffc1be02a47aec5145f2f",
+ "e1691b779ff300b742310068e6bfe14eb547f0e0",
[]
]
}
@@ -328278,7 +328677,7 @@
[]
],
"reports.py": [
- "432f5c61d5e9c452a24e8985b846da0ce7079c0c",
+ "4d4c3fd5ec739e23d8a136070050e8d31733c969",
[]
]
}
@@ -329823,20 +330222,12 @@
"90ed0a78576edc041caaa2ae70c319837152b726",
[]
],
- "observer-in-dedicated-worker.js": [
- "a30edd0a33ede1a1f628c356c92b768ed31e3e2f",
- []
- ],
- "observer-in-shared-worker.js": [
- "f69eadaacee6324edd021f1f20a245e5dd720cbc",
- []
- ],
"pressure-helpers.js": [
"5234cf2d78c90d559d3cfd8ee1b86d9b3fa97861",
[]
],
"support-iframe.html": [
- "57e18b77f62dbae3425e9f8b59b4d43c439ea709",
+ "6b2b3097926b192df23c3e21dd19742bb19e69d4",
[]
]
}
@@ -369194,6 +369585,10 @@
[]
],
"reference": {
+ "anchor-scroll-composited-scrolling-006-ref.html": [
+ "92fe187117ed3f55379797da7987e5272bd71301",
+ []
+ ],
"anchor-scroll-fixedpos-ref.html": [
"e73354df72dac33f7a94eaef445e80ec61e3976a",
[]
@@ -369439,6 +369834,10 @@
[]
]
},
+ "background-attachment-fixed-inline-scrolled-ref.html": [
+ "1767c84a5f011cbe120cf1b46af2d5639ea00e28",
+ []
+ ],
"background-attachment-fixed-inside-transform-1-ref.html": [
"8d4c3f785c8e84ffa121128cda96269574e27e73",
[]
@@ -385787,7 +386186,7 @@
[]
],
"auto-track-sizing-001-ref.html": [
- "800f87e5d00a767f1cb5e5816ffd46110fbd4e80",
+ "81c6d184021cac8e7a0df0402a42a082c675e62a",
[]
],
"auto-track-sizing-002-ref.html": [
@@ -385859,7 +386258,7 @@
[]
],
"independent-formatting-context-ref.html": [
- "79b90c340d844568014a3062ea35b2c087044ead",
+ "fe842b2823832e9feaae3534eab8220dd65cf129",
[]
],
"item-percentage-height-001-ref.html": [
@@ -386282,7 +386681,7 @@
[]
],
"image-orientation-none-cross-origin-ref.html": [
- "c4d72fc823f3e98d7184c0536805b6f6e8be6f7c",
+ "a54aa3870f669108afcd535766331cf4e43dbbe0",
[]
],
"image-orientation-none-cross-origin-svg-ref.html": [
@@ -406273,6 +406672,14 @@
[]
]
},
+ "scripting-print-noscript-ref.html": [
+ "2dd7aff83136a14dd9559249615438183d3b0d88",
+ []
+ ],
+ "scripting-print-script-ref.html": [
+ "d2da3f840586d803c83dc6bba11080e7b27d88ad",
+ []
+ ],
"support": {
"media_queries_iframe.html": [
"890eb6c46113afbaf1dc88188c52a791623590a8",
@@ -407061,6 +407468,12 @@
"6523fd3b64fbf10693c9d6c9a05b2da6328d6684",
[]
],
+ "selectors-4": {
+ "lang-000-ref.html": [
+ "466e9f464b906a114094b87249130bc8ff585a3b",
+ []
+ ]
+ },
"selectors-attr-many-ref.html": [
"7d8a9f6d89d103373f81fa2f09c478b12e49ee7b",
[]
@@ -413528,7 +413941,7 @@
},
"script-tests": {
"FileSystemBaseHandle-IndexedDB.js": [
- "15a0c2a3b579b308dfef01b0e1f9fa542641aaee",
+ "9e114619bf2caad6bbf53d25035c880818910dfa",
[]
],
"FileSystemBaseHandle-buckets.js": [
@@ -416476,7 +416889,7 @@
},
"filters": {
"2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [
- "90f406fed9fd8545a352f2c213ace27b9556d3d7",
+ "8327b5cad483fd95393b8bf347452899992686d7",
[]
]
},
@@ -417274,7 +417687,7 @@
],
"filters": {
"2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [
- "90f406fed9fd8545a352f2c213ace27b9556d3d7",
+ "8327b5cad483fd95393b8bf347452899992686d7",
[]
]
},
@@ -417552,7 +417965,7 @@
[]
],
"filters.yaml": [
- "bdf3dcfe9fc47be1e8f8f562a619640fc05cc3b0",
+ "246b73e7f1a91863d9c2e05938c0d931cd1b1489",
[]
],
"layers.yaml": [
@@ -425010,7 +425423,7 @@
[]
],
"selectmenu-option-arbitrary-content-displayed-ref.tentative.html": [
- "3933b93894b33762bbaa9e0dd722da6c3d6c7499",
+ "171829d90f3f28a5ee5e5229086d18fd50b61289",
[]
],
"selectmenu-option-arbitrary-content-not-displayed-ref.tentative.html": [
@@ -425039,7 +425452,7 @@
[]
],
"fake-selectmenu.js": [
- "cf3864a29409699fd338ec722e3b05f3cd533dac",
+ "84fe52856177fe6092e9fc69ae8128c3ba2a37d6",
[]
],
"selectmenu_button_icon.svg": [
@@ -429614,7 +430027,7 @@
[]
],
"webtransport-h3.https.sub.any.js.ini": [
- "f0041b0aa29c9047902a00c4a59f4d7802d3eb69",
+ "60d2e38ecadd696a05d0f675381a9bf7f367c044",
[]
],
"wpt-server-http.sub.html.ini": [
@@ -429681,7 +430094,7 @@
[]
],
"wheelScroll.html.ini": [
- "647b875e5b0b4c1c41db490a3a877f262baa0146",
+ "5632dcf11290d53739edbcc47191658719e80cd4",
[]
]
},
@@ -429906,10 +430319,6 @@
"fd7d26e7fb7970a9dfc0d50990f63d0d5771498c",
[]
],
- "EXT_clip_cull_distance.idl": [
- "18d1c02a11abdfc2bf6bf35e8bd0cd34cdaccd0a",
- []
- ],
"EXT_color_buffer_float.idl": [
"09bd397d01fb32a425b403ff5dcf2e666b6c455a",
[]
@@ -429959,7 +430368,7 @@
[]
],
"FedCM.idl": [
- "b3ddb54e0c646ce5cf6e6aee53e46a4938e56967",
+ "8de87e88b05fff5ff871b0c8c877adb759933870",
[]
],
"FileAPI.idl": [
@@ -430030,6 +430439,10 @@
"2208329ded177bf5ad3d8f598ca98a9c743a353d",
[]
],
+ "WEBGL_clip_cull_distance.idl": [
+ "46fa921fd5392807558518742eff3436702030fc",
+ []
+ ],
"WEBGL_color_buffer_float.idl": [
"b73f63153dadbe4face460f3fdfd7750a5b960ab",
[]
@@ -430090,6 +430503,10 @@
"2258fa9a10cf9f05e80ab1b220452070c0fbd87b",
[]
],
+ "WEBGL_provoking_vertex.idl": [
+ "035e1d233d6f5646768b78e878c9db43b84a0068",
+ []
+ ],
"WebCryptoAPI.idl": [
"0e68ea82f594430fdccff7db045a978905367419",
[]
@@ -430103,7 +430520,7 @@
[]
],
"anchors.idl": [
- "5aa9395f09f395a14b6cc6c35113a72aecc16a24",
+ "d8c5aa69a87293e6f40d5e471ff29f990d285c4c",
[]
],
"attribution-reporting-api.idl": [
@@ -430127,7 +430544,7 @@
[]
],
"badging.idl": [
- "f34dfa7e04af9caedd85eecaed8acf68e65d1546",
+ "8b401e057ade5ce17ced40139a270b27779296b1",
[]
],
"battery-status.idl": [
@@ -430155,11 +430572,11 @@
[]
],
"compression.idl": [
- "88be302a4a6c9a5074f744fba768d9a4984219b7",
+ "7525d7c9847b74a8e382e55ad9627b64dd4af161",
[]
],
"compute-pressure.idl": [
- "42ff4f207ab5349c541f042c2a21f317d23ff401",
+ "3e35dc4ee2d04928c00477c14b8589fb67538433",
[]
],
"console.idl": [
@@ -430167,7 +430584,7 @@
[]
],
"contact-picker.idl": [
- "aece81664e4fdd3c4beec5e4d36da109f8dc5ba6",
+ "0119d0e2ce658f02df30120083f7d1b6b203bdad",
[]
],
"content-index.idl": [
@@ -430175,7 +430592,7 @@
[]
],
"cookie-store.idl": [
- "72ef3f8c8242dfd608b400a3de10aa6d49361210",
+ "f44b4c63546605590005c7b05edd387445a088f1",
[]
],
"crash-reporting.idl": [
@@ -430206,6 +430623,10 @@
"6620e0156dc85c040da7997d9d2e351147a47354",
[]
],
+ "css-cascade-6.idl": [
+ "37cdfb8293097e4297691f92ad291fc0433269f3",
+ []
+ ],
"css-cascade.idl": [
"9011dc7fd9e2a3f835e6d6ff565d9854db82e96f",
[]
@@ -430223,7 +430644,7 @@
[]
],
"css-contain.idl": [
- "6b29119617a67b8e3ce18bc3aa943496ef5f6e75",
+ "be2137a4a6afe309fde67f6e75847f3831cc2926",
[]
],
"css-counter-styles.idl": [
@@ -430299,11 +430720,11 @@
[]
],
"css-typed-om.idl": [
- "595a424e01461e6cad1f364eb5c233dbbcf1e02a",
+ "0df6a0327a24658a75379572334ea040c1476e25",
[]
],
"css-view-transitions.idl": [
- "cf9cb8927e42c5d24c7c6fd0ae6e5d4c001ce806",
+ "745eb1d96913389a24b933152c674abb086e3c28",
[]
],
"cssom-view.idl": [
@@ -430331,7 +430752,7 @@
[]
],
"device-posture.idl": [
- "ba8f9f51f025d9ac1924d220fc17dfa11678abf2",
+ "0f1dded631329a05bc16f9105ce92c6dcb7d19af",
[]
],
"digital-goods.idl": [
@@ -430339,11 +430760,11 @@
[]
],
"dom.idl": [
- "96acfc6a717fb29e9fed64ba3dab1635ee9c78f7",
+ "c5b5c94dbccac17f1e2ee51a20cabaded63e34b6",
[]
],
"edit-context.idl": [
- "f5e60bd0d02c45ca8f3145c729edcfd0b240b61e",
+ "91d8af2ea689ef45c925fbcf4a2e0a222a152c49",
[]
],
"element-timing.idl": [
@@ -430370,8 +430791,12 @@
"62c8c4aea6adcb0979edcdbc0f054403341d2653",
[]
],
+ "fenced-frame.idl": [
+ "2869b95e6bb3c5968a3ced65cefd5b4509dbff9d",
+ []
+ ],
"fetch.idl": [
- "866d09d31bd9b9916dfcadefb17a9ec56a99cdf1",
+ "81a5e69aee57f8edf7425423caa87222b141c29f",
[]
],
"fido.idl": [
@@ -430391,7 +430816,7 @@
[]
],
"fs.idl": [
- "e341ab387d9c4767c52ad661286ddbf75d7770bf",
+ "e2474132abfb4c7ffe2e6ebcca7158d4eadbee75",
[]
],
"fullscreen.idl": [
@@ -430399,7 +430824,7 @@
[]
],
"gamepad-extensions.idl": [
- "ddfc0d9c06ac9f4a2bff1737913097bb7ab21fcc",
+ "d7d750654fd9da6d0344face719975e4fe993889",
[]
],
"gamepad.idl": [
@@ -430426,6 +430851,10 @@
"e096044c2bcf966a72324af6157d59b62d862338",
[]
],
+ "gpc-spec.idl": [
+ "0e9a063c54cb5525d466c95df06130d63635d76e",
+ []
+ ],
"gyroscope.idl": [
"00fb0efcace7c388743e615ff301e8279e0532b4",
[]
@@ -430439,7 +430868,7 @@
[]
],
"html.idl": [
- "e4752f079ceb2ef81e822a4997b942527577bc3e",
+ "33d4de0db976e1ee3008fa743772202f9207b14a",
[]
],
"idle-detection.idl": [
@@ -430547,7 +430976,7 @@
[]
],
"mediacapture-streams.idl": [
- "5b41f3fa6538e211d350af3f2e819054aa3e72b6",
+ "3197ff73689b4cfc3ed2facdcd41bca50c680370",
[]
],
"mediacapture-transform.idl": [
@@ -430574,10 +431003,6 @@
"a41abb55eaeef0abc0695384477f1cd63ddf78ad",
[]
],
- "navigation-api.idl": [
- "111785182926a0bad63cb8016dd2bdcaf9238072",
- []
- ],
"navigation-timing.idl": [
"5a33964f07eafd01e45bcc6c103d34d8df63af4c",
[]
@@ -430587,11 +431012,11 @@
[]
],
"notifications.idl": [
- "2be22213d789fc9a1a7b3df796b36763ee450e37",
+ "bfcfa2e66afb96f4d356067b1ceb750387418f59",
[]
],
"orientation-event.idl": [
- "f6ff96f0e013fe34104a9b6714104454c722cffa",
+ "a93d4658830c6164b00efd2abaac13bb3273fb33",
[]
],
"orientation-sensor.idl": [
@@ -430631,7 +431056,7 @@
[]
],
"permissions-policy.idl": [
- "16945e3a9b7cded5610d9d2e2cb53acbb8d6b831",
+ "a789d41738c157a92ee96d9b56269f5e6f1fd657",
[]
],
"permissions-request.idl": [
@@ -430674,10 +431099,6 @@
"4f1e4bee835a23c5b7bcf54b5b05f4ded2b08023",
[]
],
- "priority-hints.idl": [
- "cbff6a5222d0a911dd2ba041031e3027451d0609",
- []
- ],
"private-click-measurement.idl": [
"3bed7ccf991f6b8cd4e9a5a237275c4ff5fc6f1f",
[]
@@ -430706,6 +431127,10 @@
"c0a400a999e98f904345f94bf4b6ae0e377b18ec",
[]
],
+ "requestStorageAccessFor.idl": [
+ "adca77a2b0395500571dd6efb2513dd390f3f832",
+ []
+ ],
"requestidlecallback.idl": [
"9c49aa1854f57b16bddb0144e027ceb7e3e8f85d",
[]
@@ -430715,7 +431140,7 @@
[]
],
"resource-timing.idl": [
- "242df0bd804af4cfa790b0f421d62beba58761b3",
+ "151e5d46d842742cf7f7a6328bedcc40e4cf7456",
[]
],
"sanitizer-api.idl": [
@@ -430747,19 +431172,19 @@
[]
],
"scroll-animations.idl": [
- "1fd52dece191c65f8480168206a35cdd93a5d5f0",
+ "14215509c9fec9db69602ed1f91c0ee1ee7052d0",
[]
],
"scroll-to-text-fragment.idl": [
- "ce571ddd694d4ecbb1024fcaf7f11dc805504bf2",
+ "be7bf73968ea202d0630fbb71d82fc758e7fe026",
[]
],
"secure-payment-confirmation.idl": [
- "6b6083b165e77441751c56b30f2e831ec7903b2b",
+ "9061b243477b4aaecc4ce756d5e0aae654342fe5",
[]
],
"selection-api.idl": [
- "c1eed2a9cf243d27ba24a385fb15cfd691e37065",
+ "a84536ab0f58bbb45a210870a6b9873c37df20e1",
[]
],
"serial.idl": [
@@ -430818,12 +431243,20 @@
"9844f08538194e673fb9e2a972aece97ad4559b3",
[]
],
+ "trust-token-api.idl": [
+ "ee339590827e0f678d9dc1dfe592d4ab33ba697c",
+ []
+ ],
"trusted-types.idl": [
"23562381294e59493880857584f6ac9200254ee2",
[]
],
+ "turtledove.idl": [
+ "cd81a3d87ef8cb476ee303eafe58fb3b9d4fbca2",
+ []
+ ],
"ua-client-hints.idl": [
- "f5070a0e0904f78531fece6f08ad19d591b39a55",
+ "c69714b9734ade32207ba1b2ff9a6cd5c2f46924",
[]
],
"uievents.idl": [
@@ -430831,7 +431264,7 @@
[]
],
"url.idl": [
- "360c9adcfa1104ec5fd591869d7cc3ecdaf4395f",
+ "6549e45f419cd89e9e5e5f28889da8ff18cf2d79",
[]
],
"urlpattern.idl": [
@@ -430863,7 +431296,7 @@
[]
],
"wasm-js-api.idl": [
- "141af90fd2d9d9432747277fc7d38ab6f53ea1f5",
+ "0d4384251df458a13e0c923c5412848039903da4",
[]
],
"wasm-web-api.idl": [
@@ -430871,11 +431304,11 @@
[]
],
"web-animations-2.idl": [
- "61df2cd1518319c1ca949952bb58b20749b07473",
+ "f9f68a0d49a5ba71ade7e4a62546020d3adc22c5",
[]
],
"web-animations.idl": [
- "ed612302a47f5a9118f90288c86d1e69ab51463e",
+ "956d700f49b703400559851d05508e861d495fce",
[]
],
"web-app-launch.idl": [
@@ -430883,7 +431316,7 @@
[]
],
"web-bluetooth.idl": [
- "21c237040ebbb939a58a9d2c7c67a3bcaf27ca91",
+ "5d461194a833e19b89a72adeb78e411c5ac07b32",
[]
],
"web-locks.idl": [
@@ -430907,13 +431340,17 @@
[]
],
"webauthn.idl": [
- "ef27322312f1cb8e9e7282a7369c0b673c113b5f",
+ "58a9e285232184b99caed6434b1a66f8a8ecee4a",
[]
],
"webcodecs-aac-codec-registration.idl": [
"124a0b0febdd304a3bffccf94fd464a9067a2752",
[]
],
+ "webcodecs-av1-codec-registration.idl": [
+ "00e4493d3c0a957fefbaeeeb95efeaa26afd871c",
+ []
+ ],
"webcodecs-avc-codec-registration.idl": [
"d4074f647dab2b1af158a4f544ccd4737164b32c",
[]
@@ -430930,8 +431367,12 @@
"0d198a6bcdeabf63117166098cdabbbbf7772fa5",
[]
],
+ "webcodecs-vp9-codec-registration.idl": [
+ "aca64a789614930b9d9e7c36db2957de58335c6f",
+ []
+ ],
"webcodecs.idl": [
- "68df48584bd327b5a6aaea513dcd5445647d8ad3",
+ "77649029db69dd81b77f4178f9325537d50e4198",
[]
],
"webcrypto-secure-curves.idl": [
@@ -430951,7 +431392,7 @@
[]
],
"webgpu.idl": [
- "b00e2374e586a63df1e09e36b5cbc008e3539772",
+ "284327a578999a7a068952526ab457389e40729f",
[]
],
"webhid.idl": [
@@ -430959,7 +431400,7 @@
[]
],
"webidl.idl": [
- "9993673361aad662b83e96b491ddf6c6864f9100",
+ "7271f19dfa65f689b6e36d4df255f8c70517a5c0",
[]
],
"webmidi.idl": [
@@ -430967,11 +431408,11 @@
[]
],
"webnn.idl": [
- "820c79e96666f812c0ce46d2e298859f93497149",
+ "2c2ab35e909712ad4ab89fe0f16358b4e92b353c",
[]
],
"webrtc-encoded-transform.idl": [
- "13f3999db1222c4d8c901111ccd90cb8128ec115",
+ "e48f1080c41209bd83d90e002aa00d52f4c2425f",
[]
],
"webrtc-ice.idl": [
@@ -430987,7 +431428,7 @@
[]
],
"webrtc-stats.idl": [
- "f1dca4a923d46517a8a5e943aa3ac7a0cab78778",
+ "7e820a26df4844bcd094e16089a86ebca235a612",
[]
],
"webrtc-svc.idl": [
@@ -430995,7 +431436,7 @@
[]
],
"webrtc.idl": [
- "d631169f46f47aab936c6fce1e86ec3b64a65931",
+ "578cbe92974fd711f1d96154ed6b6f3bef5c6cdb",
[]
],
"websockets.idl": [
@@ -431003,7 +431444,7 @@
[]
],
"webtransport.idl": [
- "ba705807f1298de1185c7f10231070b96fd8a3da",
+ "2bea483e1b91f78569d80c706c20f95bd44978ac",
[]
],
"webusb.idl": [
@@ -431047,7 +431488,7 @@
[]
],
"webxr.idl": [
- "939da53364deef0b436cb8f0757d33e775eb5ca8",
+ "de2b04691b32f60d68f5c5155134adba4a9bbe17",
[]
],
"webxrlayers.idl": [
@@ -431058,12 +431499,12 @@
"051978d693e3aa5213096e571be66d10cc8d8199",
[]
],
- "window-placement.idl": [
- "ac86c1d502aa816ecd87fa205133910a67f28537",
+ "window-management.idl": [
+ "527c41deb6cda2de79780899d15bc43f02b281db",
[]
],
"xhr.idl": [
- "3abd09ce5ed7fa651466f7a242b573c3bc2d109f",
+ "b4c27c8aca9ab3b44abbf39002fba9c687519257",
[]
]
},
@@ -433254,7 +433695,7 @@
},
"utils": {
"peerconnection.js": [
- "26a925abf077827136f6f4755fee7e3f3ff9c800",
+ "8b0f266facae0296d4ca0f58da31cd5b87c1b260",
[]
],
"sources.js": [
@@ -434194,7 +434635,7 @@
[]
],
"window_state_context.js": [
- "40f10a564484c97e33706f6a6df71f7984b72df4",
+ "fa96bf3b760ea95d2eb04a322a9ee15680a2caa0",
[]
]
}
@@ -437782,7 +438223,7 @@
[]
],
"mock-pressure-service.js": [
- "91efe529f2af9951f4f21c1c74038291152dbc93",
+ "21811ed52da2cd4f6782b390d848d0085d0849cc",
[]
],
"mock-pressure-service.js.headers": [
@@ -437790,7 +438231,7 @@
[]
],
"mock-subapps.js": [
- "b63e97b8c4dccf7726671d7f372f24bc431ba2f1",
+ "b81936713b17db941ef380d4019cecfbe563caf6",
[]
],
"mock-textdetection.js": [
@@ -438481,7 +438922,7 @@
[]
],
"scroll-timeline-specified-scroller-ref.html": [
- "9074f2454b1a81c7bd51b6af9167680e11496798",
+ "d2f2d8f73d71f84c0c1111e6f923929acdb22a3a",
[]
]
},
@@ -442476,7 +442917,7 @@
"subapps": {
"resources": {
"subapps-helpers.js": [
- "9158d15c6c89b7cb328ca9a378a7753deb4d5e91",
+ "38b8d1146603147667df405ef012358ae423fde4",
[]
]
}
@@ -443434,6 +443875,10 @@
"18c6ed4f1bd5905652d209007322dc394769665b",
[]
],
+ "opacity-ref.svg": [
+ "18c00ab332c73f5c033e37d4429872d07210ade4",
+ []
+ ],
"text-clipped-offscreen-move-onscreen-ref.html": [
"b03ac22aaa3155323ea1574e49241368ec1ad66c",
[]
@@ -443772,15 +444217,15 @@
[]
],
"requirements_build.txt": [
- "03fe7d73efa81721a18fbda828ec09ab7cf5f8aa",
+ "c2137af3156ae426e8bd7a1e117e9c67bbfc203a",
[]
],
"requirements_tc.txt": [
- "53b10f8dcaaa40e8dd1bbc4cdd49fc9f62940d49",
+ "64b51841b0cf17f2ff9e59d8a89950d6a46bed81",
[]
],
"run_tc.py": [
- "46e3d613a99225e24db3e05a2fdeeb734ca0b55f",
+ "a5a6256ad542e1601988c5ad408804ec671d7298",
[]
],
"taskcluster-run.py": [
@@ -443962,7 +444407,7 @@
[]
],
"lint.py": [
- "89ecee8035c71eebe1d7d5713a01185af53bec71",
+ "f255c024952cd1f8b102f3226cae84a923ef1a3d",
[]
],
"rules.py": [
@@ -444182,7 +444627,7 @@
],
"manifest": {
"XMLParser.py": [
- "689533421d77e723882e6a8a12ab6f5e4e46fd65",
+ "21be8a26cd3f7748c8e86505083b31531ed17347",
[]
],
"__init__.py": [
@@ -444204,7 +444649,7 @@
[]
],
"item.py": [
- "02a72eeb292d1819a5bf5285fccef4c973f3edf2",
+ "f798ec2ae8d7fed1f39b1dee478e7645f0fdb4bf",
[]
],
"jsonlib.py": [
@@ -444275,7 +444720,7 @@
]
},
"mypy.ini": [
- "fb9b5c81c2cbdeaa623eff7f8fa25218f5a1abb3",
+ "def40c0bd0614c297bd1b1213f2182a2dba07a2a",
[]
],
"pytest.ini": [
@@ -444287,15 +444732,15 @@
[]
],
"requirements_mypy.txt": [
- "ff878deb613a5bf5515ae3228277e223def0a90c",
+ "c95a836e6ab10d67a374401357127634e831d354",
[]
],
"requirements_pytest.txt": [
- "0bb151cb644ca0bdd7e5e28de955f5da95ca8be3",
+ "78e1ae4d613dc00a01da9cbfba4a3d06d906808c",
[]
],
"requirements_tests.txt": [
- "26bf23a7f5e4ef2bf2ecd544e1f8572062594823",
+ "9ccaaa0d02a751320a34fcc91d360593277b4834",
[]
],
"runner": {
@@ -451539,7 +451984,7 @@
}
},
"tox.ini": [
- "6a3001e25a048192804d5d859cd73413433000fe",
+ "5efbe9b37abc88e6467bef877e646ce865ee49b0",
[]
],
"wave": {
@@ -452276,11 +452721,11 @@
[]
],
"client.py": [
- "56fa274cdc4c282478c441a792ba743f164db473",
+ "9bb03b34f96343bff885d89be37ddc2c3130b41a",
[]
],
"error.py": [
- "81910a63eb2bf3d062cc8a6985002826bb25fa59",
+ "d9ea28c78fd6e6786576ba6355386c1e1d5fefdc",
[]
],
"modules": {
@@ -452289,7 +452734,7 @@
[]
],
"_module.py": [
- "c2034033c79be44b8982164b7ac2863c9e7f4599",
+ "e28a83584a8ac4de6747a4c3894c9728d5682acb",
[]
],
"browsing_context.py": [
@@ -452297,7 +452742,7 @@
[]
],
"input.py": [
- "d2ee17e36e249970ec777a32b99451336b8b32b0",
+ "be0d745a0ca3a31da4453ee6750e612ca08e615b",
[]
],
"script.py": [
@@ -452310,12 +452755,12 @@
]
},
"transport.py": [
- "a28c484b83c7fed557418c3f170ee43f7843f5be",
+ "2d5d8ee9224ff549cb9256741be79cf3e4b076ed",
[]
]
},
"client.py": [
- "851c6722fc27c199956e90f4d08a4d2b10ed7976",
+ "f33fc34dac9ee53135239ef906b1e88b6f4c6114",
[]
],
"error.py": [
@@ -452363,7 +452808,7 @@
[]
],
"webtransport_h3_server.py": [
- "6384a5aefb2bacabeffeede8f6679dfa3295af01",
+ "141bd9f7dc9fa2c24707dce87b3250e909179c83",
[]
]
},
@@ -452382,7 +452827,7 @@
[]
],
"browser.py": [
- "d6c238a1f2722f2af34bc64ea045dabad25b5895",
+ "7a046e8f07c5d5afc020011b1baa9bcf8a7229b4",
[]
],
"commands.json": [
@@ -452394,7 +452839,7 @@
[]
],
"install.py": [
- "821ce86f97f4e883ccc1a9c9c28a4cf84a714fc8",
+ "5bcbb7a7c339e79dfe71579c5db1f88e5e0bfeb4",
[]
],
"markdown.py": [
@@ -452418,7 +452863,7 @@
[]
],
"run.py": [
- "0b7d73b204247f9b2d8481591983bd31c5ccc3b8",
+ "72ceab08b9794e45a14db05e90794e608a6785d7",
[]
],
"testfiles.py": [
@@ -452509,7 +452954,7 @@
[]
],
"test_update_expectations.py": [
- "1635dce7ec67809e7824ba39806cf16e2f40b31a",
+ "184cd7247b39e8a033cfca5008522962aefffade",
[]
],
"test_wpt.py": [
@@ -452574,7 +453019,7 @@
]
},
"requirements.txt": [
- "ccf09be728d5aefd44c3b2a484d636b3ad358bdf",
+ "bfd21934d99bfbba9abe6f404a9125efcabe7f5c",
[]
],
"requirements_chromium.txt": [
@@ -452586,7 +453031,7 @@
[]
],
"requirements_firefox.txt": [
- "64546d55314b92f20324914a7b9152a2c9671d05",
+ "0b51ee8f463047bbc5ba446ae67c302af7441642",
[]
],
"requirements_ie.txt": [
@@ -452844,7 +453289,7 @@
[]
],
"chromium.py": [
- "eca63d136bb683327713af60d8def6fa9cafd228",
+ "95f53011bfc32de47a93e0bb7d2ac99f84be4e40",
[]
],
"tests": {
@@ -452998,7 +453443,7 @@
[]
],
"test_update.py": [
- "35c75758f534d3f8a4ac53f7a69998926c46baaf",
+ "6cbe335cfe7dcb1400aceca5fb45947828c634d3",
[]
],
"test_wpttest.py": [
@@ -453198,7 +453643,7 @@
[]
],
"base.py": [
- "be5dc0d102c95cd74793bf5595e9f2efc1c60fb5",
+ "f47308d88df27d21469f0e80f92fd98681a1dd70",
[]
],
"docroot": {
@@ -456190,6 +456635,28 @@
[]
]
},
+ "input": {
+ "__init__.py": [
+ "3aa0c3a19d1da10d8d7ae04db4ec6cea394ec75e",
+ []
+ ],
+ "conftest.py": [
+ "0ec3174163f76779da87173bc75039491b0f4303",
+ []
+ ],
+ "perform_actions": {
+ "__init__.py": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ []
+ ]
+ },
+ "release_actions": {
+ "__init__.py": [
+ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
+ []
+ ]
+ }
+ },
"log": {
"__init__.py": [
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
@@ -456220,7 +456687,7 @@
]
},
"conftest.py": [
- "e6ca1f999b06a2dd9930c3603314630aea1b3286",
+ "21a037a0f77b6255773d7f432a98988fce3ddffe",
[]
],
"response_completed": {
@@ -456655,7 +457122,7 @@
[]
],
"conftest.py": [
- "f28fb06ce2999518b6071df8d8931a9410a709b3",
+ "30069a02386566c6c707c83bc5281d49e82ce08f",
[]
],
"support": {
@@ -456709,7 +457176,7 @@
[]
],
"conftest.py": [
- "34c8e5de183e54415e6285359f744129ee91de92",
+ "8275efc23b70de3f06eb9d081d4fa2d3c13d7fc5",
[]
],
"support": {
@@ -456718,11 +457185,7 @@
[]
],
"refine.py": [
- "90f722587c3be0e4066fbb6a604668a6d40f359f",
- []
- ],
- "test_actions_wdspec.html": [
- "6f844cd255a075d31caf1c19957af3d6ac833778",
+ "d40520974938b1dd226021be40a79e1661860249",
[]
]
}
@@ -456773,7 +457236,7 @@
[]
],
"fixtures_bidi.py": [
- "9407dc160704524e589dadd07a686d1d6dc40f4d",
+ "612718b89e57e6867b85e8d818fe30810859a1aa",
[]
],
"fixtures_http.py": [
@@ -456781,7 +457244,7 @@
[]
],
"helpers.py": [
- "b0c065dca1189b711c44d23454760fde0181244c",
+ "45f4f4d23922dc3bf28d4d3117208f70ef90ca7f",
[]
],
"html": {
@@ -457203,7 +457666,7 @@
[]
],
"prelu.json": [
- "f3855b0f4e19b4e8b70b8fafb0a5f32b733ee7bd",
+ "e1bf67826195d27c62115d0806493fe5db97c04b",
[]
],
"reduce_max.json": [
@@ -457250,6 +457713,10 @@
"52ea57c7632d0d27b1745ddd4e983c37becf9832",
[]
],
+ "softsign.json": [
+ "e3208b18ad49a64dbbeb6a939dc69d2ea5ab3c43",
+ []
+ ],
"split.json": [
"e4216003c02f7fa8174d2d2734217477ca975407",
[]
@@ -457276,7 +457743,7 @@
]
},
"utils.js": [
- "a91dfa04c6e7b38cb1d461edef7cbb72edaa65ba",
+ "427b47e28cc2f9aeae42e9ed6fbf6b36128c9a0b",
[]
]
}
@@ -457842,26 +458309,6 @@
"543d876e01d2b1612538825082ef0650401bc6e3",
[]
],
- "close.https.any.js.ini": [
- "6f118ff5f2745d7423609590efcacce426ae323e",
- []
- ],
- "connect.https.any.js.ini": [
- "d53cd702ccda18d457b9c6f68abd1989518ef4d7",
- []
- ],
- "csp-fail.https.window.js.ini": [
- "adbd3c1359242839d7f84afd56a73784bb68a8d4",
- []
- ],
- "csp-pass.https.window.js.ini": [
- "28d68410bbe856c21e3d83a50d599093fc553e84",
- []
- ],
- "datagrams.https.any.js.ini": [
- "49ad1548df3c672fa749f43e9225cf9001c1e7eb",
- []
- ],
"handlers": {
"abort-stream-from-server.py": [
"1d92b705e6de05e2cf56476698560511410df3c7",
@@ -457898,18 +458345,10 @@
},
"resources": {
"webtransport-test-helpers.sub.js": [
- "733153e12027d1e47fd823fa4fa8b47b1717b91f",
+ "9f9127b22f96da1c8dc84465d33e5c5e476f4262",
[]
]
- },
- "streams-close.https.any.js.ini": [
- "0d60f7e54dbe086d5ab3a6b0f6290d27e1cdc52d",
- []
- ],
- "streams-echo.https.any.js.ini": [
- "eb11ca786f1c81594fa3f1af6bcfaae7cff9efe3",
- []
- ]
+ }
},
"webusb": {
"META.yml": [
@@ -485757,17 +486196,58 @@
]
},
"compute-pressure": {
- "compute_pressure_basic.tentative.https.window.js": [
- "e2d9a0f05bc99a7e798c6ca71a152f72481f5c49",
+ "compute_pressure_basic.tentative.https.any.js": [
+ "18b8985cf51c2c9874af273ceeb38eb697df3345",
[
- "compute-pressure/compute_pressure_basic.tentative.https.window.html",
- {}
- ]
- ],
- "compute_pressure_basic_async.tentative.https.window.js": [
- "3a9a32dedc0ea819c7eea013a5b22925960fba72",
+ "compute-pressure/compute_pressure_basic.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_basic.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
[
- "compute-pressure/compute_pressure_basic_async.tentative.https.window.html",
+ "compute-pressure/compute_pressure_basic.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -485781,6 +486261,10 @@
[
"script",
"resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
]
],
"timeout": "long"
@@ -485788,7 +486272,7 @@
]
],
"compute_pressure_cross_origin_focus_control.tentative.https.window.js": [
- "f88c9fdf64e3afdae60b06fd658256841e9a5283",
+ "950334d6fc57f324b61cede416920534ccce76aa",
[
"compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.html",
{
@@ -485800,6 +486284,14 @@
[
"script",
"/common/get-host-info.sub.js"
+ ],
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
]
],
"timeout": "long"
@@ -485807,37 +486299,174 @@
]
],
"compute_pressure_detached_iframe.tentative.https.html": [
- "3b0a5504e536acf9426476122f59b7c8ed24b150",
+ "5511a147048d610125a0d0d485367b88e4e5a70e",
[
null,
{}
]
],
- "compute_pressure_disconnect.tentative.https.window.js": [
- "c9950f2dc84d2ad7001df440b598d0730fe3cfb9",
+ "compute_pressure_disconnect.tentative.https.any.js": [
+ "1d188fad8b8e1cd2123e320d99943c408be55fcd",
[
- "compute-pressure/compute_pressure_disconnect.tentative.https.window.html",
- {}
- ]
- ],
- "compute_pressure_disconnect_idempotent.tentative.https.window.js": [
- "72021fd2708b6aab870e133f744cf53ebd61f194",
+ "compute-pressure/compute_pressure_disconnect.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
[
- "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_disconnect.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_disconnect.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
- "compute_pressure_disconnect_immediately.tentative.https.window.js": [
- "1abe84d57202ba568d4c1fa459b355e591582a77",
+ "compute_pressure_disconnect_idempotent.tentative.https.any.js": [
+ "2f6421ee11711f8d1768cc19d233346440f16f7f",
[
- "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
- "compute_pressure_duplicate_updates.tentative.https.window.js": [
- "3c312ca5b1fb6bc0693e6626063075bcb0e6e8ae",
+ "compute_pressure_disconnect_immediately.tentative.https.any.js": [
+ "b96ebd802e666bcd0230406da3435d8969484037",
+ [
+ "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
[
- "compute-pressure/compute_pressure_duplicate_updates.tentative.https.window.html",
+ "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -485847,15 +486476,57 @@
[
"script",
"resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
]
]
}
]
],
- "compute_pressure_factors.tentative.https.window.js": [
- "6d8d2208887007e429269b26cfd2891dfc497a29",
+ "compute_pressure_duplicate_updates.tentative.https.any.js": [
+ "b5d7690d18295b82bf052faa3a7c93cc5ecc024a",
+ [
+ "compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
[
- "compute-pressure/compute_pressure_factors.tentative.https.window.html",
+ "compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -485865,48 +486536,269 @@
[
"script",
"resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
]
]
}
]
],
- "compute_pressure_multiple.tentative.https.window.js": [
- "6015ae1f81bc495e642a7482757934fa1c1a1924",
+ "compute_pressure_factors.tentative.https.any.js": [
+ "7486a70f91170c180ea12f8a0acee46a2626b640",
[
- "compute-pressure/compute_pressure_multiple.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_factors.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_factors.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_factors.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
- "compute_pressure_multiple_across_iframes.tentative.https.window.js": [
- "838b9a17a00f2bf14f8443673fac1fbc4560e6fe",
+ "compute_pressure_multiple.tentative.https.any.js": [
+ "c8cef5beca0cba5b26ba897d16f90b08caa1c40d",
[
- "compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_multiple.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_multiple.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_multiple.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
- "compute_pressure_observe_idempotent.tentative.https.window.js": [
- "e60115fee87c15cb25c55382e418e7611514c892",
+ "compute_pressure_observe_idempotent.tentative.https.any.js": [
+ "5dc3804b2f7ea21f5e189351ea0194f30d6f536d",
[
- "compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
- "compute_pressure_observe_unobserve_failure.tentative.https.window.js": [
- "c32649da5c3dde260d74c0ab6bbeb275143d385d",
+ "compute_pressure_observe_unobserve_failure.tentative.https.any.js": [
+ "8eafeb356d815728719b61aee9e9ee704b79bdad",
[
- "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
- "compute_pressure_options.tentative.https.window.js": [
- "d142ecc088187e60bcdbbd5a94b81c1d37c89331",
+ "compute_pressure_options.tentative.https.any.js": [
+ "69999819d962fbf1841d87a817aed1ac23767f17",
[
- "compute-pressure/compute_pressure_options.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_options.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_options.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_options.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
"compute_pressure_privacy_test.tentative.https.window.js": [
- "d33f6ef09ad1681a2803fc0fda8315dcd80e39f9",
+ "113f4bdf79be9325df22f859c819558ab37429f5",
[
"compute-pressure/compute_pressure_privacy_test.tentative.https.window.html",
{
@@ -485938,6 +486830,14 @@
[
"script",
"/resources/testdriver-vendor.js"
+ ],
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
]
],
"timeout": "long"
@@ -485945,23 +486845,106 @@
]
],
"compute_pressure_same_origin_focus_control.tentative.https.window.js": [
- "746f119f249c8c1a7d6451a5672823d011adf22e",
+ "7df0be5c47d161fe4cadcba937f875a0a0cba320",
[
"compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.html",
- {}
+ {
+ "script_metadata": [
+ [
+ "timeout",
+ "long"
+ ],
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ]
+ ],
+ "timeout": "long"
+ }
]
],
- "compute_pressure_supported_sources.tentative.https.window.js": [
- "2a69e731e7f9f7c5c0b54ea3b7bc9202bda57f16",
+ "compute_pressure_supported_sources.tentative.https.any.js": [
+ "63f2666cca69c9ed69b1449fb5c336854d11967d",
[
- "compute-pressure/compute_pressure_supported_sources.tentative.https.window.html",
- {}
+ "compute-pressure/compute_pressure_supported_sources.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_supported_sources.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_supported_sources.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
]
],
- "compute_pressure_take_records.tentative.https.window.js": [
- "d294a7e80fd7e4cfcf4bbf5962f9014e1826e331",
+ "compute_pressure_take_records.tentative.https.any.js": [
+ "d93c9b5c886f9d57def646c052f5ea1cce627ea5",
+ [
+ "compute-pressure/compute_pressure_take_records.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_take_records.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
[
- "compute-pressure/compute_pressure_take_records.tentative.https.window.html",
+ "compute-pressure/compute_pressure_take_records.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -485971,15 +486954,57 @@
[
"script",
"resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
]
]
}
]
],
- "compute_pressure_timestamp.tentative.https.window.js": [
- "b9b932e64fcfedb03e7038ce5a963df2a1610336",
+ "compute_pressure_timestamp.tentative.https.any.js": [
+ "f283caa6baebbe531b1fdddb2add2b761b7ad083",
+ [
+ "compute-pressure/compute_pressure_timestamp.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_timestamp.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
[
- "compute-pressure/compute_pressure_timestamp.tentative.https.window.html",
+ "compute-pressure/compute_pressure_timestamp.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -485989,15 +487014,57 @@
[
"script",
"resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
]
]
}
]
],
- "compute_pressure_update_toJSON.tentative.https.window.js": [
- "7f3acf3e07fb0f537b057ac3d9181559dafd1c2f",
+ "compute_pressure_update_toJSON.tentative.https.any.js": [
+ "c1cd240a3bc52b4b9dc79cb594d48ebdd7f64ec7",
+ [
+ "compute-pressure/compute_pressure_update_toJSON.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
+ [
+ "compute-pressure/compute_pressure_update_toJSON.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/test-only-api.js"
+ ],
+ [
+ "script",
+ "resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
+ ]
+ ]
+ }
+ ],
[
- "compute-pressure/compute_pressure_update_toJSON.tentative.https.window.html",
+ "compute-pressure/compute_pressure_update_toJSON.tentative.https.any.worker.html",
{
"script_metadata": [
[
@@ -486007,6 +487074,10 @@
[
"script",
"resources/pressure-helpers.js"
+ ],
+ [
+ "global",
+ "window,dedicatedworker,sharedworker"
]
]
}
@@ -496508,6 +497579,13 @@
{}
]
],
+ "anchor-non-oof-inherit.html": [
+ "75f98a1ebfe0e6b61008e2152bea88228829af08",
+ [
+ null,
+ {}
+ ]
+ ],
"anchor-parse-invalid.html": [
"de4b0ffac45ec09914bac7bbfd43fabf8b083989",
[
@@ -497277,6 +498355,13 @@
{}
]
],
+ "display-none-dont-cancel.tentative.html": [
+ "6ae115803b820ffdb51169c38769ee51f5062652",
+ [
+ null,
+ {}
+ ]
+ ],
"event-dispatch.tentative.html": [
"3e577d6ea6c67269766ed9ec38d13bd4cbda435c",
[
@@ -499402,7 +500487,7 @@
]
],
"import-conditions.html": [
- "0bb09754702ce2c4f2655f2ec1c01ec8f78a661d",
+ "e5e1c685a9e214af6f0cd4a9eefa4f67056665e8",
[
null,
{}
@@ -499562,6 +500647,13 @@
null,
{}
]
+ ],
+ "supports-import-parsing.html": [
+ "58e1f7cd165381d7ab53a6eb6feb03bbc976ef97",
+ [
+ null,
+ {}
+ ]
]
},
"presentational-hints-cascade.html": [
@@ -502400,6 +503492,13 @@
{}
]
],
+ "fieldset-as-container-justify-center.tentative.html": [
+ "a1d7564e8a766d34e566df937ef2d6fd6def627b",
+ [
+ null,
+ {}
+ ]
+ ],
"flex-aspect-ratio-img-column-011.html": [
"f716d5ad6c896624577b253ea37e66954c08c358",
[
@@ -503426,6 +504525,13 @@
{}
]
],
+ "justify-content-007.html": [
+ "2ce9177a76639f1bbfaedb736d4ed620d6e1b3d1",
+ [
+ null,
+ {}
+ ]
+ ],
"justify-content_space-between-002.html": [
"fde1a7312408d02fe3843452585de2ee660ae6f7",
[
@@ -509122,7 +510228,7 @@
},
"text-box-trim": {
"text-box-trim-valid.html": [
- "1ce4ceb107409896d3f9e1d000f226c3afb5fcb2",
+ "61622774f6f33054ad97e74dde0b020619eb1d02",
[
null,
{}
@@ -511488,6 +512594,36 @@
{}
]
],
+ "overlay": {
+ "overlay-computed.html": [
+ "f1a0a315de6eeb08863d9fd4dbad2588b3492d89",
+ [
+ null,
+ {}
+ ]
+ ],
+ "overlay-invalid.html": [
+ "e84d0c8a6b0c36f815301dcfe6683f80661121b3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "overlay-transition-property.html": [
+ "a667f26ea6a42a2dde565d4eeb7f28cb98aacbc1",
+ [
+ null,
+ {}
+ ]
+ ],
+ "overlay-valid.html": [
+ "8d808ac6dcf582628f782b2e228b261a654ba212",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"parsing": {
"bottom-computed.html": [
"baeef5daa5df496d9f62e4bde9b409965cdcb768",
@@ -528635,6 +529771,13 @@
{}
]
],
+ "scripting.html": [
+ "de047cb463cff5c1d8af268f1e08908c9684fe8c",
+ [
+ null,
+ {}
+ ]
+ ],
"test_media_queries.html": [
"20fca4affd24e5a3d1335b9d39420f653c7cd9fb",
[
@@ -529586,7 +530729,7 @@
]
],
"css3-selectors-lang-014.html": [
- "5e68d50d5a07211dcc1cb70235da5efa96e38759",
+ "411d50d35e50f46609fa98a6c60b3ef1065aa5a1",
[
null,
{}
@@ -533203,7 +534346,7 @@
]
],
"scrollend-event-fired-to-element-with-overscroll-behavior.html": [
- "acad168e56c995dea4e70f4124b4ec97f8b90c15",
+ "edda88e7cb2064757cb4b34c2bf7dcdab97e8f65",
[
null,
{
@@ -566210,7 +567353,7 @@
]
],
"join-leave-ad-interest-group.https.sub.window.js": [
- "32924a8d8724c203b21bbd52b26a40d15b901f1d",
+ "973c586ca4f1b3d35bd6c0814dc5fe3a012bbdda",
[
"fledge/tentative/join-leave-ad-interest-group.https.sub.window.html",
{
@@ -568337,6 +569480,15 @@
}
]
],
+ "element-request-fullscreen-screen-size.https.html": [
+ "1c2bc9e3d119edb9ebeb88aabe33aeee7b7a334a",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"element-request-fullscreen-svg-rect.html": [
"44adfa68986566e63ad788eeb2f8595076c1c413",
[
@@ -579551,56 +580703,56 @@
},
"filters": {
"2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [
- "d64b81026ad5f60494b2df0db50b11fb01bfb255",
+ "77818444c87c90312000dc6a601eb5985be1f070",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.colorMatrix.tentative.html": [
- "678a722520a98bb0039c3c0fb846c320fd943800",
+ "a56840e60739638fbf54e1363d119fab56dca3e3",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [
- "0ecd132c8efa286b90f5a2777e1351c3204316d0",
+ "c54299ff2a5a45f66bf67ff31d1945c201ed4f82",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [
- "4ef30c9249bb01fa1780f8ab07d677b087073ff2",
+ "110cd2396ea893dd9586098e9810399f63a179f2",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [
- "25eda36d96b08779e73cb385ae5496e623976461",
+ "96a3e4936ee2640f792b971ff4b9f702e7e3b79f",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [
- "c45f5586009150b862acd6b3398ca53350456baa",
+ "10f9931cc6430ef84b2314add5581c09136122b7",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [
- "b561cb6fd3f0a8d293941bffada44c70416d266a",
+ "7e743bf34f008d0b4579183d8f28ad2aa0624a81",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [
- "b85b742b3ebb2c26ed9b17b6683b6b510268ee84",
+ "b994a91842c031f05cd1650ee8078a62a0825416",
[
null,
{}
@@ -579614,14 +580766,14 @@
]
],
"2d.filter.canvasFilterObject.tentative.html": [
- "3a32eb6a55a2487449b982cb0dda11815e782218",
+ "a4625db01977fe277d3b0543dd80146b7ce47f55",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [
- "1f9d978ac8c29f8e51075cd119240d3921411b6b",
+ "64f909a7fdb25ee209ba4aeb6fd3830b5b6a7e48",
[
null,
{}
@@ -588697,112 +589849,112 @@
},
"filters": {
"2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [
- "6ce6fb633f8c08e0b168a810350d862b14838b8f",
+ "f5332780c82b41dab06cb18d1d78990724426a50",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js": [
- "a44868f585c67ccee883b06bc6681b4c88bb4f7f",
+ "61f10308801caa7e3c276aa4db4b7cf6158e4d84",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.colorMatrix.tentative.html": [
- "3eda41776c0ef289c23991bc9e88219a974829fd",
+ "f3dd3037bb7ab7b9e82fbab0590d8bfe508f8f46",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js": [
- "105f312b9ceae0243b27234934477568493861df",
+ "19d57b61e53242a4c0144b87c060dfad708bfada",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [
- "7cb8b0dd143602bb2fb6893b63b6bebaf23a3bf0",
+ "dd6fc9ee5ff1694e6a19b87a83c24ef2d32e2dbd",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js": [
- "f1274f14253c559ccfe9939abbc87c62884ff7c0",
+ "79a5cd2475ca911c061b898881d2474ee556531d",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [
- "388fdca6f9d8db49680b506c918a163935d25908",
+ "f2a9fcfd49a4a66f0a1283f41a8a5346e0a4e769",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js": [
- "14bf50f89dde725304dbcbdb9f8ea65447c373ca",
+ "a36fa19a5efad6948108a3cfd7c337daca1f5f76",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [
- "44eb7184956bd4b535d8c097237a90e358d8e1b2",
+ "33aae01eb056f9c37f4254b1aa4ad16c49aa267a",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js": [
- "ae749673f4362ea4aade37ffdc55986e77735a6c",
+ "7236c7087a174372a271e9c043d149faefbf6d42",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [
- "d24a9e8608d1b2c2d404579b9e122522c7965e2e",
+ "23731a1286ce723473b2268dc1d1530d6af028dc",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js": [
- "5117d4a1b3b0d683146a9ee39eb1b30966cb72b7",
+ "9a4499d4d6b70114fd9225172a04cf5ac9ef8c4e",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [
- "a704557cc54551a70dc8087130ae270ba79ad558",
+ "c11e6adb9109972b1c0d2a6da7e847e2aeecc047",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js": [
- "e2463eb9e7663b0409b6ea661d333d500e08a9e1",
+ "8ff791d3bb986733308320a158c3a8f3d17b9f08",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [
- "0a6bddc56d7b339dad16db40531d8832d08c3624",
+ "c4b6df8e0db0bec1dcff080436c0daba92ccdadc",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js": [
- "bce4c0be158aafce773333805f2e8b0ce7644873",
+ "f7e616e7a63fc32dc6da14acec08c4255f24ee3c",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.html",
{}
@@ -588823,28 +589975,28 @@
]
],
"2d.filter.canvasFilterObject.tentative.html": [
- "75d369cad2f9e0c3a7674537badd49fdfa79c74e",
+ "4d80dddf0071467eabde32c85d0dd5b30da2dcbb",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.tentative.worker.js": [
- "30772a39d102169cc5d04b79fe83c037f66085a4",
+ "48c4a0448d95e596c7d46e5c38a05f33ab29efd9",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.html",
{}
]
],
"2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [
- "610dca9feaf59afd413aec78f291ba14607a53d6",
+ "2ed61e66d0335be76c33a71a30cfb18d5304bf03",
[
null,
{}
]
],
"2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js": [
- "76673fab9a7e6a16c4340021961c8180c6253ca4",
+ "1bed65ad156a78121ad52d6448dc7107995986e1",
[
"html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.html",
{}
@@ -604001,8 +605153,15 @@
]
]
},
- "http-equiv-and-name.html": [
- "144217df3848851445f78d4e1b725dc1d479584e",
+ "http-equiv-and-name-1.html": [
+ "ac82e3396d6258e2fea86dbac65a12b12304b751",
+ [
+ null,
+ {}
+ ]
+ ],
+ "http-equiv-and-name-2.html": [
+ "b73013a341b9774dc3ad1f3154df47e365a816be",
[
null,
{}
@@ -627225,6 +628384,13 @@
}
]
],
+ "loaf-blocking-duration.html": [
+ "3514d413e9eb763eb12563180437b0a9d8211cee",
+ [
+ null,
+ {}
+ ]
+ ],
"loaf-buffered.html": [
"1a07036b157a93f1f4c099a8cd5c0917d71424e0",
[
@@ -627345,7 +628511,7 @@
]
],
"loaf-toJSON.html": [
- "f78e95da6d11e25d355d71d26bbc56bf2c967b1f",
+ "5b249e697245c5b9002c1a5fcbd6f456ab220005",
[
null,
{}
@@ -632923,7 +634089,7 @@
],
"cross-window": {
"click-crossdocument-crossorigin-sameorigindomain.sub.html": [
- "676672a230f15030eee9b10a0380ed3b3006b840",
+ "004e1a75e3d8ca38c5634424a4816c577e705479",
[
null,
{}
@@ -632937,35 +634103,35 @@
]
],
"click-crossdocument-sameorigin.html": [
- "41c3ca71eef1d5eaafb1eff0bbe5eb70799a1ce2",
+ "683875d0062e3b0d56428c0827822bf75b10e68e",
[
null,
{}
]
],
"click-samedocument-crossorigin-sameorigindomain.sub.html": [
- "a467ecf9d73d88af6537a234125e4ef15dd05d00",
+ "60d1653a3ab17aa5a392e97bdc91734024c16a51",
[
null,
{}
]
],
"click-samedocument-crossorigin.html": [
- "b9fa97f6d526ae395402dac8b8d6c59988a404b0",
+ "ee01e7f1f2d8d31f2596fcf3ecb77c22004c7201",
[
null,
{}
]
],
"click-samedocument-sameorigin.html": [
- "566bea3dc7e9b58baff552e219f85be75a6fdb08",
+ "eaa7b52345722801885f1d5ef8f9f51002375d2d",
[
null,
{}
]
],
"location-crossdocument-crossorigin-sameorigindomain.sub.html": [
- "77a5873c0838f8452dafc4bdca785944dbd92ef0",
+ "cee7d95b9ecf678982eba240d96e6787647beaaf",
[
null,
{}
@@ -632979,35 +634145,35 @@
]
],
"location-crossdocument-sameorigin.html": [
- "41ac1b037506f12a86dec1ab10df1d917bc1ba72",
+ "d0dad46b72ab9476c15860b8d0249bdd23c5421a",
[
null,
{}
]
],
"location-samedocument-crossorigin-sameorigindomain.sub.html": [
- "1eda74e982831088f7b70d0175fb954583044db8",
+ "156d1cb3cfd1f3f469c68de21b0aebc9e9b94615",
[
null,
{}
]
],
"location-samedocument-crossorigin.html": [
- "5679236a7ddca9b6ac7e3627652ba4faaa29fee4",
+ "6d73262dea0153a61a7f146105cbbcbbc4a4280f",
[
null,
{}
]
],
"location-samedocument-sameorigin.html": [
- "a7e4181c3a19f0449e0fce7457c664d94edcd932",
+ "6516a602395065f6447be7e4e0c52c99559473d8",
[
null,
{}
]
],
"open-crossdocument-crossorigin-sameorigindomain.sub.html": [
- "ea9ea479c34733c46f8312a72dd6ca2900c5680c",
+ "1c411d986682ed7aeb06aa79f481815795677fa6",
[
null,
{}
@@ -633021,35 +634187,35 @@
]
],
"open-crossdocument-sameorigin.html": [
- "478483e238d7271e65af53c4a29b861b11d44efd",
+ "c91689341e85e8a1053c311580e622449ab77be4",
[
null,
{}
]
],
"open-samedocument-crossorigin-sameorigindomain.sub.html": [
- "324adb32a45922d605ad2df350188ee05200171c",
+ "74a6cae2461835429a0181538e529ae05a12f0e9",
[
null,
{}
]
],
"open-samedocument-crossorigin.html": [
- "23dceb04204841a66b28bc55001742f091e1117a",
+ "9b31744ba384e12cd031c0ccba68e13936dab5b6",
[
null,
{}
]
],
"open-samedocument-sameorigin.html": [
- "9ca853180343f69cee1896837f77c21b485fa08b",
+ "c357072e09d1d00832616fba9886b4f8eac63c02",
[
null,
{}
]
],
"submit-crossdocument-crossorigin-sameorigindomain.sub.html": [
- "f611034617401e8497567c825d27ef245d75bf01",
+ "ffdaac7ccdd6428ba03fb00600a79bd3e15a9e86",
[
null,
{}
@@ -633063,28 +634229,28 @@
]
],
"submit-crossdocument-sameorigin.html": [
- "05347335a192a65306b652ff7c680dc7279e15d8",
+ "b54a5a440b05cbd54c2a9dce2bcd73bc2a635e29",
[
null,
{}
]
],
"submit-samedocument-crossorigin-sameorigindomain.sub.html": [
- "9e64a0124daf5f549daf12f5c13a5793da254584",
+ "e9ab17243e5836f25542669b5973639f7787c09d",
[
null,
{}
]
],
"submit-samedocument-crossorigin.html": [
- "e53a1f93e7a7a063c050c1419760d9a1fed8f1e8",
+ "69b12f279594387134c9082258b94a82d6b5dba3",
[
null,
{}
]
],
"submit-samedocument-sameorigin.html": [
- "43aa3226fcd6fc99d86eab400fbdea75d2d2a6c0",
+ "8a0e1f1fb69635ba8595c4ed5f4ec3c85d2e642e",
[
null,
{}
@@ -633253,14 +634419,14 @@
]
],
"navigate-anchor-cross-origin.html": [
- "d8f2e383124be56d493d6d67b47d9664f62f2a94",
+ "ee0992485078fd85d1c2099e7c74440407c111b4",
[
null,
{}
]
],
"navigate-anchor-download-userInitiated.html": [
- "90a612b75886963b2bf706fcfb934637d9a903ec",
+ "b9506984dad8d8cd65b6d80c084922c59ed319ac",
[
null,
{
@@ -633269,28 +634435,28 @@
]
],
"navigate-anchor-download.html": [
- "c5ca306b7908d518a7e105d5dcf39e312a07a6bc",
+ "05fb0ecf2fe6f60577fed75e2ca6fc57677cac0f",
[
null,
{}
]
],
"navigate-anchor-fragment.html": [
- "b7706b7debea3cdf5cc943f96ec4a099c4c02acb",
+ "51221ebcad381b04600835bbc765e82dafa9d4b2",
[
null,
{}
]
],
"navigate-anchor-same-origin-cross-document.html": [
- "b8e925a4dbacd54399f2ad96eb21f8b6481caf8c",
+ "68f5bf0627c123f1fe954d109924c2c1a5ab7170",
[
null,
{}
]
],
"navigate-anchor-userInitiated.html": [
- "b746bbe3f028c25c4038d9e1b4f748f7b93289d7",
+ "39192c915132485a512a353d7f6e2c5693cf4cdf",
[
null,
{
@@ -633299,35 +634465,49 @@
]
],
"navigate-anchor-with-target.html": [
- "c2053a37b09a45610dbbb43fdd0780a24614b4e8",
+ "6407b963beb7cd8a321574faab8b942e887959ae",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigate-destination-after-detach.html": [
+ "1dcb6cac4377ab79551ec51382308d6d669b5670",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigate-destination-dynamic-index.html": [
+ "2e0f1ea49730fcdcf07f483188b01d5350540069",
[
null,
{}
]
],
"navigate-destination-getState-back-forward.html": [
- "c118aa7a1f3867990beed09786cc6778858f5a2f",
+ "c8b1043aba6f5ee4605ee461b4f0ab1bc4136077",
[
null,
{}
]
],
"navigate-destination-getState-navigate.html": [
- "9c34c5753a1197631cd1770284dfb012bb0192f6",
+ "5dac40de566e9e42a5e2f08ec0a7a2882f318b51",
[
null,
{}
]
],
"navigate-destination-getState-reload.html": [
- "b3afb72482c8fd545a044e4923c8b0820c7a9bf9",
+ "a180e086a94b084bb8df4a6a315444551ea57158",
[
null,
{}
]
],
"navigate-form-get.html": [
- "69a49eb08a67711178dd8ef1a9f35c3c807d55d4",
+ "87a102ddc0598f9903c630c5c1add3075dbbdcdb",
[
null,
{}
@@ -633348,7 +634528,7 @@
]
],
"navigate-form-userInitiated.html": [
- "454f0773962f326f1ae66ee4d5a470fc1abf50ff",
+ "40c5905447c59fc0ed1d873d3248c39a49163db0",
[
null,
{
@@ -633357,14 +634537,14 @@
]
],
"navigate-form-with-target.html": [
- "b23ab3a70ccb2bb724cde932bbd3fc91f711177a",
+ "f6fe05c938f2fb88289c3a95bfab2f809d11177b",
[
null,
{}
]
],
"navigate-form.html": [
- "b537a9b58f090c8f7ce76bb06433ae5a9c8b93a6",
+ "c57d72c3deb0f7714bf78630afe6a39d87569f01",
[
null,
{}
@@ -633399,42 +634579,42 @@
]
],
"navigate-history-go-0.html": [
- "96d98cf44c8261a777d37b31785137897f3429c8",
+ "b1f41425b62f833474b85dd3049d1c33ea3095d9",
[
null,
{}
]
],
"navigate-history-pushState.html": [
- "2f8c81c7090cb9441210936f1d63a016cca29ccc",
+ "266309a79e13a4e5239853316089c19a729a5ba2",
[
null,
{}
]
],
"navigate-history-replaceState.html": [
- "d8417fbfd308ae9a7120b6a8040d401b5384084a",
+ "ea6d3df455dc74fb27e964a4f41eabdf611ab5f5",
[
null,
{}
]
],
"navigate-iframe-location.html": [
- "059b995011836619c46a0d8c95bef56c82cceaec",
+ "25d51476f3ffeea34583254a9e8162c507915408",
[
null,
{}
]
],
"navigate-location.html": [
- "c5aa0be97a47be497f019c8a9cd6fc03db022bd3",
+ "a4d0c60776dc0eb21996ffa8abb92e884995b9dd",
[
null,
{}
]
],
"navigate-meta-refresh.html": [
- "1f8ed306851fd469e7ebbdeac3695b16ab47421e",
+ "9fa59b29f240014e86e7a379cfd3b56a490dc853",
[
null,
{}
@@ -633462,7 +634642,7 @@
]
],
"navigate-navigation-navigate.html": [
- "76f98c72361060fa5fbc842fecdfa00c737cd56c",
+ "ffc8ea867f71f3c23290813a1e90065341f68c81",
[
null,
{}
@@ -633476,21 +634656,21 @@
]
],
"navigate-to-srcdoc.html": [
- "26ad135b6ad0b7718c97f2914d60dfc2bbb9dea0",
+ "8bbb66a31fdfee846444dc2c2e338fb7669bfff7",
[
null,
{}
]
],
"navigate-window-open-self.html": [
- "274c8bc4d5762fd47314b4534a79145da31b5f8a",
+ "a6e443fd5a115edd7dea6f5cd40abfb3386c937c",
[
null,
{}
]
],
"navigate-window-open.html": [
- "afc998271f6e96f206ecea45368a275f44400b79",
+ "1fe2402bc91e524371cb0f998e6477000ad96357",
[
null,
{}
@@ -636638,7 +637818,7 @@
]
],
"visibility-state-entry.tentative.html": [
- "c62b6c583f42ca97c812480a0842c15d26543a6f",
+ "0dbe634d25bef37fb2293cbbcd113fa33a8ddceb",
[
null,
{
@@ -657954,7 +659134,7 @@
]
],
"orientation-reading.html": [
- "0bebb6723a384fc112358418d783e72a762940e2",
+ "90bbb8071dacf704c5a66b564268af4ee4f92354",
[
null,
{
@@ -658163,7 +659343,7 @@
"scroll-animations": {
"css": {
"animation-duration-auto.tentative.html": [
- "f44a682890d8e25fa5f92e06591b7e22b00a26a3",
+ "375489c26a4f49aa3f8bb1f3b4f24d19654ab549",
[
null,
{}
@@ -658282,7 +659462,7 @@
]
],
"progress-based-animation-timeline.html": [
- "2e910cbe51efbf4bdcd73eca85c9bed1c39d09e6",
+ "3f1aeed0ae9bdd6f19550cab37f92f1437619634",
[
null,
{}
@@ -658302,6 +659482,13 @@
{}
]
],
+ "scroll-timeline-attachment.html": [
+ "78ca257437322a5b24281f9bd45cffabf728cad2",
+ [
+ null,
+ {}
+ ]
+ ],
"scroll-timeline-axis-computed.html": [
"b971aba6c0f8a5bd5a6e18ddbef1cc296263c305",
[
@@ -658317,7 +659504,7 @@
]
],
"scroll-timeline-axis-writing-mode.html": [
- "37b4dfdf549e52943c5e8a35683cc6a998442db4",
+ "958ce4964e844bcf8d94699b4a8bbc5e29df8e2f",
[
null,
{}
@@ -658443,7 +659630,7 @@
]
],
"timeline-offset-keyframes-hidden-subject.html": [
- "047acfed33f36adb3afca0655c99e75a707f3976",
+ "389c8baca3ad035df1de6767ac9abc6265756808",
[
null,
{}
@@ -658457,7 +659644,7 @@
]
],
"timeline-range-name-offset-in-keyframes.tentative.html": [
- "a0d1bd92f0907f26b98843cac21d306a0848949c",
+ "7bae49c2e97dcc8c22b3f071256fdfd9cca699c2",
[
null,
{}
@@ -658471,7 +659658,7 @@
]
],
"view-timeline-animation.html": [
- "b816bb689732b3be59df48c0653ed892dc70cdd4",
+ "73189b85917314e497cf0cb70d2e22986c230997",
[
null,
{}
@@ -658491,6 +659678,13 @@
{}
]
],
+ "view-timeline-attachment.html": [
+ "47f4444b0dcad286f9a9d538e0e85d05623c3ea3",
+ [
+ null,
+ {}
+ ]
+ ],
"view-timeline-axis-computed.html": [
"f4649dab0404a49be5014e2df7475fd151c44342",
[
@@ -658513,7 +659707,7 @@
]
],
"view-timeline-inset-animation.html": [
- "a95086b62bf338ea338345990a11735f7f594e23",
+ "a7e807c2e819dd0678178171816af5569b3aadff",
[
null,
{}
@@ -658534,14 +659728,14 @@
]
],
"view-timeline-keyframe-boundary-interpolation.html": [
- "1dc766d961c5dd513e3d0912d01468279044648e",
+ "04eb648949057b6452d96b2f4ba55a1cb9f467e2",
[
null,
{}
]
],
"view-timeline-lookup.html": [
- "c1797c7ba1c37177f413ed1396ddb3e8b61660dc",
+ "b8a5b0008be1a0b9285fd52b3ecd666f39ab6a3e",
[
null,
{}
@@ -659130,6 +660324,15 @@
}
]
],
+ "authentication-disallowed-when-hidden.https.html": [
+ "1c01fa0e89c133122952479e2e3b1a0632ce0007",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
"authentication-icon-data-url.https.html": [
"cd820d84c32116a400f76f059af97a0241cfcc37",
[
@@ -664978,7 +666181,7 @@
]
],
"html-collection.html": [
- "2f3d49ec267b83c64d37641ce50b22c9b26aa0df",
+ "1ce2cf34401dff1bb63b1955d93b3c79ab7886ea",
[
null,
{}
@@ -665752,6 +666955,13 @@
]
},
"shared-storage": {
+ "insecure-context.tentative.http.html": [
+ "7ddf02f861aaba92db75ac47c85dfcab4a7c8861",
+ [
+ null,
+ {}
+ ]
+ ],
"select-url-permissions-policy-default.tentative.https.sub.html": [
"67911388ec0f41790d8c7c678256f153765a6294",
[
@@ -666510,6 +667720,13 @@
}
]
],
+ "different-initiators-2.https.html": [
+ "69e84333aa4dec9f5602f299bd224c58ee13a66a",
+ [
+ null,
+ {}
+ ]
+ ],
"different-initiators.sub.https.html": [
"74e79323d9413da5196d7b1b57b340b205bc2099",
[
@@ -673054,14 +674271,14 @@
]
],
"remove-error.tentative.https.html": [
- "e85ffd74a78d52a156f1fba88bba61a384a20cc7",
+ "917c3b4d022d446488ac14c45fff114e34a95c5d",
[
null,
{}
]
],
"remove-success.tentative.https.html": [
- "ca73cbea8886aa5eb93249b97264df0c4ac1e875",
+ "6fd4305b4340a036ddba6084d9f6c5b929254f2e",
[
null,
{}
@@ -676524,14 +677741,14 @@
]
},
"trust-token-parameter-validation-xhr.tentative.https.html": [
- "73af4634b6d0326711275293e70e9b28ce618ec0",
+ "883c438fa93be67e44c2da172fca00a45a8d3ddc",
[
null,
{}
]
],
"trust-token-parameter-validation.tentative.https.html": [
- "e2ab079434bd6e6eda9274ba9e0064683056367a",
+ "cf24b232e834383655e3d54b0a81fad3810454fc",
[
null,
{}
@@ -692518,7 +693735,7 @@
]
],
"video-encoder.https.any.js": [
- "b5c511d4062cc5bf473dfbb670491d02c1daa19e",
+ "229ae32edd44307d8683ad8793641d16d9d28c1c",
[
"webcodecs/video-encoder.https.any.html",
{
@@ -693246,7 +694463,7 @@
]
],
"videoFrame-serialization.crossAgentCluster.https.html": [
- "cb02ad4bcc3a23c33e091b887bc069fcfe6ed170",
+ "8fe7cf44cc686e041fc1fdc677c060905e7d76d0",
[
null,
{}
@@ -696276,6 +697493,57 @@
}
]
],
+ "softsign.https.any.js": [
+ "61a7d5365fabca290eaeb400c961a107558e17ed",
+ [
+ "webnn/softsign.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API softsign operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "./resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ],
+ [
+ "webnn/softsign.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "test WebNN API softsign operation"
+ ],
+ [
+ "global",
+ "window,dedicatedworker"
+ ],
+ [
+ "script",
+ "./resources/utils.js"
+ ],
+ [
+ "timeout",
+ "long"
+ ]
+ ],
+ "timeout": "long"
+ }
+ ]
+ ],
"split.https.any.js": [
"bb1c99565879ccb922bb3f492803138767f6deff",
[
@@ -698082,7 +699350,7 @@
]
],
"RTCRtpTransceiver-headerExtensionControl.html": [
- "b6dc7da5d4076d113419888e814e445e9dd2c40a",
+ "79eba02727bb35b745cee0a3b6246e37fb216e06",
[
null,
{}
@@ -710842,7 +712110,7 @@
]
],
"datagrams.https.any.js": [
- "b96b36fc369f1dbb929ce0f44dcf7ae18ffc8e22",
+ "dc7133bb867e203ee651d887b64e48782dc3c58b",
[
"webtransport/datagrams.https.any.html",
{
@@ -711188,7 +712456,7 @@
]
],
"streams-echo.https.any.js": [
- "32781419ebf7bd83d376419ca07e2829196ed4db",
+ "3b402d00e08aa0b7b746248835faed37b9b99578",
[
"webtransport/streams-echo.https.any.html",
{
@@ -742294,7 +743562,7 @@
},
"dom_content_loaded": {
"dom_content_loaded.py": [
- "486414aa3cd97bfd8d979445070c204dda44c2d9",
+ "9723ee4a4edfef0dd5bb51414d32d8cac2b39e82",
[
null,
{}
@@ -742333,7 +743601,7 @@
},
"load": {
"load.py": [
- "878d26eaad82d5bb1a9be437e072031b001ad06a",
+ "b4b174818cf20f52cb4f1c864ef6a34682f4e03c",
[
null,
{}
@@ -742444,7 +743712,7 @@
]
],
"page.py": [
- "dd1fbcb9ae7359ff65d1bff425e179e5ccb6cbce",
+ "b66fb9881e5c8bbe530d2056e959d76a0add6e44",
[
null,
{}
@@ -742486,6 +743754,13 @@
},
"input": {
"perform_actions": {
+ "invalid.py": [
+ "4dee9e33654651a288d7ea8a00d73f3529acd3d9",
+ [
+ null,
+ {}
+ ]
+ ],
"key.py": [
"bed2182f34cfd7f31b3c06ee85be8936c35fa8fe",
[
@@ -742494,7 +743769,37 @@
]
],
"key_events.py": [
- "65f54ed7b3846f7805e34771aeac0392b83937ba",
+ "e222776d1f9b828aac6070f79a5c624bcdb54707",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
+ "release_actions": {
+ "context.py": [
+ "0cb407606d4819a56879610dbed5c560c28d0b4b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "invalid.py": [
+ "2adc0aa95388915829e833280c0d3398801ad470",
+ [
+ null,
+ {}
+ ]
+ ],
+ "release.py": [
+ "c4990b702aefa0490b285143d0cf39bd13a909ca",
+ [
+ null,
+ {}
+ ]
+ ],
+ "sequence.py": [
+ "bd1d77523037f7294491682501b2185b91870327",
[
null,
{}
@@ -742661,7 +743966,7 @@
]
],
"invalid.py": [
- "d73705c672470e1fe1986b61808b29eae4aea4d6",
+ "015fd40cf90ba3f1f07730d5feb39c547f3bfe13",
[
null,
{}
@@ -742735,7 +744040,7 @@
},
"disown": {
"handles.py": [
- "d4a514576624cd9fce98cf244b00ca39008ba0ee",
+ "e1226463a5cb82b1cd4a3facda15f4af93040557",
[
null,
{}
@@ -742756,7 +744061,7 @@
]
],
"target.py": [
- "d8439c2be3d5345a9fecb4d3205642baeba752b9",
+ "67d857a04141ea441085f92ab5bc39f57088ff5c",
[
null,
{}
@@ -744073,7 +745378,7 @@
]
],
"key_events.py": [
- "8dbe024d18396f010b2dcac7281b8436b5b69c65",
+ "9f912684c76f4e6b7347c8a08a8b9e9559d6d6bd",
[
null,
{
@@ -744281,7 +745586,7 @@
]
],
"sequence.py": [
- "75143d85ca600b3e3a2d7d5ac3679a26b7d7bf5a",
+ "24ca16c86043ac091b5173fcc3e8571a50107eca",
[
null,
{
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-001.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-001.html.ini
new file mode 100644
index 00000000000..0842d0b5727
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-001.html.ini
@@ -0,0 +1,3 @@
+[hit-test-floats-001.html]
+ [hit-test-floats-001]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini
deleted file mode 100644
index 968f62a2553..00000000000
--- a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[hit-test-floats-002.html]
- [Hit test float]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini
new file mode 100644
index 00000000000..665ec4646cb
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini
@@ -0,0 +1,3 @@
+[hit-test-floats-003.html]
+ [Miss float below something else]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini
new file mode 100644
index 00000000000..147f062e548
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini
@@ -0,0 +1,3 @@
+[hit-test-floats-005.html]
+ [Miss clipped float]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini
index ee34bc91078..51432362d66 100644
--- a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini
+++ b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini
@@ -1,6 +1,3 @@
[block-in-inline-hittest-002.html]
[elementsFromPoint]
expected: FAIL
-
- [elementFromPoint]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini
index f9e216a8cfc..cdd8b55f192 100644
--- a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini
+++ b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini
@@ -1,6 +1,3 @@
[block-in-inline-hittest-relpos-zindex.html]
[position: relative; z-index: -1;]
expected: FAIL
-
- [block-in-inline-hittest-relpos-zindex]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/hit-test-anonymous-block.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/hit-test-anonymous-block.html.ini
deleted file mode 100644
index 7c07b71d77c..00000000000
--- a/tests/wpt/metadata/css/CSS2/normal-flow/hit-test-anonymous-block.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[hit-test-anonymous-block.html]
- [Hit test beside line of text inside anonymous block]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/css-animations/display-none-dont-cancel.tentative.html.ini b/tests/wpt/metadata/css/css-animations/display-none-dont-cancel.tentative.html.ini
new file mode 100644
index 00000000000..0ac75b5ef27
--- /dev/null
+++ b/tests/wpt/metadata/css/css-animations/display-none-dont-cancel.tentative.html.ini
@@ -0,0 +1,15 @@
+[display-none-dont-cancel.tentative.html]
+ [display:none animating to display:inline should be inline for the whole animation.]
+ expected: FAIL
+
+ [A CSS variable of display:none animating to display:inline should be inline for the whole animation.]
+ expected: FAIL
+
+ [Animating from display:none to display:none should not cancel the animation.]
+ expected: FAIL
+
+ [Animating from display:none to display:none with an intermediate variable should not cancel the animation.]
+ expected: FAIL
+
+ [Animating a variable of "none" which gets set to display elsewhere should not cancel the animation.]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini
new file mode 100644
index 00000000000..2789084260c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini
@@ -0,0 +1,2 @@
+[background-attachment-fixed-inline-scrolled.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/hittest-anonymous-box.html.ini b/tests/wpt/metadata/css/css-flexbox/hittest-anonymous-box.html.ini
deleted file mode 100644
index b8f8d45a31f..00000000000
--- a/tests/wpt/metadata/css/css-flexbox/hittest-anonymous-box.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[hittest-anonymous-box.html]
- [Hit-testing within an anonymous flex-item should return the flexbox as the hittest result.]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/hittest-before-pseudo.html.ini b/tests/wpt/metadata/css/css-flexbox/hittest-before-pseudo.html.ini
deleted file mode 100644
index 5b685485f3c..00000000000
--- a/tests/wpt/metadata/css/css-flexbox/hittest-before-pseudo.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[hittest-before-pseudo.html]
- [Hit-testing text within a pseudo-element flex-item should return the flexbox as the hittest result.]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/justify-content-007.html.ini b/tests/wpt/metadata/css/css-flexbox/justify-content-007.html.ini
new file mode 100644
index 00000000000..ea29b95ecec
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/justify-content-007.html.ini
@@ -0,0 +1,3 @@
+[justify-content-007.html]
+ [.flexitem + .flexitem 1]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-flexbox/table-as-flex-item-max-content.html.ini b/tests/wpt/metadata/css/css-flexbox/table-as-flex-item-max-content.html.ini
new file mode 100644
index 00000000000..0757e0f9b55
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/table-as-flex-item-max-content.html.ini
@@ -0,0 +1,2 @@
+[table-as-flex-item-max-content.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini b/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini
index 1781ee56d0b..c8501a56905 100644
--- a/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini
+++ b/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini
@@ -34,3 +34,9 @@
[Test @font-face matching for weight 250]
expected: FAIL
+
+ [Test @font-face matching for weight 400]
+ expected: FAIL
+
+ [Test @font-face matching for weight 420]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-position/overlay/overlay-computed.html.ini b/tests/wpt/metadata/css/css-position/overlay/overlay-computed.html.ini
new file mode 100644
index 00000000000..cc0692d0132
--- /dev/null
+++ b/tests/wpt/metadata/css/css-position/overlay/overlay-computed.html.ini
@@ -0,0 +1,18 @@
+[overlay-computed.html]
+ [Property overlay value 'none']
+ expected: FAIL
+
+ [Property overlay value 'auto']
+ expected: FAIL
+
+ [Property overlay value 'inherit']
+ expected: FAIL
+
+ [Property overlay value 'initial']
+ expected: FAIL
+
+ [Property overlay value 'revert']
+ expected: FAIL
+
+ [Property overlay value 'unset']
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-position/overlay/overlay-transition-property.html.ini b/tests/wpt/metadata/css/css-position/overlay/overlay-transition-property.html.ini
new file mode 100644
index 00000000000..aacfbd3b035
--- /dev/null
+++ b/tests/wpt/metadata/css/css-position/overlay/overlay-transition-property.html.ini
@@ -0,0 +1,3 @@
+[overlay-transition-property.html]
+ [Property transition value 'overlay 1s']
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-position/overlay/overlay-valid.html.ini b/tests/wpt/metadata/css/css-position/overlay/overlay-valid.html.ini
new file mode 100644
index 00000000000..5c27614af3c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-position/overlay/overlay-valid.html.ini
@@ -0,0 +1,18 @@
+[overlay-valid.html]
+ [e.style['overlay'\] = "none" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "auto" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "inherit" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "initial" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "revert" should set the property value]
+ expected: FAIL
+
+ [e.style['overlay'\] = "unset" should set the property value]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transforms/inline-with-filter-and-hidden-backface.html.ini b/tests/wpt/metadata/css/css-transforms/inline-with-filter-and-hidden-backface.html.ini
deleted file mode 100644
index ae4a71ae9b3..00000000000
--- a/tests/wpt/metadata/css/css-transforms/inline-with-filter-and-hidden-backface.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[inline-with-filter-and-hidden-backface.html]
- [Hit test]
- 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..72b09371038
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini
@@ -0,0 +1,3 @@
+[elementFromPoint-001.html]
+ [CSSOM View - 5 - extensions to the Document interface]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-float-in-table.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-float-in-table.html.ini
deleted file mode 100644
index db065588308..00000000000
--- a/tests/wpt/metadata/css/cssom-view/elementFromPoint-float-in-table.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[elementFromPoint-float-in-table.html]
- [float-in-div]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini
index 390e170437a..8ae9bae3500 100644
--- a/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini
+++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini
@@ -13,15 +13,3 @@
[<li>Outside 3</li>]
expected: FAIL
-
- [<li>Inside 2</li>]
- expected: FAIL
-
- [<li>Inside 3</li>]
- expected: FAIL
-
- [<li>Image Inside 1</li>]
- expected: FAIL
-
- [<li>Image Inside 2</li>]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-subpixel.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-subpixel.html.ini
new file mode 100644
index 00000000000..8f6f663ba61
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-subpixel.html.ini
@@ -0,0 +1,3 @@
+[elementFromPoint-subpixel.html]
+ [Hit test top left corner of box]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-visibility-hidden-resizer.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-visibility-hidden-resizer.html.ini
deleted file mode 100644
index a6bca7ac372..00000000000
--- a/tests/wpt/metadata/css/cssom-view/elementFromPoint-visibility-hidden-resizer.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[elementFromPoint-visibility-hidden-resizer.html]
- [elementFromPoint on resizer area of an element with visibility:hidden]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini
index ceb43099040..3615da5f3a2 100644
--- a/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini
+++ b/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini
@@ -17,3 +17,9 @@
[test some point of the element: bottom right corner]
expected: FAIL
+
+ [test some point of the element: top left corner]
+ expected: FAIL
+
+ [test the top of layer]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
deleted file mode 100644
index a3496a40d07..00000000000
--- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[elementsFromPoint-invalid-cases.html]
- [The root element is the last element returned for otherwise empty queries within the viewport]
- expected: FAIL
diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini
new file mode 100644
index 00000000000..a3e30250229
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini
@@ -0,0 +1,6 @@
+[scroll-behavior-smooth-navigation.html]
+ [Instant scrolling while doing history navigation.]
+ expected: FAIL
+
+ [Smooth scrolling while doing history navigation.]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/mediaqueries/scripting-print-noscript.html.ini b/tests/wpt/metadata/css/mediaqueries/scripting-print-noscript.html.ini
new file mode 100644
index 00000000000..f8256a35717
--- /dev/null
+++ b/tests/wpt/metadata/css/mediaqueries/scripting-print-noscript.html.ini
@@ -0,0 +1,2 @@
+[scripting-print-noscript.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/mediaqueries/scripting-print-script.html.ini b/tests/wpt/metadata/css/mediaqueries/scripting-print-script.html.ini
new file mode 100644
index 00000000000..2143b97f4b4
--- /dev/null
+++ b/tests/wpt/metadata/css/mediaqueries/scripting-print-script.html.ini
@@ -0,0 +1,2 @@
+[scripting-print-script.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/mediaqueries/scripting.html.ini b/tests/wpt/metadata/css/mediaqueries/scripting.html.ini
new file mode 100644
index 00000000000..afffc87ac19
--- /dev/null
+++ b/tests/wpt/metadata/css/mediaqueries/scripting.html.ini
@@ -0,0 +1,27 @@
+[scripting.html]
+ [Should be known: '(scripting)']
+ expected: FAIL
+
+ [Should be known: '(scripting: enabled)']
+ expected: FAIL
+
+ [Should be known: '(scripting: initial-only)']
+ expected: FAIL
+
+ [Should be known: '(scripting: none)']
+ expected: FAIL
+
+ [Should be parseable: '(scripting: 0)']
+ expected: FAIL
+
+ [Should be parseable: '(scripting: 10px)']
+ expected: FAIL
+
+ [Should be parseable: '(scripting: invalid)']
+ expected: FAIL
+
+ [Check that scripting currently matches 'enabled']
+ expected: FAIL
+
+ [Check that scripting currently evaluates to true in the boolean context]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/selectors/selectors-4/lang-011.html.ini b/tests/wpt/metadata/css/selectors/selectors-4/lang-011.html.ini
new file mode 100644
index 00000000000..b168bf5cd3a
--- /dev/null
+++ b/tests/wpt/metadata/css/selectors/selectors-4/lang-011.html.ini
@@ -0,0 +1,2 @@
+[lang-011.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/selectors/selectors-4/lang-012.html.ini b/tests/wpt/metadata/css/selectors/selectors-4/lang-012.html.ini
new file mode 100644
index 00000000000..cdc6bafba43
--- /dev/null
+++ b/tests/wpt/metadata/css/selectors/selectors-4/lang-012.html.ini
@@ -0,0 +1,2 @@
+[lang-012.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini b/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini
index e9ab91fc80e..4c1c78640bb 100644
--- a/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini
+++ b/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini
@@ -1,3 +1,4 @@
[keepalive.any.html]
+ expected: TIMEOUT
[keepalive in onunload in nested frame in another window]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/body/mime-type.any.js.ini b/tests/wpt/metadata/fetch/api/body/mime-type.any.js.ini
deleted file mode 100644
index 9df4327e18f..00000000000
--- a/tests/wpt/metadata/fetch/api/body/mime-type.any.js.ini
+++ /dev/null
@@ -1,39 +0,0 @@
-[mime-type.any.html]
- [Request: overriding explicit Content-Type]
- expected: FAIL
-
- [Response: setting missing Content-Type]
- expected: FAIL
-
- [Response: overriding explicit Content-Type]
- expected: FAIL
-
- [Request: setting missing Content-Type]
- expected: FAIL
-
- [Response: removing implicit Content-Type]
- expected: FAIL
-
- [Request: removing implicit Content-Type]
- expected: FAIL
-
-
-[mime-type.any.worker.html]
- [Request: overriding explicit Content-Type]
- expected: FAIL
-
- [Response: setting missing Content-Type]
- expected: FAIL
-
- [Response: overriding explicit Content-Type]
- expected: FAIL
-
- [Request: setting missing Content-Type]
- expected: FAIL
-
- [Response: removing implicit Content-Type]
- expected: FAIL
-
- [Request: removing implicit Content-Type]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/redirect/redirect-keepalive.any.js.ini b/tests/wpt/metadata/fetch/api/redirect/redirect-keepalive.any.js.ini
deleted file mode 100644
index c57e48f2078..00000000000
--- a/tests/wpt/metadata/fetch/api/redirect/redirect-keepalive.any.js.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[redirect-keepalive.any.html]
- expected: TIMEOUT
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 f5ba8274138..4807d68ba4d 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -174,9 +174,6 @@
[fetch(): separate response Content-Type: text/plain;charset=gbk text/plain]
expected: NOTRUN
- [Request: combined response Content-Type: text/plain]
- expected: FAIL
-
[<iframe>: combined response Content-Type: text/plain ]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini
index f9de5391ad6..36a410bfecb 100644
--- a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini
+++ b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini
@@ -146,3 +146,6 @@
[list-style-image sec-fetch-site - HTTPS downgrade-upgrade]
expected: FAIL
+
+ [border-image sec-fetch-site - HTTPS downgrade (header not sent)]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
deleted file mode 100644
index 3e07e6b7d1f..00000000000
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[empty-iframe-load-event.html]
- [Check execution order from nested timeout]
- expected: FAIL
-
- [Check execution order on load handler]
- expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini
index ab9ac6e835e..1d68034a37d 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini
@@ -1,13 +1,12 @@
[failure-check-sequence.https.html]
- expected: TIMEOUT
[CSP check precedes COEP check - CSP header first]
- expected: NOTRUN
+ expected: FAIL
[COEP check precedes X-Frame-Options check]
- expected: NOTRUN
+ expected: FAIL
[CSP check precedes COEP check - COEP header first]
- expected: NOTRUN
+ expected: FAIL
[CSP check precedes X-Frame-Options check]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
index 78240a2f463..8ae58f9f1e2 100644
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini
@@ -16,3 +16,6 @@
[D83D DE0D set in href="" targeting a frame and clicked]
expected: FAIL
+
+ [DE0D 0041 set in href="" targeting a frame and clicked]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini
new file mode 100644
index 00000000000..4ecd6d9f753
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini
@@ -0,0 +1,3 @@
+[navigation-unload-cross-origin.sub.window.html]
+ [Cross-origin navigation started from unload handler must be ignored]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini
new file mode 100644
index 00000000000..7dc346632a4
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini
@@ -0,0 +1,3 @@
+[navigation-unload-same-origin.window.html]
+ [Same-origin navigation started from unload handler must be ignored]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
new file mode 100644
index 00000000000..60a4fa51f8a
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini
@@ -0,0 +1,3 @@
+[a-click.html]
+ [aElement.click() before the load event must NOT replace]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini
deleted file mode 100644
index d993e8dcc42..00000000000
--- a/tests/wpt/metadata/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[pageload-image-in-popup.html]
- [The document for a standalone media file should have one child in the body.]
- expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
new file mode 100644
index 00000000000..7a5fcb79165
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
@@ -0,0 +1,3 @@
+[traverse_the_history_5.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini
index 2a54f2f8814..5cdcce07c65 100644
--- a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini
+++ b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini
@@ -1,2 +1,2 @@
[canvas.2d.disconnected.html]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini b/tests/wpt/metadata/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini
deleted file mode 100644
index 5ff0d0fdbbc..00000000000
--- a/tests/wpt/metadata/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[2d.filter.canvasFilterObject.dropShadow.tentative.html]
- 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 396feea2e32..50e9a6ac04a 100644
--- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini
+++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini
@@ -1601,6 +1601,45 @@
[SVGElement interface: attribute onscrollend]
expected: FAIL
+ [ToggleEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ToggleEvent interface object length]
+ expected: FAIL
+
+ [ToggleEvent interface object name]
+ expected: FAIL
+
+ [ToggleEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ToggleEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [ToggleEvent interface: existence and properties of interface prototype object's @@unscopables property]
+ expected: FAIL
+
+ [ToggleEvent interface: attribute oldState]
+ expected: FAIL
+
+ [ToggleEvent interface: attribute newState]
+ expected: FAIL
+
+ [ToggleEvent must be primary interface of new ToggleEvent("beforetoggle")]
+ expected: FAIL
+
+ [Stringification of new ToggleEvent("beforetoggle")]
+ expected: FAIL
+
+ [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "oldState" with the proper type]
+ expected: FAIL
+
+ [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "newState" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: attribute onbeforetoggle]
+ expected: FAIL
+
[idlharness.https.html?include=(Document|Window)]
[Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type]
@@ -2221,6 +2260,24 @@
[Window interface: window must inherit property "onpaste" with the proper type]
expected: FAIL
+ [Window interface: attribute onbeforetoggle]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [Document interface: attribute onbeforetoggle]
+ expected: FAIL
+
+ [Document interface: iframe.contentDocument must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [Document interface: documentWithHandlers must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
[idlharness.https.html?include=HTML.*]
[HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type]
@@ -4334,3 +4391,213 @@
[HTMLScriptElement interface: document.createElement("script") must inherit property "blocking" with the proper type]
expected: FAIL
+
+ [HTMLElement interface: operation showPopover()]
+ expected: FAIL
+
+ [HTMLElement interface: operation hidePopover()]
+ expected: FAIL
+
+ [HTMLElement interface: operation togglePopover(optional boolean)]
+ expected: FAIL
+
+ [HTMLElement interface: attribute popover]
+ expected: FAIL
+
+ [HTMLElement interface: attribute onbeforetoggle]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "showPopover()" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "hidePopover()" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "togglePopover(optional boolean)" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: calling togglePopover(optional boolean) on document.createElement("noscript") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "popover" with the proper type]
+ expected: FAIL
+
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforetoggle" with the proper type]
+ expected: FAIL
+
+ [HTMLLinkElement interface: attribute fetchPriority]
+ expected: FAIL
+
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute fetchPriority]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement("img") must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: new Image() must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute popoverTargetElement]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute popoverTargetAction]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: attribute popoverTargetElement]
+ expected: FAIL
+
+ [HTMLButtonElement interface: attribute popoverTargetAction]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetElement" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetAction" with the proper type]
+ expected: FAIL
+
+ [HTMLScriptElement interface: attribute fetchPriority]
+ expected: FAIL
+
+ [HTMLScriptElement interface: document.createElement("script") must inherit property "fetchPriority" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini
new file mode 100644
index 00000000000..27c12573f11
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini
@@ -0,0 +1,3 @@
+[http-equiv-and-name-1.html]
+ [<meta> set the color-scheme to dark]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini
new file mode 100644
index 00000000000..def16bc1f29
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini
@@ -0,0 +1,3 @@
+[http-equiv-and-name-2.html]
+ [<meta> set the content-language to de-DE]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html.ini
deleted file mode 100644
index 99f2e083da9..00000000000
--- a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[http-equiv-and-name.html]
- [<meta> set the color-scheme to dark]
- expected: FAIL
-
- [<meta> set the content-language to dark]
- 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 7df8f9458e9..841bafc6eca 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,3 @@
[iframe_sandbox_popups_escaping-2.html]
- expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index f9138fb999a..6f7461b9472 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,5 +1,4 @@
[iframe_sandbox_popups_nonescaping-1.html]
type: testharness
- expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
index 3cdeb8ebcbc..47b45e65a1c 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
@@ -1,3 +1,9 @@
[non-active-document.html]
[DOMParser]
expected: FAIL
+
+ [createHTMLDocument]
+ expected: FAIL
+
+ [<template>]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html.ini
new file mode 100644
index 00000000000..d44f3ccff52
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html.ini
@@ -0,0 +1,3 @@
+[form-submit-iframe-then-location-navigate.html]
+ [Verifies that location navigations take precedence when following form submissions.]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
index cc18f512574..071b4378add 100644
--- a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
+++ b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
@@ -11,6 +11,3 @@
[Check that rel=noopener with target=_parent does a normal load]
expected: FAIL
-
- [Check that rel=noopener with target=_self does a normal load]
- expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini
deleted file mode 100644
index 2212b9d731f..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[async-script.html?reload]
- expected: ERROR
-
-[async-script.html]
diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
index 8845054116d..e55f8f2ce3c 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini
@@ -3,3 +3,6 @@
expected: TIMEOUT
[The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
expected: TIMEOUT
+
+ [The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
index 5ff7875ce72..7649a7eff8c 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini
@@ -503,3 +503,12 @@
[onpaste: the default value must be null]
expected: FAIL
+
+ [onbeforetoggle: must be on the appropriate locations for GlobalEventHandlers]
+ expected: FAIL
+
+ [onbeforetoggle: the default value must be null]
+ expected: FAIL
+
+ [onbeforetoggle: the content attribute must be compiled into a function as the corresponding property]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
index ca681bfa984..8652a34d6c2 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini
@@ -137,3 +137,12 @@
[not shadowed scrollend (window)]
expected: FAIL
+
+ [not shadowed beforetoggle (document.body)]
+ expected: FAIL
+
+ [not shadowed beforetoggle (document.createElement("body"))]
+ expected: FAIL
+
+ [not shadowed beforetoggle (window)]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
index 7ff89c04b44..c00f9f0a377 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini
@@ -133,3 +133,12 @@
[not shadowed scrollend (window)]
expected: FAIL
+
+ [not shadowed beforetoggle (document.body)]
+ expected: FAIL
+
+ [not shadowed beforetoggle (document.createElement("frameset"))]
+ expected: FAIL
+
+ [not shadowed beforetoggle (window)]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
index e1638db8b78..fe670236729 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini
@@ -79,3 +79,9 @@
[scrollend is unaffected on a windowless frameset]
expected: FAIL
+
+ [beforetoggle is unaffected on a windowless body]
+ expected: FAIL
+
+ [beforetoggle is unaffected on a windowless frameset]
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini
index dbe1def99e3..7237f5792de 100644
--- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini
+++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini
@@ -1,9 +1,10 @@
[promise-job-entry-different-function-realm.html]
+ expected: TIMEOUT
[Fulfillment handler on fulfilled promise]
expected: FAIL
[Rejection handler on pending-then-rejected promise]
- expected: FAIL
+ expected: TIMEOUT
[Thenable resolution]
expected: FAIL
@@ -12,4 +13,4 @@
expected: FAIL
[Fulfillment handler on pending-then-fulfilled promise]
- expected: FAIL
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini b/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini
index 71ca4ed5411..49b17a921b5 100644
--- a/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini
+++ b/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini
@@ -94,10 +94,10 @@
expected: FAIL
[mime-type 16 : text/html;charset=\x0bgbk]
- expected: FAIL
+ expected: TIMEOUT
[mime-type 17 : text/html;charset=\x0cgbk]
- expected: TIMEOUT
+ expected: NOTRUN
[mime-type 18 : text/html;\x0bcharset=gbk]
expected: NOTRUN
diff --git a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini
index a763160c0e0..a96df921c04 100644
--- a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini
+++ b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini
@@ -20,6 +20,12 @@
[PerformanceResourceTiming interface: resource must inherit property "renderBlockingStatus" with the proper type]
expected: FAIL
+ [PerformanceResourceTiming interface: attribute deliveryType]
+ expected: FAIL
+
+ [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type]
+ expected: FAIL
+
[idlharness.any.worker.html]
[PerformanceResourceTiming interface: resource must inherit property "workerStart" with the proper type]
@@ -42,3 +48,9 @@
[PerformanceResourceTiming interface: resource must inherit property "renderBlockingStatus" with the proper type]
expected: FAIL
+
+ [PerformanceResourceTiming interface: attribute deliveryType]
+ expected: FAIL
+
+ [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata/selection/idlharness.window.js.ini b/tests/wpt/metadata/selection/idlharness.window.js.ini
index 7890db33546..adc033c4f6d 100644
--- a/tests/wpt/metadata/selection/idlharness.window.js.ini
+++ b/tests/wpt/metadata/selection/idlharness.window.js.ini
@@ -16,3 +16,18 @@
[Selection interface: calling getComposedRange(ShadowRoot...) on getSelection() with too few arguments must throw TypeError]
expected: FAIL
+
+ [Selection interface: attribute direction]
+ expected: FAIL
+
+ [Selection interface: operation getComposedRanges(ShadowRoot...)]
+ expected: FAIL
+
+ [Selection interface: getSelection() must inherit property "direction" with the proper type]
+ expected: FAIL
+
+ [Selection interface: getSelection() must inherit property "getComposedRanges(ShadowRoot...)" with the proper type]
+ expected: FAIL
+
+ [Selection interface: calling getComposedRanges(ShadowRoot...) on getSelection() with too few arguments must throw TypeError]
+ expected: FAIL
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
index 20a8f9a4320..1f70062991c 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini
@@ -1,5 +1,4 @@
[realtimeanalyser-fft-scaling.html]
- expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini
index b7537329068..eed03df37f3 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini
@@ -1,5 +1,4 @@
[audiocontext-not-fully-active.html]
- expected: TIMEOUT
[frame in navigated remote-site frame]
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 c7946fc91b4..00000000000
--- a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[017.html]
- expected: TIMEOUT
- [origin of the script that invoked the method, about:blank]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini b/tests/wpt/metadata/webmessaging/without-ports/018.html.ini
deleted file mode 100644
index b7b36c1d3a4..00000000000
--- a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[018.html]
- expected: TIMEOUT
- [origin of the script that invoked the method, javascript:]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini b/tests/wpt/metadata/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini
new file mode 100644
index 00000000000..aa6c9e5b826
--- /dev/null
+++ b/tests/wpt/metadata/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini
@@ -0,0 +1,4 @@
+[localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html]
+ expected: TIMEOUT
+ [StorageKey: test 3P about:blank window opened from a 3P iframe]
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini
index 4bec6189b7a..b79ea99423a 100644
--- a/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini
+++ b/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini
@@ -61,3 +61,6 @@
[XRSession interface: operation deletePersistentAnchor(DOMString)]
expected: FAIL
+
+ [XRSession interface: attribute persistentAnchors]
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini
index c904025859f..f24aec48da2 100644
--- a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini
+++ b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini
@@ -385,3 +385,9 @@
[XRSession interface: xrSession must inherit property "enabledFeatures" with the proper type]
expected: FAIL
+
+ [XRSession interface: attribute isSystemKeyboardSupported]
+ expected: FAIL
+
+ [XRSession interface: xrSession must inherit property "isSystemKeyboardSupported" with the proper type]
+ expected: FAIL
diff --git a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini
new file mode 100644
index 00000000000..80f9a4f15b8
--- /dev/null
+++ b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini
@@ -0,0 +1,2 @@
+[Worker-constructor.html]
+ expected: ERROR
diff --git a/tests/wpt/mozilla/meta/mozilla/scrollBy.html.ini b/tests/wpt/mozilla/meta/mozilla/scrollBy.html.ini
new file mode 100644
index 00000000000..f78f699f620
--- /dev/null
+++ b/tests/wpt/mozilla/meta/mozilla/scrollBy.html.ini
@@ -0,0 +1,3 @@
+[scrollBy.html]
+ [Ensure that the window.scrollBy function affects scroll position as expected]
+ expected: FAIL
diff --git a/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml b/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml
index 91aecaa12f1..2e55ab28e18 100644
--- a/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml
+++ b/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml
@@ -15,7 +15,7 @@ jobs:
- name: Create pull request
# Use a conditional step instead of a conditional job to work around #20700.
if: github.repository == 'web-platform-tests/wpt'
- uses: peter-evans/create-pull-request@v4
+ uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
author: wpt-pr-bot <wpt-pr-bot@users.noreply.github.com>
diff --git a/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml b/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml
index 4e29171ff27..e1691b779ff 100644
--- a/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml
+++ b/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml
@@ -24,7 +24,7 @@ jobs:
- name: Commit and create pull request
# Use a conditional step instead of a conditional job to work around #20700.
if: github.repository == 'web-platform-tests/wpt'
- uses: peter-evans/create-pull-request@v4
+ uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
author: wpt-pr-bot <wpt-pr-bot@users.noreply.github.com>
diff --git a/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py b/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py
index 432f5c61d5e..4d4c3fd5ec7 100644
--- a/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py
+++ b/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py
@@ -13,8 +13,6 @@ Header = Tuple[str, str]
Status = Tuple[int, str]
Response = Tuple[Status, List[Header], str]
-CLEAR_STASH = isomorphic_encode("clear_stash")
-
def decode_headers(headers: dict) -> dict:
"""Decodes the headers from wptserve.
@@ -40,14 +38,8 @@ def handle_post_report(request: Request, headers: List[Header]) -> Response:
"""Handles POST request for reports.
Retrieves the report from the request body and stores the report in the
- stash. If clear_stash is specified in the query params, clears the stash.
+ stash.
"""
- if request.GET.get(CLEAR_STASH):
- clear_stash(request.server.stash)
- return (200, "OK"), headers, json.dumps({
- "code": 200,
- "message": "Stash successfully cleared.",
- })
store_report(
request.server.stash, get_request_origin(request), {
"body": request.body.decode("utf-8"),
@@ -97,12 +89,6 @@ def take_reports(stash: Stash, origin: str) -> List[str]:
return reports
-def clear_stash(stash: Stash) -> None:
- "Clears the stash."
- stash.take(REPORTS)
- return None
-
-
def handle_reports(request: Request) -> Response:
"""Handles request to get or store reports."""
headers = [("Content-Type", "application/json")]
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic_async.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.any.js
index 3a9a32dedc0..18b8985cf51 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic_async.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.any.js
@@ -1,6 +1,7 @@
// META: timeout=long
// META: script=/resources/test-only-api.js
// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
'use strict';
@@ -17,9 +18,10 @@ pressure_test((t, mockPressureService) => {
pressure_test(async (t, mockPressureService) => {
const changes = await new Promise(resolve => {
const observer = new PressureObserver(resolve);
+ t.add_cleanup(() => observer.disconnect());
observer.observe('cpu');
- mockPressureService.setPressureUpdate('critical');
- mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_true(changes.length === 1);
assert_equals(changes[0].state, 'critical');
@@ -34,8 +36,8 @@ pressure_test((t, mockPressureService) => {
const promise = observer.observe('cpu');
observer.unobserve('cpu');
- mockPressureService.setPressureUpdate('critical');
- mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
return promise_rejects_dom(t, 'NotSupportedError', promise);
}, 'Removing observer before observe() resolves works');
@@ -47,14 +49,15 @@ pressure_test(async (t, mockPressureService) => {
for (let i = 0; i < 2; i++) {
callbackPromises.push(new Promise(resolve => {
const observer = new PressureObserver(resolve);
+ t.add_cleanup(() => observer.disconnect());
observePromises.push(observer.observe('cpu'));
}));
}
await Promise.all(observePromises);
- mockPressureService.setPressureUpdate('critical');
- mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
return Promise.all(callbackPromises);
}, 'Calling observe() multiple times works');
@@ -68,10 +71,11 @@ pressure_test(async (t, mockPressureService) => {
});
t.add_cleanup(() => observer1.disconnect());
observer1.observe('cpu');
- mockPressureService.setPressureUpdate('critical');
- mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_true(observer1_changes.length === 1);
+ assert_equals(observer1_changes[0][0].source, 'cpu');
assert_equals(observer1_changes[0][0].state, 'critical');
const observer2_changes = [];
@@ -84,5 +88,6 @@ pressure_test(async (t, mockPressureService) => {
observer2.observe('cpu');
});
assert_true(observer2_changes.length === 1);
+ assert_equals(observer2_changes[0][0].source, 'cpu');
assert_equals(observer2_changes[0][0].state, 'critical');
}, 'Starting a new observer after an observer has started works');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.window.js
deleted file mode 100644
index e2d9a0f05bc..00000000000
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.window.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict';
-
-promise_test(async t => {
- await new Promise((resolve, reject) => {
- const observer = new PressureObserver(resolve, {sampleRate: 1.0});
- t.add_cleanup(() => observer.disconnect());
- observer.observe('cpu').catch(reject);
- });
-}, 'An active PressureObserver calls its callback at least once');
-
-promise_test(async t => {
- await new Promise(resolve => {
- const myDedicatedWorker = new Worker(
- '/compute-pressure/resources/observer-in-dedicated-worker.js');
- myDedicatedWorker.onmessage = event => {
- assert_equals(typeof event.data.time, 'number');
- assert_equals('cpu', event.data.source);
- resolve();
- };
- });
-}, 'Test receives updates from dedicated worker');
-
-promise_test(async t => {
- await new Promise(resolve => {
- const mySharedWorker = new SharedWorker(
- '/compute-pressure/resources/observer-in-shared-worker.js');
- mySharedWorker.port.start();
- mySharedWorker.port.postMessage('observe');
- mySharedWorker.port.onmessage = event => {
- assert_equals(typeof event.data.time, 'number');
- assert_equals('cpu', event.data.source);
- resolve();
- };
- });
-}, 'Test receives updates from shared worker');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js
index f88c9fdf64e..950334d6fc5 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js
@@ -1,9 +1,11 @@
// META: timeout=long
// META: script=/common/get-host-info.sub.js
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
'use strict';
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const iframe = document.createElement('iframe');
iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN +
'/compute-pressure/resources/support-iframe.html';
@@ -20,11 +22,13 @@ promise_test(async t => {
iframe.remove();
});
await observer.observe('cpu');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
- return new Promise(resolve => t.step_timeout(resolve, 2000));
+ return new Promise(resolve => t.step_timeout(resolve, 1000));
}, 'Observer in main frame should not receive PressureRecord when focused on cross-origin iframe');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const iframe = document.createElement('iframe');
iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN +
'/compute-pressure/resources/support-iframe.html';
@@ -49,5 +53,7 @@ promise_test(async t => {
}
}, {once: true});
iframe.contentWindow.postMessage({command: 'start'}, '*');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
}, 'Observer in iframe should not receive PressureRecord when focused on cross-origin main frame');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html
index 3b0a5504e53..5511a147048 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html
@@ -3,6 +3,8 @@
<title>PressureObserver on DOMWindow of detached iframe</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/test-only-api.js"></script>
+<script src="resources/pressure-helpers.js"></script>
<body>
<script>
'use strict';
@@ -21,9 +23,7 @@ promise_test(async t => {
document.body.appendChild(iframe);
const frame_window = iframe.contentWindow;
- const observer = new frame_window.PressureObserver(
- () => {},
- {sampleRate: 1});
+ const observer = new frame_window.PressureObserver(() => {});
const iframe_DOMException = frame_window.DOMException;
iframe.remove();
@@ -38,9 +38,7 @@ promise_test(async t => {
document.body.appendChild(iframe);
const frame_window = iframe.contentWindow;
- const observer = new frame_window.PressureObserver(
- () => {},
- {sampleRate: 1});
+ const observer = new frame_window.PressureObserver(() => {});
await observer.observe('cpu');
@@ -50,43 +48,43 @@ promise_test(async t => {
observer.disconnect();
}, 'PressureObserver.disconnect() on detached frame returns');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const frame_window = iframe.contentWindow;
- const observer = new frame_window.PressureObserver(
- () => {},
- {sampleRate: 1});
+ const observer = new frame_window.PressureObserver(() => {});
const iframe_DOMException = frame_window.DOMException;
// await is intentionally not used here. We want to remove the iframe while
// the returned Promise settles.
- const observe_promise = observer.observe('cpu');
+ observer.observe('cpu');
iframe.remove();
// Establish an observer and wait for changes in the main frame. This should
// keep the test running long enough to catch any crash from the observe()
// call in the removed iframe's PressureObserver.
const changes = await new Promise((resolve, reject) => {
- const observer = new PressureObserver(
- resolve, {sampleRate: 1});
+ const observer = new PressureObserver(resolve);
t.add_cleanup(() => observer.disconnect());
observer.observe('cpu').catch(reject);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
- assert_in_array(changes[0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
+ assert_equals(changes[0].state, 'critical');
}, 'Detaching frame while PressureObserver.observe() settles');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const frame_window = iframe.contentWindow;
const observer = new frame_window.PressureObserver(() => {
assert_unreached('The observer callback should not be called');
- }, {sampleRate: 1});
+ });
await observer.observe('cpu');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
iframe.remove();
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.any.js
index c9950f2dc84..1d188fad8b8 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.any.js
@@ -1,3 +1,7 @@
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
+
'use strict';
test(t => {
@@ -8,11 +12,11 @@ test(t => {
observer.disconnect();
}, 'Call disconnect() directly should not crash');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const observer1_changes = [];
const observer1 = new PressureObserver(change => {
observer1_changes.push(change);
- }, {sampleRate: 1.0});
+ });
t.add_cleanup(() => observer1.disconnect());
// Ensure that observer1's schema gets registered before observer2 starts.
await observer1.observe('cpu');
@@ -23,9 +27,11 @@ promise_test(async t => {
const observer2 = new PressureObserver(change => {
observer2_changes.push(change);
resolve();
- }, {sampleRate: 1.0});
+ });
t.add_cleanup(() => observer2.disconnect());
observer2.observe('cpu').catch(reject);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_equals(
@@ -34,7 +40,5 @@ promise_test(async t => {
assert_equals(observer2_changes.length, 1);
assert_equals(observer2_changes[0].length, 1);
- assert_in_array(
- observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
+ assert_equals(observer2_changes[0][0].state, 'critical');
}, 'Stopped PressureObserver do not receive changes');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.js
index 72021fd2708..2f6421ee117 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.js
@@ -1,10 +1,14 @@
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
+
'use strict';
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const observer1_changes = [];
const observer1 = new PressureObserver(changes => {
observer1_changes.push(changes);
- }, {sampleRate: 1});
+ });
t.add_cleanup(() => observer1.disconnect());
// Ensure that observer1's schema gets registered before observer2 starts.
const promise = observer1.observe('cpu');
@@ -17,9 +21,11 @@ promise_test(async t => {
const observer2 = new PressureObserver(changes => {
observer2_changes.push(changes);
resolve();
- }, {sampleRate: 1});
+ });
t.add_cleanup(() => observer2.disconnect());
observer2.observe('cpu').catch(reject);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_equals(
@@ -27,7 +33,5 @@ promise_test(async t => {
'stopped observers should not receive callbacks');
assert_equals(observer2_changes.length, 1);
- assert_in_array(
- observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
+ assert_equals(observer2_changes[0][0].state, 'critical');
}, 'Stopped PressureObserver do not receive changes');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.js
index 1abe84d5720..b96ebd802e6 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.js
@@ -1,10 +1,14 @@
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
+
'use strict';
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const observer1_changes = [];
const observer1 = new PressureObserver(changes => {
observer1_changes.push(changes);
- }, {sampleRate: 1.0});
+ });
t.add_cleanup(() => observer1.disconnect());
// Ensure that observer1's schema gets registered before observer2 starts.
const promise = observer1.observe('cpu');
@@ -16,9 +20,11 @@ promise_test(async t => {
const observer2 = new PressureObserver(changes => {
observer2_changes.push(changes);
resolve();
- }, {sampleRate: 1.0});
+ });
t.add_cleanup(() => observer2.disconnect());
observer2.observe('cpu').catch(reject);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_equals(
@@ -27,16 +33,14 @@ promise_test(async t => {
assert_equals(observer2_changes.length, 1);
assert_equals(observer2_changes[0].length, 1);
- assert_in_array(
- observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
+ assert_equals(observer2_changes[0][0].state, 'critical');
}, 'Stopped PressureObserver do not receive changes');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const observer1_changes = [];
const observer1 = new PressureObserver(changes => {
observer1_changes.push(changes);
- }, {sampleRate: 1});
+ });
t.add_cleanup(() => observer1.disconnect());
const observer2_changes = [];
@@ -44,12 +48,14 @@ promise_test(async t => {
const observer2 = new PressureObserver(changes => {
observer2_changes.push(changes);
resolve();
- }, {sampleRate: 1});
+ });
t.add_cleanup(() => observer2.disconnect());
const promise = observer1.observe('cpu');
observer2.observe('cpu');
observer1.disconnect();
await promise_rejects_dom(t, 'NotSupportedError', promise);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_equals(
@@ -57,7 +63,5 @@ promise_test(async t => {
'stopped observers should not receive callbacks');
assert_equals(observer2_changes.length, 1);
- assert_in_array(
- observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
+ assert_equals(observer2_changes[0][0].state, 'critical');
}, 'Removing observer before observe() resolves does not affect other observers');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.js
index 3c312ca5b1f..b5d7690d182 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.js
@@ -1,5 +1,6 @@
// META: script=/resources/test-only-api.js
// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
'use strict';
@@ -14,13 +15,13 @@ pressure_test(async (t, mockPressureService) => {
}, {sampleRate: 5.0});
observer.observe('cpu');
const updatesDelivered = mockPressureService.updatesDelivered();
- mockPressureService.setPressureUpdate('critical');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
mockPressureService.startPlatformCollector(/*sampleRate*/ 5.0);
// Deliver 2 updates.
await t.step_wait(
() => mockPressureService.updatesDelivered() >= (updatesDelivered + 2),
'Wait for more than one update to be delivered to the observer');
- mockPressureService.setPressureUpdate('nominal');
+ mockPressureService.setPressureUpdate('cpu', 'nominal');
// Deliver more updates, |resolve()| will be called when the new pressure
// state reaches PressureObserver and its callback is invoked
// for the second time.
@@ -41,14 +42,14 @@ pressure_test(async (t, mockPressureService) => {
}, {sampleRate: 5.0});
observer.observe('cpu');
const updatesDelivered = mockPressureService.updatesDelivered();
- mockPressureService.setPressureUpdate('critical', ['thermal']);
+ mockPressureService.setPressureUpdate('cpu', 'critical', ['thermal']);
mockPressureService.startPlatformCollector(/*sampleRate*/ 5.0);
// Deliver 2 updates.
await t.step_wait(
() => mockPressureService.updatesDelivered() >= (updatesDelivered + 2),
'Wait for more than one update to be delivered to the observer');
- mockPressureService.setPressureUpdate('critical', ['power-supply']);
+ mockPressureService.setPressureUpdate('cpu', 'critical', ['power-supply']);
// Deliver more updates, |resolve()| will be called when the new pressure
// state reaches PressureObserver and its callback is invoked
// for the second time.
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.any.js
index 6d8d2208887..7486a70f911 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.any.js
@@ -1,14 +1,16 @@
// META: script=/resources/test-only-api.js
// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
'use strict';
pressure_test(async (t, mockPressureService) => {
const changes = await new Promise(resolve => {
- const observer = new PressureObserver(resolve, {sampleRate: 1.0});
+ const observer = new PressureObserver(resolve);
+ t.add_cleanup(() => observer.disconnect());
observer.observe('cpu');
- mockPressureService.setPressureUpdate('critical', ['thermal']);
- mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0);
+ mockPressureService.setPressureUpdate('cpu', 'critical', ['thermal']);
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_true(changes.length === 1);
assert_equals(changes[0].state, 'critical');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.any.js
index 6015ae1f81b..c8cef5beca0 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.any.js
@@ -1,30 +1,35 @@
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
+
'use strict';
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const changes1_promise = new Promise((resolve, reject) => {
- const observer = new PressureObserver(resolve, {sampleRate: 1.0});
+ const observer = new PressureObserver(resolve);
t.add_cleanup(() => observer.disconnect());
observer.observe('cpu').catch(reject);
});
const changes2_promise = new Promise((resolve, reject) => {
- const observer = new PressureObserver(resolve, {sampleRate: 1.0});
+ const observer = new PressureObserver(resolve);
t.add_cleanup(() => observer.disconnect());
observer.observe('cpu').catch(reject);
});
const changes3_promise = new Promise((resolve, reject) => {
- const observer = new PressureObserver(resolve, {sampleRate: 1.0});
+ const observer = new PressureObserver(resolve);
t.add_cleanup(() => observer.disconnect());
observer.observe('cpu').catch(reject);
});
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
+
const [changes1, changes2, changes3] =
await Promise.all([changes1_promise, changes2_promise, changes3_promise]);
for (const changes of [changes1, changes2, changes3]) {
- assert_in_array(
- changes[0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
+ assert_equals(changes[0].state, 'critical');
}
}, 'Three PressureObserver instances receive changes');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.js
deleted file mode 100644
index 838b9a17a00..00000000000
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict';
-
-promise_test(async t => {
- const changes1_promise = new Promise((resolve, reject) => {
- const observer = new PressureObserver(resolve, {sampleRate: 1.0});
- t.add_cleanup(() => observer.disconnect());
- observer.observe('cpu').catch(reject);
- });
-
- // iframe numbers are aligned with observer numbers. The first observer is
- // in the main frame, so there is no iframe1.
- const iframe2 = document.createElement('iframe');
- document.body.appendChild(iframe2);
-
- const changes2_promise = new Promise((resolve, reject) => {
- const observer =
- new iframe2.contentWindow.PressureObserver(resolve, {sampleRate: 1.0});
- t.add_cleanup(() => observer.disconnect());
- observer.observe('cpu').catch(reject);
- });
-
- const iframe3 = document.createElement('iframe');
- document.body.appendChild(iframe3);
-
- const changes3_promise = new Promise((resolve, reject) => {
- const observer =
- new iframe3.contentWindow.PressureObserver(resolve, {sampleRate: 1.0});
- t.add_cleanup(() => observer.disconnect());
- observer.observe('cpu').catch(reject);
- });
-
- const [changes1, changes2, changes3] =
- await Promise.all([changes1_promise, changes2_promise, changes3_promise]);
-
- for (const changes of [changes1, changes2, changes3]) {
- assert_in_array(
- changes[0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
- }
-}, 'Three PressureObserver instances, in different iframes, receive changes');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.js
new file mode 100644
index 00000000000..5dc3804b2f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.js
@@ -0,0 +1,19 @@
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
+
+'use strict';
+
+pressure_test(async (t, mockPressureService) => {
+ const update = await new Promise((resolve, reject) => {
+ const observer = new PressureObserver(resolve);
+ t.add_cleanup(() => observer.disconnect());
+ observer.observe('cpu').catch(reject);
+ observer.observe('cpu').catch(reject);
+ observer.observe('cpu').catch(reject);
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
+ });
+
+ assert_equals(update[0].state, 'critical');
+}, 'PressureObserver.observe() is idempotent');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.js
deleted file mode 100644
index e60115fee87..00000000000
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-
-promise_test(async t => {
- const update = await new Promise((resolve, reject) => {
- const observer = new PressureObserver(resolve, {sampleRate: 1.0});
- t.add_cleanup(() => observer.disconnect());
- observer.observe('cpu').catch(reject);
- observer.observe('cpu').catch(reject);
- observer.observe('cpu').catch(reject);
- });
-
- assert_equals(typeof update[0].state, 'string');
- assert_in_array(
- update[0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu pressure state');
-}, 'PressureObserver.observe() is idempotent');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.js
index c32649da5c3..8eafeb356d8 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.js
@@ -1,15 +1,17 @@
+// META: global=window,dedicatedworker,sharedworker
+
'use strict';
promise_test(async t => {
- const observer = new PressureObserver(
- t.unreached_func('oops should not end up here'), {sampleRate: 1.0});
+ const observer =
+ new PressureObserver(t.unreached_func('oops should not end up here'));
t.add_cleanup(() => observer.disconnect());
await promise_rejects_js(t, TypeError, observer.observe('random'));
}, 'PressureObserver.observe() requires a valid source');
test(t => {
- const observer = new PressureObserver(
- t.unreached_func('oops should not end up here'), {sampleRate: 1.0});
+ const observer =
+ new PressureObserver(t.unreached_func('oops should not end up here'));
t.add_cleanup(() => observer.disconnect());
assert_throws_js(TypeError, () => {
observer.unobserve('random');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.any.js
index d142ecc0881..69999819d96 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.any.js
@@ -1,3 +1,5 @@
+// META: global=window,dedicatedworker,sharedworker
+
'use strict';
test(t => {
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js
index d33f6ef09ad..113f4bdf79b 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js
@@ -5,10 +5,12 @@
// META: script=/picture-in-picture/resources/picture-in-picture-helpers.js
// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
'use strict';
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const video = await loadVideo();
document.body.appendChild(video);
const pipWindow = await requestPictureInPictureWithTrustedClick(video);
@@ -38,10 +40,12 @@ promise_test(async t => {
video.remove();
});
observer.observe('cpu');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
}, 'Observer should receive PressureRecord if associated document is the initiator of active Picture-in-Picture session');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
await setMediaPermission();
const stream =
await navigator.mediaDevices.getUserMedia({video: true, audio: true});
@@ -67,5 +71,7 @@ promise_test(async t => {
stream.getTracks().forEach(track => track.stop());
});
observer.observe('cpu');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
}, 'Observer should receive PressureRecord if browsing context is capturing');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js
index 746f119f249..7df0be5c47d 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js
@@ -1,21 +1,27 @@
+// META: timeout=long
+// META: script=/resources/test-only-api.js
+// META: script=resources/pressure-helpers.js
+
'use strict';
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.contentWindow.focus();
await new Promise(resolve => {
const observer = new PressureObserver(resolve);
- t.add_cleanup(async () => {
+ t.add_cleanup(() => {
observer.disconnect();
iframe.remove();
});
observer.observe('cpu');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
}, 'Observer in main frame should receive PressureRecord when focused on same-origin iframe');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
// Focus on the main frame to make the iframe lose focus, so that
@@ -31,5 +37,7 @@ promise_test(async t => {
iframe.remove();
});
observer.observe('cpu');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
}, 'Observer in iframe should receive PressureRecord when focused on same-origin main frame');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.any.js
index 2a69e731e7f..63f2666cca6 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.any.js
@@ -1,3 +1,5 @@
+// META: global=window,dedicatedworker,sharedworker
+
'use strict';
test(() => {
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.any.js
index d294a7e80fd..d93c9b5c886 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.any.js
@@ -1,28 +1,28 @@
// META: script=/resources/test-only-api.js
// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
'use strict';
test(t => {
const observer = new PressureObserver(
- t.unreached_func('This callback should not have been called.'),
- {sampleRate: 1.0});
+ t.unreached_func('This callback should not have been called.'));
const records = observer.takeRecords();
assert_equals(records.length, 0, 'No record before observe');
}, 'Calling takeRecords() before observe()');
-promise_test(async t => {
+pressure_test(async (t, mockPressureService) => {
let observer;
const changes = await new Promise(resolve => {
- observer = new PressureObserver(resolve, {sampleRate: 1.0});
+ observer = new PressureObserver(resolve);
t.add_cleanup(() => observer.disconnect());
observer.observe('cpu');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
- assert_in_array(
- changes[0].state, ['nominal', 'fair', 'serious', 'critical'],
- 'cpu presure state');
+ assert_equals(changes[0].state, 'critical');
const records = observer.takeRecords();
assert_equals(records.length, 0, 'No record available');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.any.js
index b9b932e64fc..f283caa6bae 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.any.js
@@ -1,5 +1,6 @@
// META: script=/resources/test-only-api.js
// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
'use strict';
@@ -21,7 +22,8 @@ pressure_test(async (t, mockPressureService) => {
// cause the actual timer used by mockPressureService to deliver readings
// to be a bit slower or faster than requested.
while (observerChanges.length < 4) {
- mockPressureService.setPressureUpdate(readings[i++ % readings.length]);
+ mockPressureService.setPressureUpdate(
+ 'cpu', readings[i++ % readings.length]);
await t.step_wait(
() => mockPressureService.updatesDelivered() >= i,
`At least ${i} readings have been delivered`);
@@ -51,7 +53,7 @@ pressure_test(async (t, mockPressureService) => {
await new Promise(async resolve => {
observer.observe('cpu');
- mockPressureService.setPressureUpdate('critical');
+ mockPressureService.setPressureUpdate('cpu', 'critical');
mockPressureService.startPlatformCollector(sampleRate);
await t.step_wait(() => pressureChanges.length == 1);
observer.disconnect();
@@ -60,7 +62,7 @@ pressure_test(async (t, mockPressureService) => {
await new Promise(async resolve => {
observer.observe('cpu');
- mockPressureService.setPressureUpdate('serious');
+ mockPressureService.setPressureUpdate('cpu', 'serious');
mockPressureService.startPlatformCollector(sampleRate * 4);
await t.step_wait(() => pressureChanges.length == 2);
observer.disconnect();
diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.any.js
index 7f3acf3e07f..c1cd240a3bc 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.any.js
@@ -1,12 +1,13 @@
// META: script=/resources/test-only-api.js
// META: script=resources/pressure-helpers.js
+// META: global=window,dedicatedworker,sharedworker
pressure_test(async (t, mockPressureService) => {
const changes = await new Promise(resolve => {
const observer = new PressureObserver(resolve);
observer.observe('cpu');
- mockPressureService.setPressureUpdate('critical', ['thermal']);
- mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0);
+ mockPressureService.setPressureUpdate('cpu', 'critical', ['thermal']);
+ mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0);
});
assert_true(changes.length === 1);
const json = changes[0].toJSON();
@@ -15,4 +16,3 @@ pressure_test(async (t, mockPressureService) => {
assert_equals(json.factors[0], 'thermal');
assert_equals(typeof json.time, 'number');
}, 'Basic functionality test');
-
diff --git a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-dedicated-worker.js b/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-dedicated-worker.js
deleted file mode 100644
index a30edd0a33e..00000000000
--- a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-dedicated-worker.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-
-function pressureCallback(update) {
- postMessage(update[0].toJSON());
-};
-
-const observerWorker =
- new PressureObserver(pressureCallback, {sampleRate: 0.5});
-
-observerWorker.observe('cpu');
diff --git a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-shared-worker.js b/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-shared-worker.js
deleted file mode 100644
index f69eadaacee..00000000000
--- a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-shared-worker.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-
-onconnect = function(e) {
- const port = e.ports[0]; // get the port
- let started = false;
-
- port.start(); // Open the port connection to enable two-way communication
-
- let observerWorker =
- new PressureObserver(pressureCallback, {sampleRate: 0.5});
-
- port.onmessage = function(e) {
- if (started === false)
- observerWorker.observe('cpu');
- started = true;
- };
-
- function pressureCallback(update) {
- port.postMessage(update[0].toJSON());
- };
-}
diff --git a/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html b/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html
index 57e18b77f62..6b2b3097926 100644
--- a/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html
+++ b/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html
@@ -11,7 +11,7 @@ async function messageHandler(e) {
resolve('success');
});
observer.observe('cpu');
- window.setTimeout(() => { reject('timeout'); }, 2000);
+ window.setTimeout(() => { reject('timeout'); }, 1000);
});
} else {
return Promise.reject(`unknown command "${e.data.command}"`);
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-non-oof-inherit.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-non-oof-inherit.html
new file mode 100644
index 00000000000..75f98a1ebfe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-non-oof-inherit.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<title>Tests that anchor functions can be inherited from in-flow elements</title>
+<link rel="help" href="https://drafts4.csswg.org/css-anchor-position-1/">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1382151">
+<link rel="author" href="mailto:xiaochengh@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<script src="support/test-common.js"></script>
+
+<style>
+.cb {
+ width: 200px;
+ height: 200px;
+ transform: scale(1);
+}
+
+.anchor {
+ width: 100px;
+ height: 100px;
+ top: 50px;
+ left: 50px;
+ position: relative;
+ background: red;
+ anchor-name: --a;
+}
+
+.target {
+ position: absolute;
+ background: green;
+ top: inherit;
+ bottom: inherit;
+ left: inherit;
+ right: inherit;
+ width: inherit;
+ min-width: inherit;
+ max-width: inherit;
+ height: inherit;
+ min-height: inherit;
+ max-height: inherit;
+}
+
+.inset-parent {
+ top: anchor(--a top);
+ bottom: anchor(--a bottom);
+ left: anchor(--a left);
+ right: anchor(--a right);
+}
+
+.size-parent {
+ width: anchor-size(--a width);
+ height: anchor-size(--a height);
+ top: 50px;
+ left: 50px;
+}
+
+.min-size-parent {
+ min-width: anchor-size(--a width);
+ min-height: anchor-size(--a height);
+ top: 50px;
+ left: 50px;
+ bottom: 200px;
+ right: 200px;
+}
+
+.max-size-parent {
+ max-width: anchor-size(--a width);
+ max-height: anchor-size(--a height);
+ top: 50px;
+ left: 50px;
+ bottom: 0px;
+ right: 0px;
+}
+
+</style>
+
+<body onload="checkLayoutForAnchorPos('.target')">
+
+<p>In each test case, we should see a filled green square with no red.</p>
+
+<div class=cb>
+ <div class="anchor"></div>
+ <div class="inset-parent">
+ <div class="target"
+ data-offset-x=50 data-offset-y=50
+ data-expected-width=100 data-expected-height=100></div>
+ </div>
+</div>
+
+<div class=cb>
+ <div class="anchor"></div>
+ <div class="size-parent">
+ <div class="target"
+ data-offset-x=50 data-offset-y=50
+ data-expected-width=100 data-expected-height=100></div>
+ </div>
+</div>
+
+<div class=cb>
+ <div class="anchor"></div>
+ <div class="min-size-parent">
+ <div class="target"
+ data-offset-x=50 data-offset-y=50
+ data-expected-width=100 data-expected-height=100></div>
+ </div>
+</div>
+
+<div class=cb>
+ <div class="anchor"></div>
+ <div class="max-size-parent">
+ <div class="target"
+ data-offset-x=50 data-offset-y=50
+ data-expected-width=100 data-expected-height=100></div>
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html
new file mode 100644
index 00000000000..6b5f268f554
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Tests anchor-scroll element paint order in composited scrolling</title>
+<link rel="help" href="https://drafts4.csswg.org/css-anchor-position-1/#scroll">
+<link rel="author" href="mailto:xiaochengh@chromium.org">
+<link rel="match" href="reference/anchor-scroll-composited-scrolling-006-ref.html">
+<style>
+body {
+ margin: 0;
+}
+#scroller {
+ width: 200px;
+ height: 100px;
+ overflow: scroll;
+ will-change: scroll-position;
+}
+#spacer {
+ height: 400px;
+}
+#anchor {
+ width: 100px;
+ height: 100px;
+ anchor-name: --a;
+}
+#target {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: red;
+ left: 0;
+ bottom: anchor(--a top);
+ anchor-scroll: --a;
+}
+#overlap {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ top: 150px;
+ left: 0;
+ z-index: 100;
+ background: green;
+}
+</style>
+
+<div id="overlap"></div>
+<div id="scroller">
+ <div id="spacer"></div>
+ <div id="anchor"></div>
+</div>
+<div id="target"></div>
+
+<script type="module">
+function raf() { return new Promise(resolve => requestAnimationFrame(resolve)); }
+
+await raf();
+await raf();
+scroller.scrollTop = 150;
+
+document.documentElement.classList.remove('reftest-wait');
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html b/tests/wpt/web-platform-tests/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html
new file mode 100644
index 00000000000..92fe187117e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<style>
+body {
+ margin: 0;
+}
+#scroller {
+ width: 200px;
+ height: 100px;
+ overflow: scroll;
+ will-change: scroll-position;
+}
+#spacer {
+ height: 400px;
+}
+#anchor {
+ width: 100px;
+ height: 100px;
+ anchor-name: --a;
+}
+#overlap {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ top: 150px;
+ left: 0;
+ z-index: 100;
+ background: green;
+}
+</style>
+
+<div id="overlap"></div>
+<div id="scroller">
+ <div id="spacer"></div>
+ <div id="anchor"></div>
+</div>
+
+<script>
+scroller.scrollTop = 150;
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-animations/display-none-dont-cancel.tentative.html b/tests/wpt/web-platform-tests/css/css-animations/display-none-dont-cancel.tentative.html
new file mode 100644
index 00000000000..6ae115803b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-animations/display-none-dont-cancel.tentative.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://drafts.csswg.org/css-display-4/#display-animation">
+<link rel=help href="https://github.com/w3c/csswg-drafts/issues/6429">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/css-animations/support/testcommon.js"></script>
+
+<div id=target1>hello</div>
+<style>
+@keyframes display1 {
+ 0% { display: none; }
+ 100% { display: inline; }
+}
+.animate1 {
+ animation: display1 1s infinite;
+}
+</style>
+<script>
+promise_test(async () => {
+ let numAnimationstartFired = 0;
+ target1.addEventListener('animationstart', () => numAnimationstartFired++);
+
+ await waitForAnimationFrames(1);
+ target1.classList.add('animate1');
+ await waitForAnimationFrames(2);
+
+ assert_equals(getComputedStyle(target1).display, 'inline',
+ 'The display should be inline during the animation.');
+ assert_equals(numAnimationstartFired, 1,
+ 'Only one animation should start.');
+}, 'display:none animating to display:inline should be inline for the whole animation.');
+</script>
+
+<div id=target2>hello</div>
+<style>
+@keyframes display2 {
+ 0% { display: var(--none-value); }
+ 100% { display: inline; }
+}
+.animate2 {
+ animation: display2 1s infinite;
+}
+#target2 {
+ --none-value: none;
+}
+</style>
+<script>
+promise_test(async () => {
+ let numAnimationstartFired = 0;
+ target2.addEventListener('animationstart', () => numAnimationstartFired++);
+
+ await waitForAnimationFrames(1);
+ target2.classList.add('animate2');
+ await waitForAnimationFrames(2);
+
+ assert_equals(getComputedStyle(target2).display, 'inline',
+ 'The display should be inline during the animation.');
+ assert_equals(numAnimationstartFired, 1,
+ 'Only one animation should start.');
+}, 'A CSS variable of display:none animating to display:inline should be inline for the whole animation.');
+</script>
+
+<div id=target3>hello</div>
+<style>
+@keyframes display3 {
+ 0% { display: none; }
+ 100% { display: none; }
+}
+.animate3 {
+ animation: display3 1s infinite;
+}
+</style>
+<script>
+promise_test(async () => {
+ let numAnimationstartFired = 0;
+ target3.addEventListener('animationstart', () => numAnimationstartFired++);
+
+ await waitForAnimationFrames(1);
+ target3.classList.add('animate3');
+ await waitForAnimationFrames(2);
+
+ assert_equals(getComputedStyle(target3).display, 'none',
+ 'The display should be none and the animation should keep running.');
+ assert_equals(numAnimationstartFired, 1,
+ 'Only one animation should start.');
+}, 'Animating from display:none to display:none should not cancel the animation.');
+</script>
+
+<div id=target4>hello</div>
+<style>
+@keyframes display4 {
+ 0% { display: var(--none-value); }
+ 100% { display: var(--none-value); }
+}
+.animate4 {
+ animation: display4 1s infinite;
+}
+#target4 {
+ --none-value: none;
+}
+</style>
+<script>
+promise_test(async () => {
+ let numAnimationstartFired = 0;
+ target4.addEventListener('animationstart', () => numAnimationstartFired++);
+
+ await waitForAnimationFrames(1);
+ target4.classList.add('animate4');
+ await waitForAnimationFrames(2);
+
+ assert_equals(getComputedStyle(target4).display, 'none',
+ 'The display should be none and the animation should keep running.');
+ assert_equals(numAnimationstartFired, 1,
+ 'Only one animation should start.');
+}, 'Animating from display:none to display:none with an intermediate variable should not cancel the animation.');
+</script>
+
+<div id=target5>hello</div>
+<style>
+@keyframes display5 {
+ 0% { --display: none; }
+ 100% { --display: none; }
+}
+.animate5 {
+ animation: display5 1s infinite;
+}
+#target5 {
+ display: var(--display, block);
+}
+</style>
+<script>
+promise_test(async () => {
+ let numAnimationstartFired = 0;
+ target5.addEventListener('animationstart', () => numAnimationstartFired++);
+
+ await waitForAnimationFrames(1);
+ target5.classList.add('animate5');
+ await waitForAnimationFrames(2);
+
+ assert_equals(getComputedStyle(target5).display, 'none',
+ 'The display should be none and the animation should keep running.');
+ assert_equals(numAnimationstartFired, 1,
+ 'Only one animation should start.');
+}, 'Animating a variable of "none" which gets set to display elsewhere should not cancel the animation.');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html
new file mode 100644
index 00000000000..1767c84a5f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<style>
+body {
+ /* suppress scrollbars */
+ overflow: hidden;
+}
+#target {
+ background-attachment: fixed;
+ background-image: linear-gradient(green 50%, yellow 50%);
+ font-size: 130px;
+ line-height: 100px;
+}
+</style>
+<span id="target">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+</span>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html
new file mode 100644
index 00000000000..746997d6057
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#background-attachment">
+<link rel="match" href="background-attachment-fixed-inline-scrolled-ref.html">
+<meta name="assert" content="Background with background-attachment-fixed on an inline element should be fixed to the viewport">
+<style>
+body {
+ /* suppress scrollbars */
+ overflow: hidden;
+}
+#target {
+ background-attachment: fixed;
+ background-image: linear-gradient(green 50%, yellow 50%);
+ font-size: 130px;
+ line-height: 100px;
+}
+</style>
+<span id="target">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+</span>
+<script>
+requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ scrollTo(0, 300);
+ document.documentElement.classList.remove("reftest-wait");
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-014.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-014.html
new file mode 100644
index 00000000000..4edf112e432
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-014.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946">
+<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; gap:0; width:100px; height:100px; column-fill:auto; background:red;">
+ <div style="position:relative; overflow-y:clip; height:200px;">
+ <div style="position:absolute; width:100%; height:300px;">
+ <div style="height:200px; background:green;"></div>
+ <div style="height:200px; background:red;"></div>
+ </div>
+ <div style="height:1000px; background:red;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-015.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-015.html
new file mode 100644
index 00000000000..1eb114458c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-015.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946">
+<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; gap:0; width:100px; height:100px; column-fill:auto; background:red;">
+ <div style="position:relative; overflow-y:clip; height:200px;">
+ <div style="height:150px;"></div>
+ <div style="position:absolute; top:0; width:100%; height:300px;">
+ <div style="height:200px; background:green;"></div>
+ <div style="height:200px; background:red;"></div>
+ </div>
+ <div style="height:1000px; background:red;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-016.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-016.html
new file mode 100644
index 00000000000..4314c0135e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-016.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946">
+<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; gap:0; width:100px; height:100px; column-fill:auto; background:red;">
+ <div style="position:relative; overflow-y:clip; height:200px;">
+ <div style="height:150px;"></div>
+ <div style="position:absolute; top:-100px; width:100%; height:300px;">
+ <div style="height:100px; background:red;"></div>
+ <div style="height:200px; background:green;"></div>
+ <div style="height:200px; background:red;"></div>
+ </div>
+ <div style="height:1000px; background:red;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-017.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-017.html
new file mode 100644
index 00000000000..1ab3cdd194f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-017.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946">
+<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; gap:0; column-fill:auto; width:100px; height:100px; background:red;">
+ <div style="height:70px; background:green;"></div>
+ <div style="float:left; break-inside:avoid; width:100%; height:40px; background:green;"></div>
+ <div style="position:relative; display:flow-root; overflow-y:clip; width:100%; height:90px; background:red;">
+ <div style="height:30px; background:green;"></div>
+ <div style="height:10px;"></div>
+ <div style="position:absolute; margin-top:-30px; width:100%;">
+ <div style="height:20px; background:red;"></div>
+ <div style="height:60px; background:green;"></div>
+ <div style="height:20px; background:red;"></div>
+ </div>
+ <div style="height:1000px;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html b/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html
index 9bdbbcb5a32..a841f265457 100644
--- a/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html
+++ b/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html
@@ -16,8 +16,10 @@
@import "support/test-red.css"
(max-width: 1px), nonsense;
div {
+ box-sizing: border-box;
width: 100px;
height: 100px;
+ padding: 5px; /* Avoids text antialiasing issues */
background: red;
}
</style>
diff --git a/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html b/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html
index 0bb09754702..e5e1c685a9e 100644
--- a/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html
+++ b/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html
@@ -14,6 +14,34 @@
matches: true
},
{
+ importCondition: "supports((display:flex))",
+ matches: true
+ },
+ {
+ importCondition: "supports((display:block) and (display:flex))",
+ matches: true
+ },
+ {
+ importCondition: "supports((display:block) and (foo:bar))",
+ matches: false
+ },
+ {
+ importCondition: "supports((display:block) or (display:flex))",
+ matches: true
+ },
+ {
+ importCondition: "supports((display:block) or (foo:bar))",
+ matches: true
+ },
+ {
+ importCondition: "supports(not (display: flex))",
+ matches: false
+ },
+ {
+ importCondition: "supports(display: block !important)",
+ matches: true
+ },
+ {
importCondition: "supports(foo:bar)",
matches: false
},
@@ -28,7 +56,49 @@
{
importCondition: "(width >= 0px) supports(display:block)",
matches: false
- }
+ },
+
+ // selector()
+ {
+ importCondition: "supports(selector(a))",
+ matches: true
+ },
+ {
+ importCondition: "supports(selector(p a))",
+ matches: true
+ },
+ {
+ importCondition: "supports(selector(p > a))",
+ matches: true
+ },
+ {
+ importCondition: "supports(selector(p + a))",
+ matches: true
+ },
+
+ // font-tech()
+ {
+ importCondition: "supports(font-tech(color-COLRv1))",
+ matches: true
+ },
+ {
+ importCondition: "supports(font-tech(invalid))",
+ matches: false
+ },
+
+ // font-format()
+ {
+ importCondition: "supports(font-format(opentype))",
+ matches: true
+ },
+ {
+ importCondition: "supports(font-format(woff))",
+ matches: true
+ },
+ {
+ importCondition: "supports(font-format(invalid))",
+ matches: false
+ },
];
let target = document.getElementById("target");
for (let testCase of testCases) {
diff --git a/tests/wpt/web-platform-tests/css/css-cascade/parsing/supports-import-parsing.html b/tests/wpt/web-platform-tests/css/css-cascade/parsing/supports-import-parsing.html
new file mode 100644
index 00000000000..58e1f7cd165
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-cascade/parsing/supports-import-parsing.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>@import rule with supports parsing / serialization</title>
+<link rel="author" href="mailto:oj@oojmed.com">
+<link rel="help" href="https://drafts.csswg.org/css-cascade-4/#at-import">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ function setupSheet(rule) {
+ const style = document.createElement("style");
+ document.head.append(style);
+ const {sheet} = style;
+ const {cssRules} = sheet;
+
+ assert_equals(cssRules.length, 0, "Sheet should have no rules");
+ sheet.insertRule(rule);
+ assert_equals(cssRules.length, 1, "Sheet should have 1 rule");
+
+ return {sheet, cssRules};
+ }
+
+ function test_valid_supports_import(rule, serialized) {
+ if (serialized === undefined)
+ serialized = rule;
+
+ test(function() {
+ const {sheet, cssRules} = setupSheet(rule);
+
+ const serialization = cssRules[0].cssText;
+ assert_equals(serialization, serialized, 'serialization should be canonical');
+
+ sheet.deleteRule(0);
+ assert_equals(cssRules.length, 0, 'Sheet should have no rule');
+ sheet.insertRule(serialization);
+ assert_equals(cssRules.length, 1, 'Sheet should have 1 rule');
+
+ assert_equals(cssRules[0].cssText, serialization, 'serialization should round-trip');
+ }, rule + ' should be a valid supports() import rule');
+ }
+
+ function test_invalid_supports_import(rule) {
+ test(function() {
+ const {sheet, cssRules} = setupSheet(rule);
+
+ sheet.deleteRule(0);
+ assert_equals(cssRules.length, 0, 'Sheet should have no rule');
+ }, rule + ' should still be a valid import rule with an invalid supports() declaration');
+ }
+
+ test_valid_supports_import('@import url("nonexist.css") supports();');
+ test_valid_supports_import('@import url("nonexist.css") supports(display:block);');
+ test_valid_supports_import('@import url("nonexist.css") supports((display:flex));');
+ test_valid_supports_import('@import url("nonexist.css") supports(not (display: flex));');
+ test_valid_supports_import('@import url("nonexist.css") supports((display: flex) and (display: block));');
+ test_valid_supports_import('@import url("nonexist.css") supports((display: flex) or (display: block));');
+ test_valid_supports_import('@import url("nonexist.css") supports((display: flex) or (foo: bar));');
+ test_valid_supports_import('@import url("nonexist.css") supports(display: block !important);');
+
+ test_valid_supports_import('@import url("nonexist.css") supports(selector(a));');
+ test_valid_supports_import('@import url("nonexist.css") supports(selector(p a));');
+ test_valid_supports_import('@import url("nonexist.css") supports(selector(p > a));');
+ test_valid_supports_import('@import url("nonexist.css") supports(selector(p + a));');
+
+ test_valid_supports_import('@import url("nonexist.css") supports(font-tech(color-colrv1));');
+ test_valid_supports_import('@import url("nonexist.css") supports(font-format(opentype));');
+
+ test_valid_supports_import('@import url(nonexist.css) supports(display:block);',
+ '@import url("nonexist.css") supports(display:block);');
+
+ test_valid_supports_import('@import "nonexist.css" supports(display:block);',
+ '@import url("nonexist.css") supports(display:block);');
+
+ test_invalid_supports_import('@import url("nonexist.css") supports;');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/abspos/dynamic-align-self-001.html b/tests/wpt/web-platform-tests/css/css-flexbox/abspos/dynamic-align-self-001.html
new file mode 100644
index 00000000000..208c006d2d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/abspos/dynamic-align-self-001.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://crbug.com/1306037">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert"
+ content="Abspos child of a flexbox moves after script changes its alignment.">
+<style>
+ #reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+ }
+
+ #parent {
+ position: relative;
+ display: flex;
+ width: 200px;
+ height: 200px;
+ }
+
+ #child {
+ display: flex;
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ align-self: end;
+ }
+
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.
+</p>
+
+<div id=reference-overlapped-red></div>
+
+<div id="parent">
+ <div id="child"></div>
+</div>
+
+<script>
+ document.body.offsetTop;
+ child.style.alignSelf = 'start';
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fieldset-as-container-justify-center.tentative.html b/tests/wpt/web-platform-tests/css/css-flexbox/fieldset-as-container-justify-center.tentative.html
new file mode 100644
index 00000000000..a1d7564e8a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/fieldset-as-container-justify-center.tentative.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://crbug.com/1229458">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/8690">
+<link rel="help" href="https://github.com/whatwg/html/issues/9123">
+<link rel="help"
+ href="https://html.spec.whatwg.org/multipage/rendering.html#anonymous-fieldset-content-box">
+<meta name="assert"
+ content="justify-content: center is ignored in a column flexbox fieldset when the anonymous fieldset content box has no height or min-height.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+
+<style>
+ fieldset {
+ display: flex;
+ flex-flow: column;
+ justify-content: center;
+ align-items: center;
+ width: 200px;
+ min-height: 200px;
+ padding: 0px;
+ border: 1px solid;
+ position: relative;
+ }
+
+ .item {
+ height: 100px;
+ width: 100px;
+ background: orange;
+ }
+
+</style>
+<p>Pass Condition: orange square is at top of black square.<br>
+ Safari 16.4 and Firefox 111 fail -- orange box is vertically centered as if
+ the anonymous fieldset content box and the fieldset were the same box.
+</p>
+
+<fieldset>
+ <div class="item" data-offset-y="0"></div>
+</fieldset>
+
+<script>
+ checkLayout('.item');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-row-017.html b/tests/wpt/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-row-017.html
new file mode 100644
index 00000000000..b2408159b5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-row-017.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1700474">
+<link rel="help" href="https://crbug.com/1337056">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
+<meta name="assert"
+ content="specified size suggestion obeys item's resolvable % main size">
+
+<style>
+ #reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+ }
+
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.
+</p>
+
+<div id="reference-overlapped-red"></div>
+
+<div style="display: flex; width: 100px;">
+ <img src="support/100x100-green.png" style="width: 100%; flex: 0 0 10px;">
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/grandchild-span-height.html b/tests/wpt/web-platform-tests/css/css-flexbox/grandchild-span-height.html
new file mode 100644
index 00000000000..c087edb68d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/grandchild-span-height.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta name="flags" content="asis" />
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1601626">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+
+<style>
+ #reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+ }
+
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.
+</p>
+
+<div id=reference-overlapped-red></div>
+
+<!-- Firefox 111 gives the green square too much height. 111px on my system. -->
+
+<div style="display: flex;">
+ <div style="background-color: green; line-height: 10px;">
+ <span style="margin-left: 1px">
+ <div style="display:inline-block; width: 99px; height: 100px"></div>
+ <!-- the html comments are necessary to trigger the bug -->
+ <!-- -->
+ </span>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/grid-flex-item-007.html b/tests/wpt/web-platform-tests/css/css-flexbox/grid-flex-item-007.html
new file mode 100644
index 00000000000..bdea17d0692
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/grid-flex-item-007.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help"
+ href="https://drafts.csswg.org/css-flexbox-1/#valdef-flex-direction-column">
+<link rel="help" href="https://webkit.org/b/226522">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert"
+ content="Column flexboxes with indefinite heights don't mess up positioning of descendant grid items.">
+
+<style>
+ #reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+ }
+
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.
+</p>
+<div id=reference-overlapped-red></div>
+
+<body style="height: 400px;">
+ <div style="display: flex; flex-direction: column;">
+ <div style="display: grid; align-items: center; height: 100%;">
+ <div style="width:100px; height: 100px; background: green;"></div>
+ </div>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/justify-content-007.html b/tests/wpt/web-platform-tests/css/css-flexbox/justify-content-007.html
new file mode 100644
index 00000000000..2ce9177a766
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/justify-content-007.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help"
+ href="https://drafts.csswg.org/css-flexbox/#justify-content-property">
+<link rel="help" href="https://crbug.com/1228023">
+<meta name="assert"
+ content="Wrapped item obeys justify-content:center when the item wraps because the container has max-height.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+
+<style>
+ .flexitem {
+ width: 100px;
+ }
+
+</style>
+
+Pass condition: orange square is vertically centered in the black box.<br>
+Chrome 112 and Safari 16.4 fail. Firefox 111 passes.
+<div
+ style="display: flex; flex-flow: column wrap; max-height: 200px; justify-content: center; align-content: start; border: 2px solid; position: relative;">
+ <div class=flexitem style="background: blue; height: 200px;"></div>
+ <div class=flexitem style="background: orange; height: 100px;"
+ data-offset-y=50></div>
+</div>
+
+<script>
+ checkLayout('.flexitem + .flexitem');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/table-as-flex-item-max-content.html b/tests/wpt/web-platform-tests/css/css-flexbox/table-as-flex-item-max-content.html
new file mode 100644
index 00000000000..c7316aab950
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/table-as-flex-item-max-content.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help"
+ href="https://drafts.csswg.org/css-flexbox/#intrinsic-cross-sizes">
+<link rel="help" href="https://webkit.org/b/253922">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert"
+ content="A table's max-content width is used for its parent flexbox's max-content calculation. Safari 16.4 uses min-content width.">
+
+<style>
+ #reference-overlapped-red {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 100px;
+ z-index: -1;
+ }
+
+ .inline-block {
+ float: left;
+ width: 50px;
+ }
+
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.
+</p>
+
+<div id=reference-overlapped-red></div>
+<div
+ style="display: flex; flex-direction: column; height: 100px; width: max-content; background-color: green;">
+ <div style="display: table">
+ <div style="display: table-cell">
+ <div class="inline-block"></div>
+ <div class="inline-block"></div>
+ </div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html
index 800f87e5d00..81c6d184021 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html
@@ -50,13 +50,13 @@ html,body {
</article>
<article class="grid" style="grid-template-columns: auto 100px auto">
- <div class="subgrid" style="grid-column:2 span 2">
+ <div class="subgrid" style="grid-column:2 / span 2">
The cat can not be separated from milk
</div>
</article>
<article class="grid" style="grid-template-columns: auto 100px auto">
- <div class="subgrid" style="grid-column:1 span 3">
+ <div class="subgrid" style="grid-column:1 / span 3">
The cat can not be separated from milk
</div>
</article>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html
index 0fdb9b0b7e2..4a946e6feb4 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html
@@ -53,13 +53,13 @@ html,body {
</article>
<article class="grid" style="grid-template-columns: auto 100px auto">
- <div class="subgrid" style="grid-column:2 span 2">
+ <div class="subgrid" style="grid-column:2 / span 2">
The cat can not be separated from milk
</div>
</article>
<article class="grid" style="grid-template-columns: auto 100px auto">
- <div class="subgrid" style="grid-column:1 span 3">
+ <div class="subgrid" style="grid-column:1 / span 3">
The cat can not be separated from milk
</div>
</article>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html
index 79b90c340d8..fe842b28238 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html
@@ -5,12 +5,13 @@
-->
<html><head>
<meta charset="utf-8">
- <title>Test: subgrid disabled if grid item establishes independent formatting context</title>
+ <title>Reference: subgrid disabled if grid item establishes independent formatting context</title>
<link rel="author" title="Matt Woodrow" href="https://bugs.webkit.org/show_bug.cgi?id=237692">
<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-listing">
<style>
+
html,body {
- color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0;
+ font:16px/1 monospace; padding:0; margin:0; line-height: 0;
}
.grid {
@@ -31,5 +32,22 @@ html,body {
<div class="grid">
</div>
+<div class="grid">
+</div>
+
+<div class="grid">
+</div>
+
+<div class="grid">
+</div>
+
+<div class="grid">
+</div>
+
+<div class="grid">
+</div>
+
+<div class="grid">
+</div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html
index 888b23c2f62..5a76ac2d6de 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html
@@ -10,8 +10,9 @@
<link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-listing">
<link rel="match" href="independent-formatting-context-ref.html">
<style>
+
html,body {
- color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0;
+ font:16px/1 monospace; padding:0; margin:0; line-height: 0;
}
.grid {
@@ -32,19 +33,20 @@ html,body {
}
.first {
- background-color: green;
grid-row: 1;
+ background-color: green;
}
.second {
- background-color: red;
grid-row: 2;
+ background-color: green;
}
</style>
</head>
<body>
-
+<!-- The subgrid's style attribute establishes an independent formatting context
+ and makes them no longer eligible as subgrids.-->
<div class="grid">
<div class="subgrid" style="position:absolute">
<div class="first"></div>
@@ -57,5 +59,43 @@ html,body {
</div>
</div>
+<div class="grid">
+ <div class="subgrid" style="contain: paint">
+ <div class="first"></div>
+ </div>
+</div>
+
+<div class="grid">
+ <div class="subgrid" style="contain: strict">
+ <div class="first"></div>
+ </div>
+</div>
+
+<div class="grid">
+ <div class="subgrid" style="contain: content">
+ <div class="first"></div>
+ </div>
+</div>
+
+<!-- Only layout and paint containment establish an independent formatting
+ context. These tests validate that other types of containment maintain
+ subgrid layout.-->
+<div class="grid">
+ <div class="subgrid" style="contain: none">
+ <div class="second"></div>
+ </div>
+</div>
+
+<div class="grid">
+ <div class="subgrid" style="contain: size">
+ <div class="second"></div>
+ </div>
+</div>
+
+<div class="grid">
+ <div class="subgrid" style="contain: style">
+ <div class="second"></div>
+ </div>
+</div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html
index e36c1295d31..ec139d4e229 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html
@@ -22,7 +22,7 @@
<body>
<p>The following images should not be identical.</p>
<p>The image should not rotate respecting their EXIF orientation because
- image-orientation: none is specified.</p>
+ image-orientation: none is specified and the request is same origin.</p>
<div><img src="support/exif-orientation-3-lr.jpg"/></div>
<p>This image should rotate respecting their EXIF orientation because
@@ -30,16 +30,25 @@
<div><img id="corsImage" src="support/exif-orientation-3-lr.jpg"/></div>
<p>The image should not rotate respecting their EXIF orientation because
- image-orientation: none is specified.</p>
+ image-orientation: none is specified and the request is CORS anonymous.</p>
+ <div><img id="corsAnonymousImg" crossorigin="anonymous" src="support/exif-orientation-3-lr.jpg"/></div>
+
+ <p>The image should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified and the request is CORS
+ use-credentials.</p>
+ <div><img id="corsUseCredsImg" crossorigin="use-credentials" src="support/exif-orientation-3-lr.jpg"/></div>
+
+ <p>The image should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified and the image source is a blob.</p>
<div><img id="blobImage"/></div>
<p>The image should not rotate respecting their EXIF orientation because
- image-orientation: none is specified.</p>
+ image-orientation: none is specified and the image source is a data url.</p>
<div><img id="dataImage"/></div>
</body>
<script>
const testImage = 'support/exif-orientation-3-lr.jpg';
- let sPendingImagesToLoad = 3;
+ let sPendingImagesToLoad = 5;
function pendingImageLoaded() {
if (!--sPendingImagesToLoad) {
@@ -51,6 +60,19 @@
img.onload = pendingImageLoaded;
img.src = img.src.replace(new URL(img.src).origin, get_host_info().HTTP_REMOTE_ORIGIN)
+ const corsAnonImg = document.getElementById('corsAnonymousImg')
+ corsAnonImg.onload = pendingImageLoaded;
+ corsAnonImg.src = corsAnonImg.src.replace(new URL(corsAnonImg.src).origin,
+ get_host_info().HTTP_REMOTE_ORIGIN)
+ + "?pipe=header(Access-Control-Allow-Origin,*)";
+
+ const corsUseCredsImg = document.getElementById('corsUseCredsImg')
+ corsUseCredsImg.onload = pendingImageLoaded;
+ corsUseCredsImg.src = corsUseCredsImg.src.replace(new URL(corsUseCredsImg.src).origin,
+ get_host_info().HTTP_REMOTE_ORIGIN)
+ + "?pipe=header(Access-Control-Allow-Credentials,true)"
+ + "|header(Access-Control-Allow-Origin," + location.origin + ")";
+
const blobImg = document.getElementById('blobImage');
fetch(testImage).then((resp) => {
return resp.blob();
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html
index c4d72fc823f..a54aa3870f6 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html
@@ -19,7 +19,7 @@
<body>
<p>The following images should not be identical.</p>
<p>The image should not rotate respecting their EXIF orientation because
- image-orientation: none is specified.</p>
+ image-orientation: none is specified and the request is same origin.</p>
<div><img src="../support/exif-orientation-3-lr.jpg"/></div>
<p>This image should rotate respecting their EXIF orientation because
@@ -27,11 +27,20 @@
<div><img src="../support/exif-orientation-3-lr.jpg" style="image-orientation: from-image" /></div>
<p>The image should not rotate respecting their EXIF orientation because
- image-orientation: none is specified.</p>
+ image-orientation: none is specified and the request is CORS anonymous.</p>
<div><img src="../support/exif-orientation-3-lr.jpg"/></div>
<p>The image should not rotate respecting their EXIF orientation because
- image-orientation: none is specified.</p>
+ image-orientation: none is specified and the request is CORS
+ use-credentials.</p>
+ <div><img src="../support/exif-orientation-3-lr.jpg"/></div>
+
+ <p>The image should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified and the image source is a blob.</p>
+ <div><img src="../support/exif-orientation-3-lr.jpg"/></div>
+
+ <p>The image should not rotate respecting their EXIF orientation because
+ image-orientation: none is specified and the image source is a data url.</p>
<div><img src="../support/exif-orientation-3-lr.jpg"/></div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html b/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html
index 1ce4ceb1074..61622774f6f 100644
--- a/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html
+++ b/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html
@@ -5,7 +5,7 @@
<script src="/css/support/parsing-testcommon.js"></script>
<script>
-test_valid_value('text-box-trim', 'normal');
+test_valid_value('text-box-trim', 'none');
test_valid_value('text-box-trim', 'start');
test_valid_value('text-box-trim', 'end');
test_valid_value('text-box-trim', 'both');
diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-computed.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-computed.html
new file mode 100644
index 00000000000..f1a0a315de6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-computed.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>CSS Positioned Layout Module Test: getComputedStyle().overlay</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<div id="target"></div>
+<script>
+ test_computed_value("overlay", "none", "none");
+ // 'auto' also computes to 'none' due to this UA style while the element is
+ // not in the top layer:
+ //
+ // * { overlay: none !important }
+ test_computed_value("overlay", "auto", "none");
+ test_computed_value("overlay", "inherit", "none");
+ test_computed_value("overlay", "initial", "none");
+ test_computed_value("overlay", "revert", "none");
+ test_computed_value("overlay", "unset", "none");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-invalid.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-invalid.html
new file mode 100644
index 00000000000..e84d0c8a6b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-invalid.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>CSS Positioned Layout Module Test: parsing overlay with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<script>
+ // overlay: none | auto
+ test_invalid_value("overlay", "browser");
+ test_invalid_value("overlay", "normal");
+ test_invalid_value("overlay", "none auto");
+ test_invalid_value("overlay", "none, auto");
+ test_invalid_value("overlay", "\'auto\'");
+ test_invalid_value("overlay", "\'none\'");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-transition-property.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-transition-property.html
new file mode 100644
index 00000000000..a667f26ea6a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-transition-property.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>CSS Positioned Layout Module Test: 'overlay' is a valid transition-property value</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+<div id="target"></div>
+<script>
+ test_valid_value("transition-property", "overlay");
+ test_valid_value("transition", "overlay 2s", "overlay 2s ease 0s");
+
+ test_computed_value("transition-property", "overlay");
+ test_computed_value("transition", "overlay 1s", "overlay 1s ease 0s");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-valid.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-valid.html
new file mode 100644
index 00000000000..8d808ac6dcf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-valid.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>CSS Positioned Layout Module Test: parsing overlay with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+<script>
+ // overlay: none | auto
+ test_valid_value("overlay", "none");
+ test_valid_value("overlay", "auto");
+ test_valid_value("overlay", "inherit");
+ test_valid_value("overlay", "initial");
+ test_valid_value("overlay", "revert");
+ test_valid_value("overlay", "unset");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-view-transitions/root-element-cv-hidden-crash.html b/tests/wpt/web-platform-tests/css/css-view-transitions/root-element-cv-hidden-crash.html
new file mode 100644
index 00000000000..890194b7c17
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-view-transitions/root-element-cv-hidden-crash.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>View transitions: content-visibility:hidden on root element crash</title>
+<link rel="help" href="https://crbug.com/1429947">
+<style>
+ html {
+ content-visibility: hidden;
+ }
+</style>
+<script>
+ document.startViewTransition();
+</script>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript-ref.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript-ref.html
new file mode 100644
index 00000000000..2dd7aff8313
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript-ref.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<noscript>
+ Script is disabled
+</noscript>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript.html
new file mode 100644
index 00000000000..1d1af708fd7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/mediaqueries/#scripting">
+<link rel="match" href="scripting-print-noscript-ref.html">
+<style>
+ @media (scripting) {
+ #noscript {
+ display: none;
+ }
+ }
+</style>
+<div id="noscript">
+ Script is disabled
+</div>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script-ref.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script-ref.html
new file mode 100644
index 00000000000..d2da3f84058
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script-ref.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<div>
+ Script is enabled
+</div>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script.html
new file mode 100644
index 00000000000..e80dba4d83f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/mediaqueries/#scripting">
+<link rel="match" href="scripting-print-script-ref.html">
+<style>
+ #script {
+ display: none;
+ }
+
+ @media (scripting) {
+ #script {
+ display: block;
+ }
+ }
+</style>
+<div id="script">
+ Script is enabled
+</div>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting.html
new file mode 100644
index 00000000000..de047cb463c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/mediaqueries-5/#scripting">
+<script type="text/javascript" src="/resources/testharness.js"></script>
+<script type="text/javascript" src="/resources/testharnessreport.js"></script>
+<script type="text/javascript" src="resources/matchmedia-utils.js"></script>
+
+<script>
+query_should_be_known("(scripting)");
+query_should_be_known("(scripting: enabled)");
+query_should_be_known("(scripting: initial-only)");
+query_should_be_known("(scripting: none)");
+
+query_should_be_unknown("(scripting: 0)");
+query_should_be_unknown("(scripting: 10px)");
+query_should_be_unknown("(scripting: invalid)");
+
+test(() => {
+ let match_enabled = window.matchMedia("(scripting: enabled)");
+ assert_true(match_enabled.matches);
+}, "Check that scripting currently matches 'enabled'");
+
+test(() => {
+ let booleanContext = window.matchMedia("(scripting)");
+ assert_true(booleanContext.matches);
+}, "Check that scripting currently evaluates to true in the boolean context");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html b/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html
index 5e68d50d5a0..411d50d35e5 100644
--- a/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html
+++ b/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html
@@ -28,8 +28,8 @@ This tests a detail related to :lang support. If :lang is not supported, a messa
<script>
test(function() {
assert_equals(document.getElementById('colonlangcontroltest').offsetWidth, 0)
-assert_equals(document.getElementById('box').offsetWidth, 50);
-}, "A :lang value with language and region subtags will NOT match a lang attribute value with language, script and region subtags.");
+assert_in_array(document.getElementById('box').offsetWidth, [50, 100]);
+}, "A :lang value with language and region subtags will match a lang attribute value with language, script and region subtags under CSS Selectors 4, but not Selectors 3.");
</script>
<div id='log'></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000-ref.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000-ref.html
new file mode 100644
index 00000000000..466e9f464b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching reference</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+
+<style>
+div.test { color: green; }
+</style>
+
+<div class="test">This should be green</div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000.html
new file mode 100644
index 00000000000..1d66bebbc6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+:lang(en-US) { color: green; }
+</style>
+
+<div class="test">This should be green</div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-001.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-001.html
new file mode 100644
index 00000000000..908643fca81
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-001.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang(fr) { color: green; }
+</style>
+
+<div class="test"><span lang="fr">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-002.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-002.html
new file mode 100644
index 00000000000..0be426c66e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-002.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("FR") { color: green; }
+</style>
+
+<div class="test"><span lang="fr">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-003.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-003.html
new file mode 100644
index 00000000000..a3e5340b6e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-003.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("Fr") { color: green; }
+</style>
+
+<div class="test"><span lang="fR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-004.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-004.html
new file mode 100644
index 00000000000..d5929972707
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-004.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("fr") { color: green; }
+</style>
+
+<div class="test"><span lang="fr-CH">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-005.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-005.html
new file mode 100644
index 00000000000..816dfc9b503
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-005.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: green; }
+:lang("fr-CH") { color: red; }
+</style>
+
+<div class="test"><span lang="fr">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-006.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-006.html
new file mode 100644
index 00000000000..d249a4c8c06
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-006.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: green; }
+:lang("fr-CH") { color: red; }
+</style>
+
+<div class="test"><span lang="fr-FR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-007.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-007.html
new file mode 100644
index 00000000000..a21506d94c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-007.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("*-CH") { color: green; }
+</style>
+
+<div class="test"><span lang="fr-CH">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-008.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-008.html
new file mode 100644
index 00000000000..77f77a884ac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-008.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("*-Latn") { color: green; }
+</style>
+
+<div class="test"><span lang="fr-Latn-FR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-009.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-009.html
new file mode 100644
index 00000000000..bf2e9883916
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-009.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("fr-FR") { color: green; }
+</style>
+
+<div class="test"><span lang="fr-Latn-FR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-010.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-010.html
new file mode 100644
index 00000000000..081c9207add
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-010.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("*-FR") { color: green; }
+</style>
+
+<div class="test"><span lang="fr-Latn-FR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-011.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-011.html
new file mode 100644
index 00000000000..5620317a14b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-011.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang("fr", "nl", "de") { color: green; }
+</style>
+
+<div class="test"><span lang="fr-Latn-FR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-012.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-012.html
new file mode 100644
index 00000000000..f299e22eaec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-012.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang(de, nl, fr) { color: green; }
+</style>
+
+<div class="test"><span lang="fr-Latn-FR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-013.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-013.html
new file mode 100644
index 00000000000..34303d97805
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-013.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: green; }
+:lang(de, nl, 0, fr) { color: red; }
+</style>
+
+<div class="test"><span lang="fr">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-014.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-014.html
new file mode 100644
index 00000000000..2d064c8d29b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-014.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: green; }
+:lang(0) { color: red; }
+</style>
+
+<div class="test"><span lang="0">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-015.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-015.html
new file mode 100644
index 00000000000..4d90b080f39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-015.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en-US">
+<meta charset="utf-8">
+<title>CSS Selectors 4 - :lang matching</title>
+<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo">
+<link rel="match" href="lang-000-ref.html">
+
+<style>
+div.test { color: red; }
+:lang(\*-FR) { color: green; }
+</style>
+
+<div class="test"><span lang="fr-Latn-FR">This should be green</span></div>
diff --git a/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html b/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html
index acad168e56c..edda88e7cb2 100644
--- a/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html
+++ b/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html
@@ -7,96 +7,167 @@
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
-#overscrollXDiv {
- width: 600px;
- height: 600px;
- overflow: scroll;
- overscroll-behavior-x: contain;
-}
-#overscrollYDiv {
- width: 500px;
- height: 500px;
- overflow: scroll;
- overscroll-behavior-y: none;
-}
-#targetDiv {
- width: 400px;
- height: 400px;
- overflow: scroll;
-}
-.content {
- width:800px;
- height:800px;
-}
+ #overscrollXDiv {
+ width: 200px;
+ height: 200px;
+ overflow: scroll;
+ overscroll-behavior-x: contain;
+ border: solid 1px black;
+ display: grid;
+ /* Places content and targetXDiv beside each other. */
+ grid-template-columns: 500px 100px;
+ }
+
+ #overscrollYDiv {
+ width: 200px;
+ height: 200px;
+ overflow: scroll;
+ overscroll-behavior-y: none;
+ border: solid 1px black;
+ }
+
+ #targetXDiv {
+ width: 100px;
+ height: 100px;
+ overflow: scroll;
+ border: solid 1px black;
+ }
+
+ #targetYDiv {
+ width: 100px;
+ height: 100px;
+ overflow: scroll;
+ border: solid 1px black;
+ }
+
+ .content {
+ width: 500px;
+ height: 500px;
+ }
+
+ #spacer {
+ height: 200vh;
+ width: 200vw;
+ border: solid 1px black;
+ }
</style>
<body style="margin:0" onload=runTest()>
-<div id="overscrollXDiv">
- <div class=content>
- <div id="overscrollYDiv">
- <div class=content>
- <div id="targetDiv">
- <div class="content">
- </div>
- </div>
+ <div id="overscrollXDiv">
+ <div class="content"></div>
+ <div id="targetXDiv">
+ <div class="content">
</div>
</div>
</div>
-</div>
+ <div id="overscrollYDiv">
+ <div class="content"></div>
+ <!-- Place targetYDiv below content so that is in view when
+ overscrollYDiv is scrolled all the way down -->
+ <div id="targetYDiv">
+ <div class="content">
+ </div>
+ </div>
+ </div>
+ <div id="spacer"></div>
</body>
<script>
-var target_div = document.getElementById('targetDiv');
-var horizontal_scrollend_arrived = false;
-var vertical_scrollend_arrived = false;
-function onHorizontalScrollEnd(event) {
- assert_false(event.cancelable);
- assert_false(event.bubbles);
- horizontal_scrollend_arrived = true;
-}
-function onVerticalScrollEnd(event) {
- assert_false(event.cancelable);
- assert_false(event.bubbles);
- vertical_scrollend_arrived = true;
-}
-// Test that both "onscrollend" and addEventListener("scrollend"... work.
-document.getElementById('overscrollXDiv').onscrollend = onHorizontalScrollEnd;
-document.getElementById('overscrollYDiv').
+ var horizontal_scrollend_arrived = false;
+ var vertical_scrollend_arrived = false;
+ let scrollers = [document.scrollingElement, targetXDiv, targetYDiv,
+ overscrollXDiv, overscrollYDiv];
+
+ async function resetScrollers(test) {
+ for (const scroller of scrollers) {
+ await resetTargetScrollState(test, scroller);
+ }
+ }
+ function onHorizontalScrollEnd(event) {
+ assert_false(event.cancelable);
+ assert_false(event.bubbles);
+ horizontal_scrollend_arrived = true;
+ }
+ function onVerticalScrollEnd(event) {
+ assert_false(event.cancelable);
+ assert_false(event.bubbles);
+ vertical_scrollend_arrived = true;
+ }
+ // Test that both "onscrollend" and addEventListener("scrollend"... work.
+ document.getElementById('overscrollXDiv').onscrollend = onHorizontalScrollEnd;
+ document.getElementById('overscrollYDiv').
addEventListener("scrollend", onVerticalScrollEnd);
-function runTest() {
- promise_test (async (t) => {
- // Make sure that no scrollend event is sent to document or target_div.
- document.addEventListener("scrollend",
- t.unreached_func("Document got unexpected scrollend event."));
- target_div.addEventListener("scrollend",
- t.unreached_func("target_div got unexpected scrollend event."));
- await waitForCompositorCommit();
-
- // Scroll left on target div and wait for the element with overscroll-x to
- // get scrollend event.
- await touchScrollInTarget(300, target_div, 'left');
- await waitFor(() => { return horizontal_scrollend_arrived; },
- 'Expected element did not receive scrollend event after scroll left ' +
- 'on target.');
- assert_equals(target_div.scrollLeft, 0);
-
- let touchEndPromise = new Promise((resolve) => {
- target_div.addEventListener("touchend", resolve);
- });
- await touchScrollInTarget(300, target_div, 'up');
-
- // The scrollend event should never be fired before the gesture has completed.
- await touchEndPromise;
-
- // Ensure we wait at least a tick after the touch end.
- await waitForCompositorCommit();
-
- // We should not trigger a scrollend event for a scroll that did not change
- // the scroll position.
- assert_equals(vertical_scrollend_arrived, false);
- assert_equals(target_div.scrollTop, 0);
- }, 'Tests that the last element in the cut scroll chain gets scrollend ' +
- 'event when no element scrolls by touch.');
-}
+ function runTest() {
+ promise_test(async (t) => {
+ await resetScrollers(t);
+ await waitForCompositorCommit();
+
+ // Make sure that no scrollend event is sent to document.
+ document.addEventListener("scrollend",
+ t.unreached_func("Document got unexpected scrollend event."));
+ let scrollend_promise;
+
+ scrollend_promise = waitForScrollendEvent(t, targetXDiv, 2000);
+ targetXDiv.scrollLeft = targetXDiv.scrollWidth;
+ await scrollend_promise;
+
+ scrollend_promise = waitForScrollendEvent(t, overscrollXDiv, 2000);
+ overscrollXDiv.scrollLeft = overscrollXDiv.scrollWidth;
+ await scrollend_promise;
+ horizontal_scrollend_arrived = false;
+
+ assert_equals(targetXDiv.scrollLeft,
+ targetXDiv.scrollWidth - targetXDiv.clientWidth);
+ assert_equals(overscrollXDiv.scrollLeft,
+ overscrollXDiv.scrollWidth - overscrollXDiv.clientWidth);
+ // Attempt to scroll targetXDiv further to the right.
+ // targetXDiv and overscrollXDiv are already fully scrolled right but the
+ // scroll should not propagate to the document because of
+ // overscroll-behavior-x: contain on overscrollXDiv.
+ let touchEndPromise = new Promise((resolve) => {
+ targetXDiv.addEventListener("touchend", resolve);
+ });
+ await touchScrollInTarget(100, targetXDiv, 'right');
+ // The scrollend event should never be fired before the gesture has
+ // completed.
+ await touchEndPromise;
+
+ scrollend_promise = waitForScrollendEvent(t, targetYDiv, 2000);
+ targetYDiv.scrollTop = targetXDiv.scrollHeight;
+ await scrollend_promise;
+
+ scrollend_promise = waitForScrollendEvent(t, overscrollYDiv, 2000);
+ overscrollYDiv.scrollTop = overscrollYDiv.scrollHeight;
+ await scrollend_promise;
+ vertical_scrollend_arrived = false;
+
+ assert_equals(targetYDiv.scrollTop,
+ targetYDiv.scrollHeight - targetYDiv.clientHeight);
+ assert_equals(overscrollYDiv.scrollTop,
+ overscrollYDiv.scrollHeight - overscrollYDiv.clientHeight);
+ // Attempt to scroll targetYDiv further down.
+ // targetYDiv and overscrollYDiv are already fully scrolled down but the
+ // scroll should not propagate to the document because of
+ // overscroll-behavior-y: none on overscrollYDiv.
+ touchEndPromise = new Promise((resolve) => {
+ targetYDiv.addEventListener("touchend", resolve);
+ });
+ await touchScrollInTarget(50, targetYDiv, 'down');
+ // The scrollend event should never be fired before the gesture has
+ // completed.
+ await touchEndPromise;
+
+ // Ensure we wait at least a tick after the touch end.
+ await waitForCompositorCommit();
+
+ // We should not trigger a scrollend event for a scroll that did not
+ // change the scroll position.
+ assert_equals(horizontal_scrollend_arrived, false,
+ "overscrollXDiv should not receive scrollend");
+ assert_equals(vertical_scrollend_arrived, false,
+ "overscrollYDiv should not receive scrollend");
+ }, "Tests that the scroll is not propagated beyond div with non-auto " +
+ "overscroll-behavior.");
+ }
</script>
diff --git a/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js b/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js
index 32924a8d872..973c586ca4f 100644
--- a/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js
+++ b/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js
@@ -462,21 +462,21 @@ const SIMPLE_JOIN_LEAVE_TEST_CASES = [
all: [3,4,5] }
},
- // Interest group dictionaries must be less than 50 KiB (51200 bytes), so test
- // that here by using a large name on an otherwise valid interest group
+ // Interest group dictionaries must be less than 1 MB (1048576 bytes), so
+ // test that here by using a large name on an otherwise valid interest group
// dictionary. The first case is the largest name value that still results in
// a valid dictionary, whereas the second test case produces a dictionary
// that's one byte too large.
{ expectJoinSucces: true,
expectLeaveSucces: true,
interestGroup: { ...BASE_INTEREST_GROUP,
- name: 'a'.repeat(51152) },
+ name: 'a'.repeat(1048528) },
testCaseName: "Largest possible interest group dictionary",
},
{ expectJoinSucces: false,
expectLeaveSucces: true,
interestGroup: { ...BASE_INTEREST_GROUP,
- name: 'a'.repeat(51153) },
+ name: 'a'.repeat(1048529) },
testCaseName: "Oversized interest group dictionary",
},
];
diff --git a/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js b/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js
index 15a0c2a3b57..9e114619bf2 100644
--- a/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js
+++ b/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js
@@ -119,3 +119,27 @@ directory_test(async (t, root_dir) => {
assert_equals(result.value.length, value.length);
await assert_equals_cloned_handles(result.value, value);
}, 'Store handle in IndexedDB using inline keys.');
+
+directory_test(async (t, root_dir) => {
+ const expected_root_name = '';
+ assert_equals(root_dir.name, expected_root_name);
+
+ const db = await createDatabase(t, db => {
+ const store = db.createObjectStore('store', {keyPath: 'key'});
+ });
+
+ const value = [ root_dir ];
+ let tx = db.transaction('store', 'readwrite');
+ let store = tx.objectStore('store');
+ await promiseForRequest(t, store.put({key: 'key', value}));
+ await promiseForTransaction(t, tx);
+
+ tx = db.transaction('store', 'readonly');
+ store = tx.objectStore('store');
+ const result = await promiseForRequest(t, store.get('key'));
+ await promiseForTransaction(t, tx);
+
+ const actual = result.value[ 0 ];
+ assert_equals(actual.name, expected_root_name);
+ assert_true(await root_dir.isSameEntry(actual));
+}, 'Store and retrieve the root directory from IndexedDB.');
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-screen-size.https.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-screen-size.https.html
new file mode 100644
index 00000000000..1c2bc9e3d11
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-screen-size.https.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>
+ Element#requestFullscreen() does not affect Screen sizes
+</title>
+<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="../trusted-click.js"></script>
+<body></body>
+<script>
+ promise_test(async (t) => {
+ const screenWidth = window.screen.width;
+ const screenHeight = window.screen.height;
+
+ if ('onchange' in window.screen) {
+ window.screen.onchange = () => {
+ assert_equals(window.screen.width, screenWidth);
+ assert_equals(window.screen.height, screenHeight);
+ }
+ t.add_cleanup(() => { window.screen.onchange = null; });
+ }
+
+ // Await a test_driver or manual click, fullscreen promise, and change.
+ await Promise.all([trusted_request(), fullScreenChange()]);
+ t.add_cleanup(() => { document.exitFullscreen(); });
+ assert_not_equals(document.fullscreenElement, null);
+
+ // Ensure the screen size is unchanged during fullscreen.
+ assert_equals(window.screen.width, screenWidth);
+ assert_equals(window.screen.height, screenHeight);
+ }, "Screen size is unchanged during element fullscreen");
+
+ promise_test(async (t) => {
+ const screenWidth = window.screen.width;
+ const screenHeight = window.screen.height;
+
+ if ('onchange' in window.screen) {
+ window.screen.onchange = () => {
+ assert_equals(window.screen.width, screenWidth);
+ assert_equals(window.screen.height, screenHeight);
+ }
+ t.add_cleanup(() => { window.screen.onchange = null; });
+ }
+
+ // Await a test_driver or manual click to start tab content capture.
+ await trusted_click();
+ const stream = await navigator.mediaDevices.getDisplayMedia(
+ {video:{displaySurface:"browser"}, selfBrowserSurface:"include"});
+ const capabilities = stream.getVideoTracks()[0].getCapabilities();
+ assert_equals(capabilities.displaySurface, "browser");
+ t.add_cleanup(() => { stream.getTracks().forEach(t => t.stop()) });
+
+ // Await a test_driver or manual click, fullscreen promise, and change.
+ await Promise.all([trusted_request(), fullScreenChange()]);
+ t.add_cleanup(() => { document.exitFullscreen(); });
+ assert_not_equals(document.fullscreenElement, null);
+
+ // Ensure the screen size is unchanged during tab-capture fullscreen.
+ assert_equals(window.screen.width, screenWidth);
+ assert_equals(window.screen.height, screenHeight);
+ }, "Screen size is unchanged during tab-capture element fullscreen");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
index d64b81026ad..77818444c87 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
@@ -19,12 +19,12 @@
var t = async_test("Test exceptions on CanvasFilter() blur.object");
_addTest(function(canvas, ctx) {
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur"}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur'}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}}); });
});
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
index 678a722520a..a56840e6073 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
@@ -19,44 +19,44 @@
var t = async_test("Test the functionality of ColorMatrix filters in CanvasFilter objects");
_addTest(function(canvas, ctx) {
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: undefined}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: "foo"}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: null}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
-ctx.fillStyle = "#f00";
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0});
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: undefined}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: 'foo'}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: null}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
+ctx.fillStyle = '#f00';
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
ctx.clearRect(0, 0, 100, 50);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [
0, 0, 0, 0, 0,
1, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 0, 0, 1, 0
]});
ctx.fillRect(0, 0, 50, 25);
-ctx.fillStyle = "#0f0";
+ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
-ctx.fillStyle = "#00f";
+ctx.fillStyle = '#00f';
ctx.fillRect(0, 25, 50, 25);
-ctx.fillStyle = "#fff";
+ctx.fillStyle = '#fff';
ctx.fillRect(50, 25, 50, 25);
_assertPixelApprox(canvas, 10,10, 0,255,0,255, 2);
_assertPixelApprox(canvas, 60,10, 0,255,0,255, 2);
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
index 0ecd132c8ef..c54299ff2a5 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
@@ -40,10 +40,10 @@ function getColor(inputColor, tableValues) {
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "discrete", tableValues: tableValuesR},
- funcG: {type: "discrete", tableValues: tableValuesG},
- funcB: {type: "discrete", tableValues: tableValuesB},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
index 4ef30c9249b..110cd2396ea 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
@@ -31,10 +31,10 @@ function getColor(inputColor, amplitude, exponent, offset) {
const amplitudes = [2, 1.1, 0.5];
const exponents = [5, 3, 1];
const offsets = [0.25, 0, 0.5];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
index 25eda36d96b..96a3e4936ee 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
@@ -19,10 +19,10 @@
var t = async_test("Test pixels on CanvasFilter() componentTransfer with identity type");
_addTest(function(canvas, ctx) {
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "identity"},
- funcG: {type: "identity"},
- funcB: {type: "identity"},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
index c45f5586009..10f9931cc64 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
@@ -30,10 +30,10 @@ function getColor(inputColor, slopes, intercepts) {
const slopes = [0.5, 1.2, -0.2];
const intercepts = [0.25, 0, 0.5];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]},
- funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]},
- funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
index b561cb6fd3f..7e743bf34f0 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
@@ -40,10 +40,10 @@ function getColor(inputColor, tableValues) {
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "table", tableValues: tableValuesR},
- funcG: {type: "table", tableValues: tableValuesG},
- funcB: {type: "table", tableValues: tableValuesB},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
index b85b742b3eb..b994a91842c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
@@ -19,23 +19,23 @@
var t = async_test("Test exceptions on CanvasFilter() convolveMatrix");
_addTest(function(canvas, ctx) {
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix"}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", divisor: 2}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix'}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', divisor: 2}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
// This should not throw an error
-ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]});
-ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]});
+ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]});
+ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]});
});
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html
index 90f406fed9f..8327b5cad48 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html
@@ -4,71 +4,33 @@
<h1>2d.filter.canvasFilterObject.dropShadow.tentative</h1>
<p class="desc">Test CanvasFilter() dropShadow object.</p>
-<style>
- .background {
- background-color: teal;
- position: absolute;
- left: 0px;
- width: 620px;
- height: 50px;
- }
+<svg width=620 height=320 xmlns="http://www.w3.org/2000/svg">
+ <rect x=0 y=0 width=100% height=50 fill="teal" />
+ <rect x=0 y=100 width=100% height=50 fill="teal" />
+ <rect x=0 y=200 width=100% height=50 fill="teal" />
- .testcase {
- position: absolute;
- background-color: crimson;
- width: 80px;
- height: 80px;
- }
-</style>
+ <rect x=10 y=10 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(2px 2px 2px black)"/>
+ <rect x=110 y=10 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7))"/>
-<div style="position: relative">
- <div class='background' style="top: 0px;"></div>
- <div class='background' style="top: 100px;"></div>
- <div class='background' style="top: 200px;"></div>
+ <rect x=10 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(10px 10px 3px purple)"/>
+ <rect x=110 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px LinkText)"/>
+ <rect x=210 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(10px 15px 0px purple)"/>
+ <rect x=310 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/>
+ <rect x=410 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"/>
+ <rect x=510 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"/>
- <div class='testcase'
- style="left: 10px; top: 10px;
- filter: drop-shadow(2px 2px 2px black);">
- </div>
- <div class='testcase'
- style="left: 110px; top: 10px;
- filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7));">
- </div>
- <div class='testcase'
- style="left: 10px; top: 110px;
- filter: drop-shadow(10px 10px 3px purple)">
- </div>
- <div class='testcase'
- style="left: 110px; top: 110px;
- filter: drop-shadow(15px 10px 3px LinkText)">
- </div>
- <div class='testcase'
- style="left: 210px; top: 110px;
- filter: drop-shadow(10px 15px 0px purple)">
- </div>
- <div class='testcase'
- style="left: 310px; top: 110px;
- filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))">
- </div>
- <div class='testcase'
- style="left: 410px; top: 110px;
- filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))">
- </div>
- <div class='testcase'
- style="left: 510px; top: 110px;
- filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))">
- </div>
-
- <div class='testcase'
- style="left: 10px; top: 210px;
- filter: drop-shadow(-5px 0px 0px purple);">
- </div>
- <div class='testcase'
- style="left: 110px; top: 210px;
- filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8));">
- </div>
- <div class='testcase'
- style="left: 210px; top: 210px;
- filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4));">
- </div>
-</div>
+ <rect x=10 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(-5px 0px 0px purple)"/>
+ <rect x=110 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8))"/>
+ <rect x=210 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
index 22c6a6547f2..712716d9f01 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
@@ -19,64 +19,64 @@
ctx.fillStyle = 'crimson';
// Parameter defaults.
- ctx.filter = new CanvasFilter({filter: "dropShadow"});
+ ctx.filter = new CanvasFilter({filter: 'dropShadow'});
ctx.fillRect(10, 10, 80, 80);
// All parameters specified.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5,
- floodColor: "purple", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7});
ctx.fillRect(110, 10, 80, 80);
// Named color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3,
+ floodColor: 'purple'});
ctx.fillRect(10, 110, 80, 80);
// System color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "LinkText"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'LinkText'});
ctx.fillRect(110, 110, 80, 80);
// No blur.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0,
+ floodColor: 'purple'});
ctx.fillRect(210, 110, 80, 80);
// Numerical color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 1)"});
+ {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'});
ctx.fillRect(310, 110, 80, 80);
// Transparent floodColor.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'});
ctx.fillRect(410, 110, 80, 80);
// Transparent floodColor and floodOpacity.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
ctx.fillRect(510, 110, 80, 80);
// Degenerate parameter values.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null,
- floodColor: "purple", floodOpacity: [2]});
+ {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]});
ctx.fillRect(10, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5,
- floodColor: "purple", floodOpacity: '0.8'});
+ {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5,
+ floodColor: 'purple', floodOpacity: '0.8'});
ctx.fillRect(110, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false,
- floodColor: "purple", floodOpacity: ['0.4']});
+ {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 210, 80, 80);
</script>
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html
index 3a32eb6a55a..a4625db0197 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html
@@ -22,11 +22,11 @@ _addTest(function(canvas, ctx) {
_assert(ctx.filter == 'none', "ctx.filter == 'none'");
ctx.filter = 'blur(5px)';
_assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'");
-ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
+ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
ctx.filter = new CanvasFilter([
- {filter: "gaussianBlur", stdDeviation: 5},
- {filter: "gaussianBlur", stdDeviation: 10}
+ {filter: 'gaussianBlur', stdDeviation: 5},
+ {filter: 'gaussianBlur', stdDeviation: 10}
]);
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
var canvas2 = document.createElement('canvas');
@@ -37,8 +37,8 @@ ctx.filter = 'blur(5px)';
_assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'");
ctx.filter = 'none';
_assert(ctx.filter == 'none', "ctx.filter == 'none'");
-ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
-ctx.filter = "this string is not a filter and should do nothing";
+ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
+ctx.filter = 'this string is not a filter and should do nothing';
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
index 1f9d978ac8c..64f909a7fdb 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
@@ -27,7 +27,7 @@ const errorTestCases = [
{baseFrequency: Infinity},
{baseFrequency: undefined},
{baseFrequency: -Infinity},
- {baseFrequency: "test"},
+ {baseFrequency: 'test'},
{numOctaves: {}},
{numOctaves: -1},
@@ -36,7 +36,7 @@ const errorTestCases = [
{numOctaves: undefined},
{numOctaves: -Infinity},
{numOctaves: [1, 1]},
- {numOctaves: "test"},
+ {numOctaves: 'test'},
{seed: {}},
{seed: NaN},
@@ -44,7 +44,7 @@ const errorTestCases = [
{seed: undefined},
{seed: -Infinity},
{seed: [1, 1]},
- {seed: "test"},
+ {seed: 'test'},
{stitchTiles: {}},
{stitchTiles: NaN},
@@ -52,14 +52,14 @@ const errorTestCases = [
{stitchTiles: undefined},
{stitchTiles: -Infinity},
{stitchTiles: [1, 1]},
- {stitchTiles: "test"},
+ {stitchTiles: 'test'},
{stitchTiles: null},
{stitchTiles: []},
{stitchTiles: [10]},
{stitchTiles: 30},
{stitchTiles: false},
{stitchTiles: true},
- {stitchTiles: "10"},
+ {stitchTiles: '10'},
{stitchTiles: -1},
{type: {}},
@@ -68,14 +68,14 @@ const errorTestCases = [
{type: undefined},
{type: -Infinity},
{type: [1, 1]},
- {type: "test"},
+ {type: 'test'},
{type: null},
{type: []},
{type: [10]},
{type: 30},
{type: false},
{type: true},
- {type: "10"},
+ {type: '10'},
{type: -1},
]
@@ -88,7 +88,7 @@ const workingTestCases = [
{baseFrequency: 30},
{baseFrequency: false},
{baseFrequency: true},
- {baseFrequency: "10"},
+ {baseFrequency: '10'},
{numOctaves: null},
{numOctaves: []},
@@ -96,7 +96,7 @@ const workingTestCases = [
{numOctaves: 30},
{numOctaves: false},
{numOctaves: true},
- {numOctaves: "10"},
+ {numOctaves: '10'},
{seed: null},
{seed: []},
@@ -104,23 +104,23 @@ const workingTestCases = [
{seed: 30},
{seed: false},
{seed: true},
- {seed: "10"},
+ {seed: '10'},
{seed: -1},
- {stitchTiles: "stitch"},
- {stitchTiles: "noStitch"},
+ {stitchTiles: 'stitch'},
+ {stitchTiles: 'noStitch'},
- {type: "fractalNoise"},
- {type: "turbulence"},
+ {type: 'fractalNoise'},
+ {type: 'turbulence'},
]
for (testCase of errorTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); });
}
for (testCase of workingTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
_assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null");
}
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
index 6ce6fb633f8..f5332780c82 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html
@@ -21,12 +21,12 @@ var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
await (function(canvas, ctx) {
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur"}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur'}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}}); });
})(canvas, ctx);
t.done();
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js
index a44868f585c..61f10308801 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js
@@ -16,12 +16,12 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur"}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN}); });
-assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur'}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN}); });
+assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}}); });
t.done();
});
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
index 3eda41776c0..f3dd3037bb7 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html
@@ -21,44 +21,44 @@ var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
await (function(canvas, ctx) {
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: undefined}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: "foo"}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: null}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
-ctx.fillStyle = "#f00";
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0});
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: undefined}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: 'foo'}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: null}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
+ctx.fillStyle = '#f00';
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
ctx.clearRect(0, 0, 100, 50);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [
0, 0, 0, 0, 0,
1, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 0, 0, 1, 0
]});
ctx.fillRect(0, 0, 50, 25);
-ctx.fillStyle = "#0f0";
+ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
-ctx.fillStyle = "#00f";
+ctx.fillStyle = '#00f';
ctx.fillRect(0, 25, 50, 25);
-ctx.fillStyle = "#fff";
+ctx.fillStyle = '#fff';
ctx.fillRect(50, 25, 50, 25);
_assertPixelApprox(canvas, 10,10, 0,255,0,255, 2);
_assertPixelApprox(canvas, 60,10, 0,255,0,255, 2);
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js
index 105f312b9ce..19d57b61e53 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js
@@ -16,44 +16,44 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: undefined}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: "foo"}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: null}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
-ctx.fillStyle = "#f00";
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0});
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: undefined}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: 'foo'}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: null}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); });
+ctx.fillStyle = '#f00';
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 255,0,0,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,91,0,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,109,109,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 109,18,255,255, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 155,27,27,255, 2);
ctx.clearRect(0, 0, 100, 50);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"});
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'});
ctx.fillRect(0, 0, 100, 50);
_assertPixelApprox(canvas, 10,10, 0,0,0,54, 2);
-ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [
+ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [
0, 0, 0, 0, 0,
1, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 0, 0, 1, 0
]});
ctx.fillRect(0, 0, 50, 25);
-ctx.fillStyle = "#0f0";
+ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
-ctx.fillStyle = "#00f";
+ctx.fillStyle = '#00f';
ctx.fillRect(0, 25, 50, 25);
-ctx.fillStyle = "#fff";
+ctx.fillStyle = '#fff';
ctx.fillRect(50, 25, 50, 25);
_assertPixelApprox(canvas, 10,10, 0,255,0,255, 2);
_assertPixelApprox(canvas, 60,10, 0,255,0,255, 2);
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
index 7cb8b0dd143..dd6fc9ee5ff 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html
@@ -42,10 +42,10 @@ function getColor(inputColor, tableValues) {
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "discrete", tableValues: tableValuesR},
- funcG: {type: "discrete", tableValues: tableValuesG},
- funcB: {type: "discrete", tableValues: tableValuesB},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js
index f1274f14253..79a5cd2475c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js
@@ -37,10 +37,10 @@ function getColor(inputColor, tableValues) {
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "discrete", tableValues: tableValuesR},
- funcG: {type: "discrete", tableValues: tableValuesG},
- funcB: {type: "discrete", tableValues: tableValuesB},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
index 388fdca6f9d..f2a9fcfd49a 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html
@@ -33,10 +33,10 @@ function getColor(inputColor, amplitude, exponent, offset) {
const amplitudes = [2, 1.1, 0.5];
const exponents = [5, 3, 1];
const offsets = [0.25, 0, 0.5];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js
index 14bf50f89dd..a36fa19a5ef 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js
@@ -28,10 +28,10 @@ function getColor(inputColor, amplitude, exponent, offset) {
const amplitudes = [2, 1.1, 0.5];
const exponents = [5, 3, 1];
const offsets = [0.25, 0, 0.5];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
index 44eb7184956..33aae01eb05 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html
@@ -21,10 +21,10 @@ var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
await (function(canvas, ctx) {
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "identity"},
- funcG: {type: "identity"},
- funcB: {type: "identity"},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js
index ae749673f43..7236c7087a1 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js
@@ -16,10 +16,10 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "identity"},
- funcG: {type: "identity"},
- funcB: {type: "identity"},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
index d24a9e8608d..23731a1286c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html
@@ -32,10 +32,10 @@ function getColor(inputColor, slopes, intercepts) {
const slopes = [0.5, 1.2, -0.2];
const intercepts = [0.25, 0, 0.5];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]},
- funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]},
- funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js
index 5117d4a1b3b..9a4499d4d6b 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js
@@ -27,10 +27,10 @@ function getColor(inputColor, slopes, intercepts) {
const slopes = [0.5, 1.2, -0.2];
const intercepts = [0.25, 0, 0.5];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]},
- funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]},
- funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
index a704557cc54..c11e6adb910 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html
@@ -42,10 +42,10 @@ function getColor(inputColor, tableValues) {
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "table", tableValues: tableValuesR},
- funcG: {type: "table", tableValues: tableValuesG},
- funcB: {type: "table", tableValues: tableValuesB},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js
index e2463eb9e76..8ff791d3bb9 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js
@@ -37,10 +37,10 @@ function getColor(inputColor, tableValues) {
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
-ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "table", tableValues: tableValuesR},
- funcG: {type: "table", tableValues: tableValuesG},
- funcB: {type: "table", tableValues: tableValuesB},
+ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
});
const inputColors = [
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
index 0a6bddc56d7..c4b6df8e0db 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html
@@ -21,23 +21,23 @@ var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
await (function(canvas, ctx) {
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix"}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", divisor: 2}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix'}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', divisor: 2}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
// This should not throw an error
-ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]});
-ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]});
+ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]});
+ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]});
})(canvas, ctx);
t.done();
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js
index bce4c0be158..f7e616e7a63 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js
@@ -16,23 +16,23 @@ t.step(function() {
var canvas = new OffscreenCanvas(100, 50);
var ctx = canvas.getContext('2d');
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix"}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", divisor: 2}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]}); });
-assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix'}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', divisor: 2}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); });
+assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); });
// This should not throw an error
-ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]});
-ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]});
+ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]});
+ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]});
t.done();
});
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html
index 90f406fed9f..8327b5cad48 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html
@@ -4,71 +4,33 @@
<h1>2d.filter.canvasFilterObject.dropShadow.tentative</h1>
<p class="desc">Test CanvasFilter() dropShadow object.</p>
-<style>
- .background {
- background-color: teal;
- position: absolute;
- left: 0px;
- width: 620px;
- height: 50px;
- }
+<svg width=620 height=320 xmlns="http://www.w3.org/2000/svg">
+ <rect x=0 y=0 width=100% height=50 fill="teal" />
+ <rect x=0 y=100 width=100% height=50 fill="teal" />
+ <rect x=0 y=200 width=100% height=50 fill="teal" />
- .testcase {
- position: absolute;
- background-color: crimson;
- width: 80px;
- height: 80px;
- }
-</style>
+ <rect x=10 y=10 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(2px 2px 2px black)"/>
+ <rect x=110 y=10 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7))"/>
-<div style="position: relative">
- <div class='background' style="top: 0px;"></div>
- <div class='background' style="top: 100px;"></div>
- <div class='background' style="top: 200px;"></div>
+ <rect x=10 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(10px 10px 3px purple)"/>
+ <rect x=110 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px LinkText)"/>
+ <rect x=210 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(10px 15px 0px purple)"/>
+ <rect x=310 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/>
+ <rect x=410 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"/>
+ <rect x=510 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"/>
- <div class='testcase'
- style="left: 10px; top: 10px;
- filter: drop-shadow(2px 2px 2px black);">
- </div>
- <div class='testcase'
- style="left: 110px; top: 10px;
- filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7));">
- </div>
- <div class='testcase'
- style="left: 10px; top: 110px;
- filter: drop-shadow(10px 10px 3px purple)">
- </div>
- <div class='testcase'
- style="left: 110px; top: 110px;
- filter: drop-shadow(15px 10px 3px LinkText)">
- </div>
- <div class='testcase'
- style="left: 210px; top: 110px;
- filter: drop-shadow(10px 15px 0px purple)">
- </div>
- <div class='testcase'
- style="left: 310px; top: 110px;
- filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))">
- </div>
- <div class='testcase'
- style="left: 410px; top: 110px;
- filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))">
- </div>
- <div class='testcase'
- style="left: 510px; top: 110px;
- filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))">
- </div>
-
- <div class='testcase'
- style="left: 10px; top: 210px;
- filter: drop-shadow(-5px 0px 0px purple);">
- </div>
- <div class='testcase'
- style="left: 110px; top: 210px;
- filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8));">
- </div>
- <div class='testcase'
- style="left: 210px; top: 210px;
- filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4));">
- </div>
-</div>
+ <rect x=10 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(-5px 0px 0px purple)"/>
+ <rect x=110 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8))"/>
+ <rect x=210 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
index 04cf86d204c..04326527905 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
@@ -19,65 +19,65 @@
ctx.fillStyle = 'crimson';
// Parameter defaults.
- ctx.filter = new CanvasFilter({filter: "dropShadow"});
+ ctx.filter = new CanvasFilter({filter: 'dropShadow'});
ctx.fillRect(10, 10, 80, 80);
// All parameters specified.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5,
- floodColor: "purple", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7});
ctx.fillRect(110, 10, 80, 80);
// Named color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3,
+ floodColor: 'purple'});
ctx.fillRect(10, 110, 80, 80);
// System color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "LinkText"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'LinkText'});
ctx.fillRect(110, 110, 80, 80);
// No blur.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0,
+ floodColor: 'purple'});
ctx.fillRect(210, 110, 80, 80);
// Numerical color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 1)"});
+ {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'});
ctx.fillRect(310, 110, 80, 80);
// Transparent floodColor.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'});
ctx.fillRect(410, 110, 80, 80);
// Transparent floodColor and floodOpacity.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
ctx.fillRect(510, 110, 80, 80);
// Degenerate parameter values.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null,
- floodColor: "purple", floodOpacity: [2]});
+ {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]});
ctx.fillRect(10, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5,
- floodColor: "purple", floodOpacity: '0.8'});
+ {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5,
+ floodColor: 'purple', floodOpacity: '0.8'});
ctx.fillRect(110, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false,
- floodColor: "purple", floodOpacity: ['0.4']});
+ {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 210, 80, 80);
const canvas = document.getElementById("canvas");
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
index 8d5e2da1586..de72f5fe3d9 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html
@@ -21,65 +21,65 @@
ctx.fillStyle = 'crimson';
// Parameter defaults.
- ctx.filter = new CanvasFilter({filter: "dropShadow"});
+ ctx.filter = new CanvasFilter({filter: 'dropShadow'});
ctx.fillRect(10, 10, 80, 80);
// All parameters specified.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5,
- floodColor: "purple", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7});
ctx.fillRect(110, 10, 80, 80);
// Named color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3,
+ floodColor: 'purple'});
ctx.fillRect(10, 110, 80, 80);
// System color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "LinkText"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'LinkText'});
ctx.fillRect(110, 110, 80, 80);
// No blur.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0,
+ floodColor: 'purple'});
ctx.fillRect(210, 110, 80, 80);
// Numerical color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 1)"});
+ {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'});
ctx.fillRect(310, 110, 80, 80);
// Transparent floodColor.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'});
ctx.fillRect(410, 110, 80, 80);
// Transparent floodColor and floodOpacity.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
ctx.fillRect(510, 110, 80, 80);
// Degenerate parameter values.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null,
- floodColor: "purple", floodOpacity: [2]});
+ {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]});
ctx.fillRect(10, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5,
- floodColor: "purple", floodOpacity: '0.8'});
+ {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5,
+ floodColor: 'purple', floodOpacity: '0.8'});
ctx.fillRect(110, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false,
- floodColor: "purple", floodOpacity: ['0.4']});
+ {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 210, 80, 80);
const bitmap = oc.transferToImageBitmap();
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html
index 75d369cad2f..4d80dddf007 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html
@@ -24,11 +24,11 @@ await (function(canvas, ctx) {
_assert(ctx.filter == 'none', "ctx.filter == 'none'");
ctx.filter = 'blur(5px)';
_assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'");
-ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
+ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
ctx.filter = new CanvasFilter([
- {filter: "gaussianBlur", stdDeviation: 5},
- {filter: "gaussianBlur", stdDeviation: 10}
+ {filter: 'gaussianBlur', stdDeviation: 5},
+ {filter: 'gaussianBlur', stdDeviation: 10}
]);
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
var canvas2 = new OffscreenCanvas(100, 50);
@@ -39,8 +39,8 @@ ctx.filter = 'blur(5px)';
_assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'");
ctx.filter = 'none';
_assert(ctx.filter == 'none', "ctx.filter == 'none'");
-ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
-ctx.filter = "this string is not a filter and should do nothing";
+ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
+ctx.filter = 'this string is not a filter and should do nothing';
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
})(canvas, ctx);
t.done();
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js
index 30772a39d10..48c4a0448d9 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js
@@ -19,11 +19,11 @@ var ctx = canvas.getContext('2d');
_assert(ctx.filter == 'none', "ctx.filter == 'none'");
ctx.filter = 'blur(5px)';
_assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'");
-ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
+ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
ctx.filter = new CanvasFilter([
- {filter: "gaussianBlur", stdDeviation: 5},
- {filter: "gaussianBlur", stdDeviation: 10}
+ {filter: 'gaussianBlur', stdDeviation: 5},
+ {filter: 'gaussianBlur', stdDeviation: 10}
]);
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
var canvas2 = new OffscreenCanvas(100, 50);
@@ -34,8 +34,8 @@ ctx.filter = 'blur(5px)';
_assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'");
ctx.filter = 'none';
_assert(ctx.filter == 'none', "ctx.filter == 'none'");
-ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
-ctx.filter = "this string is not a filter and should do nothing";
+ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
+ctx.filter = 'this string is not a filter and should do nothing';
_assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'");
t.done();
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
index 610dca9feaf..2ed61e66d03 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html
@@ -29,7 +29,7 @@ const errorTestCases = [
{baseFrequency: Infinity},
{baseFrequency: undefined},
{baseFrequency: -Infinity},
- {baseFrequency: "test"},
+ {baseFrequency: 'test'},
{numOctaves: {}},
{numOctaves: -1},
@@ -38,7 +38,7 @@ const errorTestCases = [
{numOctaves: undefined},
{numOctaves: -Infinity},
{numOctaves: [1, 1]},
- {numOctaves: "test"},
+ {numOctaves: 'test'},
{seed: {}},
{seed: NaN},
@@ -46,7 +46,7 @@ const errorTestCases = [
{seed: undefined},
{seed: -Infinity},
{seed: [1, 1]},
- {seed: "test"},
+ {seed: 'test'},
{stitchTiles: {}},
{stitchTiles: NaN},
@@ -54,14 +54,14 @@ const errorTestCases = [
{stitchTiles: undefined},
{stitchTiles: -Infinity},
{stitchTiles: [1, 1]},
- {stitchTiles: "test"},
+ {stitchTiles: 'test'},
{stitchTiles: null},
{stitchTiles: []},
{stitchTiles: [10]},
{stitchTiles: 30},
{stitchTiles: false},
{stitchTiles: true},
- {stitchTiles: "10"},
+ {stitchTiles: '10'},
{stitchTiles: -1},
{type: {}},
@@ -70,14 +70,14 @@ const errorTestCases = [
{type: undefined},
{type: -Infinity},
{type: [1, 1]},
- {type: "test"},
+ {type: 'test'},
{type: null},
{type: []},
{type: [10]},
{type: 30},
{type: false},
{type: true},
- {type: "10"},
+ {type: '10'},
{type: -1},
]
@@ -90,7 +90,7 @@ const workingTestCases = [
{baseFrequency: 30},
{baseFrequency: false},
{baseFrequency: true},
- {baseFrequency: "10"},
+ {baseFrequency: '10'},
{numOctaves: null},
{numOctaves: []},
@@ -98,7 +98,7 @@ const workingTestCases = [
{numOctaves: 30},
{numOctaves: false},
{numOctaves: true},
- {numOctaves: "10"},
+ {numOctaves: '10'},
{seed: null},
{seed: []},
@@ -106,23 +106,23 @@ const workingTestCases = [
{seed: 30},
{seed: false},
{seed: true},
- {seed: "10"},
+ {seed: '10'},
{seed: -1},
- {stitchTiles: "stitch"},
- {stitchTiles: "noStitch"},
+ {stitchTiles: 'stitch'},
+ {stitchTiles: 'noStitch'},
- {type: "fractalNoise"},
- {type: "turbulence"},
+ {type: 'fractalNoise'},
+ {type: 'turbulence'},
]
for (testCase of errorTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); });
}
for (testCase of workingTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
_assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null");
}
})(canvas, ctx);
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js
index 76673fab9a7..1bed65ad156 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js
@@ -24,7 +24,7 @@ const errorTestCases = [
{baseFrequency: Infinity},
{baseFrequency: undefined},
{baseFrequency: -Infinity},
- {baseFrequency: "test"},
+ {baseFrequency: 'test'},
{numOctaves: {}},
{numOctaves: -1},
@@ -33,7 +33,7 @@ const errorTestCases = [
{numOctaves: undefined},
{numOctaves: -Infinity},
{numOctaves: [1, 1]},
- {numOctaves: "test"},
+ {numOctaves: 'test'},
{seed: {}},
{seed: NaN},
@@ -41,7 +41,7 @@ const errorTestCases = [
{seed: undefined},
{seed: -Infinity},
{seed: [1, 1]},
- {seed: "test"},
+ {seed: 'test'},
{stitchTiles: {}},
{stitchTiles: NaN},
@@ -49,14 +49,14 @@ const errorTestCases = [
{stitchTiles: undefined},
{stitchTiles: -Infinity},
{stitchTiles: [1, 1]},
- {stitchTiles: "test"},
+ {stitchTiles: 'test'},
{stitchTiles: null},
{stitchTiles: []},
{stitchTiles: [10]},
{stitchTiles: 30},
{stitchTiles: false},
{stitchTiles: true},
- {stitchTiles: "10"},
+ {stitchTiles: '10'},
{stitchTiles: -1},
{type: {}},
@@ -65,14 +65,14 @@ const errorTestCases = [
{type: undefined},
{type: -Infinity},
{type: [1, 1]},
- {type: "test"},
+ {type: 'test'},
{type: null},
{type: []},
{type: [10]},
{type: 30},
{type: false},
{type: true},
- {type: "10"},
+ {type: '10'},
{type: -1},
]
@@ -85,7 +85,7 @@ const workingTestCases = [
{baseFrequency: 30},
{baseFrequency: false},
{baseFrequency: true},
- {baseFrequency: "10"},
+ {baseFrequency: '10'},
{numOctaves: null},
{numOctaves: []},
@@ -93,7 +93,7 @@ const workingTestCases = [
{numOctaves: 30},
{numOctaves: false},
{numOctaves: true},
- {numOctaves: "10"},
+ {numOctaves: '10'},
{seed: null},
{seed: []},
@@ -101,23 +101,23 @@ const workingTestCases = [
{seed: 30},
{seed: false},
{seed: true},
- {seed: "10"},
+ {seed: '10'},
{seed: -1},
- {stitchTiles: "stitch"},
- {stitchTiles: "noStitch"},
+ {stitchTiles: 'stitch'},
+ {stitchTiles: 'noStitch'},
- {type: "fractalNoise"},
- {type: "turbulence"},
+ {type: 'fractalNoise'},
+ {type: 'turbulence'},
]
for (testCase of errorTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); });
}
for (testCase of workingTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
_assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null");
}
t.done();
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml
index bdf3dcfe9fc..246b73e7f1a 100644
--- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml
@@ -40,11 +40,11 @@
@assert ctx.filter == 'none';
ctx.filter = 'blur(5px)';
@assert ctx.filter == 'blur(5px)';
- ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
+ ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
@assert ctx.filter.toString() == '[object CanvasFilter]';
ctx.filter = new CanvasFilter([
- {filter: "gaussianBlur", stdDeviation: 5},
- {filter: "gaussianBlur", stdDeviation: 10}
+ {filter: 'gaussianBlur', stdDeviation: 5},
+ {filter: 'gaussianBlur', stdDeviation: 10}
]);
@assert ctx.filter.toString() == '[object CanvasFilter]';
var canvas2 = document.createElement('canvas');
@@ -55,8 +55,8 @@
@assert ctx.filter == 'blur(5px)';
ctx.filter = 'none';
@assert ctx.filter == 'none';
- ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
- ctx.filter = "this string is not a filter and should do nothing";
+ ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
+ ctx.filter = 'this string is not a filter and should do nothing';
@assert ctx.filter.toString() == '[object CanvasFilter]';
- name: 2d.filter.canvasFilterObject.tentative
@@ -66,11 +66,11 @@
@assert ctx.filter == 'none';
ctx.filter = 'blur(5px)';
@assert ctx.filter == 'blur(5px)';
- ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
+ ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
@assert ctx.filter.toString() == '[object CanvasFilter]';
ctx.filter = new CanvasFilter([
- {filter: "gaussianBlur", stdDeviation: 5},
- {filter: "gaussianBlur", stdDeviation: 10}
+ {filter: 'gaussianBlur', stdDeviation: 5},
+ {filter: 'gaussianBlur', stdDeviation: 10}
]);
@assert ctx.filter.toString() == '[object CanvasFilter]';
var canvas2 = new OffscreenCanvas(100, 50);
@@ -81,61 +81,61 @@
@assert ctx.filter == 'blur(5px)';
ctx.filter = 'none';
@assert ctx.filter == 'none';
- ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5});
- ctx.filter = "this string is not a filter and should do nothing";
+ ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5});
+ ctx.filter = 'this string is not a filter and should do nothing';
@assert ctx.filter.toString() == '[object CanvasFilter]';
- name: 2d.filter.canvasFilterObject.blur.exceptions.tentative
desc: Test exceptions on CanvasFilter() blur.object
code: |
- @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur"});
- @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined});
- @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"});
- @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]});
- @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN});
- @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}});
+ @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur'});
+ @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined});
+ @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'});
+ @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]});
+ @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN});
+ @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}});
- name: 2d.filter.canvasFilterObject.colorMatrix.tentative
desc: Test the functionality of ColorMatrix filters in CanvasFilter objects
code: |
- @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: undefined});
- @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: "foo"});
- @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: null});
- @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]});
- @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]});
- @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]});
- ctx.fillStyle = "#f00";
- ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0});
+ @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: undefined});
+ @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: 'foo'});
+ @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: null});
+ @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]});
+ @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']});
+ @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]});
+ ctx.fillStyle = '#f00';
+ ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0});
ctx.fillRect(0, 0, 100, 50);
@assert pixel 10,10 ==~ 255,0,0,255;
- ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90});
+ ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90});
ctx.fillRect(0, 0, 100, 50);
@assert pixel 10,10 ==~ 0,91,0,255;
- ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180});
+ ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180});
ctx.fillRect(0, 0, 100, 50);
@assert pixel 10,10 ==~ 0,109,109,255;
- ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270});
+ ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270});
ctx.fillRect(0, 0, 100, 50);
@assert pixel 10,10 ==~ 109,18,255,255;
- ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5});
+ ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5});
ctx.fillRect(0, 0, 100, 50);
@assert pixel 10,10 ==~ 155,27,27,255;
ctx.clearRect(0, 0, 100, 50);
- ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"});
+ ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'});
ctx.fillRect(0, 0, 100, 50);
@assert pixel 10,10 ==~ 0,0,0,54;
- ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [
+ ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [
0, 0, 0, 0, 0,
1, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 0, 0, 1, 0
]});
ctx.fillRect(0, 0, 50, 25);
- ctx.fillStyle = "#0f0";
+ ctx.fillStyle = '#0f0';
ctx.fillRect(50, 0, 50, 25);
- ctx.fillStyle = "#00f";
+ ctx.fillStyle = '#00f';
ctx.fillRect(0, 25, 50, 25);
- ctx.fillStyle = "#fff";
+ ctx.fillStyle = '#fff';
ctx.fillRect(50, 25, 50, 25);
@assert pixel 10,10 ==~ 0,255,0,255;
@assert pixel 60,10 ==~ 0,255,0,255;
@@ -145,23 +145,23 @@
- name: 2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative
desc: Test exceptions on CanvasFilter() convolveMatrix
code: |
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix"});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", divisor: 2});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]});
- @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix'});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', divisor: 2});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]});
+ @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]});
// This should not throw an error
- ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]});
- ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]});
+ ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]});
+ ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]});
- name: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative
desc: Test pixels on CanvasFilter() componentTransfer with linear type
@@ -177,10 +177,10 @@
const slopes = [0.5, 1.2, -0.2];
const intercepts = [0.25, 0, 0.5];
- ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]},
- funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]},
- funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]},
+ ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]},
+ funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]},
+ funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]},
});
const inputColors = [
@@ -201,10 +201,10 @@
- name: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative
desc: Test pixels on CanvasFilter() componentTransfer with identity type
code: |
- ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "identity"},
- funcG: {type: "identity"},
- funcB: {type: "identity"},
+ ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'identity'},
+ funcG: {type: 'identity'},
+ funcB: {type: 'identity'},
});
const inputColors = [
@@ -236,10 +236,10 @@
const amplitudes = [2, 1.1, 0.5];
const exponents = [5, 3, 1];
const offsets = [0.25, 0, 0.5];
- ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
- funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
- funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
+ ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]},
+ funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]},
+ funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]},
});
const inputColors = [
@@ -281,10 +281,10 @@
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
- ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "table", tableValues: tableValuesR},
- funcG: {type: "table", tableValues: tableValuesG},
- funcB: {type: "table", tableValues: tableValuesB},
+ ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'table', tableValues: tableValuesR},
+ funcG: {type: 'table', tableValues: tableValuesG},
+ funcB: {type: 'table', tableValues: tableValuesB},
});
const inputColors = [
@@ -326,10 +326,10 @@
tableValuesR = [0, 0, 1, 1];
tableValuesG = [2, 0, 0.5, 3];
tableValuesB = [1, -1, 5, 0];
- ctx.filter = new CanvasFilter({filter: "componentTransfer",
- funcR: {type: "discrete", tableValues: tableValuesR},
- funcG: {type: "discrete", tableValues: tableValuesG},
- funcB: {type: "discrete", tableValues: tableValuesB},
+ ctx.filter = new CanvasFilter({filter: 'componentTransfer',
+ funcR: {type: 'discrete', tableValues: tableValuesR},
+ funcG: {type: 'discrete', tableValues: tableValuesG},
+ funcB: {type: 'discrete', tableValues: tableValuesB},
});
const inputColors = [
@@ -359,135 +359,97 @@
ctx.fillStyle = 'crimson';
// Parameter defaults.
- ctx.filter = new CanvasFilter({filter: "dropShadow"});
+ ctx.filter = new CanvasFilter({filter: 'dropShadow'});
ctx.fillRect(10, 10, 80, 80);
// All parameters specified.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5,
- floodColor: "purple", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5,
+ floodColor: 'purple', floodOpacity: 0.7});
ctx.fillRect(110, 10, 80, 80);
// Named color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3,
+ floodColor: 'purple'});
ctx.fillRect(10, 110, 80, 80);
// System color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "LinkText"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'LinkText'});
ctx.fillRect(110, 110, 80, 80);
// No blur.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0,
- floodColor: "purple"});
+ {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0,
+ floodColor: 'purple'});
ctx.fillRect(210, 110, 80, 80);
// Numerical color.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 1)"});
+ {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 1)'});
ctx.fillRect(310, 110, 80, 80);
// Transparent floodColor.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)"});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)'});
ctx.fillRect(410, 110, 80, 80);
// Transparent floodColor and floodOpacity.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3,
- floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7});
+ {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3,
+ floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7});
ctx.fillRect(510, 110, 80, 80);
// Degenerate parameter values.
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null,
- floodColor: "purple", floodOpacity: [2]});
+ {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null,
+ floodColor: 'purple', floodOpacity: [2]});
ctx.fillRect(10, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5,
- floodColor: "purple", floodOpacity: '0.8'});
+ {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5,
+ floodColor: 'purple', floodOpacity: '0.8'});
ctx.fillRect(110, 210, 80, 80);
ctx.filter = new CanvasFilter(
- {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false,
- floodColor: "purple", floodOpacity: ['0.4']});
+ {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false,
+ floodColor: 'purple', floodOpacity: ['0.4']});
ctx.fillRect(210, 210, 80, 80);
html_reference: |
- <style>
- .background {
- background-color: teal;
- position: absolute;
- left: 0px;
- width: 620px;
- height: 50px;
- }
-
- .testcase {
- position: absolute;
- background-color: crimson;
- width: 80px;
- height: 80px;
- }
- </style>
-
- <div style="position: relative">
- <div class='background' style="top: 0px;"></div>
- <div class='background' style="top: 100px;"></div>
- <div class='background' style="top: 200px;"></div>
-
- <div class='testcase'
- style="left: 10px; top: 10px;
- filter: drop-shadow(2px 2px 2px black);">
- </div>
- <div class='testcase'
- style="left: 110px; top: 10px;
- filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7));">
- </div>
- <div class='testcase'
- style="left: 10px; top: 110px;
- filter: drop-shadow(10px 10px 3px purple)">
- </div>
- <div class='testcase'
- style="left: 110px; top: 110px;
- filter: drop-shadow(15px 10px 3px LinkText)">
- </div>
- <div class='testcase'
- style="left: 210px; top: 110px;
- filter: drop-shadow(10px 15px 0px purple)">
- </div>
- <div class='testcase'
- style="left: 310px; top: 110px;
- filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))">
- </div>
- <div class='testcase'
- style="left: 410px; top: 110px;
- filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))">
- </div>
- <div class='testcase'
- style="left: 510px; top: 110px;
- filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))">
- </div>
-
- <div class='testcase'
- style="left: 10px; top: 210px;
- filter: drop-shadow(-5px 0px 0px purple);">
- </div>
- <div class='testcase'
- style="left: 110px; top: 210px;
- filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8));">
- </div>
- <div class='testcase'
- style="left: 210px; top: 210px;
- filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4));">
- </div>
- </div>
+ <svg width=620 height=320 xmlns="http://www.w3.org/2000/svg">
+ <rect x=0 y=0 width=100% height=50 fill="teal" />
+ <rect x=0 y=100 width=100% height=50 fill="teal" />
+ <rect x=0 y=200 width=100% height=50 fill="teal" />
+
+ <rect x=10 y=10 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(2px 2px 2px black)"/>
+ <rect x=110 y=10 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7))"/>
+
+ <rect x=10 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(10px 10px 3px purple)"/>
+ <rect x=110 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px LinkText)"/>
+ <rect x=210 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(10px 15px 0px purple)"/>
+ <rect x=310 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/>
+ <rect x=410 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"/>
+ <rect x=510 y=110 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"/>
+
+ <rect x=10 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(-5px 0px 0px purple)"/>
+ <rect x=110 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8))"/>
+ <rect x=210 y=210 width=80 height=80 fill="crimson"
+ style="filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/>
+ </svg>
- name: 2d.filter.canvasFilterObject.dropShadow.exceptions.tentative
desc: Test exceptions on CanvasFilter() dropShadow object
@@ -521,7 +483,7 @@
{baseFrequency: Infinity},
{baseFrequency: undefined},
{baseFrequency: -Infinity},
- {baseFrequency: "test"},
+ {baseFrequency: 'test'},
{numOctaves: {}},
{numOctaves: -1},
@@ -530,7 +492,7 @@
{numOctaves: undefined},
{numOctaves: -Infinity},
{numOctaves: [1, 1]},
- {numOctaves: "test"},
+ {numOctaves: 'test'},
{seed: {}},
{seed: NaN},
@@ -538,7 +500,7 @@
{seed: undefined},
{seed: -Infinity},
{seed: [1, 1]},
- {seed: "test"},
+ {seed: 'test'},
{stitchTiles: {}},
{stitchTiles: NaN},
@@ -546,14 +508,14 @@
{stitchTiles: undefined},
{stitchTiles: -Infinity},
{stitchTiles: [1, 1]},
- {stitchTiles: "test"},
+ {stitchTiles: 'test'},
{stitchTiles: null},
{stitchTiles: []},
{stitchTiles: [10]},
{stitchTiles: 30},
{stitchTiles: false},
{stitchTiles: true},
- {stitchTiles: "10"},
+ {stitchTiles: '10'},
{stitchTiles: -1},
{type: {}},
@@ -562,14 +524,14 @@
{type: undefined},
{type: -Infinity},
{type: [1, 1]},
- {type: "test"},
+ {type: 'test'},
{type: null},
{type: []},
{type: [10]},
{type: 30},
{type: false},
{type: true},
- {type: "10"},
+ {type: '10'},
{type: -1},
]
@@ -582,7 +544,7 @@
{baseFrequency: 30},
{baseFrequency: false},
{baseFrequency: true},
- {baseFrequency: "10"},
+ {baseFrequency: '10'},
{numOctaves: null},
{numOctaves: []},
@@ -590,7 +552,7 @@
{numOctaves: 30},
{numOctaves: false},
{numOctaves: true},
- {numOctaves: "10"},
+ {numOctaves: '10'},
{seed: null},
{seed: []},
@@ -598,22 +560,22 @@
{seed: 30},
{seed: false},
{seed: true},
- {seed: "10"},
+ {seed: '10'},
{seed: -1},
- {stitchTiles: "stitch"},
- {stitchTiles: "noStitch"},
+ {stitchTiles: 'stitch'},
+ {stitchTiles: 'noStitch'},
- {type: "fractalNoise"},
- {type: "turbulence"},
+ {type: 'fractalNoise'},
+ {type: 'turbulence'},
]
for (testCase of errorTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
@assert throws TypeError new CanvasFilter(filterOptions);
}
for (testCase of workingTestCases) {
- const filterOptions = {...{filter: "turbulence"}, ...testCase};
+ const filterOptions = {...{filter: 'turbulence'}, ...testCase};
@assert new CanvasFilter(filterOptions) != null;
}
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html
index 144217df384..ac82e3396d6 100644
--- a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html
@@ -12,7 +12,12 @@
// This creates a test()
assert_root_color_scheme("dark", "<meta> set the color-scheme to dark");
- test(() => {
- assert_equals(document.querySelector(":root:lang(dark)"), document.documentElement);
- }, "<meta> set the content-language to dark");
+ // We can't test content-language against :lang(), because CSS Selectors 4
+ // references BCP 47 syntax and RFC4647 "Matching of Language Tags", but
+ // "dark" is not a well-formed BCP 47 tag and therefore cannot be matched.
+ // Therefore, the test that content-language gets set is split off to a
+ // separate testcase using a well-formed lang tag as the content.
+ // test(() => {
+ // assert_equals(document.querySelector(":root:lang(dark)"), document.documentElement);
+ // }, "<meta> set the content-language to dark");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html
new file mode 100644
index 00000000000..b73013a341b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<title>Setting both http-equiv and name attributes on a meta element</title>
+<meta http-equiv=content-language name=color-scheme content=de-DE>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ // We don't attempt to test the color-scheme here because "de-DE" is not a valid
+ // value for it.
+
+ test(() => {
+ assert_equals(document.querySelector(":root:lang(de-DE)"), document.documentElement);
+ }, "<meta> set the content-language to de-DE");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html
index 3933b93894b..171829d90f3 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html
@@ -4,12 +4,7 @@
<link rel="stylesheet" href="/fonts/ahem.css">
<selectmenu id="selectMenu0">
- <div popover slot="listbox" behavior="listbox">
- <option>
- option with image displayed
- <img src="/images/green-256x256.png">
- </option>
- </div>
+ <option>option with image displayed</option>
</selectmenu>
<div id=fakelistbox>
option with image displayed
@@ -17,15 +12,16 @@
</div>
<style>
- html {
+ html,selectmenu {
font-family: Ahem;
}
#fakelistbox {
/* Per spec: */
display: block;
position: fixed;
- top: 20px;
+ top: 30px;
left: 0;
+ font-size: 0.765625em /* 0.875 * 0.875 */;
/* Per settings in test file: */
width: fit-content;
height: fit-content;
@@ -43,6 +39,6 @@
position: absolute;
top: 0px;
left: 0px;
- height: 20px;
+ height: 30px;
}
</style>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html
index 0fad1a1918f..05bc651cb7c 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html
@@ -9,14 +9,14 @@
<script src="/resources/testdriver-vendor.js"></script>
<style>
- html {
+ html,selectmenu {
font-family: Ahem;
}
selectmenu {
position: absolute;
top: 0px;
left: 0px;
- height: 20px;
+ height: 30px;
}
[popover] {
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js
index cf3864a2940..84fe5285617 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js
@@ -10,17 +10,21 @@ function createFakeSelectmenu(selectedValueText) {
<style>
.fake-selectmenu {
display: inline-block;
+ user-select: none;
+ font-family: sans-serif;
+ font-size: .875em;
}
.fake-selectmenu-internal-selectmenu-button {
display: inline-flex;
align-items: center;
- background-color: #ffffff;
- padding: 0 0 0 3px;
- border: 1px solid #767676;
- border-radius: 2px;
cursor: default;
appearance: none;
+ background-color: Field;
+ color: ButtonText;
+ border: 1px solid ButtonBorder;
+ border-radius: 0.25em;
+ padding: 0.25em;
}
.fake-selectmenu-internal-selectmenu-button-icon {
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini
index f0041b0aa29..60d2e38ecad 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini
@@ -1,31 +1,29 @@
[webtransport-h3.https.sub.any.html]
- disabled:
- if product == "firefox": times out
[WebTransport server should be running and should handle a bidirectional stream]
expected:
- if product == "chrome": PASS
+ if product == "chrome" or product == "firefox": PASS
+ FAIL
+
+[webtransport-h3.https.sub.any.window.html]
+ [WebTransport server should be running and should handle a bidirectional stream]
+ expected:
+ if product == "chrome" or product == "firefox": PASS
FAIL
[webtransport-h3.https.sub.any.worker.html]
- disabled:
- if product == "firefox": times out
[WebTransport server should be running and should handle a bidirectional stream]
expected:
- if product == "chrome": PASS
+ if product == "chrome" or product == "firefox": PASS
FAIL
[webtransport-h3.https.sub.any.sharedworker.html]
- disabled:
- if product == "firefox": times out
[WebTransport server should be running and should handle a bidirectional stream]
expected:
- if product == "chrome": PASS
+ if product == "chrome" or product == "firefox": PASS
FAIL
[webtransport-h3.https.sub.any.serviceworker.html]
- disabled:
- if product == "firefox": times out
[WebTransport server should be running and should handle a bidirectional stream]
expected:
- if product == "chrome": PASS
+ if product == "chrome" or product == "firefox": PASS
FAIL
diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini
index 647b875e5b0..5632dcf1129 100644
--- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini
+++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini
@@ -1,3 +1,3 @@
[wheelScroll.html]
expected:
- if product == "firefox" or product == "epiphany": ERROR
+ if product == "epiphany": ERROR
diff --git a/tests/wpt/web-platform-tests/interfaces/EXT_clip_cull_distance.idl b/tests/wpt/web-platform-tests/interfaces/EXT_clip_cull_distance.idl
deleted file mode 100644
index 18d1c02a11a..00000000000
--- a/tests/wpt/web-platform-tests/interfaces/EXT_clip_cull_distance.idl
+++ /dev/null
@@ -1,20 +0,0 @@
-// GENERATED CONTENT - DO NOT EDIT
-// Content was automatically extracted by Reffy into webref
-// (https://github.com/w3c/webref)
-// Source: WebGL EXT_clip_cull_distance Extension Draft Specification (https://registry.khronos.org/webgl/extensions/EXT_clip_cull_distance/)
-
-[Exposed=(Window,Worker), LegacyNoInterfaceObject]
-interface EXT_clip_cull_distance {
- const GLenum MAX_CLIP_DISTANCES_EXT = 0x0D32;
- const GLenum MAX_CULL_DISTANCES_EXT = 0x82F9;
- const GLenum MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT = 0x82FA;
-
- const GLenum CLIP_DISTANCE0_EXT = 0x3000;
- const GLenum CLIP_DISTANCE1_EXT = 0x3001;
- const GLenum CLIP_DISTANCE2_EXT = 0x3002;
- const GLenum CLIP_DISTANCE3_EXT = 0x3003;
- const GLenum CLIP_DISTANCE4_EXT = 0x3004;
- const GLenum CLIP_DISTANCE5_EXT = 0x3005;
- const GLenum CLIP_DISTANCE6_EXT = 0x3006;
- const GLenum CLIP_DISTANCE7_EXT = 0x3007;
-};
diff --git a/tests/wpt/web-platform-tests/interfaces/FedCM.idl b/tests/wpt/web-platform-tests/interfaces/FedCM.idl
index b3ddb54e0c6..8de87e88b05 100644
--- a/tests/wpt/web-platform-tests/interfaces/FedCM.idl
+++ b/tests/wpt/web-platform-tests/interfaces/FedCM.idl
@@ -3,6 +3,25 @@
// (https://github.com/w3c/webref)
// Source: Federated Credential Management API (https://fedidcg.github.io/FedCM/)
+[Exposed=Window, SecureContext]
+interface IdentityCredential : Credential {
+ readonly attribute USVString? token;
+};
+
+partial dictionary CredentialRequestOptions {
+ IdentityCredentialRequestOptions identity;
+};
+
+dictionary IdentityCredentialRequestOptions {
+ sequence<IdentityProviderConfig> providers;
+};
+
+dictionary IdentityProviderConfig {
+ required USVString configURL;
+ required USVString clientId;
+ USVString nonce;
+};
+
dictionary IdentityProviderWellKnown {
required sequence<USVString> provider_urls;
};
@@ -16,6 +35,7 @@ dictionary IdentityProviderBranding {
USVString background_color;
USVString color;
sequence<IdentityProviderIcon> icons;
+ USVString name;
};
dictionary IdentityProviderAPIConfig {
@@ -30,52 +50,18 @@ dictionary IdentityProviderAccount {
required USVString name;
required USVString email;
USVString given_name;
+ USVString picture;
sequence<USVString> approved_clients;
};
dictionary IdentityProviderAccountList {
sequence<IdentityProviderAccount> accounts;
};
-dictionary IdentityProviderClientMetadata {
- USVString privacy_policy_url;
- USVString terms_of_service_url;
-};
-
dictionary IdentityProviderToken {
required USVString token;
};
-[Exposed=Window, SecureContext]
-interface IdentityCredential : Credential {
- readonly attribute USVString? token;
-};
-
-partial dictionary CredentialRequestOptions {
- IdentityCredentialRequestOptions identity;
-};
-
-dictionary IdentityCredentialRequestOptions {
- sequence<IdentityProviderConfig> providers;
-};
-
-dictionary IdentityProviderConfig {
- required USVString configURL;
- required USVString clientId;
- USVString nonce;
-};
-
-dictionary IdentityCredentialLogoutRPsRequest {
- required USVString url;
- required USVString accountId;
-};
-
-[Exposed=Window, SecureContext]
-partial interface IdentityCredential {
- static Promise<undefined> logoutRPs(sequence<IdentityCredentialLogoutRPsRequest> logoutRequests);
-};
-
-[Exposed=Window, SecureContext]
-interface IdentityProvider {
- static undefined login();
- static undefined logout();
+dictionary IdentityProviderClientMetadata {
+ USVString privacy_policy_url;
+ USVString terms_of_service_url;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/WEBGL_clip_cull_distance.idl b/tests/wpt/web-platform-tests/interfaces/WEBGL_clip_cull_distance.idl
new file mode 100644
index 00000000000..46fa921fd53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/WEBGL_clip_cull_distance.idl
@@ -0,0 +1,20 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: WebGL WEBGL_clip_cull_distance Extension Draft Specification (https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/)
+
+[Exposed=(Window,Worker), LegacyNoInterfaceObject]
+interface WEBGL_clip_cull_distance {
+ const GLenum MAX_CLIP_DISTANCES_WEBGL = 0x0D32;
+ const GLenum MAX_CULL_DISTANCES_WEBGL = 0x82F9;
+ const GLenum MAX_COMBINED_CLIP_AND_CULL_DISTANCES_WEBGL = 0x82FA;
+
+ const GLenum CLIP_DISTANCE0_WEBGL = 0x3000;
+ const GLenum CLIP_DISTANCE1_WEBGL = 0x3001;
+ const GLenum CLIP_DISTANCE2_WEBGL = 0x3002;
+ const GLenum CLIP_DISTANCE3_WEBGL = 0x3003;
+ const GLenum CLIP_DISTANCE4_WEBGL = 0x3004;
+ const GLenum CLIP_DISTANCE5_WEBGL = 0x3005;
+ const GLenum CLIP_DISTANCE6_WEBGL = 0x3006;
+ const GLenum CLIP_DISTANCE7_WEBGL = 0x3007;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/WEBGL_provoking_vertex.idl b/tests/wpt/web-platform-tests/interfaces/WEBGL_provoking_vertex.idl
new file mode 100644
index 00000000000..035e1d233d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/WEBGL_provoking_vertex.idl
@@ -0,0 +1,13 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: WebGL WEBGL_provoking_vertex Extension Specification (https://registry.khronos.org/webgl/extensions/WEBGL_provoking_vertex/)
+
+[Exposed=(Window,Worker), LegacyNoInterfaceObject]
+interface WEBGL_provoking_vertex {
+ const GLenum FIRST_VERTEX_CONVENTION_WEBGL = 0x8E4D;
+ const GLenum LAST_VERTEX_CONVENTION_WEBGL = 0x8E4E; // default
+ const GLenum PROVOKING_VERTEX_WEBGL = 0x8E4F;
+
+ undefined provokingVertexWEBGL(GLenum provokeMode);
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/anchors.idl b/tests/wpt/web-platform-tests/interfaces/anchors.idl
index 5aa9395f09f..d8c5aa69a87 100644
--- a/tests/wpt/web-platform-tests/interfaces/anchors.idl
+++ b/tests/wpt/web-platform-tests/interfaces/anchors.idl
@@ -17,6 +17,8 @@ partial interface XRFrame {
};
partial interface XRSession {
+ readonly attribute FrozenArray<DOMString> persistentAnchors;
+
Promise<XRAnchor> restorePersistentAnchor(DOMString uuid);
Promise<undefined> deletePersistentAnchor(DOMString uuid);
};
diff --git a/tests/wpt/web-platform-tests/interfaces/badging.idl b/tests/wpt/web-platform-tests/interfaces/badging.idl
index f34dfa7e04a..8b401e057ad 100644
--- a/tests/wpt/web-platform-tests/interfaces/badging.idl
+++ b/tests/wpt/web-platform-tests/interfaces/badging.idl
@@ -4,14 +4,10 @@
// Source: Badging API (https://w3c.github.io/badging/)
[SecureContext]
-partial interface Navigator {
- Promise<undefined> setClientBadge(optional [EnforceRange] unsigned long long contents);
- Promise<undefined> clearClientBadge();
-};
-
-[SecureContext]
interface mixin NavigatorBadge {
- Promise<undefined> setAppBadge(optional [EnforceRange] unsigned long long contents);
+ Promise<undefined> setAppBadge(
+ optional [EnforceRange] unsigned long long contents
+ );
Promise<undefined> clearAppBadge();
};
diff --git a/tests/wpt/web-platform-tests/interfaces/compression.idl b/tests/wpt/web-platform-tests/interfaces/compression.idl
index 88be302a4a6..7525d7c9847 100644
--- a/tests/wpt/web-platform-tests/interfaces/compression.idl
+++ b/tests/wpt/web-platform-tests/interfaces/compression.idl
@@ -3,14 +3,20 @@
// (https://github.com/w3c/webref)
// Source: Compression Streams (https://wicg.github.io/compression/)
+enum CompressionFormat {
+ "deflate",
+ "deflate-raw",
+ "gzip",
+};
+
[Exposed=*]
interface CompressionStream {
- constructor(DOMString format);
+ constructor(CompressionFormat format);
};
CompressionStream includes GenericTransformStream;
[Exposed=*]
interface DecompressionStream {
- constructor(DOMString format);
+ constructor(CompressionFormat format);
};
DecompressionStream includes GenericTransformStream;
diff --git a/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl b/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl
index 42ff4f207ab..3e35dc4ee2d 100644
--- a/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl
+++ b/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl
@@ -3,17 +3,15 @@
// (https://github.com/w3c/webref)
// Source: Compute Pressure Level 1 (https://w3c.github.io/compute-pressure/)
-enum PressureState { "nominal", "fair", "serious", "critical" };
+enum PressureSource { "thermals", "cpu" };
-enum PressureFactor { "thermal", "power-supply" };
+enum PressureState { "nominal", "fair", "serious", "critical" };
callback PressureUpdateCallback = undefined (
sequence<PressureRecord> changes,
PressureObserver observer
);
-enum PressureSource { "cpu" };
-
[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureObserver {
constructor(PressureUpdateCallback callback, optional PressureObserverOptions options = {});
@@ -30,7 +28,6 @@ interface PressureObserver {
interface PressureRecord {
readonly attribute PressureSource source;
readonly attribute PressureState state;
- readonly attribute FrozenArray<PressureFactor> factors;
readonly attribute DOMHighResTimeStamp time;
[Default] object toJSON();
};
diff --git a/tests/wpt/web-platform-tests/interfaces/contact-picker.idl b/tests/wpt/web-platform-tests/interfaces/contact-picker.idl
index aece81664e4..0119d0e2ce6 100644
--- a/tests/wpt/web-platform-tests/interfaces/contact-picker.idl
+++ b/tests/wpt/web-platform-tests/interfaces/contact-picker.idl
@@ -1,7 +1,7 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
-// Source: Contact Picker API (https://w3c.github.io/contact-picker/spec/)
+// Source: Contact Picker API (https://w3c.github.io/contact-picker/)
[Exposed=Window]
partial interface Navigator {
diff --git a/tests/wpt/web-platform-tests/interfaces/cookie-store.idl b/tests/wpt/web-platform-tests/interfaces/cookie-store.idl
index 72ef3f8c824..f44b4c63546 100644
--- a/tests/wpt/web-platform-tests/interfaces/cookie-store.idl
+++ b/tests/wpt/web-platform-tests/interfaces/cookie-store.idl
@@ -36,7 +36,7 @@ enum CookieSameSite {
dictionary CookieInit {
required USVString name;
required USVString value;
- EpochTimeStamp? expires = null;
+ DOMHighResTimeStamp? expires = null;
USVString? domain = null;
USVString path = "/";
CookieSameSite sameSite = "strict";
@@ -53,7 +53,7 @@ dictionary CookieListItem {
USVString value;
USVString? domain;
USVString path;
- EpochTimeStamp? expires;
+ DOMHighResTimeStamp? expires;
boolean secure;
CookieSameSite sameSite;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl
new file mode 100644
index 00000000000..37cdfb82930
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl
@@ -0,0 +1,10 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: CSS Cascading and Inheritance Level 6 (https://drafts.csswg.org/css-cascade-6/)
+
+[Exposed=Window]
+interface CSSScopeRule : CSSGroupingRule {
+ readonly attribute CSSOMString start;
+ readonly attribute CSSOMString end;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/css-contain.idl b/tests/wpt/web-platform-tests/interfaces/css-contain.idl
index 6b29119617a..be2137a4a6a 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-contain.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-contain.idl
@@ -4,10 +4,10 @@
// Source: CSS Containment Module Level 2 (https://drafts.csswg.org/css-contain-2/)
[Exposed=Window]
-interface ContentVisibilityAutoStateChangedEvent : Event {
- constructor(DOMString type, optional ContentVisibilityAutoStateChangedEventInit eventInitDict = {});
+interface ContentVisibilityAutoStateChangeEvent : Event {
+ constructor(DOMString type, optional ContentVisibilityAutoStateChangeEventInit eventInitDict = {});
readonly attribute boolean skipped;
};
-dictionary ContentVisibilityAutoStateChangedEventInit : EventInit {
+dictionary ContentVisibilityAutoStateChangeEventInit : EventInit {
boolean skipped = false;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl
index 595a424e014..0df6a0327a2 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl
@@ -13,9 +13,7 @@ interface CSSStyleValue {
[Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)]
interface StylePropertyMapReadOnly {
iterable<USVString, sequence<CSSStyleValue>>;
- any get(USVString property);
- /* 'any' means (undefined or CSSStyleValue) here,
- see https://github.com/heycam/webidl/issues/60 */
+ (undefined or CSSStyleValue) get(USVString property);
sequence<CSSStyleValue> getAll(USVString property);
boolean has(USVString property);
readonly attribute unsigned long size;
diff --git a/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl b/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl
index cf9cb8927e4..745eb1d9691 100644
--- a/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl
+++ b/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl
@@ -4,15 +4,15 @@
// Source: CSS View Transitions Module Level 1 (https://drafts.csswg.org/css-view-transitions-1/)
partial interface Document {
- ViewTransition startViewTransition(optional UpdateCallback? callback = null);
+ ViewTransition startViewTransition(optional UpdateCallback? updateCallback = null);
};
callback UpdateCallback = Promise<any> ();
[Exposed=Window]
interface ViewTransition {
- undefined skipTransition();
- readonly attribute Promise<undefined> finished;
- readonly attribute Promise<undefined> ready;
readonly attribute Promise<undefined> updateCallbackDone;
+ readonly attribute Promise<undefined> ready;
+ readonly attribute Promise<undefined> finished;
+ undefined skipTransition();
};
diff --git a/tests/wpt/web-platform-tests/interfaces/device-posture.idl b/tests/wpt/web-platform-tests/interfaces/device-posture.idl
index ba8f9f51f02..0f1dded6313 100644
--- a/tests/wpt/web-platform-tests/interfaces/device-posture.idl
+++ b/tests/wpt/web-platform-tests/interfaces/device-posture.idl
@@ -16,6 +16,5 @@ interface DevicePosture : EventTarget {
enum DevicePostureType {
"continuous",
- "folded",
- "folded-over"
+ "folded"
};
diff --git a/tests/wpt/web-platform-tests/interfaces/dom.idl b/tests/wpt/web-platform-tests/interfaces/dom.idl
index 96acfc6a717..c5b5c94dbcc 100644
--- a/tests/wpt/web-platform-tests/interfaces/dom.idl
+++ b/tests/wpt/web-platform-tests/interfaces/dom.idl
@@ -618,7 +618,7 @@ callback interface XPathNSResolver {
interface mixin XPathEvaluatorBase {
[NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null);
- XPathNSResolver createNSResolver(Node nodeResolver);
+ Node createNSResolver(Node nodeResolver); // legacy
// XPathResult.ANY_TYPE = 0
XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null);
};
diff --git a/tests/wpt/web-platform-tests/interfaces/edit-context.idl b/tests/wpt/web-platform-tests/interfaces/edit-context.idl
index f5e60bd0d02..91d8af2ea68 100644
--- a/tests/wpt/web-platform-tests/interfaces/edit-context.idl
+++ b/tests/wpt/web-platform-tests/interfaces/edit-context.idl
@@ -3,7 +3,7 @@
// (https://github.com/w3c/webref)
// Source: EditContext API (https://w3c.github.io/edit-context/)
-partial interface Element {
+partial interface HTMLElement {
attribute EditContext? editContext;
};
@@ -20,8 +20,8 @@ interface EditContext : EventTarget {
undefined updateText(unsigned long rangeStart, unsigned long rangeEnd,
DOMString text);
undefined updateSelection(unsigned long start, unsigned long end);
- undefined updateControlBound(DOMRect controlBound);
- undefined updateSelectionBound(DOMRect selectionBound);
+ undefined updateControlBounds(DOMRect controlBounds);
+ undefined updateSelectionBounds(DOMRect selectionBounds);
undefined updateCharacterBounds(unsigned long rangeStart, sequence<DOMRect> characterBounds);
sequence<Element> attachedElements();
@@ -31,9 +31,9 @@ interface EditContext : EventTarget {
readonly attribute unsigned long selectionEnd;
readonly attribute unsigned long compositionRangeStart;
readonly attribute unsigned long compositionRangeEnd;
- readonly attribute boolean isInComposition;
- readonly attribute DOMRect controlBound;
- readonly attribute DOMRect selectionBound;
+ readonly attribute boolean isComposing;
+ readonly attribute DOMRect controlBounds;
+ readonly attribute DOMRect selectionBounds;
readonly attribute unsigned long characterBoundsRangeStart;
sequence<DOMRect> characterBounds();
@@ -44,7 +44,7 @@ interface EditContext : EventTarget {
attribute EventHandler oncompositionend;
};
-dictionary TextUpdateEventInit {
+dictionary TextUpdateEventInit : EventInit {
unsigned long updateRangeStart;
unsigned long updateRangeEnd;
DOMString text;
@@ -56,7 +56,7 @@ dictionary TextUpdateEventInit {
[Exposed=Window]
interface TextUpdateEvent : Event {
- constructor(optional TextUpdateEventInit options = {});
+ constructor(DOMString type, optional TextUpdateEventInit options = {});
readonly attribute unsigned long updateRangeStart;
readonly attribute unsigned long updateRangeEnd;
readonly attribute DOMString text;
@@ -79,35 +79,33 @@ dictionary TextFormatInit {
[Exposed=Window]
interface TextFormat {
constructor(optional TextFormatInit options = {});
- attribute unsigned long rangeStart;
- attribute unsigned long rangeEnd;
- attribute DOMString textColor;
- attribute DOMString backgroundColor;
- attribute DOMString underlineStyle;
- attribute DOMString underlineThickness;
- attribute DOMString underlineColor;
+ readonly attribute unsigned long rangeStart;
+ readonly attribute unsigned long rangeEnd;
+ readonly attribute DOMString textColor;
+ readonly attribute DOMString backgroundColor;
+ readonly attribute DOMString underlineStyle;
+ readonly attribute DOMString underlineThickness;
+ readonly attribute DOMString underlineColor;
};
-dictionary TextFormatUpdateEventInit {
+dictionary TextFormatUpdateEventInit : EventInit {
sequence<TextFormat> textFormats;
};
[Exposed=Window]
interface TextFormatUpdateEvent : Event {
- constructor(optional TextFormatUpdateEventInit options = {});
-
+ constructor(DOMString type, optional TextFormatUpdateEventInit options = {});
sequence<TextFormat> getTextFormats();
};
-dictionary CharacterBoundsUpdateEventInit {
+dictionary CharacterBoundsUpdateEventInit : EventInit {
unsigned long rangeStart;
unsigned long rangeEnd;
};
[Exposed=Window]
interface CharacterBoundsUpdateEvent : Event {
- constructor(optional CharacterBoundsUpdateEventInit options = {});
-
+ constructor(DOMString type, optional CharacterBoundsUpdateEventInit options = {});
readonly attribute unsigned long rangeStart;
readonly attribute unsigned long rangeEnd;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl
new file mode 100644
index 00000000000..2869b95e6bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl
@@ -0,0 +1,54 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Fenced frame (https://wicg.github.io/fenced-frame/)
+
+[Exposed=Window]
+interface HTMLFencedFrameElement : HTMLElement {
+ [HTMLConstructor] constructor();
+
+ [CEReactions] attribute FencedFrameConfig? config;
+ [CEReactions] attribute DOMString width;
+ [CEReactions] attribute DOMString height;
+};
+
+enum OpaqueProperty {"opaque"};
+
+typedef (unsigned long or OpaqueProperty) FencedFrameConfigSize;
+typedef (USVString or OpaqueProperty) FencedFrameConfigURL;
+
+[Exposed=Window]
+interface FencedFrameConfig {
+ constructor(USVString url);
+ readonly attribute FencedFrameConfigURL? url;
+ readonly attribute FencedFrameConfigSize? width;
+ readonly attribute FencedFrameConfigSize? height;
+};
+
+enum FenceReportingDestination {
+ "buyer",
+ "seller",
+ "component-seller",
+ "direct-seller",
+ "shared-storage-select-url",
+};
+
+dictionary FenceEvent {
+ required DOMString eventType;
+ required DOMString eventData;
+ required sequence<FenceReportingDestination> destination;
+};
+
+typedef (FenceEvent or DOMString) ReportEventType;
+
+[Exposed=Window]
+interface Fence {
+ undefined reportEvent(ReportEventType event);
+ undefined setReportEventDataForAutomaticBeacons(FenceEvent event);
+ sequence<FencedFrameConfig> getNestedConfigs();
+};
+
+partial interface Window {
+ // Collection of fenced frame APIs
+ readonly attribute Fence? fence;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/fetch.idl b/tests/wpt/web-platform-tests/interfaces/fetch.idl
index 866d09d31bd..81a5e69aee5 100644
--- a/tests/wpt/web-platform-tests/interfaces/fetch.idl
+++ b/tests/wpt/web-platform-tests/interfaces/fetch.idl
@@ -12,6 +12,7 @@ interface Headers {
undefined append(ByteString name, ByteString value);
undefined delete(ByteString name);
ByteString? get(ByteString name);
+ sequence<ByteString> getSetCookie();
boolean has(ByteString name);
undefined set(ByteString name, ByteString value);
iterable<ByteString, ByteString>;
diff --git a/tests/wpt/web-platform-tests/interfaces/fs.idl b/tests/wpt/web-platform-tests/interfaces/fs.idl
index e341ab387d9..e2474132abf 100644
--- a/tests/wpt/web-platform-tests/interfaces/fs.idl
+++ b/tests/wpt/web-platform-tests/interfaces/fs.idl
@@ -15,7 +15,6 @@ interface FileSystemHandle {
Promise<boolean> isSameEntry(FileSystemHandle other);
};
-
dictionary FileSystemCreateWritableOptions {
boolean keepExistingData = false;
};
@@ -27,7 +26,6 @@ interface FileSystemFileHandle : FileSystemHandle {
[Exposed=DedicatedWorker]
Promise<FileSystemSyncAccessHandle> createSyncAccessHandle();
};
-
dictionary FileSystemGetFileOptions {
boolean create = false;
};
@@ -51,7 +49,6 @@ interface FileSystemDirectoryHandle : FileSystemHandle {
Promise<sequence<USVString>?> resolve(FileSystemHandle possibleDescendant);
};
-
enum WriteCommandType {
"write",
"seek",
@@ -73,7 +70,6 @@ interface FileSystemWritableFileStream : WritableStream {
Promise<undefined> seek(unsigned long long position);
Promise<undefined> truncate(unsigned long long size);
};
-
dictionary FileSystemReadWriteOptions {
[EnforceRange] unsigned long long at;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl b/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl
index ddfc0d9c06a..d7d750654fd 100644
--- a/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl
+++ b/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl
@@ -67,5 +67,5 @@ partial interface Gamepad {
readonly attribute FrozenArray<GamepadHapticActuator> hapticActuators;
readonly attribute GamepadPose? pose;
readonly attribute FrozenArray<GamepadTouch>? touchEvents;
- [SameObject] readonly attribute GamepadHapticActuator vibrationActuator;
+ [SameObject] readonly attribute GamepadHapticActuator? vibrationActuator;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/gpc-spec.idl b/tests/wpt/web-platform-tests/interfaces/gpc-spec.idl
new file mode 100644
index 00000000000..0e9a063c54c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/gpc-spec.idl
@@ -0,0 +1,10 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Global Privacy Control (GPC) (https://privacycg.github.io/gpc-spec/)
+
+interface mixin GlobalPrivacyControl {
+ readonly attribute boolean globalPrivacyControl;
+};
+Navigator includes GlobalPrivacyControl;
+WorkerNavigator includes GlobalPrivacyControl;
diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl
index e4752f079ce..33d4de0db97 100644
--- a/tests/wpt/web-platform-tests/interfaces/html.idl
+++ b/tests/wpt/web-platform-tests/interfaces/html.idl
@@ -127,6 +127,12 @@ interface HTMLElement : Element {
[CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText;
ElementInternals attachInternals();
+
+ // The popover API
+ undefined showPopover();
+ undefined hidePopover();
+ undefined togglePopover(optional boolean force);
+ [CEReactions] attribute DOMString? popover;
};
HTMLElement includes GlobalEventHandlers;
@@ -202,6 +208,7 @@ interface HTMLLinkElement : HTMLElement {
[CEReactions] attribute DOMString referrerPolicy;
[SameObject, PutForwards=value] readonly attribute DOMTokenList blocking;
[CEReactions] attribute boolean disabled;
+ [CEReactions] attribute DOMString fetchPriority;
// also has obsolete members
};
@@ -430,6 +437,7 @@ interface HTMLImageElement : HTMLElement {
[CEReactions] attribute DOMString referrerPolicy;
[CEReactions] attribute DOMString decoding;
[CEReactions] attribute DOMString loading;
+ [CEReactions] attribute DOMString fetchPriority;
Promise<undefined> decode();
@@ -929,6 +937,7 @@ interface HTMLInputElement : HTMLElement {
// also has obsolete members
};
+HTMLInputElement includes PopoverInvokerElement;
[Exposed=Window]
interface HTMLButtonElement : HTMLElement {
@@ -954,6 +963,7 @@ interface HTMLButtonElement : HTMLElement {
readonly attribute NodeList labels;
};
+HTMLButtonElement includes PopoverInvokerElement;
[Exposed=Window]
interface HTMLSelectElement : HTMLElement {
@@ -1214,6 +1224,7 @@ interface HTMLScriptElement : HTMLElement {
[CEReactions] attribute DOMString integrity;
[CEReactions] attribute DOMString referrerPolicy;
[SameObject, PutForwards=value] readonly attribute DOMTokenList blocking;
+ [CEReactions] attribute DOMString fetchPriority;
static boolean supports(DOMString type);
@@ -1704,6 +1715,23 @@ dictionary DragEventInit : MouseEventInit {
DataTransfer? dataTransfer = null;
};
+interface mixin PopoverInvokerElement {
+ [CEReactions] attribute Element? popoverTargetElement;
+ [CEReactions] attribute DOMString popoverTargetAction;
+};
+
+[Exposed=Window]
+interface ToggleEvent : Event {
+ constructor(DOMString type, optional ToggleEventInit eventInitDict = {});
+ readonly attribute DOMString oldState;
+ readonly attribute DOMString newState;
+};
+
+dictionary ToggleEventInit : EventInit {
+ DOMString oldState = "";
+ DOMString newState = "";
+};
+
[Global=Window,
Exposed=Window,
LegacyUnenumerableNamedProperties]
@@ -1737,10 +1765,11 @@ interface Window : EventTarget {
[Replaceable] readonly attribute WindowProxy? parent;
readonly attribute Element? frameElement;
WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [LegacyNullToEmptyString] DOMString features = "");
- getter object (DOMString name);
+
// Since this is the global object, the IDL named getter adds a NamedPropertiesObject exotic
// object on the prototype chain. Indeed, this does not make the global object an exotic object.
// Indexed access is taken care of by the WindowProxy exotic object.
+ getter object (DOMString name);
// the user agent
readonly attribute Navigator navigator;
@@ -1893,6 +1922,7 @@ interface mixin GlobalEventHandlers {
attribute EventHandler onauxclick;
attribute EventHandler onbeforeinput;
attribute EventHandler onbeforematch;
+ attribute EventHandler onbeforetoggle;
attribute EventHandler onblur;
attribute EventHandler oncancel;
attribute EventHandler oncanplay;
diff --git a/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl b/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl
index 5b41f3fa653..3197ff73689 100644
--- a/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl
+++ b/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl
@@ -104,19 +104,19 @@ dictionary MediaTrackConstraintSet {
};
dictionary MediaTrackSettings {
- long width;
- long height;
+ unsigned long width;
+ unsigned long height;
double aspectRatio;
double frameRate;
DOMString facingMode;
DOMString resizeMode;
- long sampleRate;
- long sampleSize;
+ unsigned long sampleRate;
+ unsigned long sampleSize;
boolean echoCancellation;
boolean autoGainControl;
boolean noiseSuppression;
double latency;
- long channelCount;
+ unsigned long channelCount;
DOMString deviceId;
DOMString groupId;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/navigation-api.idl b/tests/wpt/web-platform-tests/interfaces/navigation-api.idl
deleted file mode 100644
index 11178518292..00000000000
--- a/tests/wpt/web-platform-tests/interfaces/navigation-api.idl
+++ /dev/null
@@ -1,158 +0,0 @@
-// GENERATED CONTENT - DO NOT EDIT
-// Content was automatically extracted by Reffy into webref
-// (https://github.com/w3c/webref)
-// Source: Navigation API (https://wicg.github.io/navigation-api/)
-
-partial interface Window {
- [Replaceable] readonly attribute Navigation navigation;
-};
-
-[Exposed=Window]
-interface Navigation : EventTarget {
- sequence<NavigationHistoryEntry> entries();
- readonly attribute NavigationHistoryEntry? currentEntry;
- undefined updateCurrentEntry(NavigationUpdateCurrentEntryOptions options);
- readonly attribute NavigationTransition? transition;
-
- readonly attribute boolean canGoBack;
- readonly attribute boolean canGoForward;
-
- NavigationResult navigate(USVString url, optional NavigationNavigateOptions options = {});
- NavigationResult reload(optional NavigationReloadOptions options = {});
-
- NavigationResult traverseTo(DOMString key, optional NavigationOptions options = {});
- NavigationResult back(optional NavigationOptions options = {});
- NavigationResult forward(optional NavigationOptions options = {});
-
- attribute EventHandler onnavigate;
- attribute EventHandler onnavigatesuccess;
- attribute EventHandler onnavigateerror;
- attribute EventHandler oncurrententrychange;
-};
-
-dictionary NavigationUpdateCurrentEntryOptions {
- required any state;
-};
-
-dictionary NavigationOptions {
- any info;
-};
-
-dictionary NavigationNavigateOptions : NavigationOptions {
- any state;
- NavigationHistoryBehavior history = "auto";
-};
-
-dictionary NavigationReloadOptions : NavigationOptions {
- any state;
-};
-
-dictionary NavigationResult {
- Promise<NavigationHistoryEntry> committed;
- Promise<NavigationHistoryEntry> finished;
-};
-
-enum NavigationHistoryBehavior {
- "auto",
- "push",
- "replace"
-};
-
-[Exposed=Window]
-interface NavigationCurrentEntryChangeEvent : Event {
- constructor(DOMString type, NavigationCurrentEntryChangeEventInit eventInit);
-
- readonly attribute NavigationType? navigationType;
- readonly attribute NavigationHistoryEntry from;
-};
-
-dictionary NavigationCurrentEntryChangeEventInit : EventInit {
- NavigationType? navigationType = null;
- required NavigationHistoryEntry destination;
-};
-
-[Exposed=Window]
-interface NavigationTransition {
- readonly attribute NavigationType navigationType;
- readonly attribute NavigationHistoryEntry from;
- readonly attribute Promise<undefined> finished;
-};
-
-[Exposed=Window]
-interface NavigateEvent : Event {
- constructor(DOMString type, NavigateEventInit eventInit);
-
- readonly attribute NavigationType navigationType;
- readonly attribute NavigationDestination destination;
- readonly attribute boolean canIntercept;
- readonly attribute boolean userInitiated;
- readonly attribute boolean hashChange;
- readonly attribute AbortSignal signal;
- readonly attribute FormData? formData;
- readonly attribute DOMString? downloadRequest;
- readonly attribute any info;
-
- undefined intercept(optional NavigationInterceptOptions options = {});
- undefined scroll();
-};
-
-dictionary NavigateEventInit : EventInit {
- NavigationType navigationType = "push";
- required NavigationDestination destination;
- boolean canIntercept = false;
- boolean userInitiated = false;
- boolean hashChange = false;
- required AbortSignal signal;
- FormData? formData = null;
- DOMString? downloadRequest = null;
- any info;
-};
-
-dictionary NavigationInterceptOptions {
- NavigationInterceptHandler handler;
- NavigationFocusReset focusReset;
- NavigationScrollBehavior scroll;
-};
-
-enum NavigationFocusReset {
- "after-transition",
- "manual"
-};
-
-enum NavigationScrollBehavior {
- "after-transition",
- "manual"
-};
-
-callback NavigationInterceptHandler = Promise<undefined> ();
-
-enum NavigationType {
- "reload",
- "push",
- "replace",
- "traverse"
-};
-
-[Exposed=Window]
-interface NavigationDestination {
- readonly attribute USVString url;
- readonly attribute DOMString? key;
- readonly attribute DOMString? id;
- readonly attribute long long index;
- readonly attribute boolean sameDocument;
-
- any getState();
-};
-
-[Exposed=Window]
-interface NavigationHistoryEntry : EventTarget {
- readonly attribute USVString? url;
- readonly attribute DOMString key;
- readonly attribute DOMString id;
- readonly attribute long long index;
- readonly attribute boolean sameDocument;
-
- any getState();
-
- attribute EventHandler ondispose;
-};
diff --git a/tests/wpt/web-platform-tests/interfaces/notifications.idl b/tests/wpt/web-platform-tests/interfaces/notifications.idl
index 2be22213d78..bfcfa2e66af 100644
--- a/tests/wpt/web-platform-tests/interfaces/notifications.idl
+++ b/tests/wpt/web-platform-tests/interfaces/notifications.idl
@@ -72,7 +72,6 @@ dictionary NotificationAction {
};
callback NotificationPermissionCallback = undefined (NotificationPermission permission);
-
dictionary GetNotificationOptions {
DOMString tag = "";
};
diff --git a/tests/wpt/web-platform-tests/interfaces/orientation-event.idl b/tests/wpt/web-platform-tests/interfaces/orientation-event.idl
index f6ff96f0e01..a93d4658830 100644
--- a/tests/wpt/web-platform-tests/interfaces/orientation-event.idl
+++ b/tests/wpt/web-platform-tests/interfaces/orientation-event.idl
@@ -30,10 +30,6 @@ partial interface Window {
};
partial interface Window {
- attribute EventHandler oncompassneedscalibration;
-};
-
-partial interface Window {
[SecureContext] attribute EventHandler ondevicemotion;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl b/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl
index 16945e3a9b7..a789d41738c 100644
--- a/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl
+++ b/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl
@@ -18,7 +18,6 @@ partial interface Document {
partial interface HTMLIFrameElement {
[SameObject] readonly attribute PermissionsPolicy permissionsPolicy;
};
-
[Exposed=Window]
interface PermissionsPolicyViolationReportBody : ReportBody {
readonly attribute DOMString featureId;
diff --git a/tests/wpt/web-platform-tests/interfaces/priority-hints.idl b/tests/wpt/web-platform-tests/interfaces/priority-hints.idl
deleted file mode 100644
index cbff6a5222d..00000000000
--- a/tests/wpt/web-platform-tests/interfaces/priority-hints.idl
+++ /dev/null
@@ -1,20 +0,0 @@
-// GENERATED CONTENT - DO NOT EDIT
-// Content was automatically extracted by Reffy into webref
-// (https://github.com/w3c/webref)
-// Source: Priority Hints (https://wicg.github.io/priority-hints/)
-
-partial interface HTMLImageElement {
- [CEReactions] attribute DOMString fetchPriority;
-};
-
-partial interface HTMLLinkElement {
- [CEReactions] attribute DOMString fetchPriority;
-};
-
-partial interface HTMLScriptElement {
- [CEReactions] attribute DOMString fetchPriority;
-};
-
-partial interface HTMLIFrameElement {
- [CEReactions] attribute DOMString fetchPriority;
-};
diff --git a/tests/wpt/web-platform-tests/interfaces/requestStorageAccessFor.idl b/tests/wpt/web-platform-tests/interfaces/requestStorageAccessFor.idl
new file mode 100644
index 00000000000..adca77a2b03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/requestStorageAccessFor.idl
@@ -0,0 +1,12 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: requestStorageAccessFor API (https://privacycg.github.io/requestStorageAccessFor/)
+
+partial interface Document {
+ Promise<undefined> requestStorageAccessFor(USVString requestedOrigin);
+};
+
+dictionary TopLevelStorageAccessPermissionDescriptor : PermissionDescriptor {
+ USVString requestedOrigin = "";
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl
index 242df0bd804..151e5d46d84 100644
--- a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl
+++ b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl
@@ -6,6 +6,7 @@
[Exposed=(Window,Worker)]
interface PerformanceResourceTiming : PerformanceEntry {
readonly attribute DOMString initiatorType;
+ readonly attribute DOMString deliveryType;
readonly attribute ByteString nextHopProtocol;
readonly attribute DOMHighResTimeStamp workerStart;
readonly attribute DOMHighResTimeStamp redirectStart;
diff --git a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl
index 1fd52dece19..14215509c9f 100644
--- a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl
+++ b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl
@@ -25,6 +25,7 @@ interface ScrollTimeline : AnimationTimeline {
dictionary ViewTimelineOptions {
Element subject;
ScrollAxis axis = "block";
+ (DOMString or sequence<(CSSNumericValue or CSSKeywordValue)>) inset = "auto";
};
[Exposed=Window]
diff --git a/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl b/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl
index ce571ddd694..be7bf73968e 100644
--- a/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl
+++ b/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl
@@ -1,7 +1,7 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
-// Source: Text Fragments (https://wicg.github.io/scroll-to-text-fragment/)
+// Source: URL Fragment Text Directives (https://wicg.github.io/scroll-to-text-fragment/)
[Exposed=Window]
interface FragmentDirective {
diff --git a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl
index 6b6083b165e..9061b243477 100644
--- a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl
+++ b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl
@@ -15,7 +15,6 @@ dictionary SecurePaymentConfirmationRequest {
sequence<USVString> locale;
boolean showOptOut;
};
-
partial dictionary AuthenticationExtensionsClientInputs {
AuthenticationExtensionsPaymentInputs payment;
};
@@ -31,11 +30,9 @@ dictionary AuthenticationExtensionsPaymentInputs {
PaymentCurrencyAmount total;
PaymentCredentialInstrument instrument;
};
-
dictionary CollectedClientPaymentData : CollectedClientData {
required CollectedClientAdditionalPaymentData payment;
};
-
dictionary CollectedClientAdditionalPaymentData {
required USVString rpId;
required USVString topOrigin;
@@ -44,16 +41,8 @@ dictionary CollectedClientAdditionalPaymentData {
required PaymentCurrencyAmount total;
required PaymentCredentialInstrument instrument;
};
-
dictionary PaymentCredentialInstrument {
required USVString displayName;
required USVString icon;
boolean iconMustBeShown = true;
};
-
-enum TransactionAutomationMode {
- "none",
- "autoAccept",
- "autoReject",
- "autoOptOut"
-};
diff --git a/tests/wpt/web-platform-tests/interfaces/selection-api.idl b/tests/wpt/web-platform-tests/interfaces/selection-api.idl
index c1eed2a9cf2..a84536ab0f5 100644
--- a/tests/wpt/web-platform-tests/interfaces/selection-api.idl
+++ b/tests/wpt/web-platform-tests/interfaces/selection-api.idl
@@ -12,12 +12,13 @@ interface Selection {
readonly attribute boolean isCollapsed;
readonly attribute unsigned long rangeCount;
readonly attribute DOMString type;
+ readonly attribute DOMString direction;
Range getRangeAt(unsigned long index);
undefined addRange(Range range);
undefined removeRange(Range range);
undefined removeAllRanges();
undefined empty();
- StaticRange getComposedRange(ShadowRoot... shadowRoots);
+ sequence<StaticRange> getComposedRanges(ShadowRoot... shadowRoots);
undefined collapse(Node? node, optional unsigned long offset = 0);
undefined setPosition(Node? node, optional unsigned long offset = 0);
undefined collapseToStart();
diff --git a/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl
new file mode 100644
index 00000000000..ee339590827
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl
@@ -0,0 +1,29 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Private State Token API (https://wicg.github.io/trust-token-api/)
+
+enum RefreshPolicy { "none", "refresh" };
+
+enum TokenType { "private-state-token" };
+
+enum TokenVersion { "1" };
+
+enum OperationType { "token-request", "send-redemption-record", "token-redemption" };
+
+dictionary PrivateToken {
+ required TokenType type;
+ required TokenVersion version;
+ required OperationType operation;
+ RefreshPolicy refreshPolicy = "none";
+ sequence<USVString> issuers;
+};
+
+partial dictionary RequestInit {
+ PrivateToken privateToken;
+};
+
+partial interface Document {
+ Promise<boolean> hasPrivateTokens(USVString issuer, USVString type);
+ Promise<boolean> hasRedemptionRecord(USVString issuer, USVString type);
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/turtledove.idl b/tests/wpt/web-platform-tests/interfaces/turtledove.idl
new file mode 100644
index 00000000000..cd81a3d87ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/turtledove.idl
@@ -0,0 +1,109 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: FLEDGE (https://wicg.github.io/turtledove/)
+
+[SecureContext]
+partial interface Navigator {
+ Promise<undefined> joinAdInterestGroup(AuctionAdInterestGroup group, double durationSeconds);
+};
+
+dictionary AuctionAd {
+ required USVString renderURL;
+ any metadata;
+};
+
+dictionary AuctionAdInterestGroup {
+ required USVString owner;
+ required USVString name;
+
+ double priority = 0.0;
+ boolean enableBiddingSignalsPrioritization = false;
+ record<DOMString, double> priorityVector;
+ record<DOMString, double> prioritySignalsOverrides;
+
+ DOMString executionMode = "compatibility";
+ USVString biddingLogicURL;
+ USVString biddingWasmHelperURL;
+ USVString dailyUpdateURL;
+ USVString trustedBiddingSignalsURL;
+ sequence<USVString> trustedBiddingSignalsKeys;
+ any userBiddingSignals;
+ sequence<AuctionAd> ads;
+ sequence<AuctionAd> adComponents;
+};
+
+[SecureContext]
+partial interface Navigator {
+ Promise<undefined> leaveAdInterestGroup(AuctionAdInterestGroupKey group);
+};
+
+dictionary AuctionAdInterestGroupKey {
+ required USVString owner;
+ required USVString name;
+};
+
+[SecureContext]
+partial interface Navigator {
+ Promise<USVString?> runAdAuction(AuctionAdConfig config);
+};
+
+dictionary AuctionAdConfig {
+ required USVString seller;
+ required USVString decisionLogicURL;
+ USVString trustedScoringSignalsURL;
+ sequence<USVString> interestGroupBuyers;
+ any auctionSignals;
+ any sellerSignals;
+ USVString directFromSellerSignals;
+ unsigned long long sellerTimeout;
+ unsigned short sellerExperimentGroupId;
+ record<USVString, any> perBuyerSignals;
+ record<USVString, unsigned long long> perBuyerTimeouts;
+ record<USVString, unsigned short> perBuyerGroupLimits;
+ record<USVString, unsigned short> perBuyerExperimentGroupIds;
+ record<USVString, record<USVString, double>> perBuyerPrioritySignals;
+ sequence<AuctionAdConfig> componentAuctions = [];
+ AbortSignal? signal;
+};
+
+[Exposed=InterestGroupBiddingScriptRunnerGlobalScope,
+Global=InterestGroupBiddingScriptRunnerGlobalScope]
+interface InterestGroupBiddingScriptRunnerGlobalScope {
+ boolean setBid();
+ boolean setBid(GenerateBidOutput generateBidOutput);
+ undefined setPriority(double priority);
+ undefined setPrioritySignalsOverride(DOMString key, double priority);
+};
+
+[Exposed=InterestGroupScoringScriptRunnerGlobalScope,
+Global=InterestGroupScoringScriptRunnerGlobalScope]
+interface InterestGroupScoringScriptRunnerGlobalScope {
+};
+
+[Exposed=InterestGroupReportingScriptRunnerGlobalScope,
+Global=InterestGroupReportingScriptRunnerGlobalScope]
+interface InterestGroupReportingScriptRunnerGlobalScope {
+ undefined sendReportTo(DOMString url);
+};
+
+dictionary AdRender {
+ required DOMString url;
+ required DOMString width;
+ required DOMString height;
+};
+
+dictionary GenerateBidOutput {
+ required double bid;
+ required (DOMString or AdRender) adRender;
+ DOMString ad;
+ sequence<(DOMString or AdRender)> adComponents;
+ double adCost;
+ double modelingSignals;
+ boolean allowComponentAuction = false;
+};
+
+[SecureContext]
+partial interface Navigator {
+ undefined updateAdInterestGroups();
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl b/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl
index f5070a0e090..c69714b9734 100644
--- a/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl
+++ b/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl
@@ -9,16 +9,17 @@ dictionary NavigatorUABrandVersion {
};
dictionary UADataValues {
- sequence<NavigatorUABrandVersion> brands;
- boolean mobile;
DOMString architecture;
DOMString bitness;
+ sequence<NavigatorUABrandVersion> brands;
+ DOMString formFactor;
+ sequence<NavigatorUABrandVersion> fullVersionList;
DOMString model;
+ boolean mobile;
DOMString platform;
DOMString platformVersion;
DOMString uaFullVersion; // deprecated in favor of fullVersionList
boolean wow64;
- sequence<NavigatorUABrandVersion> fullVersionList;
};
dictionary UALowEntropyJSON {
diff --git a/tests/wpt/web-platform-tests/interfaces/url.idl b/tests/wpt/web-platform-tests/interfaces/url.idl
index 360c9adcfa1..6549e45f419 100644
--- a/tests/wpt/web-platform-tests/interfaces/url.idl
+++ b/tests/wpt/web-platform-tests/interfaces/url.idl
@@ -8,6 +8,8 @@
interface URL {
constructor(USVString url, optional USVString base);
+ static boolean canParse(USVString url, optional USVString base);
+
stringifier attribute USVString href;
readonly attribute USVString origin;
attribute USVString protocol;
@@ -28,6 +30,8 @@ interface URL {
interface URLSearchParams {
constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = "");
+ readonly attribute unsigned long size;
+
undefined append(USVString name, USVString value);
undefined delete(USVString name);
USVString? get(USVString name);
diff --git a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl
index 141af90fd2d..0d4384251df 100644
--- a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl
+++ b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl
@@ -8,7 +8,7 @@ dictionary WebAssemblyInstantiatedSource {
required Instance instance;
};
-[Exposed=(Window,Worker,Worklet)]
+[Exposed=*]
namespace WebAssembly {
boolean validate(BufferSource bytes);
Promise<Module> compile(BufferSource bytes);
@@ -39,7 +39,7 @@ dictionary ModuleImportDescriptor {
required ImportExportKind kind;
};
-[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
+[LegacyNamespace=WebAssembly, Exposed=*]
interface Module {
constructor(BufferSource bytes);
static sequence<ModuleExportDescriptor> exports(Module moduleObject);
@@ -47,7 +47,7 @@ interface Module {
static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName);
};
-[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
+[LegacyNamespace=WebAssembly, Exposed=*]
interface Instance {
constructor(Module module, optional object importObject);
readonly attribute object exports;
@@ -58,7 +58,7 @@ dictionary MemoryDescriptor {
[EnforceRange] unsigned long maximum;
};
-[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
+[LegacyNamespace=WebAssembly, Exposed=*]
interface Memory {
constructor(MemoryDescriptor descriptor);
unsigned long grow([EnforceRange] unsigned long delta);
@@ -78,7 +78,7 @@ dictionary TableDescriptor {
[EnforceRange] unsigned long maximum;
};
-[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
+[LegacyNamespace=WebAssembly, Exposed=*]
interface Table {
constructor(TableDescriptor descriptor, optional any value);
unsigned long grow([EnforceRange] unsigned long delta, optional any value);
@@ -102,7 +102,7 @@ dictionary GlobalDescriptor {
boolean mutable = false;
};
-[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)]
+[LegacyNamespace=WebAssembly, Exposed=*]
interface Global {
constructor(GlobalDescriptor descriptor, optional any v);
any valueOf();
diff --git a/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl b/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl
index 61df2cd1518..f9f68a0d49a 100644
--- a/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl
+++ b/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl
@@ -5,6 +5,7 @@
[Exposed=Window]
partial interface AnimationTimeline {
+ readonly attribute CSSNumberish? currentTime;
readonly attribute CSSNumberish? duration;
Animation play (optional AnimationEffect? effect = null);
};
@@ -88,6 +89,16 @@ callback EffectCallback = undefined (double? progress,
(Element or CSSPseudoElement) currentTarget,
Animation animation);
+dictionary TimelineRangeOffset {
+ CSSOMString? rangeName;
+ CSSNumericValue offset;
+};
+
+partial dictionary KeyframeAnimationOptions {
+ (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart = "normal";
+ (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd = "normal";
+};
+
[Exposed=Window]
interface AnimationPlaybackEvent : Event {
constructor(DOMString type, optional AnimationPlaybackEventInit
diff --git a/tests/wpt/web-platform-tests/interfaces/web-animations.idl b/tests/wpt/web-platform-tests/interfaces/web-animations.idl
index ed612302a47..956d700f49b 100644
--- a/tests/wpt/web-platform-tests/interfaces/web-animations.idl
+++ b/tests/wpt/web-platform-tests/interfaces/web-animations.idl
@@ -5,7 +5,6 @@
[Exposed=Window]
interface AnimationTimeline {
- readonly attribute double? currentTime;
};
dictionary DocumentTimelineOptions {
diff --git a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl
index 21c237040eb..5d461194a83 100644
--- a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl
+++ b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl
@@ -26,6 +26,7 @@ dictionary BluetoothLEScanFilterInit {
dictionary RequestDeviceOptions {
sequence<BluetoothLEScanFilterInit> filters;
+ sequence<BluetoothLEScanFilterInit> exclusionFilters;
sequence<BluetoothServiceUUID> optionalServices = [];
sequence<unsigned short> optionalManufacturerData = [];
boolean acceptAllDevices = false;
diff --git a/tests/wpt/web-platform-tests/interfaces/webauthn.idl b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
index ef27322312f..58a9e285232 100644
--- a/tests/wpt/web-platform-tests/interfaces/webauthn.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
@@ -12,7 +12,6 @@ interface PublicKeyCredential : Credential {
static Promise<boolean> isConditionalMediationAvailable();
PublicKeyCredentialJSON toJSON();
};
-
typedef DOMString Base64URLString;
typedef (RegistrationResponseJSON or AuthenticationResponseJSON) PublicKeyCredentialJSON;
@@ -49,19 +48,15 @@ dictionary AuthenticatorAssertionResponseJSON {
dictionary AuthenticationExtensionsClientOutputsJSON {
};
-
partial dictionary CredentialCreationOptions {
PublicKeyCredentialCreationOptions publicKey;
};
-
partial dictionary CredentialRequestOptions {
PublicKeyCredentialRequestOptions publicKey;
};
-
partial interface PublicKeyCredential {
static Promise<boolean> isUserVerifyingPlatformAuthenticatorAvailable();
};
-
partial interface PublicKeyCredential {
static PublicKeyCredentialCreationOptions parseCreationOptionsFromJSON(PublicKeyCredentialCreationOptionsJSON options);
};
@@ -92,7 +87,6 @@ dictionary PublicKeyCredentialDescriptorJSON {
dictionary AuthenticationExtensionsClientInputsJSON {
};
-
partial interface PublicKeyCredential {
static PublicKeyCredentialRequestOptions parseRequestOptionsFromJSON(PublicKeyCredentialRequestOptionsJSON options);
};
@@ -105,12 +99,10 @@ dictionary PublicKeyCredentialRequestOptionsJSON {
DOMString userVerification = "preferred";
AuthenticationExtensionsClientInputsJSON extensions;
};
-
[SecureContext, Exposed=Window]
interface AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer clientDataJSON;
};
-
[SecureContext, Exposed=Window]
interface AuthenticatorAttestationResponse : AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer attestationObject;
@@ -119,7 +111,6 @@ interface AuthenticatorAttestationResponse : AuthenticatorResponse {
ArrayBuffer? getPublicKey();
COSEAlgorithmIdentifier getPublicKeyAlgorithm();
};
-
[SecureContext, Exposed=Window]
interface AuthenticatorAssertionResponse : AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer authenticatorData;
@@ -127,12 +118,10 @@ interface AuthenticatorAssertionResponse : AuthenticatorResponse {
[SameObject] readonly attribute ArrayBuffer? userHandle;
[SameObject] readonly attribute ArrayBuffer? attestationObject;
};
-
dictionary PublicKeyCredentialParameters {
required DOMString type;
required COSEAlgorithmIdentifier alg;
};
-
dictionary PublicKeyCredentialCreationOptions {
required PublicKeyCredentialRpEntity rp;
required PublicKeyCredentialUserEntity user;
@@ -147,45 +136,37 @@ dictionary PublicKeyCredentialCreationOptions {
sequence<DOMString> attestationFormats = [];
AuthenticationExtensionsClientInputs extensions;
};
-
dictionary PublicKeyCredentialEntity {
required DOMString name;
};
-
dictionary PublicKeyCredentialRpEntity : PublicKeyCredentialEntity {
DOMString id;
};
-
dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity {
required BufferSource id;
required DOMString displayName;
};
-
dictionary AuthenticatorSelectionCriteria {
DOMString authenticatorAttachment;
DOMString residentKey;
boolean requireResidentKey = false;
DOMString userVerification = "preferred";
};
-
enum AuthenticatorAttachment {
"platform",
"cross-platform"
};
-
enum ResidentKeyRequirement {
"discouraged",
"preferred",
"required"
};
-
enum AttestationConveyancePreference {
"none",
"indirect",
"direct",
"enterprise"
};
-
dictionary PublicKeyCredentialRequestOptions {
required BufferSource challenge;
unsigned long timeout;
@@ -196,17 +177,15 @@ dictionary PublicKeyCredentialRequestOptions {
sequence<DOMString> attestationFormats = [];
AuthenticationExtensionsClientInputs extensions;
};
-
dictionary AuthenticationExtensionsClientInputs {
};
-
dictionary AuthenticationExtensionsClientOutputs {
};
-
dictionary CollectedClientData {
required DOMString type;
required DOMString challenge;
required DOMString origin;
+ DOMString topOrigin;
boolean crossOrigin;
};
@@ -216,17 +195,14 @@ dictionary TokenBinding {
};
enum TokenBindingStatus { "present", "supported" };
-
enum PublicKeyCredentialType {
"public-key"
};
-
dictionary PublicKeyCredentialDescriptor {
required DOMString type;
required BufferSource id;
sequence<DOMString> transports;
};
-
enum AuthenticatorTransport {
"usb",
"nfc",
@@ -234,35 +210,27 @@ enum AuthenticatorTransport {
"hybrid",
"internal"
};
-
typedef long COSEAlgorithmIdentifier;
-
enum UserVerificationRequirement {
"required",
"preferred",
"discouraged"
};
-
partial dictionary AuthenticationExtensionsClientInputs {
USVString appid;
};
-
partial dictionary AuthenticationExtensionsClientOutputs {
boolean appid;
};
-
partial dictionary AuthenticationExtensionsClientInputs {
USVString appidExclude;
};
-
partial dictionary AuthenticationExtensionsClientOutputs {
boolean appidExclude;
};
-
partial dictionary AuthenticationExtensionsClientInputs {
boolean credProps;
};
-
dictionary CredentialPropertiesOutput {
boolean rk;
};
@@ -270,10 +238,9 @@ dictionary CredentialPropertiesOutput {
partial dictionary AuthenticationExtensionsClientOutputs {
CredentialPropertiesOutput credProps;
};
-
dictionary AuthenticationExtensionsPRFValues {
- required ArrayBuffer first;
- ArrayBuffer second;
+ required BufferSource first;
+ BufferSource second;
};
dictionary AuthenticationExtensionsPRFInputs {
@@ -322,14 +289,12 @@ dictionary AuthenticationExtensionsLargeBlobOutputs {
partial dictionary AuthenticationExtensionsClientInputs {
boolean uvm;
};
-
typedef sequence<unsigned long> UvmEntry;
typedef sequence<UvmEntry> UvmEntries;
partial dictionary AuthenticationExtensionsClientOutputs {
UvmEntries uvm;
};
-
dictionary AuthenticationExtensionsDevicePublicKeyInputs {
DOMString attestation = "none";
sequence<DOMString> attestationFormats = [];
@@ -340,7 +305,6 @@ partial dictionary AuthenticationExtensionsClientInputs {
};
dictionary AuthenticationExtensionsDevicePublicKeyOutputs {
- ArrayBuffer authenticatorOutput;
ArrayBuffer signature;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl
new file mode 100644
index 00000000000..00e4493d3c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl
@@ -0,0 +1,12 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: AV1 WebCodecs Registration (https://w3c.github.io/webcodecs/av1_codec_registration.html)
+
+partial dictionary VideoEncoderEncodeOptions {
+ VideoEncoderEncodeOptionsForAv1 av1;
+};
+
+dictionary VideoEncoderEncodeOptionsForAv1 {
+ unsigned short? quantizer;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-vp9-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-vp9-codec-registration.idl
new file mode 100644
index 00000000000..aca64a78961
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-vp9-codec-registration.idl
@@ -0,0 +1,12 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: VP9 WebCodecs Registration (https://w3c.github.io/webcodecs/vp9_codec_registration.html)
+
+partial dictionary VideoEncoderEncodeOptions {
+ VideoEncoderEncodeOptionsForVp9 vp9;
+};
+
+dictionary VideoEncoderEncodeOptionsForVp9 {
+ unsigned short? quantizer;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl
index 68df48584bd..77649029db6 100644
--- a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl
@@ -4,7 +4,7 @@
// Source: WebCodecs (https://w3c.github.io/webcodecs/)
[Exposed=(Window,DedicatedWorker), SecureContext]
-interface AudioDecoder {
+interface AudioDecoder : EventTarget {
constructor(AudioDecoderInit init);
readonly attribute CodecState state;
@@ -28,7 +28,7 @@ dictionary AudioDecoderInit {
callback AudioDataOutputCallback = undefined(AudioData output);
[Exposed=(Window,DedicatedWorker), SecureContext]
-interface VideoDecoder {
+interface VideoDecoder : EventTarget {
constructor(VideoDecoderInit init);
readonly attribute CodecState state;
@@ -52,7 +52,7 @@ dictionary VideoDecoderInit {
callback VideoFrameOutputCallback = undefined(VideoFrame output);
[Exposed=(Window,DedicatedWorker), SecureContext]
-interface AudioEncoder {
+interface AudioEncoder : EventTarget {
constructor(AudioEncoderInit init);
readonly attribute CodecState state;
@@ -82,7 +82,7 @@ dictionary EncodedAudioChunkMetadata {
};
[Exposed=(Window,DedicatedWorker), SecureContext]
-interface VideoEncoder {
+interface VideoEncoder : EventTarget {
constructor(VideoEncoderInit init);
readonly attribute CodecState state;
@@ -174,7 +174,7 @@ dictionary VideoEncoderConfig {
HardwareAcceleration hardwareAcceleration = "no-preference";
AlphaOption alpha = "discard";
DOMString scalabilityMode;
- BitrateMode bitrateMode = "variable";
+ VideoEncoderBitrateMode bitrateMode = "variable";
LatencyMode latencyMode = "quality";
};
@@ -198,6 +198,12 @@ dictionary VideoEncoderEncodeOptions {
boolean keyFrame = false;
};
+enum VideoEncoderBitrateMode {
+ "constant",
+ "variable",
+ "quantizer"
+};
+
enum CodecState {
"unconfigured",
"configured",
diff --git a/tests/wpt/web-platform-tests/interfaces/webgpu.idl b/tests/wpt/web-platform-tests/interfaces/webgpu.idl
index b00e2374e58..284327a5789 100644
--- a/tests/wpt/web-platform-tests/interfaces/webgpu.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webgpu.idl
@@ -26,6 +26,7 @@ interface GPUSupportedLimits {
readonly attribute unsigned long maxStorageBuffersPerShaderStage;
readonly attribute unsigned long maxStorageTexturesPerShaderStage;
readonly attribute unsigned long maxUniformBuffersPerShaderStage;
+ readonly attribute unsigned long maxFragmentCombinedOutputResources;
readonly attribute unsigned long long maxUniformBufferBindingSize;
readonly attribute unsigned long long maxStorageBufferBindingSize;
readonly attribute unsigned long minUniformBufferOffsetAlignment;
@@ -52,6 +53,11 @@ interface GPUSupportedFeatures {
};
[Exposed=(Window, DedicatedWorker), SecureContext]
+interface WGSLLanguageFeatures {
+ readonly setlike<DOMString>;
+};
+
+[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUAdapterInfo {
readonly attribute DOMString vendor;
readonly attribute DOMString architecture;
@@ -69,6 +75,7 @@ WorkerNavigator includes NavigatorGPU;
interface GPU {
Promise<GPUAdapter?> requestAdapter(optional GPURequestAdapterOptions options = {});
GPUTextureFormat getPreferredCanvasFormat();
+ [SameObject] readonly attribute WGSLLanguageFeatures wgslLanguageFeatures;
};
dictionary GPURequestAdapterOptions {
@@ -106,7 +113,9 @@ enum GPUFeatureName {
"timestamp-query",
"indirect-first-instance",
"shader-f16",
- "rg11b10ufloat-renderable"
+ "rg11b10ufloat-renderable",
+ "bgra8unorm-storage",
+ "float32-filterable"
};
[Exposed=(Window, DedicatedWorker), SecureContext]
@@ -168,7 +177,7 @@ dictionary GPUBufferDescriptor : GPUObjectDescriptorBase {
};
typedef [EnforceRange] unsigned long GPUBufferUsageFlags;
-[Exposed=(Window, DedicatedWorker)]
+[Exposed=(Window, DedicatedWorker), SecureContext]
namespace GPUBufferUsage {
const GPUFlagsConstant MAP_READ = 0x0001;
const GPUFlagsConstant MAP_WRITE = 0x0002;
@@ -183,7 +192,7 @@ namespace GPUBufferUsage {
};
typedef [EnforceRange] unsigned long GPUMapModeFlags;
-[Exposed=(Window, DedicatedWorker)]
+[Exposed=(Window, DedicatedWorker), SecureContext]
namespace GPUMapMode {
const GPUFlagsConstant READ = 0x0001;
const GPUFlagsConstant WRITE = 0x0002;
@@ -223,7 +232,7 @@ enum GPUTextureDimension {
};
typedef [EnforceRange] unsigned long GPUTextureUsageFlags;
-[Exposed=(Window, DedicatedWorker)]
+[Exposed=(Window, DedicatedWorker), SecureContext]
namespace GPUTextureUsage {
const GPUFlagsConstant COPY_SRC = 0x01;
const GPUFlagsConstant COPY_DST = 0x02;
@@ -384,7 +393,6 @@ enum GPUTextureFormat {
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUExternalTexture {
- readonly attribute boolean expired;
};
GPUExternalTexture includes GPUObjectBase;
@@ -459,7 +467,7 @@ dictionary GPUBindGroupLayoutEntry {
};
typedef [EnforceRange] unsigned long GPUShaderStageFlags;
-[Exposed=(Window, DedicatedWorker)]
+[Exposed=(Window, DedicatedWorker), SecureContext]
namespace GPUShaderStage {
const GPUFlagsConstant VERTEX = 0x1;
const GPUFlagsConstant FRAGMENT = 0x2;
@@ -549,7 +557,7 @@ dictionary GPUPipelineLayoutDescriptor : GPUObjectDescriptorBase {
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUShaderModule {
- Promise<GPUCompilationInfo> compilationInfo();
+ Promise<GPUCompilationInfo> getCompilationInfo();
};
GPUShaderModule includes GPUObjectBase;
@@ -586,7 +594,7 @@ interface GPUCompilationInfo {
[Exposed=(Window, DedicatedWorker), SecureContext, Serializable]
interface GPUPipelineError : DOMException {
- constructor(DOMString message, GPUPipelineErrorInit options);
+ constructor((DOMString or undefined) message, GPUPipelineErrorInit options);
readonly attribute GPUPipelineErrorReason reason;
};
@@ -695,7 +703,7 @@ dictionary GPUBlendState {
};
typedef [EnforceRange] unsigned long GPUColorWriteFlags;
-[Exposed=(Window, DedicatedWorker)]
+[Exposed=(Window, DedicatedWorker), SecureContext]
namespace GPUColorWrite {
const GPUFlagsConstant RED = 0x1;
const GPUFlagsConstant GREEN = 0x2;
@@ -737,8 +745,8 @@ enum GPUBlendOperation {
dictionary GPUDepthStencilState {
required GPUTextureFormat format;
- boolean depthWriteEnabled = false;
- GPUCompareFunction depthCompare = "always";
+ required boolean depthWriteEnabled;
+ required GPUCompareFunction depthCompare;
GPUStencilFaceState stencilFront = {};
GPUStencilFaceState stencilBack = {};
@@ -829,34 +837,11 @@ dictionary GPUVertexAttribute {
required GPUIndex32 shaderLocation;
};
-dictionary GPUImageDataLayout {
- GPUSize64 offset = 0;
- GPUSize32 bytesPerRow;
- GPUSize32 rowsPerImage;
-};
-
-dictionary GPUImageCopyBuffer : GPUImageDataLayout {
- required GPUBuffer buffer;
-};
-
-dictionary GPUImageCopyTexture {
- required GPUTexture texture;
- GPUIntegerCoordinate mipLevel = 0;
- GPUOrigin3D origin = {};
- GPUTextureAspect aspect = "all";
-};
-
-dictionary GPUImageCopyTextureTagged : GPUImageCopyTexture {
- PredefinedColorSpace colorSpace = "srgb";
- boolean premultipliedAlpha = false;
-};
-
-dictionary GPUImageCopyExternalImage {
- required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source;
- GPUOrigin2D origin = {};
- boolean flipY = false;
-};
-
+dictionary GPUImageDataLayout { GPUSize64 offset = 0; GPUSize32 bytesPerRow; GPUSize32 rowsPerImage;};
+dictionary GPUImageCopyBuffer : GPUImageDataLayout { required GPUBuffer buffer;};
+dictionary GPUImageCopyTexture { required GPUTexture texture; GPUIntegerCoordinate mipLevel = 0; GPUOrigin3D origin = {}; GPUTextureAspect aspect = "all";};
+dictionary GPUImageCopyTextureTagged : GPUImageCopyTexture { PredefinedColorSpace colorSpace = "srgb"; boolean premultipliedAlpha = false;};
+dictionary GPUImageCopyExternalImage { required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source; GPUOrigin2D origin = {}; boolean flipY = false;};
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUCommandBuffer {
};
@@ -1021,7 +1006,7 @@ dictionary GPURenderPassColorAttachment {
dictionary GPURenderPassDepthStencilAttachment {
required GPUTextureView view;
- float depthClearValue = 0;
+ float depthClearValue;
GPULoadOp depthLoadOp;
GPUStoreOp depthStoreOp;
boolean depthReadOnly = false;
@@ -1161,12 +1146,13 @@ dictionary GPUCanvasConfiguration {
};
enum GPUDeviceLostReason {
+ "unknown",
"destroyed"
};
[Exposed=(Window, DedicatedWorker), SecureContext]
interface GPUDeviceLostInfo {
- readonly attribute (GPUDeviceLostReason or undefined) reason;
+ readonly attribute GPUDeviceLostReason reason;
readonly attribute DOMString message;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/webidl.idl b/tests/wpt/web-platform-tests/interfaces/webidl.idl
index 9993673361a..7271f19dfa6 100644
--- a/tests/wpt/web-platform-tests/interfaces/webidl.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webidl.idl
@@ -46,5 +46,3 @@ interface DOMException { // but see below note about ECMAScript binding
callback Function = any (any... arguments);
callback VoidFunction = undefined ();
-
-typedef unsigned long long DOMTimeStamp;
diff --git a/tests/wpt/web-platform-tests/interfaces/webnn.idl b/tests/wpt/web-platform-tests/interfaces/webnn.idl
index 820c79e9666..2c2ab35e909 100644
--- a/tests/wpt/web-platform-tests/interfaces/webnn.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webnn.idl
@@ -146,7 +146,7 @@ interface MLGraphBuilder {
dictionary MLBatchNormalizationOptions {
MLOperand scale;
MLOperand bias;
- long axis = 1;
+ unsigned long axis = 1;
float epsilon = 1e-5;
MLActivation activation;
};
@@ -167,7 +167,7 @@ partial interface MLGraphBuilder {
};
partial interface MLGraphBuilder {
- MLOperand concat(sequence<MLOperand> inputs, long axis);
+ MLOperand concat(sequence<MLOperand> inputs, unsigned long axis);
};
enum MLConv2dFilterOperandLayout {
@@ -409,7 +409,10 @@ dictionary MLPadOptions {
};
partial interface MLGraphBuilder {
- MLOperand pad(MLOperand input, MLOperand padding, optional MLPadOptions options = {});
+ MLOperand pad(MLOperand input,
+ sequence<unsigned long> beginningPadding,
+ sequence<unsigned long> endingPadding,
+ optional MLPadOptions options = {});
};
enum MLRoundingType {
@@ -434,8 +437,12 @@ partial interface MLGraphBuilder {
MLOperand maxPool2d(MLOperand input, optional MLPool2dOptions options = {});
};
+partial interface MLGraphBuilder {
+ MLOperand prelu(MLOperand x, MLOperand slope);
+};
+
dictionary MLReduceOptions {
- sequence<long> axes = null;
+ sequence<unsigned long> axes = null;
boolean keepDimensions = false;
};
@@ -466,7 +473,7 @@ dictionary MLResample2dOptions {
MLInterpolationMode mode = "nearest-neighbor";
sequence<float> scales;
sequence<unsigned long> sizes;
- sequence<long> axes;
+ sequence<unsigned long> axes;
};
partial interface MLGraphBuilder {
@@ -483,7 +490,7 @@ partial interface MLGraphBuilder {
};
dictionary MLSliceOptions {
- sequence<long> axes;
+ sequence<unsigned long> axes;
};
partial interface MLGraphBuilder {
@@ -511,7 +518,7 @@ partial interface MLGraphBuilder {
};
dictionary MLSplitOptions {
- long axis = 0;
+ unsigned long axis = 0;
};
partial interface MLGraphBuilder {
@@ -521,7 +528,7 @@ partial interface MLGraphBuilder {
};
dictionary MLSqueezeOptions {
- sequence<long> axes;
+ sequence<unsigned long> axes;
};
partial interface MLGraphBuilder {
@@ -534,7 +541,7 @@ partial interface MLGraphBuilder {
};
dictionary MLTransposeOptions {
- sequence<long> permutation;
+ sequence<unsigned long> permutation;
};
partial interface MLGraphBuilder {
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl
index 13f3999db12..e48f1080c41 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl
@@ -89,6 +89,7 @@ dictionary RTCEncodedAudioFrameMetadata {
unsigned long synchronizationSource;
octet payloadType;
sequence<unsigned long> contributingSources;
+ short sequenceNumber;
};
[Exposed=(Window,DedicatedWorker)]
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
index f1dca4a923d..7e820a26df4 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl
@@ -105,7 +105,7 @@ dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats {
};
dictionary RTCSentRtpStreamStats : RTCRtpStreamStats {
- unsigned long packetsSent;
+ unsigned long long packetsSent;
unsigned long long bytesSent;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc.idl b/tests/wpt/web-platform-tests/interfaces/webrtc.idl
index d631169f46f..578cbe92974 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc.idl
@@ -1,7 +1,7 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
-// Source: WebRTC 1.0: Real-Time Communication Between Browsers (https://w3c.github.io/webrtc-pc/)
+// Source: WebRTC: Real-Time Communication in Browsers (https://w3c.github.io/webrtc-pc/)
dictionary RTCConfiguration {
sequence<RTCIceServer> iceServers = [];
@@ -51,29 +51,29 @@ enum RTCSignalingState {
};
enum RTCIceGatheringState {
-"new",
-"gathering",
-"complete"
- };
+ "new",
+ "gathering",
+ "complete"
+};
enum RTCPeerConnectionState {
-"closed",
-"failed",
-"disconnected",
-"new",
-"connecting",
-"connected"
- };
+ "closed",
+ "failed",
+ "disconnected",
+ "new",
+ "connecting",
+ "connected"
+};
enum RTCIceConnectionState {
-"closed",
-"failed",
-"disconnected",
-"new",
-"checking",
-"completed",
-"connected"
- };
+ "closed",
+ "failed",
+ "disconnected",
+ "new",
+ "checking",
+ "completed",
+ "connected"
+};
[Exposed=Window]
interface RTCPeerConnection : EventTarget {
@@ -332,28 +332,27 @@ dictionary RTCRtpHeaderExtensionParameters {
boolean encrypted = false;
};
-dictionary RTCRtpCodecParameters {
- required octet payloadType;
+dictionary RTCRtpCodec {
required DOMString mimeType;
required unsigned long clockRate;
unsigned short channels;
DOMString sdpFmtpLine;
};
+dictionary RTCRtpCodecParameters : RTCRtpCodec {
+ required octet payloadType;
+};
+
dictionary RTCRtpCapabilities {
required sequence<RTCRtpCodecCapability> codecs;
required sequence<RTCRtpHeaderExtensionCapability> headerExtensions;
};
-dictionary RTCRtpCodecCapability {
- required DOMString mimeType;
- required unsigned long clockRate;
- unsigned short channels;
- DOMString sdpFmtpLine;
+dictionary RTCRtpCodecCapability : RTCRtpCodec {
};
dictionary RTCRtpHeaderExtensionCapability {
- DOMString uri;
+ required DOMString uri;
};
[Exposed=Window]
diff --git a/tests/wpt/web-platform-tests/interfaces/webtransport.idl b/tests/wpt/web-platform-tests/interfaces/webtransport.idl
index ba705807f12..2bea483e1b9 100644
--- a/tests/wpt/web-platform-tests/interfaces/webtransport.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webtransport.idl
@@ -9,10 +9,10 @@ interface WebTransportDatagramDuplexStream {
readonly attribute WritableStream writable;
readonly attribute unsigned long maxDatagramSize;
- attribute double? incomingMaxAge;
- attribute double? outgoingMaxAge;
- attribute long incomingHighWaterMark;
- attribute long outgoingHighWaterMark;
+ attribute unrestricted double incomingMaxAge;
+ attribute unrestricted double outgoingMaxAge;
+ attribute unrestricted double incomingHighWaterMark;
+ attribute unrestricted double outgoingHighWaterMark;
};
[Exposed=(Window,Worker), SecureContext]
@@ -24,6 +24,7 @@ interface WebTransport {
readonly attribute WebTransportReliabilityMode reliability;
readonly attribute WebTransportCongestionControl congestionControl;
readonly attribute Promise<WebTransportCloseInfo> closed;
+ readonly attribute Promise<undefined> draining;
undefined close(optional WebTransportCloseInfo closeInfo = {});
readonly attribute WebTransportDatagramDuplexStream datagrams;
@@ -85,6 +86,7 @@ dictionary WebTransportStats {
DOMHighResTimeStamp rttVariation;
DOMHighResTimeStamp minRtt;
WebTransportDatagramStats datagrams;
+ unsigned long long? estimatedSendRate;
};
dictionary WebTransportDatagramStats {
@@ -123,17 +125,17 @@ interface WebTransportBidirectionalStream {
readonly attribute WebTransportSendStream writable;
};
-[Exposed=(Window,Worker), SecureContext]
+[Exposed=(Window,Worker), Serializable, SecureContext]
interface WebTransportError : DOMException {
- constructor(optional WebTransportErrorInit init = {});
+ constructor(optional DOMString message = "", optional WebTransportErrorOptions options = {});
readonly attribute WebTransportErrorSource source;
readonly attribute octet? streamErrorCode;
};
-dictionary WebTransportErrorInit {
- [Clamp] octet streamErrorCode;
- DOMString message;
+dictionary WebTransportErrorOptions {
+ WebTransportErrorSource source = "stream";
+ [Clamp] octet? streamErrorCode = null;
};
enum WebTransportErrorSource {
diff --git a/tests/wpt/web-platform-tests/interfaces/webxr.idl b/tests/wpt/web-platform-tests/interfaces/webxr.idl
index 939da53364d..de2b04691b3 100644
--- a/tests/wpt/web-platform-tests/interfaces/webxr.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webxr.idl
@@ -41,6 +41,7 @@ enum XRVisibilityState {
[SameObject] readonly attribute XRRenderState renderState;
[SameObject] readonly attribute XRInputSourceArray inputSources;
readonly attribute FrozenArray<DOMString> enabledFeatures;
+ readonly attribute boolean isSystemKeyboardSupported;
// Methods
undefined updateRenderState(optional XRRenderStateInit state = {});
diff --git a/tests/wpt/web-platform-tests/interfaces/window-placement.idl b/tests/wpt/web-platform-tests/interfaces/window-management.idl
index ac86c1d502a..527c41deb6c 100644
--- a/tests/wpt/web-platform-tests/interfaces/window-placement.idl
+++ b/tests/wpt/web-platform-tests/interfaces/window-management.idl
@@ -1,7 +1,7 @@
// GENERATED CONTENT - DO NOT EDIT
// Content was automatically extracted by Reffy into webref
// (https://github.com/w3c/webref)
-// Source: Multi-Screen Window Placement (https://w3c.github.io/window-placement/)
+// Source: Window Management (https://w3c.github.io/window-management/)
partial interface Screen /* : EventTarget */ {
[SecureContext]
diff --git a/tests/wpt/web-platform-tests/interfaces/xhr.idl b/tests/wpt/web-platform-tests/interfaces/xhr.idl
index 3abd09ce5ed..b4c27c8aca9 100644
--- a/tests/wpt/web-platform-tests/interfaces/xhr.idl
+++ b/tests/wpt/web-platform-tests/interfaces/xhr.idl
@@ -70,7 +70,7 @@ typedef (File or USVString) FormDataEntryValue;
[Exposed=(Window,Worker)]
interface FormData {
- constructor(optional HTMLFormElement form);
+ constructor(optional HTMLFormElement form, optional HTMLElement? submitter = null);
undefined append(USVString name, USVString value);
undefined append(USVString name, Blob blobValue, optional USVString filename);
diff --git a/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-blocking-duration.html b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-blocking-duration.html
new file mode 100644
index 00000000000..3514d413e9e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-blocking-duration.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Long Animation Frame Timing: basic</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/utils.js"></script>
+
+<body>
+<h1>Long Animation Frame: blocking duration</h1>
+<div id="log"></div>
+<script>
+
+function loaf_blocking_duration_test(run, label) {
+ const OVERHEAD_EPSILON = 5;
+ const BLOCKING_THRESHOLD = 50;
+ promise_test(async t => {
+ const longtask_promise = new Promise(resolve => new PerformanceObserver(
+ (entries, observer) => {
+ resolve(entries.getEntries());
+ observer.disconnect();
+ }).observe({entryTypes: ["longtask"]}));
+ const [longtask_entries, loaf_entry] = await Promise.all(
+ [longtask_promise, expect_long_frame(run, t)]);
+ const overlapping = longtask_entries.filter(longtask =>
+ (longtask.startTime >= loaf_entry.startTime &&
+ longtask.startTime < (loaf_entry.startTime + loaf_entry.duration) &&
+ (!loaf_entry.renderStart ||
+ (longtask.startTime < loaf_entry.renderStart - OVERHEAD_EPSILON))));
+
+ const longest_index = overlapping.reduce(
+ (max, cur, i) => cur > overlapping[max] ? i : max, 0);
+ let expected_blocking_duration = 0;
+ overlapping.forEach(({duration}, i) => {
+ if (i === longest_index && loaf_entry.renderStart)
+ duration += loaf_entry.startTime + loaf_entry.duration -
+ loaf_entry.renderStart;
+ expected_blocking_duration += Math.max(0, duration - BLOCKING_THRESHOLD);
+ });
+
+ if (!overlapping.length && loaf_entry.renderStart)
+ expected_blocking_duration =
+ Math.max(0,
+ loaf_entry.startTime + loaf_entry.duration - loaf_entry.renderStart -
+ BLOCKING_THRESHOLD);
+ assert_approx_equals(loaf_entry.blockingDuration,
+ expected_blocking_duration,
+ OVERHEAD_EPSILON);
+ }, `LoAF blockingDuration should be equivalent to long tasks: ${label}`);
+}
+
+loaf_blocking_duration_test(t => t.step_timeout(busy_wait), "Non-rendering");
+loaf_blocking_duration_test(t => t.step_timeout(() => {
+ busy_wait();
+ requestAnimationFrame(busy_wait);
+}), "Rendering");
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html
index f78e95da6d1..5b249e69724 100644
--- a/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html
+++ b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html
@@ -31,7 +31,9 @@
'startTime',
'duration',
'renderStart',
- 'styleAndLayoutStart'
+ 'styleAndLayoutStart',
+ 'blockingTime',
+ 'firstUIEventTimestamp'
];
for (const key of performanceEntryKeys) {
assert_equals(entryJSON[key], entry[key],
diff --git a/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js b/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js
index 26a925abf07..8b0f266faca 100644
--- a/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js
+++ b/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js
@@ -13,9 +13,9 @@
* @param {!RTCPeerConnection} pc2 The second peer connection.
*/
async function exchangeOfferAnswer(pc1, pc2) {
- await pc1.setLocalDescription(await pc1.createOffer());
+ await pc1.setLocalDescription();
await pc2.setRemoteDescription(pc1.localDescription);
- await pc2.setLocalDescription(await pc2.createAnswer());
+ await pc2.setLocalDescription();
await pc1.setRemoteDescription(pc2.localDescription);
}
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html
index 676672a230f..004e1a75e3d 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, link.href, "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html
index 41c3ca71eef..683875d0062 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html
@@ -18,8 +18,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, link.href, "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html
index a467ecf9d73..60d1653a3ab 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, link.href, "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html
index b9fa97f6d52..ee01e7f1f2d 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html
@@ -28,8 +28,8 @@ async_test(t => {
assert_equals(e.data.formData, null, "formData");
assert_equals(e.data.destination.url, link.href, "destination.url");
assert_true(e.data.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.data.destination.key, null, "destination.key");
- assert_equals(e.data.destination.id, null, "destination.id");
+ assert_equals(e.data.destination.key, "", "destination.key");
+ assert_equals(e.data.destination.id, "", "destination.id");
assert_equals(e.data.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html
index 566bea3dc7e..eaa7b523457 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html
@@ -16,8 +16,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, link.href, "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html
index 77a5873c083..cee7d95b9ec 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -23,8 +23,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, iframe.src + "?foo", "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html
index 41ac1b03750..d0dad46b72a 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html
@@ -15,8 +15,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, i.src + "?foo", "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html
index 1eda74e9828..156d1cb3cfd 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html
@@ -23,8 +23,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, iframe.src + "#foo", "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html
index 5679236a7dd..6d73262dea0 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html
@@ -21,8 +21,8 @@ async_test(t => {
assert_equals(e.data.formData, null, "formData");
assert_equals(e.data.destination.url, iframe.src + "#foo", "destination.url");
assert_true(e.data.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.data.destination.key, null, "destination.key");
- assert_equals(e.data.destination.id, null, "destination.id");
+ assert_equals(e.data.destination.key, "", "destination.key");
+ assert_equals(e.data.destination.id, "", "destination.id");
assert_equals(e.data.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html
index a7e4181c3a1..6516a602395 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html
@@ -15,8 +15,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, i.src + "#foo", "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html
index ea9ea479c34..1c411d98668 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -24,8 +24,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, url + "?foo", "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html
index 478483e238d..c91689341e8 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html
@@ -15,8 +15,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, i.src + "?foo", "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html
index 324adb32a45..74a6cae2461 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html
@@ -24,8 +24,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, url + "#foo", "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html
index 23dceb04204..9b31744ba38 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html
@@ -22,8 +22,8 @@ async_test(t => {
assert_equals(e.data.formData, null, "formData");
assert_equals(e.data.destination.url, iframe.src + "#foo", "destination.url");
assert_true(e.data.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.data.destination.key, null, "destination.key");
- assert_equals(e.data.destination.id, null, "destination.id");
+ assert_equals(e.data.destination.key, "", "destination.key");
+ assert_equals(e.data.destination.id, "", "destination.id");
assert_equals(e.data.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html
index 9ca85318034..c357072e09d 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html
@@ -15,8 +15,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, i.src + "#foo", "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html
index f6110346174..ffdaac7ccdd 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, form.action, "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html
index 05347335a19..b54a5a440b0 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html
@@ -16,8 +16,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, form.action, "destination.url");
assert_false(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html
index 9e64a0124da..e9ab17243e5 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, form.action, "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html
index e53a1f93e7a..69b12f27959 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html
@@ -28,8 +28,8 @@ async_test(t => {
assert_equals(e.data.formData, null, "formData");
assert_equals(e.data.destination.url, form.action, "destination.url");
assert_true(e.data.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.data.destination.key, null, "destination.key");
- assert_equals(e.data.destination.id, null, "destination.id");
+ assert_equals(e.data.destination.key, "", "destination.key");
+ assert_equals(e.data.destination.id, "", "destination.id");
assert_equals(e.data.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html
index 43aa3226fcd..8a0e1f1fb69 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html
@@ -16,8 +16,8 @@ async_test(t => {
assert_equals(e.formData, null, "formData");
assert_equals(e.destination.url, form.action, "destination.url");
assert_true(e.destination.sameDocument, "destination.sameDocument");
- assert_equals(e.destination.key, null, "destination.key");
- assert_equals(e.destination.id, null, "destination.id");
+ assert_equals(e.destination.key, "", "destination.key");
+ assert_equals(e.destination.id, "", "destination.id");
assert_equals(e.destination.index, -1, "destination.index");
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html
index d8f2e383124..ee099248507 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html
@@ -14,8 +14,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(e.destination.url, "https://does-not-exist/foo.html");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.preventDefault();
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html
index 90a612b7588..b9506984dad 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html
@@ -18,8 +18,8 @@ async_test(t => {
assert_equals(e.formData, null);
assert_equals(new URL(e.destination.url).search, "?1");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.preventDefault();
t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0);
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html
index c5ca306b790..05fb0ecf2fe 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html
@@ -22,8 +22,8 @@ for (const [tag, download_attr] of tests) {
assert_equals(new URL(e.destination.url).pathname,
"/navigation-api/navigate-event/foo.html");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.preventDefault();
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html
index b7706b7debe..51221ebcad3 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html
@@ -14,8 +14,8 @@ async_test(t => {
assert_equals(e.formData, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.preventDefault();
t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0);
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html
index b8e925a4dba..68f5bf0627c 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html
@@ -15,8 +15,8 @@ async_test(t => {
assert_equals(new URL(e.destination.url).pathname,
"/navigation-api/navigate-event/foo.html");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.preventDefault();
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html
index b746bbe3f02..39192c91513 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html
@@ -17,8 +17,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.preventDefault();
t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0);
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html
index c2053a37b09..6407b963beb 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html
@@ -20,8 +20,8 @@ async_test(t => {
assert_equals(new URL(e.destination.url).pathname,
"/navigation-api/navigate-event/foo.html");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.preventDefault();
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-after-detach.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-after-detach.html
new file mode 100644
index 00000000000..1dcb6cac437
--- /dev/null
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-after-detach.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="i" src="/common/blank.html"></iframe>
+<script>
+promise_test(async t => {
+ // Wait for after the load event so that the navigation doesn't get converted
+ // into a replace navigation.
+ await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
+
+ let destination_key = i.contentWindow.navigation.currentEntry.key;
+ let destination_id = i.contentWindow.navigation.currentEntry.id;
+ let destination_index = i.contentWindow.navigation.currentEntry.index;
+ await i.contentWindow.navigation.navigate("#1").finished;
+
+ let back_destination;
+ i.contentWindow.navigation.onnavigate = e => back_destination = e.destination;
+ await i.contentWindow.navigation.back().finished;
+
+ // Before detach, key/id/index are valid.
+ assert_equals(back_destination.key, destination_key);
+ assert_equals(back_destination.id, destination_id);
+ assert_equals(back_destination.index, destination_index);
+
+ i.remove();
+
+ // After detach, key/id/index are invalid, but the url is still valid.
+ assert_equals(back_destination.key, "");
+ assert_equals(back_destination.id, "");
+ assert_equals(new URL(back_destination.url).pathname, "/common/blank.html");
+ assert_equals(back_destination.index, -1);
+}, "navigate event destination after iframe detach");
+</script>
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-dynamic-index.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-dynamic-index.html
new file mode 100644
index 00000000000..2e0f1ea4973
--- /dev/null
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-dynamic-index.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../navigation-methods/return-value/resources/helpers.js"></script>
+<script>
+promise_test(async t => {
+ // Wait for after the load event so that the navigation doesn't get converted
+ // into a replace navigation.
+ await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0));
+ await navigation.navigate("#1").finished;
+
+ let back_destination;
+ navigation.addEventListener("navigate", t.step_func(e => {
+ back_destination = e.destination;
+ assert_equals(back_destination.index, 0);
+ }), { once: true });
+ await navigation.back().finished;
+
+ // Disposing the destination entry of back_destination should update
+ // back_destination.index, even though back_destination's navigation has
+ // completed.
+ await navigation.navigate("#clobber_back", { history: "replace" }).finished;
+ assert_equals(back_destination.index, -1);
+
+ navigation.addEventListener("navigate", t.step_func(e => {
+ assert_equals(e.destination.index, 1);
+
+ // Dispose the destination entry and destination.index should update.
+ navigation.navigate("#clobber_forward");
+ assert_equals(e.destination.index, -1);
+ }), { once: true });
+ await assertBothRejectDOM(t, navigation.forward(), "AbortError");
+}, "navigate event destination.index should be dynamic");
+</script>
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html
index c118aa7a1f3..c8b1043aba6 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html
@@ -16,8 +16,8 @@ async_test(t => {
assert_not_equals(e.destination, null);
assert_not_equals(e.destination.getState(), undefined);
assert_not_equals(e.destination.getState(), e.destination.getState());
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
});
navigation.back();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html
index 9c34c5753a1..5dac40de566 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html
@@ -13,8 +13,8 @@ async_test(t => {
assert_not_equals(e.destination.getState(), undefined);
assert_equals(e.destination.getState().statevar, "state");
assert_not_equals(e.destination.getState(), e.destination.getState());
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
});
navigation.navigate("#foo", { state: navState });
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html
index b3afb72482c..a180e086a94 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html
@@ -13,8 +13,8 @@ async_test(t => {
assert_not_equals(e.destination.getState(), undefined);
assert_equals(e.destination.getState().statevar, "state");
assert_not_equals(e.destination.getState(), e.destination.getState());
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
e.intercept();
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html
index 69a49eb08a6..87a102ddc05 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html
@@ -15,8 +15,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(e.destination.url, location.href + "?");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
// Because it's a GET, not a POST
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html
index 454f0773962..40c5905447c 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html
@@ -20,8 +20,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(e.destination.url, location.href);
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_not_equals(e.formData, null);
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html
index b23ab3a70cc..f6fe05c938f 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html
@@ -18,8 +18,8 @@ async_test(t => {
assert_equals(new URL(e.destination.url).pathname,
"/navigation-api/navigate-event/foo.html");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_not_equals(e.formData, null);
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html
index b537a9b58f0..c57d72c3deb 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html
@@ -15,8 +15,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(e.destination.url, location.href);
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_not_equals(e.formData, null);
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html
index 96d98cf44c8..b1f41425b62 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html
@@ -14,8 +14,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).pathname, "/common/blank.html");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html
index 2f8c81c7090..266309a79e1 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html
@@ -13,8 +13,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html
index d8417fbfd30..ea6d3df455d 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html
@@ -13,8 +13,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html
index 059b9950118..25d51476f3f 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html
@@ -17,8 +17,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html
index c5aa0be97a4..a4d0c60776d 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html
@@ -13,8 +13,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html
index 1f8ed306851..9fa59b29f24 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html
@@ -16,8 +16,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(e.destination.url, i.contentWindow.location.href);
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html
index 76f98c72361..ffc8ea867f7 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html
@@ -12,8 +12,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#foo");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
});
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html
index 26ad135b6ad..8bbb66a31fd 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html
@@ -17,8 +17,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(e.destination.url, "about:srcdoc");
assert_false(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html
index 274c8bc4d57..a6e443fd5a1 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html
@@ -12,8 +12,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html
index afc998271f6..1fe2402bc91 100644
--- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html
+++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html
@@ -17,8 +17,8 @@ async_test(t => {
assert_equals(e.downloadRequest, null);
assert_equals(new URL(e.destination.url).hash, "#1");
assert_true(e.destination.sameDocument);
- assert_equals(e.destination.key, null);
- assert_equals(e.destination.id, null);
+ assert_equals(e.destination.key, "");
+ assert_equals(e.destination.id, "");
assert_equals(e.destination.index, -1);
assert_equals(e.formData, null);
e.preventDefault();
diff --git a/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js b/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js
index 40f10a56448..fa96bf3b760 100644
--- a/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js
+++ b/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js
@@ -15,5 +15,23 @@ function window_state_context(t) {
rect = await test_driver.minimize_window();
}
- return {minimize, restore};
+ function visibilityEventPromise() {
+ return new Promise(resolve => new PerformanceObserver(
+ (entries, observer) => { observer.disconnect(); resolve(); }).observe(
+ {type: "visibility-state"}))
+ }
+
+ async function minimizeAndWait() {
+ const promise = visibilityEventPromise();
+ await Promise.all([minimize(), promise]);
+ await new Promise(resolve => t.step_timeout(resolve, 0));
+ }
+
+ async function restoreAndWait() {
+ const promise = visibilityEventPromise();
+ await Promise.all([restore(), promise]);
+ await new Promise(resolve => t.step_timeout(resolve, 0));
+ }
+
+ return {minimize, restore, minimizeAndWait, restoreAndWait};
}
diff --git a/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html b/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html
index c62b6c583f4..0dbe634d25b 100644
--- a/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html
+++ b/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html
@@ -1,6 +1,6 @@
<!DOCTYPE HTML>
<title>Test VisibleStateEntry</title>
-<link rel="author" title="Noam Rosenthal" href="mailto:noam@chromium.org">
+<link rel="author" title="Noam Rosenthal" href="mailto:nrosenthal@chromium.org">
<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#page-visibility">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
@@ -15,68 +15,56 @@ setup(() => {
});
promise_test(async t => {
- const {minimize, restore} = window_state_context(t);
+ const {minimizeAndWait, restoreAndWait} = window_state_context(t);
+ const all = performance.getEntries();
let entries = performance.getEntriesByType("visibility-state");
assert_equals(entries.length, 1);
assert_equals(entries[0].name, "visible");
assert_equals(entries[0].startTime, 0);
assert_equals(entries[0].duration, 0);
- await minimize();
+ await minimizeAndWait();
entries = performance.getEntriesByType("visibility-state");
assert_equals(entries.length, 2);
assert_equals(entries[1].name, "hidden");
assert_equals(entries[1].duration, 0);
- await restore();
+ await restoreAndWait();
+ entries = performance.getEntriesByType("visibility-state");
assert_equals(entries.length, 3);
assert_equals(entries[2].name, "visible");
assert_equals(entries[2].duration, 0);
}, "Hiding/showing the page should create visibility-state entries");
promise_test(async t => {
- const {minimize, restore} = window_state_context(t);
- await minimize();
- const popup = window.open("resources/blank_page_green.html");
- t.add_cleanup(() => popup.close());
- await restore();
- let entries = popup.performance.getEntriesByType("visibility-state");
- assert_equals(entries.length, 2);
+ const {minimizeAndWait} = window_state_context(t);
+ await minimizeAndWait();
+ const iframe = document.createElement("iframe");
+ iframe.src = "resources/blank_page_green.html";
+ const loaded = new Promise(resolve => iframe.addEventListener("load", resolve));
+ t.add_cleanup(() => iframe.remove());
+ document.body.appendChild(iframe);
+ await loaded;
+ const entries = iframe.contentWindow.performance.getEntriesByType("visibility-state");
assert_equals(entries[0].name, "hidden");
assert_equals(entries[0].startTime, 0);
- assert_equals(entries[1].name, "visible");
- assert_greater_than(entries[1].startTime, 0);
-
}, "If a page starts as hidden, the first visibility-state entry should be hidden");
promise_test(async t => {
const {minimize, restore} = window_state_context(t);
- await minimize();
const observed = new Promise(resolve => new PerformanceObserver(list => {
- const entries = list.getEntries();
- assert_equals(entries.length, 1);
- assert_equals(entries[0].name, "visible");
- assert_greater_than(entries[0].startTime, 0);
- assert_equals(entries[0].duration, 0);
+ if (list.getEntries()[0].name === "visible")
resolve();
- }).observe({entryTypes: ['visibility-state'], buffered: true}));
+ }).observe({entryTypes: ['visibility-state']}));
+ await minimize();
await restore();
await observed;
}, "Visibility state entries should be queued to performance observers");
promise_test(async t => {
- const {minimize, restore} = window_state_context(t);
- await minimize();
- await restore();
- await new Promise(resolve => new PerformanceObserver(list => {
- const entries = list.getEntries();
- assert_equals(entries.length, 3);
- assert_equals(entries[0].name, "visible");
- assert_equals(entries[0].startTime, 0);
- assert_equals(entries[0].duration, 0);
- assert_equals(entries[1].name, "hidden");
- assert_equals(entries[1].duration, 0);
- assert_equals(entries[2].name, "visible");
- assert_equals(entries[2].duration, 0);
- resolve();
- }).observe({entryTypes: ['visibility-state'], buffered: true}));
-}, "Visibility state entries should respect the buffered flag");
+ const entry = await new Promise(resolve => new PerformanceObserver(
+ (list, observer) => {
+ observer.disconnect();
+ resolve(list.getEntries()[0]);
+ }).observe({type: "visibility-state", buffered: true}));
+ assert_equals(entry.name, "visible");
+}, "Visibility state observers should respect the buffered flag");
</script>
diff --git a/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js b/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js
index 91efe529f2a..21811ed52da 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js
@@ -1,5 +1,5 @@
import {PressureManager, PressureManagerReceiver, PressureStatus} from '/gen/services/device/public/mojom/pressure_manager.mojom.m.js'
-import {PressureFactor, PressureState} from '/gen/services/device/public/mojom/pressure_update.mojom.m.js'
+import {PressureFactor, PressureSource, PressureState} from '/gen/services/device/public/mojom/pressure_update.mojom.m.js'
class MockPressureService {
constructor() {
@@ -9,11 +9,8 @@ class MockPressureService {
this.interceptor_.oninterfacerequest = e => {
this.receiver_.$.bindHandle(e.handle);
};
- this.receiver_.onConnectionError.addListener(() => {
- this.stopPlatformCollector();
- this.observer_ = null;
- });
this.reset();
+ this.mojomSourceType_ = new Map([['cpu', PressureSource.kCpu]]);
this.mojomStateType_ = new Map([
['nominal', PressureState.kNominal], ['fair', PressureState.kFair],
['serious', PressureState.kSerious], ['critical', PressureState.kCritical]
@@ -40,22 +37,27 @@ class MockPressureService {
}
reset() {
- this.observer_ = null;
+ this.observers_ = [];
this.pressureUpdate_ = null;
this.pressureServiceReadingTimerId_ = null;
this.pressureStatus_ = PressureStatus.kOk;
this.updatesDelivered_ = 0;
}
- async addClient(observer) {
- if (this.observer_ !== null)
- throw new Error('BindObserver() has already been called');
+ async addClient(observer, source) {
+ if (this.observers_.indexOf(observer) >= 0)
+ throw new Error('addClient() has already been called');
- this.observer_ = observer;
- this.observer_.onConnectionError.addListener(() => {
- this.stopPlatformCollector();
- this.observer_ = null;
+ // TODO(crbug.com/1342184): Consider other sources.
+ // For now, "cpu" is the only source.
+ if (source !== PressureSource.kCpu)
+ throw new Error('Call addClient() with a wrong PressureSource');
+
+ observer.onConnectionError.addListener(() => {
+ // Remove this observer from observer array.
+ this.observers_.splice(this.observers_.indexOf(observer), 1);
});
+ this.observers_.push(observer);
return {status: this.pressureStatus_};
}
@@ -83,20 +85,21 @@ class MockPressureService {
const epochDeltaInMs = unixEpoch - windowsEpoch;
const timeout = (1 / sampleRate) * 1000;
- this.pressureServiceReadingTimerId_ = window.setInterval(() => {
- if (this.pressureUpdate_ === null || this.observer_ === null)
+ this.pressureServiceReadingTimerId_ = self.setInterval(() => {
+ if (this.pressureUpdate_ === null || this.observers_.length === 0)
return;
this.pressureUpdate_.timestamp = {
internalValue: BigInt((new Date().getTime() + epochDeltaInMs) * 1000)
};
- this.observer_.onPressureUpdated(this.pressureUpdate_);
+ for (let observer of this.observers_)
+ observer.onPressureUpdated(this.pressureUpdate_);
this.updatesDelivered_++;
}, timeout);
}
stopPlatformCollector() {
if (this.pressureServiceReadingTimerId_ != null) {
- window.clearInterval(this.pressureServiceReadingTimerId_);
+ self.clearInterval(this.pressureServiceReadingTimerId_);
this.pressureServiceReadingTimerId_ = null;
}
this.updatesDelivered_ = 0;
@@ -106,7 +109,10 @@ class MockPressureService {
return this.updatesDelivered_;
}
- setPressureUpdate(state, factors) {
+ setPressureUpdate(source, state, factors) {
+ if (!this.mojomSourceType_.has(source))
+ throw new Error(`PressureSource '${source}' is invalid`);
+
if (!this.mojomStateType_.has(state))
throw new Error(`PressureState '${state}' is invalid`);
@@ -120,6 +126,7 @@ class MockPressureService {
}
this.pressureUpdate_ = {
+ source: this.mojomSourceType_.get(source),
state: this.mojomStateType_.get(state),
factors: pressureFactors,
};
diff --git a/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js b/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js
index b63e97b8c4d..b81936713b1 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js
@@ -37,7 +37,7 @@ self.SubAppsServiceTest = (() => {
remove() {
return Promise.resolve({
- result: testInternal.serviceResultCode,
+ result: testInternal.removeCallReturnValue,
});
}
}
@@ -48,6 +48,7 @@ self.SubAppsServiceTest = (() => {
serviceResultCode: 0,
addCallReturnValue: [],
listCallReturnValue: [],
+ removeCallReturnValue: [],
}
class SubAppsServiceTestChromium {
@@ -55,7 +56,7 @@ self.SubAppsServiceTest = (() => {
Object.freeze(this); // Make it immutable.
}
- initialize(service_result_code, add_call_return_value, list_call_return_value) {
+ initialize(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value) {
if (!testInternal.initialized) {
testInternal = {
mockSubAppsService: new MockSubAppsService(),
@@ -63,6 +64,7 @@ self.SubAppsServiceTest = (() => {
serviceResultCode: service_result_code,
addCallReturnValue: add_call_return_value,
listCallReturnValue: list_call_return_value,
+ removeCallReturnValue: remove_call_return_value,
};
};
}
@@ -76,6 +78,7 @@ self.SubAppsServiceTest = (() => {
serviceResultCode: 0,
addCallReturnValue: [],
listCallReturnValue: [],
+ removeCallReturnValue: [],
};
await new Promise(resolve => setTimeout(resolve, 0));
}
diff --git a/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html b/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html
index 0bebb6723a3..90bbb8071da 100644
--- a/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html
+++ b/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html
@@ -6,110 +6,91 @@
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script type="module">
-
-import { makeCleanup, getOppositeOrientation } from "./resources/orientation-utils.js";
-
-test(() => {
- assert_true("type" in screen.orientation);
- assert_true("angle" in screen.orientation);
-}, "Test screen.orientation properties");
+"use strict";
+import {
+ makeCleanup,
+ getOppositeOrientation,
+} from "./resources/orientation-utils.js";
test(() => {
- const type = screen.orientation.type;
- const angle = screen.orientation.angle;
+ assert_true("type" in screen.orientation, ".type must be present");
+ assert_true("angle" in screen.orientation, ".angle must be present");
+}, "screen.orientation attributes are present");
- if (screen.width > screen.height) {
- assert_true(type == "landscape-primary" || type == "landscape-secondary");
- } else if (screen.width < screen.height) {
- assert_true(type == "portrait-primary" || type == "portrait-secondary");
+async function testExpectedOrientationAngles(expectedAngles) {
+ for (const [orientation, expectedAngle] of Object.entries(expectedAngles)) {
+ try {
+ if (screen.orientation.type !== orientation) {
+ await screen.orientation.lock(orientation);
+ }
+ assert_equals(
+ screen.orientation.angle,
+ expectedAngle,
+ `Orientation angle for '${orientation}' must be ${expectedAngle} degrees`
+ );
+ } catch (err) {
+ // implementation might not support locking to this orientation
+ }
}
+}
+
+promise_test(async (t) => {
+ t.add_cleanup(makeCleanup());
+ await test_driver.bless("request full screen");
+ await document.documentElement.requestFullscreen();
- assert_true(angle == 0 || angle == 90 || angle == 180 || angle == 270);
-}, "Test screen.orientation default values.");
+ const expectedAnglesPortrait = {
+ "portrait-primary": 0,
+ "landscape-primary": 90,
+ "portrait-secondary": 180,
+ "landscape-secondary": 270,
+ };
-promise_test(async t => {
+ await testExpectedOrientationAngles(expectedAnglesPortrait);
+}, "Test the orientations and associated angles when the natural orientation is 'portrait'");
+
+promise_test(async (t) => {
t.add_cleanup(makeCleanup());
await test_driver.bless("request full screen");
await document.documentElement.requestFullscreen();
- try {
- await screen.orientation.lock("portrait-primary");
- } catch (err) {
- // implementation might not support locking to portrait-primary
- return;
- }
- const orientations =
- screen.orientation.angle === 0
- ? {
- secondaryOrientation1: "portrait-secondary",
- primaryOrientation2: "landscape-primary",
- secondaryOrientation2: "landscape-secondary",
- }
- : {
- secondaryOrientation1: "landscape-secondary",
- primaryOrientation2: "portrait-primary",
- secondaryOrientation2: "portrait-secondary",
- };
- try {
- await screen.orientation.lock(orientations.secondaryOrientation1);
- } catch (err) {
- // implementation might not support locking to this orientation
- return;
- }
- assert_equals(
- screen.orientation.angle,
- 180,
- "Secondary orientation 1 angle must be 180"
- );
- try {
- await screen.orientation.lock(orientations.primaryOrientation2);
- } catch (err) {
- // implementation might not support locking to this orientation
- return;
- }
- assert_true(
- screen.orientation.angle == 90 || screen.orientation.angle == 270,
- "Primary orientation 2 angle must be either 90 or 270"
- );
- const primaryOrientation2Angle = screen.orientation.angle;
- const secondaryOrientation2Angle = primaryOrientation2Angle === 90 ? 270 : 90;
- try {
- await screen.orientation.lock(orientations.secondaryOrientation2);
- } catch (err) {
- // implementation might not support locking to this orientation
- return;
- }
- assert_equals(
- screen.orientation.angle,
- secondaryOrientation2Angle,
- "Secondary orientation 2 angle must be the opposite angle to primary orientation 2"
- );
- screen.orientation.unlock();
-}, "Test the orientations and associated angles");
+
+ const expectedAnglesLandscape = {
+ "landscape-primary": 0,
+ "portrait-primary": 90,
+ "landscape-secondary": 180,
+ "portrait-secondary": 270,
+ };
+
+ await testExpectedOrientationAngles(expectedAnglesLandscape);
+}, "Test the orientations and associated angles when the natural orientation is 'landscape'");
test(() => {
- const type = screen.orientation.type;
- const angle = screen.orientation.angle;
+ const { angle, type } = screen.orientation;
- try {
- screen.orientation.type = "foo";
- } catch (err) {
- // implementation might throw an exception due to readonly
- }
- try {
- screen.orientation.angle = 42;
- } catch (err) {
- // implementation might throw an exception due to readonly
- }
+ assert_throws_js(
+ TypeError,
+ () => {
+ screen.orientation.type = "foo";
+ },
+ "throws when setting ScreenOrientation.type to a string in strict mode"
+ );
+ assert_throws_js(
+ TypeError,
+ () => {
+ screen.orientation.angle = 42;
+ },
+ "throws when setting ScreenOrientation.angle to a number in strict mode"
+ );
assert_equals(screen.orientation.type, type);
assert_equals(screen.orientation.angle, angle);
-}, "Test that screen.orientation properties are not writable");
+}, "Test that ScreenOrientation properties are not writable");
test(() => {
assert_equals(screen.orientation, screen.orientation);
-}, "Test that screen.orientation is always the same object");
+}, "Test that ScreenOrientation is always the same object");
-promise_test(async t => {
+promise_test(async (t) => {
t.add_cleanup(makeCleanup());
await test_driver.bless("request full screen");
await document.documentElement.requestFullscreen();
@@ -121,10 +102,18 @@ promise_test(async t => {
// change event is fired before resolving promise by lock.
const event = await Promise.race([
orientationWatcher.wait_for("change"),
- screen.orientation.lock(newOrientationType)
+ screen.orientation.lock(newOrientationType),
]);
assert_true(event instanceof Event, "expected event");
- assert_not_equals(screen.orientation.type, initialType, "type should have changed");
- assert_not_equals(screen.orientation.angle, initialAngle, "angle should have changed");
-}, "Test that screen.orientation values change if the orientation changes");
+ assert_not_equals(
+ screen.orientation.type,
+ initialType,
+ ".type must change"
+ );
+ assert_not_equals(
+ screen.orientation.angle,
+ initialAngle,
+ ".angle must change"
+ );
+}, "Test that ScreenOrientation's attribute values change after 'change' event fires");
</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html
index f44a682890d..375489c26a4 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html
@@ -13,7 +13,7 @@
width: 100px;
height: 100px;
}
- #scroller > div {
+ #scroller > #content {
height: 200px;
width: 200px;
}
@@ -36,9 +36,9 @@
</style>
<main>
<div id=scroller>
- <div></div>
+ <div id=content></div>
+ <div id=element></div>
</div>
- <div id=element></div>
</main>
<script>
promise_test(async (t) => {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
index 7e5b6607b6e..05fab3e46ad 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
@@ -41,8 +41,8 @@
<div id="scroller">
<div id="contents"></div>
+ <div id="box"></div>
</div>
-<div id="box"></div>
<script>
window.addEventListener('load', function() {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html
index 9074f2454b1..d2f2d8f73d7 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html
@@ -23,8 +23,8 @@
<div id="scroller">
<div id="contents"></div>
+ <div id="box"></div>
</div>
-<div id="box"></div>
<script>
window.addEventListener('load', function() {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html
index 2e910cbe51e..3f1aeed0ae9 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html
@@ -28,6 +28,7 @@
animation-duration: 10s;
animation-timing-function: linear;
animation-timeline: top_timeline;
+ position: absolute;
}
/* Ensure stable expectations if feature is not supported */
@supports not (animation-timeline:foo) {
@@ -35,8 +36,10 @@
}
</style>
<main>
- <div id=scroller1><div></div></div>
- <div id=element></div>
+ <div id=scroller1>
+ <div></div>
+ <div id=element></div>
+ </div>
</main>
<script>
window.onload = async () => {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html
new file mode 100644
index 00000000000..78ca2574373
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html>
+<title>Scroll Timeline Attachment</title>
+<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/7759">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+
+<main id=main></main>
+<script>
+ function inflate(t, template) {
+ t.add_cleanup(() => main.replaceChildren());
+ main.append(template.content.cloneNode(true));
+ main.offsetTop;
+ }
+
+ async function scrollTop(e, value) {
+ e.scrollTop = value;
+ await waitForNextFrame();
+ }
+</script>
+<style>
+ @keyframes anim {
+ from { width: 0px; --applied:true; }
+ to { width: 200px; --applied:true; }
+ }
+
+ .scroller {
+ overflow-y: hidden;
+ width: 200px;
+ height: 200px;
+ }
+ .scroller > .content {
+ margin: 400px 0px;
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ }
+ .target {
+ background-color: coral;
+ width: 0px;
+ animation: anim auto linear;
+ animation-timeline: t1;
+ }
+ .timeline {
+ scroll-timeline-name: t1;
+ }
+ .local {
+ scroll-timeline-attachment: local;
+ }
+ .defer {
+ scroll-timeline-attachment: defer;
+ }
+ .ancestor {
+ scroll-timeline-attachment: ancestor;
+ }
+
+</style>
+
+
+<!-- Basic Behavior -->
+
+<template id=scroll_timeline_defer>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class="scroller timeline ancestor">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_defer);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+ }, 'Descendant can attach to deferred timeline');
+</script>
+
+<template id=scroll_timeline_defer_no_attach>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_defer_no_attach);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Deferred timeline with no attachments');
+</script>
+
+<template id=scroll_timeline_local_ancestor>
+ <div class="scroller timeline local">
+ <div class=content>
+ <div class=target>Test</div>
+ <div class="scroller timeline ancestor">
+ <div class=content></div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_local_ancestor);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+ }, 'Timeline with ancestor attachment does not attach to local');
+</script>
+
+<template id=scroll_timeline_defer_two_attachments>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class="scroller timeline ancestor">
+ <div class=content></div>
+ </div>
+ <!-- Extra attachment -->
+ <div class="timeline ancestor"></div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_defer_two_attachments);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Deferred timeline with two attachments');
+</script>
+
+<!-- Effective Axis of ScrollTimeline -->
+
+<template id=scroll_timeline_defer_axis>
+ <div class="timeline defer" style="scroll-timeline-axis:inline">
+ <div class=target>Test</div>
+ <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_defer_axis);
+ let target = main.querySelector('.target');
+ assert_equals(target.getAnimations().length, 1);
+ let anim = target.getAnimations()[0];
+ assert_not_equals(anim.timeline, null);
+ assert_equals(anim.timeline.axis, 'vertical');
+ }, 'Axis of deferred timeline is taken from attached timeline');
+</script>
+
+
+<template id=scroll_timeline_defer_axis_multiple>
+ <div class="timeline defer" style="scroll-timeline-axis:inline">
+ <div class=target>Test</div>
+ <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical">
+ <div class=content></div>
+ </div>
+ <!-- Extra attachment -->
+ <div class="timeline ancestor"></div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_defer_axis_multiple);
+ let target = main.querySelector('.target');
+ assert_equals(target.getAnimations().length, 1);
+ let anim = target.getAnimations()[0];
+ assert_not_equals(anim.timeline, null);
+ assert_equals(anim.timeline.axis, 'block');
+ }, 'Axis of deferred timeline with multiple attachments');
+</script>
+
+
+<!-- Dynamic Reattachment -->
+
+
+<template id=scroll_timeline_reattach>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class="scroller timeline ancestor">
+ <div class=content></div>
+ </div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_reattach);
+ let scrollers = main.querySelectorAll('.scroller');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 175); // 25%
+
+ // Attached to scrollers[0].
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Reattach to scrollers[1].
+ scrollers[0].classList.remove('ancestor');
+ scrollers[1].classList.add('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25%
+ }, 'Dynamically re-attaching');
+</script>
+
+
+<template id=scroll_timeline_dynamic_attach_second>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ <div class="scroller timeline">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_dynamic_attach_second);
+ let scrollers = main.querySelectorAll('.scroller');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 175); // 25%
+
+ // Attached to no timelines initially:
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+
+ // Attach to scrollers[0].
+ scrollers[0].classList.add('ancestor');
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Also attach scrollers[1].
+ scrollers[1].classList.add('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Dynamically attaching');
+</script>
+
+
+<template id=scroll_timeline_dynamic_detach_second>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class="scroller timeline ancestor">
+ <div class=content></div>
+ </div>
+ <div class="scroller timeline ancestor">
+ <div class=content></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, scroll_timeline_dynamic_detach_second);
+ let scrollers = main.querySelectorAll('.scroller');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 175); // 25%
+
+ // Attached to two timelines initially:
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+
+ // Detach scrollers[1].
+ scrollers[1].classList.remove('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Also detach scrollers[0].
+ scrollers[0].classList.remove('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Dynamically detaching');
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html
index 37b4dfdf549..958ce4964e8 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html
@@ -41,15 +41,16 @@
scroll-timeline: timeline_inline_in_vertical inline;
writing-mode: vertical-lr;
}
- #container > div {
+ .target {
width: 0px;
animation-name: expand;
animation-duration: 10s;
animation-timing-function: linear;
+ position: absolute;
}
/* Ensure stable expectations if feature is not supported */
@supports not (animation-timeline:foo) {
- #container > div { animation-play-state: paused; }
+ .target { animation-play-state: paused; }
}
#element_initial_axis { animation-timeline: timeline_initial_axis; }
#element_vertical { animation-timeline: timeline_vertical; }
@@ -59,21 +60,33 @@
#element_block_in_vertical { animation-timeline: timeline_block_in_vertical; }
#element_inline_in_vertical { animation-timeline: timeline_inline_in_vertical; }
</style>
-<div class=scroller id=timeline_initial_axis><div class=contents></div></div>
-<div class=scroller id=timeline_vertical><div class=contents></div></div>
-<div class=scroller id=timeline_horizontal><div class=contents></div></div>
-<div class=scroller id=timeline_block_in_horizontal><div class=contents></div></div>
-<div class=scroller id=timeline_inline_in_horizontal><div class=contents></div></div>
-<div class=scroller id=timeline_block_in_vertical><div class=contents></div></div>
-<div class=scroller id=timeline_inline_in_vertical><div class=contents></div></div>
-<div id=container>
- <div id=element_initial_axis></div>
- <div id=element_vertical></div>
- <div id=element_horizontal></div>
- <div id=element_block_in_horizontal></div>
- <div id=element_inline_in_horizontal></div>
- <div id=element_block_in_vertical></div>
- <div id=element_inline_in_vertical></div>
+<div class=scroller id=timeline_initial_axis>
+ <div class=contents></div>
+ <div class=target id=element_initial_axis></div>
+</div>
+<div class=scroller id=timeline_vertical>
+ <div class=contents></div>
+ <div class=target id=element_vertical></div>
+</div>
+<div class=scroller id=timeline_horizontal>
+ <div class=contents></div>
+ <div class=target id=element_horizontal></div>
+</div>
+<div class=scroller id=timeline_block_in_horizontal>
+ <div class=contents></div>
+ <div class=target id=element_block_in_horizontal></div>
+</div>
+<div class=scroller id=timeline_inline_in_horizontal>
+ <div class=contents></div>
+ <div class=target id=element_inline_in_horizontal></div>
+</div>
+<div class=scroller id=timeline_block_in_vertical>
+ <div class=contents></div>
+ <div class=target id=element_block_in_vertical></div>
+</div>
+<div class=scroller id=timeline_inline_in_vertical>
+ <div class=contents></div>
+ <div class=target id=element_inline_in_vertical></div>
</div>
<script>
// Animations linked to vertical scroll-timelines are at 75% progress.
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html
index 047acfed33f..389c8baca3a 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html
@@ -62,7 +62,10 @@
async function runTest() {
promise_test(async t => {
await waitForNextFrame();
- const anim = document.getAnimations()[0];
+ const anims = document.getAnimations();
+ assert_equals(anims.length, 1,
+ "Should have one animation attatched to the view-timeline");
+ const anim = anims[0];
await anim.ready;
await waitForNextFrame();
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
index a0d1bd92f09..7bae49c2e97 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html
@@ -51,7 +51,6 @@
// scrollTop=200 to 400 is the entry range
container.scrollTop = 200;
await waitForNextFrame();
- const anim = document.getAnimations()[0];
assert_equals(getComputedStyle(subject).opacity, '0',
'Effect at entry 0%');
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html
index b816bb68973..73189b85917 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<title>Animations using view-timeline</title>
+<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#view-timelines-named">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html
new file mode 100644
index 00000000000..47f4444b0dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html
@@ -0,0 +1,338 @@
+<!DOCTYPE html>
+<title>View Timeline Attachment</title>
+<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/7759">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+
+<main id=main></main>
+<script>
+ function inflate(t, template) {
+ t.add_cleanup(() => main.replaceChildren());
+ main.append(template.content.cloneNode(true));
+ main.offsetTop;
+ }
+
+ async function scrollTop(e, value) {
+ e.scrollTop = value;
+ await waitForNextFrame();
+ }
+</script>
+<style>
+ @keyframes anim {
+ from { width: 0px; --applied:true; }
+ to { width: 200px; --applied:true; }
+ }
+
+ .scroller {
+ overflow-y: hidden;
+ width: 200px;
+ height: 200px;
+ }
+ .scroller > .content {
+ margin: 400px 0px;
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ }
+ .target {
+ background-color: coral;
+ width: 0px;
+ animation: anim auto linear;
+ animation-timeline: t1;
+ }
+ /*
+ .defer {
+ view-timeline-name: t1;
+ view-timeline-attachment: defer;
+ }
+ */
+ .timeline {
+ view-timeline-name: t1;
+ }
+ .local {
+ view-timeline-attachment: local;
+ }
+ .defer {
+ view-timeline-attachment: defer;
+ }
+ .ancestor {
+ view-timeline-attachment: ancestor;
+ }
+
+</style>
+
+<!-- Basic Behavior -->
+
+<template id=view_timeline_defer>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="content timeline ancestor"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_defer);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+ }, 'Descendant can attach to deferred timeline');
+</script>
+
+<template id=view_timeline_defer_no_attach>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="timeline content"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_defer_no_attach);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Deferred timeline with no attachments');
+</script>
+
+<template id=view_timeline_defer_two_attachments>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="content timeline ancestor"></div>
+ <!-- Extra attachment -->
+ <div class="timeline ancestor"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_defer_two_attachments);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+ await scrollTop(scroller, 350); // 50%
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Deferred timeline with two attachments');
+</script>
+
+<!-- Effective Axis of ViewTimeline -->
+
+<template id=view_timeline_defer_axis>
+ <div class="timeline defer" style="view-timeline-axis:inline">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_defer_axis);
+ let target = main.querySelector('.target');
+ assert_equals(target.getAnimations().length, 1);
+ let anim = target.getAnimations()[0];
+ assert_not_equals(anim.timeline, null);
+ assert_equals(anim.timeline.axis, 'vertical');
+ }, 'Axis of deferred timeline is taken from attached timeline');
+</script>
+
+<template id=view_timeline_defer_axis_multiple>
+ <div class="timeline defer" style="view-timeline-axis:inline">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div>
+ <!-- Extra attachment -->
+ <div class="timeline ancestor"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_defer_axis_multiple);
+ let target = main.querySelector('.target');
+ assert_equals(target.getAnimations().length, 1);
+ let anim = target.getAnimations()[0];
+ assert_not_equals(anim.timeline, null);
+ assert_equals(anim.timeline.axis, 'block');
+ }, 'Axis of deferred timeline with multiple attachments');
+</script>
+
+<!-- Effective Inset of ViewTimeline -->
+
+<template id=view_timeline_inset>
+ <div class="timeline defer" style="view-timeline-inset:0px">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="content timeline ancestor" style="view-timeline-inset:50px"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_inset);
+ let scroller = main.querySelector('.scroller');
+ let target = main.querySelector('.target');
+
+ // Range: [200, 500] + [50, -50] (inset) = [250, 450]
+ await scrollTop(scroller, 300); // 25%
+ assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25%
+ }, 'Inset of deferred timeline is taken from attached timeline');
+</script>
+
+<!-- Dynamic Reattachment -->
+
+<template id=view_timeline_reattach>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="content timeline ancestor"></div>
+ </div>
+ <div class=scroller>
+ <div class="content timeline"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_reattach);
+ let scrollers = main.querySelectorAll('.scroller');
+ let contents = main.querySelectorAll('.content');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ // Range: [200, 500]
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 275); // 25%
+
+ // Attached to contents[0].
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Reattach to contents[1].
+ contents[0].classList.remove('ancestor');
+ contents[1].classList.add('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25%
+ }, 'Dynamically re-attaching');
+</script>
+
+
+<template id=view_timeline_dynamic_attach_second>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="timeline content"></div>
+ </div>
+ <div class=scroller>
+ <div class="timeline content"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_dynamic_attach_second);
+ let scrollers = main.querySelectorAll('.scroller');
+ let contents = main.querySelectorAll('.content');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ // Range: [200, 500]
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 275); // 25%
+
+ // Attached to no timelines initially:
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+
+ // Attach to contents[0].
+ contents[0].classList.add('ancestor');
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Also attach contents[1].
+ contents[1].classList.add('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Dynamically attaching');
+</script>
+
+
+<template id=view_timeline_dynamic_detach_second>
+ <div class="timeline defer">
+ <div class=target>Test</div>
+ <div class=scroller>
+ <div class="content timeline ancestor"></div>
+ </div>
+ <div class=scroller>
+ <div class="content timeline ancestor"></div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_timeline_dynamic_detach_second);
+ let scrollers = main.querySelectorAll('.scroller');
+ let contents = main.querySelectorAll('.content');
+ assert_equals(scrollers.length, 2);
+ let target = main.querySelector('.target');
+ // Range: [200, 500]
+ await scrollTop(scrollers[0], 350); // 50%
+ await scrollTop(scrollers[1], 275); // 25%
+
+ // Attached to two timelines initially:
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+
+ // Detach contents[1].
+ contents[1].classList.remove('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50%
+
+ // Also detach contents[0].
+ contents[0].classList.remove('ancestor');
+
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(target).width, '0px');
+ assert_equals(getComputedStyle(target).getPropertyValue('--applied'), '');
+ }, 'Dynamically detaching');
+</script>
+
+<!-- ViewTimelines and ScrollTimelines -->
+
+<template id=view_scroll_timeline_defer>
+ <div style="scroll-timeline: t1 defer">
+ <div class=target>Test1</div>
+ <div class="timeline defer">
+ <div class=target>Test2</div>
+ <div class=scroller style="scroll-timeline: t1 ancestor;">
+ <div class="content timeline ancestor" style="view-timeline-inset: 0px 50px"></div>
+ </div>
+ </div>
+ </div>
+</template>
+<script>
+ promise_test(async (t) => {
+ inflate(t, view_scroll_timeline_defer);
+ let scroller = main.querySelector('.scroller');
+ let targets = main.querySelectorAll('.target');
+ await scrollTop(scroller, 350);
+
+ // Attached to ScrollTimeline:
+ // Range: [0, 700]
+ // 350 => 50%
+ assert_equals(getComputedStyle(targets[0]).width, '100px');
+
+ // Attached to ViewTimeline:
+ // Range: [200, 500] + [50, 0] (inset) = [250, 500]
+ // 350 => 40%
+ assert_equals(getComputedStyle(targets[1]).width, '80px');
+ }, 'Mixing deferred scroll and view-timelines');
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html
index a95086b62bf..a7e807c2e81 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<title>Animations using view-timeline-inset</title>
+<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#propdef-view-timeline-inset">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html
index 1dc766d961c..04eb6489490 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html
@@ -80,7 +80,10 @@
promise_test(async t => {
await waitForNextFrame();
- const anim = document.getAnimations()[0];
+ const anims = document.getAnimations();
+ assert_equals(anims.length, 1,
+ "Should have one animation attatched to the view-timeline");
+ const anim = anims[0];
await anim.ready;
await waitForNextFrame();
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html
index c1797c7ba1c..b8a5b0008be 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html
@@ -260,8 +260,7 @@
}, 'view-timeline on ancestor sibling, closer scroll-timeline wins');
</script>
-
-<template id=timeline_ancestor_view_timeline_wins_on_same_element>
+<template id=timeline_ancestor_scroll_timeline_wins_on_same_element>
<style>
#timelines {
height: 0px;
@@ -294,8 +293,11 @@
</template>
<script>
promise_test(async (t) => {
- inflate(t, timeline_ancestor_view_timeline_wins_on_same_element);
+ inflate(t, timeline_ancestor_scroll_timeline_wins_on_same_element);
await waitForNextFrame();
- assert_equals(getComputedStyle(target).zIndex, '75');
- }, 'view-timeline on ancestor sibling, view-timeline wins on same element');
+ // In case of a name conflict on the same element, scroll progress timelines
+ // take precedence over view progress timelines.
+ // https://drafts.csswg.org/scroll-animations-1/#timeline-scope
+ assert_equals(getComputedStyle(target).zIndex, '0');
+ }, 'view-timeline on ancestor sibling, scroll-timeline wins on same element');
</script>
diff --git a/tests/wpt/web-platform-tests/secure-payment-confirmation/authentication-disallowed-when-hidden.https.html b/tests/wpt/web-platform-tests/secure-payment-confirmation/authentication-disallowed-when-hidden.https.html
new file mode 100644
index 00000000000..1c01fa0e89c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-payment-confirmation/authentication-disallowed-when-hidden.https.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test for the 'secure-payment-confirmation' payment method authentication - accepted case</title>
+<link rel="help" href="https://w3c.github.io/secure-payment-confirmation#sctn-authentication">
+<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>
+<!-- For minimize() -->
+<script src="/page-visibility/resources/window_state_context.js"></script>
+<script src="utils.sub.js"></script>
+<script>
+'use strict';
+
+promise_test(async t => {
+ const {minimize, restore} = window_state_context(t);
+
+ const authenticator = await window.test_driver.add_virtual_authenticator(
+ AUTHENTICATOR_OPTS);
+ t.add_cleanup(() => {
+ return window.test_driver.remove_virtual_authenticator(authenticator);
+ });
+
+ await window.test_driver.set_spc_transaction_mode("autoAccept");
+ t.add_cleanup(() => {
+ return window.test_driver.set_spc_transaction_mode("none");
+ });
+
+ const credential = await createCredential();
+
+ const challenge = 'server challenge';
+ const payeeOrigin = 'https://merchant.com';
+ const displayName = 'Troycard ***1234';
+ const request = new PaymentRequest([{
+ supportedMethods: 'secure-payment-confirmation',
+ data: {
+ credentialIds: [credential.rawId],
+ challenge: Uint8Array.from(challenge, c => c.charCodeAt(0)),
+ payeeOrigin,
+ rpId: window.location.hostname,
+ timeout: 60000,
+ instrument: {
+ displayName,
+ icon: ICON_URL,
+ },
+ }
+ }], PAYMENT_DETAILS);
+
+ // Before we trigger the Payment Request, minimize the window. This should
+ // cause the show() call to be rejected.
+ await minimize();
+ assert_equals(document.hidden, true);
+
+ await test_driver.bless('user activation');
+ return promise_rejects_dom(t, "AbortError", request.show());
+}, 'SPC authentication cannot be triggered from a hidden context');
+</script>
diff --git a/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html b/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html
index 2f3d49ec267..1ce2cf34401 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html
+++ b/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html
@@ -67,10 +67,13 @@ var testParams = [
['document.links should not contain shadow nodes', 'links'],
['document.anchors should not contain shadow nodes', 'anchors'],
['document.embeds should not contain shadow nodes', 'embeds'],
- ['document.plugins should not contain shadow nodes', 'plugins'],
- ['document.applets should not contain shadow nodes', 'applets']];
+ ['document.plugins should not contain shadow nodes', 'plugins']];
generate_tests(testCollection, testParams);
+test(() => {
+ assert_equals(document.applets.length, 0);
+}, 'document.applets should not contain any nodes');
+
</script>
</html>
diff --git a/tests/wpt/web-platform-tests/shared-storage/insecure-context.tentative.http.html b/tests/wpt/web-platform-tests/shared-storage/insecure-context.tentative.http.html
new file mode 100644
index 00000000000..7ddf02f861a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/shared-storage/insecure-context.tentative.http.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script>
+ test(t => {
+ assert_equals(window.sharedStorage, undefined);
+ }, 'test window.sharedStorage in insecure context');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https.html b/tests/wpt/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https.html
new file mode 100644
index 00000000000..69e84333aa4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="resources/utils.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script>
+// Regression test for https://crbug.com/1431804.
+promise_test(async t => {
+ assert_implements(HTMLScriptElement.supports('speculationrules'),
+ "Speculation Rules not supported");
+
+ const win = await spawnWindow(t, { protocol: 'https' });
+ const nextUrl = win.getExecutorURL({ protocol: 'https', page: 2 });
+
+ // Navigate `win` from Document #1 -> #2 (nextUrl) -> #3 (tempUrl) ->
+ // #4 (nextUrl),
+ // Start speculation rules prefetch from #1, and
+ // Try using the prefetched result for the navigation #3 -> #4.
+ // The Documents #2 and #4 are different, but the same RenderFrameHost is
+ // used before https://crbug.com/936696 is done.
+
+ await win.forceSinglePrefetch(nextUrl);
+
+ // Register a SW for `nextUrl` -- this is a trick to make the prefetched
+ // result to put in `PrefetchService::prefetches_ready_to_serve_` in
+ // Chromium implementation but actually not used by this navigation.
+ const r = await service_worker_unregister_and_register(
+ t, 'resources/sw.js', nextUrl);
+ await wait_for_state(t, r.installing, 'activated');
+
+ // Navigate #1 -> #2.
+ // This doesn't use the prefetched result due to the ServiceWorker.
+ await win.navigate(nextUrl);
+
+ // Unregister the SW.
+ await service_worker_unregister(t, nextUrl);
+
+ // Navigate #2 -> #3 -> #4.
+ const tempUrl = win.getExecutorURL({ protocol: 'https', page: 3 });
+ await win.navigate(tempUrl);
+ await win.navigate(nextUrl);
+
+ const headers = await win.execute_script(() => {
+ return requestHeaders;
+ }, []);
+ assert_not_prefetched(headers,
+ "Prefetch should not work for different initiators.");
+}, "Prefetches from different initiator Documents with same RenderFrameHost");
+</script>
diff --git a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html
index e85ffd74a78..917c3b4d022 100644
--- a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html
+++ b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html
@@ -20,7 +20,7 @@ promise_test(async t => {
// At this point the iframe is detached and unloaded, and its execution
// context is gone.
- await promise_rejects_dom(t, 'NotFoundError', iframeDOMException, iframeNavigator.subApps.remove('/sub-app-id'));
+ await promise_rejects_dom(t, 'NotFoundError', iframeDOMException, iframeNavigator.subApps.remove(['/sub-app-id']));
}, "The object is no longer associated to a document.");
promise_test(async t => {
@@ -31,22 +31,57 @@ promise_test(async t => {
const iframeDOMException = iframe.contentWindow.DOMException;
t.add_cleanup(() => iframe.remove());
- await promise_rejects_dom(t, 'InvalidStateError', iframeDOMException, iframeNavigator.subApps.remove('/sub-app-id'));
+ await promise_rejects_dom(t, 'InvalidStateError', iframeDOMException, iframeNavigator.subApps.remove(['/sub-app-id']));
}, "API is only supported in top-level browsing contexts.");
promise_test(async t => {
const full_url = document.location.origin + '/sub-app-id';
- await promise_rejects_dom(t, 'NotSupportedError', navigator.subApps.remove(full_url));
+ await promise_rejects_dom(t, 'NotSupportedError', navigator.subApps.remove([full_url]));
}, 'API supports only root-relative paths.');
promise_test(async t => {
- t.add_cleanup(async () => {
- await mockSubAppsService.reset();
- mockSubAppsService = null;
- });
- await createMockSubAppsService(Status.FAILURE, [], []);
- return promise_rejects_dom(t, 'OperationError', navigator.subApps.remove('/sub-app-id'));
-}, 'Remove call failed.');
+ const url_1 = '/sub-app-1';
+ const url_2 = '/sub-app-2';
+ const url_3 = '/sub-app-3';
+
+ let remove_call_params = [url_1, url_2, url_3];
+
+ let mocked_response = [
+ { "unhashedAppIdPath": url_1, "resultCode": Status.FAILURE },
+ { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE },
+ { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE }
+ ];
+
+ let expected_results = {
+ [url_1]: "failure",
+ [url_2]: "failure",
+ [url_3]: "failure"
+ };
+
+ await subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results);
+}, 'Remove call fails.');
+
+promise_test(async t => {
+ const url_1 = '/sub-app-1';
+ const url_2 = '/sub-app-2';
+ const url_3 = '/sub-app-3';
+
+ let remove_call_params = [url_1, url_2, url_3];
+
+ let mocked_response = [
+ { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS },
+ { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS },
+ { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE }
+ ];
+
+ let expected_results = {
+ [url_1]: "success",
+ [url_2]: "success",
+ [url_3]: "failure"
+ };
+
+ await subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results);
+}, 'Remove call fails with mixed results.');
</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html
index ca73cbea888..6fd4305b434 100644
--- a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html
+++ b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html
@@ -5,8 +5,37 @@
<script src="resources/subapps-helpers.js"></script>
<script>
-subapps_test(async (t, mockSubAppsService) => {
- await navigator.subApps.remove('/sub-app-id');
-}, 'Remove API call works.');
+promise_test(async t => {
+
+const url = '/sub-app';
+let remove_call_params = [url];
+let mocked_response = [{ "unhashedAppIdPath": url, "resultCode": Status.SUCCESS }];
+let expected_results = {[url]: "success"};
+
+await subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results);
+}, 'Remove API call works with one app.');
+
+promise_test(async t => {
+
+const url_1 = '/sub-app-1';
+const url_2 = '/sub-app-2';
+const url_3 = '/sub-app-3';
+
+let remove_call_params = [url_1, url_2, url_3];
+
+let mocked_response = [
+ { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS },
+ { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS },
+ { "unhashedAppIdPath": url_3, "resultCode": Status.SUCCESS }
+];
+
+let expected_results = {
+ [url_1]: "success",
+ [url_2]: "success",
+ [url_3]: "success"
+};
+
+await subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results);
+}, 'Remove API call works with several apps.');
</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js b/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js
index 9158d15c6c8..38b8d114660 100644
--- a/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js
+++ b/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js
@@ -15,7 +15,7 @@ const Status = {
FAILURE: 1,
};
-async function createMockSubAppsService(service_result_code, add_call_return_value, list_call_return_value) {
+async function createMockSubAppsService(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value) {
if (typeof SubAppsServiceTest === 'undefined') {
// Load test-only API helpers.
const script = document.createElement('script');
@@ -39,7 +39,7 @@ async function createMockSubAppsService(service_result_code, add_call_return_val
if (mockSubAppsService === null) {
mockSubAppsService = new SubAppsServiceTest();
- mockSubAppsService.initialize(service_result_code, add_call_return_value, list_call_return_value);
+ mockSubAppsService.initialize(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value);
}
}
@@ -49,7 +49,7 @@ function subapps_test(func, description) {
await mockSubAppsService.reset();
mockSubAppsService = null;
});
- await createMockSubAppsService(Status.SUCCESS, [], []);
+ await createMockSubAppsService(Status.SUCCESS, [], [], []);
await func(test, mockSubAppsService);
}, description);
}
@@ -60,7 +60,7 @@ async function subapps_add_expect_reject_with_result(t, add_call_params, mocked_
mockSubAppsService = null;
});
- await createMockSubAppsService(Status.FAILURE, mocked_response, []);
+ await createMockSubAppsService(Status.FAILURE, mocked_response, [], []);
await navigator.subApps.add(add_call_params).then(
result => {
assert_unreached("Should have rejected: ", result);
@@ -79,7 +79,7 @@ async function subapps_add_expect_success_with_result(t, add_call_params, mocked
mockSubAppsService = null;
});
- await createMockSubAppsService(Status.SUCCESS, mocked_response);
+ await createMockSubAppsService(Status.SUCCESS, mocked_response, [], []);
await navigator.subApps.add(add_call_params).then(result => {
for (const app_id in expected_results) {
assert_own_property(result, app_id, "Return results are missing entry for subapp.")
@@ -87,3 +87,37 @@ async function subapps_add_expect_success_with_result(t, add_call_params, mocked
}
});
}
+
+async function subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results) {
+ t.add_cleanup(async () => {
+ await mockSubAppsService.reset();
+ mockSubAppsService = null;
+ });
+
+ await createMockSubAppsService(Status.FAILURE, [], [], mocked_response);
+ await navigator.subApps.remove(remove_call_params).then(
+ result => {
+ assert_unreached("Should have rejected: ", result);
+ },
+ error => {
+ for (const app_id in expected_results) {
+ assert_own_property(error, app_id, "Return results are missing entry for subapp.")
+ assert_equals(error[app_id], expected_results[app_id], "Return results are not as expected.")
+ }
+ });
+}
+
+async function subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results) {
+ t.add_cleanup(async () => {
+ await mockSubAppsService.reset();
+ mockSubAppsService = null;
+ });
+
+ await createMockSubAppsService(Status.SUCCESS, [], [], mocked_response);
+ await navigator.subApps.remove(remove_call_params).then(result => {
+ for (const app_id in expected_results) {
+ assert_own_property(result, app_id, "Return results are missing entry for subapp.")
+ assert_equals(result[app_id], expected_results[app_id], "Return results are not as expected.")
+ }
+ });
+}
diff --git a/tests/wpt/web-platform-tests/svg/text/reftests/opacity-ref.svg b/tests/wpt/web-platform-tests/svg/text/reftests/opacity-ref.svg
new file mode 100644
index 00000000000..18c00ab332c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/text/reftests/opacity-ref.svg
@@ -0,0 +1,26 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+ <style>
+ text {
+ font-size: 50px;
+ }
+ </style>
+ <defs>
+ <path id="path" d="M100, 120 300, 120"/>
+ </defs>
+ <text x="100" y="60" opacity="0.5">
+ <tspan>tspan</tspan>
+ </text>
+ <text opacity="0.5">
+ <textPath href="#path">textPath</textPath>
+ </text>
+ <text x="100" y="180" opacity="0.5">
+ <a href="https://www.w3.org"><tspan>link</tspan></a>
+ </text>
+ <text x="100" y="240" opacity="0.5">
+ <a href="https://www.w3.org"><tspan>another link</tspan></a>
+ </text>
+ <text x="100" y="300" opacity="0.25" font-family="Ahem">
+ <tspan>XXXX</tspan>
+ </text>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/text/reftests/opacity.svg b/tests/wpt/web-platform-tests/svg/text/reftests/opacity.svg
new file mode 100644
index 00000000000..949de0cbf0c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/text/reftests/opacity.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml">
+ <metadata>
+ <h:title>Opacity on tspan, textPath, and a elements</h:title>
+ <h:link rel="help" href="https://svgwg.org/svg2-draft/text.html"/>
+ <h:link rel="match" href="opacity-ref.svg"/>
+ <h:link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+ </metadata>
+ <style>
+ text {
+ font-size: 50px;
+ }
+ </style>
+ <defs>
+ <path id="path" d="M100, 120 300, 120"/>
+ </defs>
+ <text x="100" y="60">
+ <tspan style="opacity: 0.5">tspan</tspan>
+ </text>
+ <text>
+ <textPath href="#path" style="opacity: 0.5">textPath</textPath>
+ </text>
+ <text x="100" y="180">
+ <a href="https://www.w3.org" style="opacity: 0.5"><tspan>link</tspan></a>
+ </text>
+ <text x="100" y="240">
+ <a href="https://www.w3.org"><tspan style="opacity: 0.5">another link</tspan></a>
+ </text>
+ <text x="100" y="300" opacity="0.5" font-family="Ahem">
+ <tspan style="opacity: 0.5">XXXX</tspan>
+ </text>
+</svg>
diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt
index 03fe7d73efa..c2137af3156 100644
--- a/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt
+++ b/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt
@@ -1,5 +1,5 @@
cairocffi==1.5.0
-fonttools==4.33.2
+fonttools==4.39.3
genshi==0.7.7
jinja2==3.1.2
pyyaml==6.0
diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt
index 53b10f8dcaa..64b51841b0c 100644
--- a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt
+++ b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt
@@ -1,4 +1,4 @@
pygithub==1.58.1
pyyaml==6.0
requests==2.28.2
-taskcluster==48.2.1
+taskcluster==49.0.0
diff --git a/tests/wpt/web-platform-tests/tools/ci/run_tc.py b/tests/wpt/web-platform-tests/tools/ci/run_tc.py
index 46e3d613a99..a5a6256ad54 100755
--- a/tests/wpt/web-platform-tests/tools/ci/run_tc.py
+++ b/tests/wpt/web-platform-tests/tools/ci/run_tc.py
@@ -46,8 +46,8 @@ import tarfile
import tempfile
import zipfile
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-from wpt.utils import get_download_to_descriptor # type: ignore
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
+from tools.wpt.utils import get_download_to_descriptor
root = os.path.abspath(
os.path.join(os.path.dirname(__file__),
diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py
index 89ecee8035c..f255c024952 100644
--- a/tests/wpt/web-platform-tests/tools/lint/lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/lint.py
@@ -689,7 +689,7 @@ class OpenModeCheck(ASTCheck):
errors = []
for node in ast.walk(root):
if isinstance(node, ast.Call):
- if hasattr(node.func, "id") and node.func.id in ("open", "file"): # type: ignore
+ if hasattr(node.func, "id") and node.func.id in ("open", "file"):
if (len(node.args) < 2 and
all(item.arg != "mode" for item in node.keywords)):
errors.append(node.lineno)
diff --git a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
index 689533421d7..21be8a26cd3 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
@@ -62,7 +62,7 @@ class XMLParser:
self._parser.EndElementHandler = self._end
self._parser.CharacterDataHandler = self._data
self._parser.ExternalEntityRefHandler = self._external
- self._parser.SkippedEntityHandler = self._skipped # type: ignore
+ self._parser.SkippedEntityHandler = self._skipped
# used for our horrible re-encoding hack
self._fed_data = [] # type: Optional[List[bytes]]
self._read_encoding = None # type: Optional[Text]
diff --git a/tests/wpt/web-platform-tests/tools/manifest/item.py b/tests/wpt/web-platform-tests/tools/manifest/item.py
index 02a72eeb292..f798ec2ae8d 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/item.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/item.py
@@ -29,16 +29,14 @@ class ManifestItemMeta(ABCMeta):
assert issubclass(inst, ManifestItem)
if MYPY:
- inst_ = cast(Type[ManifestItem], inst)
- item_type = cast(str, inst_.item_type)
+ item_type = cast(str, inst.item_type)
else:
- inst_ = inst
- assert isinstance(inst_.item_type, str)
- item_type = inst_.item_type
+ assert isinstance(inst.item_type, str)
+ item_type = inst.item_type
- item_types[item_type] = inst_
+ item_types[item_type] = inst
- return inst_
+ return inst
class ManifestItem(metaclass=ManifestItemMeta):
diff --git a/tests/wpt/web-platform-tests/tools/mypy.ini b/tests/wpt/web-platform-tests/tools/mypy.ini
index fb9b5c81c2c..def40c0bd06 100644
--- a/tests/wpt/web-platform-tests/tools/mypy.ini
+++ b/tests/wpt/web-platform-tests/tools/mypy.ini
@@ -7,6 +7,7 @@
# - tools/wptserve/docs/conf.py (generated code)
# - tools/wptserve/tests/ (deliberately invalid syntax)
exclude = (^tools/third_party/|/setup\.py$|^tools/wptserve/docs/conf.py|^tools/wptserve/tests/)
+mypy_path = tools/wptrunner:tools/wptserve:tools/webdriver:tools/webtransport
#check_untyped_defs = True
disallow_any_generics = True
disallow_incomplete_defs = True
diff --git a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt
index ff878deb613..c95a836e6ab 100644
--- a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt
+++ b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt
@@ -1,12 +1,14 @@
-mypy==0.961
-mypy-extensions==0.4.3
+mypy==1.2.0
+mypy-extensions==1.0.0
toml==0.10.2
+tomli==2.0.1
typed-ast==1.5.4
-types-atomicwrites==1.4.5
-types-python-dateutil==2.8.19
+types-atomicwrites==1.4.5.1
+types-python-dateutil==2.8.19.12
types-PyYAML==6.0.12.9
-types-requests==2.28.11.16
-types-setuptools==67.6.0.5
+types-requests==2.28.11.17
+types-setuptools==67.6.0.7
types-six==1.16.21.8
-types-ujson==4.2.1
-typing-extensions==4.1.1
+types-ujson==5.7.0.1
+types-urllib3==1.26.25.10
+typing_extensions==4.5.0
diff --git a/tests/wpt/web-platform-tests/tools/requirements_pytest.txt b/tests/wpt/web-platform-tests/tools/requirements_pytest.txt
index 0bb151cb644..78e1ae4d613 100644
--- a/tests/wpt/web-platform-tests/tools/requirements_pytest.txt
+++ b/tests/wpt/web-platform-tests/tools/requirements_pytest.txt
@@ -1,3 +1,3 @@
-pytest==7.2.2
+pytest==7.3.0
pytest-cov==4.0.0
-hypothesis==6.70.1
+hypothesis==6.71.0
diff --git a/tests/wpt/web-platform-tests/tools/requirements_tests.txt b/tests/wpt/web-platform-tests/tools/requirements_tests.txt
index 26bf23a7f5e..9ccaaa0d02a 100644
--- a/tests/wpt/web-platform-tests/tools/requirements_tests.txt
+++ b/tests/wpt/web-platform-tests/tools/requirements_tests.txt
@@ -1,5 +1,5 @@
-httpx[http2]==0.23.3
-json-e==4.5.1
+httpx[http2]==0.24.0
+json-e==4.5.2
jsonschema==4.17.3
pyyaml==6.0
-taskcluster==48.2.1
+taskcluster==49.0.0
diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini
index 6a3001e25a0..5efbe9b37ab 100644
--- a/tests/wpt/web-platform-tests/tools/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/tox.ini
@@ -16,7 +16,7 @@ changedir =
commands =
!flake8-!mypy: pytest --cov=tools --cov-report=term {posargs}
flake8: flake8 --append-config={toxinidir}/flake8.ini {posargs}
- mypy: mypy --config-file={toxinidir}/mypy.ini tools/
+ mypy: mypy --config-file={toxinidir}/mypy.ini --explicit-package-bases tools
passenv =
HYPOTHESIS_PROFILE
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py
index 56fa274cdc4..9bb03b34f96 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py
@@ -145,7 +145,7 @@ class BidiSession:
await self.transport.start()
if self.session_id is None:
- self.session_id, self.capabilities = await self.session.new(
+ self.session_id, self.capabilities = await self.session.new( # type: ignore
capabilities=self.requested_capabilities)
async def send_command(
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py
index 81910a63eb2..d9ea28c78fd 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py
@@ -38,6 +38,9 @@ class InvalidArgumentException(BidiException):
class NoSuchFrameException(BidiException):
error_code = "no such frame"
+class NoSuchHandleException(BidiException):
+ error_code = "no such handle"
+
class NoSuchNodeException(BidiException):
error_code = "no such node"
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py
index c2034033c79..e28a83584a8 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py
@@ -1,7 +1,6 @@
import functools
from typing import (
Any,
- Awaitable,
Callable,
Optional,
Mapping,
@@ -80,10 +79,6 @@ class command:
# Overwrite the method on the owner class with the wrapper
setattr(owner, name, inner)
- def __call__(*args: Any, **kwargs: Any) -> Awaitable[Any]:
- # This isn't really used, but mypy doesn't understand __set_name__
- pass
-
class BidiModule:
def __init__(self, session: "BidiSession"):
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py
index d2ee17e36e2..be0d745a0ca 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py
@@ -69,11 +69,11 @@ class PointerAction(Action):
self.y = y
self.duration = duration
self.origin = origin
- self.width = width,
+ self.width = width
self.height = height
self.pressure = pressure
self.tangential_pressure = tangential_pressure
- self.tilt_x = tilt_x,
+ self.tilt_x = tilt_x
self.tilt_y = tilt_y
self.twist = twist
self.altitude_angle = altitude_angle
@@ -113,7 +113,7 @@ class PointerAction(Action):
class PointerDownAction(PointerAction):
- type = "pointerDown"
+ action_type = "pointerDown"
def __init__(self,
button: int,
@@ -134,7 +134,7 @@ class PointerDownAction(PointerAction):
class PointerUpAction(PointerAction):
- type = "pointerUp"
+ action_type = "pointerUp"
def __init__(self,
button: int,
@@ -155,7 +155,7 @@ class PointerUpAction(PointerAction):
class PointerMoveAction(PointerAction):
- type = "pointerMove"
+ action_type = "pointerMove"
def __init__(self,
x: int,
@@ -179,7 +179,7 @@ class PointerMoveAction(PointerAction):
class WheelScrollAction(Action):
- type = "scroll"
+ action_type = "scroll"
def __init__(self,
x: int,
@@ -355,3 +355,8 @@ class Input(BidiModule):
else:
params["actions"] = actions
return params
+
+ @command
+ def release_actions(self, context: str) -> Mapping[str, Any]:
+ params: MutableMapping[str, Any] = {"context": context}
+ return params
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py
index a28c484b83c..2d5d8ee9224 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py
@@ -26,7 +26,7 @@ class Transport:
msg_handler: Callable[[Mapping[str, Any]], Coroutine[Any, Any, None]],
loop: Optional[asyncio.AbstractEventLoop] = None):
self.url = url
- self.connection: Optional[websockets.WebSocketClientProtocol] = None
+ self.connection: Optional[websockets.WebSocketClientProtocol] = None # type: ignore
self.msg_handler = msg_handler
self.send_buf: List[Mapping[str, Any]] = []
@@ -37,7 +37,7 @@ class Transport:
self.read_message_task: Optional[asyncio.Task[Any]] = None
async def start(self) -> None:
- self.connection = await websockets.connect(self.url)
+ self.connection = await websockets.connect(self.url) # type: ignore
self.read_message_task = self.loop.create_task(self.read_messages())
for msg in self.send_buf:
@@ -51,7 +51,7 @@ class Transport:
@staticmethod
async def _send(
- connection: websockets.WebSocketClientProtocol,
+ connection: websockets.WebSocketClientProtocol, # type: ignore
data: Mapping[str, Any]
) -> None:
msg = json.dumps(data)
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
index 851c6722fc2..f33fc34dac9 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
@@ -310,27 +310,24 @@ class Window:
return handles
- # The many "type: ignore" comments here and below are to silence mypy's
- # "Decorated property not supported" error, which is due to a limitation
- # in mypy, see https://github.com/python/mypy/issues/1362.
- @property # type: ignore
+ @property
@command
def rect(self):
return self.session.send_session_command("GET", "window/rect")
- @rect.setter # type: ignore
+ @rect.setter
@command
def rect(self, new_rect):
self.session.send_session_command("POST", "window/rect", new_rect)
- @property # type: ignore
+ @property
@command
def size(self):
"""Gets the window size as a tuple of `(width, height)`."""
rect = self.rect
return (rect["width"], rect["height"])
- @size.setter # type: ignore
+ @size.setter
@command
def size(self, new_size):
"""Set window size by passing a tuple of `(width, height)`."""
@@ -343,14 +340,14 @@ class Window:
# for Android. Revert this once it is implemented.
pass
- @property # type: ignore
+ @property
@command
def position(self):
"""Gets the window position as a tuple of `(x, y)`."""
rect = self.rect
return (rect["x"], rect["y"])
- @position.setter # type: ignore
+ @position.setter
@command
def position(self, new_position):
"""Set window position by passing a tuple of `(x, y)`."""
@@ -475,12 +472,12 @@ class UserPrompt:
def accept(self):
self.session.send_session_command("POST", "alert/accept")
- @property # type: ignore
+ @property
@command
def text(self):
return self.session.send_session_command("GET", "alert/text")
- @text.setter # type: ignore
+ @text.setter
@command
def text(self, value):
body = {"text": value}
@@ -660,12 +657,12 @@ class Session:
url = urlparse.urljoin("session/%s/" % self.session_id, uri)
return self.send_command(method, url, body, timeout)
- @property # type: ignore
+ @property
@command
def url(self):
return self.send_session_command("GET", "url")
- @url.setter # type: ignore
+ @url.setter
@command
def url(self, url):
if urlparse.urlsplit(url).netloc is None:
@@ -685,12 +682,12 @@ class Session:
def refresh(self):
return self.send_session_command("POST", "refresh")
- @property # type: ignore
+ @property
@command
def title(self):
return self.send_session_command("GET", "title")
- @property # type: ignore
+ @property
@command
def source(self):
return self.send_session_command("GET", "source")
@@ -702,12 +699,12 @@ class Session:
return value["handle"]
- @property # type: ignore
+ @property
@command
def window_handle(self):
return self.send_session_command("GET", "window")
- @window_handle.setter # type: ignore
+ @window_handle.setter
@command
def window_handle(self, handle):
body = {"handle": handle}
@@ -723,12 +720,12 @@ class Session:
return self.send_session_command("POST", url, body)
- @property # type: ignore
+ @property
@command
def handles(self):
return self.send_session_command("GET", "window/handles")
- @property # type: ignore
+ @property
@command
def active_element(self):
return self.send_session_command("GET", "element/active")
@@ -855,12 +852,12 @@ class Element:
def send_keys(self, text):
return self.send_element_command("POST", "value", {"text": text})
- @property # type: ignore
+ @property
@command
def text(self):
return self.send_element_command("GET", "text")
- @property # type: ignore
+ @property
@command
def name(self):
return self.send_element_command("GET", "name")
@@ -869,12 +866,12 @@ class Element:
def style(self, property_name):
return self.send_element_command("GET", "css/%s" % property_name)
- @property # type: ignore
+ @property
@command
def rect(self):
return self.send_element_command("GET", "rect")
- @property # type: ignore
+ @property
@command
def selected(self):
return self.send_element_command("GET", "selected")
@@ -883,7 +880,7 @@ class Element:
def screenshot(self):
return self.send_element_command("GET", "screenshot")
- @property # type: ignore
+ @property
@command
def shadow_root(self):
return self.send_element_command("GET", "shadow")
diff --git a/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py b/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py
index 6384a5aefb2..141bd9f7dc9 100644
--- a/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py
+++ b/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py
@@ -23,7 +23,8 @@ from aioquic.quic.connection import stream_is_unidirectional
from aioquic.quic.events import QuicEvent, ProtocolNegotiated, ConnectionTerminated, StreamReset # type: ignore
from aioquic.tls import SessionTicket # type: ignore
-from tools.wptserve.wptserve import stash # type: ignore
+from tools import localpaths # noqa: F401
+from wptserve import stash
from .capsule import H3Capsule, H3CapsuleDecoder, CapsuleType
"""
@@ -309,8 +310,8 @@ class WebTransportSession:
def stash(self) -> stash.Stash:
"""A Stash object for storing cross-session state."""
if self._stash is None:
- address, authkey = stash.load_env_config()
- self._stash = stash.Stash(self._stash_path, address, authkey)
+ address, authkey = stash.load_env_config() # type: ignore
+ self._stash = stash.Stash(self._stash_path, address, authkey) # type: ignore
return self._stash
@property
diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py
index d6c238a1f27..7a046e8f07c 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/browser.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py
@@ -7,7 +7,7 @@ import stat
import subprocess
import tempfile
from abc import ABCMeta, abstractmethod
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
from distutils.spawn import find_executable
from urllib.parse import urlsplit
@@ -93,6 +93,36 @@ class Browser:
return dest
+ def download_from_url(
+ self, url, dest=None, channel=None, rename=None, default_name="download"
+ ):
+ """Download a URL into a dest/channel
+ :param url: The URL to download
+ :param dest: Directory in which to put the dowloaded
+ :param channel: Browser channel to append to the dest
+ :param rename: Optional name for the download; the original extension
+ is preserved
+ :param default_name: The default name for the download if none is
+ provided and none can be found from the network
+ :return: The path to the downloaded package/installer
+ """
+ self.logger.info("Downloading from %s" % url)
+
+ dest = self._get_browser_binary_dir(dest, channel)
+
+ resp = get(url)
+ filename = get_download_filename(resp, default_name)
+ if rename:
+ filename = "%s%s" % (rename, get_ext(filename))
+
+ output_path = os.path.join(dest, filename)
+
+ with open(output_path, "wb") as f:
+ for chunk in resp.iter_content(chunk_size=64 * 1024):
+ f.write(chunk)
+
+ return output_path
+
@abstractmethod
def download(self, dest=None, channel=None, rename=None):
"""Download a package or installer for the browser
@@ -1891,23 +1921,108 @@ class WebKitTestRunner(Browser):
product = "wktr"
requirements = None
- def download(self, dest=None, channel=None, rename=None):
- raise NotImplementedError
+ def _find_apple_port_builds(self, channel="main"):
+ if channel != "main":
+ raise ValueError(f"unable to get builds for branch {channel}")
- def install(self, dest=None, channel=None):
- raise NotImplementedError
+ system_version, _, _ = platform.mac_ver()
+ if system_version in SpecifierSet("==13.*"):
+ platform_key = "mac-ventura-x86_64%20arm64"
+ elif system_version in SpecifierSet("==12.*"):
+ platform_key = "mac-monterey-x86_64%20arm64"
+ else:
+ raise ValueError(
+ f"don't know what platform to use for macOS {system_version}"
+ )
- def install_webdriver(self, dest=None, channel=None, browser_binary=None):
+ # This should match http://github.com/WebKit/WebKit/blob/main/Websites/webkit.org/wp-content/themes/webkit/build-archives.php
+ build_index = get(
+ f"https://q1tzqfy48e.execute-api.us-west-2.amazonaws.com/v3/latest/{platform_key}-release"
+ ).json()
+
+ builds = []
+
+ for entry in build_index["Items"]:
+ creation_time = datetime.fromtimestamp(
+ int(entry["creationTime"]["N"]), timezone.utc
+ )
+ identifier = entry["identifier"]["S"]
+ s3_url = entry["s3_url"]["S"]
+
+ builds.append((s3_url, identifier, creation_time))
+
+ return builds
+
+ def _download_metadata_apple_port(self, channel="main"):
+ digit_re = re.compile("([0-9]+)")
+
+ def natsort(string_to_split):
+ split = digit_re.split(string_to_split)
+ # this converts the split numbers into tuples so that "01" < "1"
+ split[1::2] = [(int(i), i) for i in split[1::2]]
+ return split
+
+ builds = sorted(
+ self._find_apple_port_builds(channel),
+ key=lambda x: natsort(x[1]),
+ reverse=True,
+ )
+ latest_build = builds[0]
+
+ return {
+ "url": latest_build[0],
+ "identifier": latest_build[1],
+ "creation_time": latest_build[2],
+ }
+
+ def download(
+ self, dest=None, channel="main", rename=None, version=None, revision=None
+ ):
+ if platform.system() == "Darwin":
+ meta = self._download_metadata_apple_port(channel)
+ else:
+ raise ValueError("Unsupported platform")
+
+ output_path = self.download_from_url(
+ meta["url"],
+ dest=dest,
+ channel=channel,
+ rename=rename,
+ )
+
+ dest = os.path.dirname(output_path) # This is the actual, used dest.
+
+ self.last_revision_used = meta["identifier"]
+ with open(os.path.join(dest, "identifier"), "w") as f:
+ f.write(self.last_revision_used)
+
+ return output_path
+
+ def install(self, dest=None, channel="main"):
+ dest = self._get_browser_binary_dir(dest, channel)
+ installer_path = self.download(dest=dest, channel=channel)
+ self.logger.info(f"Extracting to {dest}")
+ with open(installer_path, "rb") as f:
+ unzip(f, dest)
+
+ def install_webdriver(self, dest=None, channel="main", browser_binary=None):
raise NotImplementedError
- def find_binary(self, venv_path=None, channel=None):
- return None
+ def find_binary(self, venv_path=None, channel="main"):
+ path = self._get_browser_binary_dir(venv_path, channel)
+ return find_executable("WebKitTestRunner", os.path.join(path, "Release"))
- def find_webdriver(self, venv_path=None, channel=None):
+ def find_webdriver(self, venv_path=None, channel="main"):
return None
def version(self, binary=None, webdriver_binary=None):
- return None
+ dirname = os.path.dirname(binary)
+ identifier = os.path.join(dirname, "identifier")
+ if not os.path.exists(identifier):
+ return None
+
+ with open(identifier, "r") as f:
+ return f.read().strip()
class WebKitGTKMiniBrowser(WebKit):
diff --git a/tests/wpt/web-platform-tests/tools/wpt/install.py b/tests/wpt/web-platform-tests/tools/wpt/install.py
index 821ce86f97f..5bcbb7a7c33 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/install.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/install.py
@@ -13,7 +13,8 @@ latest_channels = {
'edgechromium': 'dev',
'safari': 'preview',
'servo': 'nightly',
- 'webkitgtk_minibrowser': 'nightly'
+ 'webkitgtk_minibrowser': 'nightly',
+ 'wktr': 'main',
}
channel_by_name = {
@@ -44,7 +45,7 @@ def get_parser():
parser = argparse.ArgumentParser(
parents=[channel_args],
description="Install a given browser or webdriver frontend.")
- parser.add_argument('browser', choices=['firefox', 'chrome', 'chromium', 'servo', 'safari'],
+ parser.add_argument('browser', choices=['firefox', 'chrome', 'chromium', 'servo', 'safari', 'wktr'],
help='name of web browser product')
parser.add_argument('component', choices=['browser', 'webdriver'],
help='name of component')
@@ -107,7 +108,12 @@ def install(name, component, destination, channel="nightly", logger=None, downlo
method = prefix + suffix
- browser_cls = getattr(browser, name.title())
+ if name == "wktr":
+ canonical_name = "WebKitTestRunner"
+ else:
+ canonical_name = name.title()
+
+ browser_cls = getattr(browser, canonical_name)
logger.info('Now installing %s %s...', name, component)
kwargs = {}
if download_only and rename:
diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py
index 0b7d73b2042..72ceab08b97 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/run.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/run.py
@@ -265,6 +265,9 @@ Consider installing certutil via your OS package manager or directly.""")
kwargs["headless"] = True
logger.info("Running in headless mode, pass --no-headless to disable")
+ if kwargs["browser_channel"] == "nightly" and kwargs["enable_webtransport_h3"] is None:
+ kwargs["enable_webtransport_h3"] = True
+
# Turn off Firefox WebRTC ICE logging on WPT (turned on by mozrunner)
safe_unsetenv('R_LOG_LEVEL')
safe_unsetenv('R_LOG_DESTINATION')
@@ -691,10 +694,16 @@ class WebKitTestRunner(BrowserSetup):
browser_cls = browser.WebKitTestRunner
def install(self, channel=None):
- raise NotImplementedError
+ if self.prompt_install(self.name):
+ return self.browser.install(self.venv.path, channel=channel)
def setup_kwargs(self, kwargs):
- pass
+ if kwargs["binary"] is None:
+ binary = self.browser.find_binary(self.venv.path, channel=kwargs["browser_channel"])
+
+ if binary is None:
+ raise WptrunError("Unable to find binary in PATH")
+ kwargs["binary"] = binary
class WebKitGTKMiniBrowser(BrowserSetup):
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py
index 1635dce7ec6..184cd7247b3 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py
@@ -6,8 +6,8 @@ import os
import pytest
from tools.wpt import wpt
-from tools.wptrunner.wptrunner import manifestexpected
-from tools.wptrunner.wptrunner.manifestupdate import get_test_name
+from wptrunner import manifestexpected
+from wptrunner.manifestupdate import get_test_name
from localpaths import repo_root
@pytest.fixture
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
index ccf09be728d..bfd21934d99 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
@@ -1,9 +1,9 @@
html5lib==1.1
mozdebug==0.3.0
mozinfo==1.2.2 # https://bugzilla.mozilla.org/show_bug.cgi?id=1621226
-mozlog==7.1.0
+mozlog==7.1.1
mozprocess==1.3.0
-pillow==8.4.0
+pillow==9.4.0
requests==2.28.2
six==1.16.0
urllib3[secure]==1.26.15
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt
index 64546d55314..0b51ee8f463 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt
@@ -1,5 +1,5 @@
-marionette_driver==3.1.0
-mozcrash==2.1.0
+marionette_driver==3.2.0
+mozcrash==2.2.0
mozdevice==4.1.0
mozinstall==2.0.1
mozleak==0.2
@@ -7,3 +7,4 @@ mozprofile==2.5.0
mozrunner==8.2.1
mozversion==2.3.0
psutil==5.9.4
+redo==2.0.4
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
index eca63d136bb..95f53011bfc 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
@@ -258,6 +258,8 @@ class ChromiumFormatter(base.BaseFormatter): # type: ignore
def suite_start(self, data):
if self.start_timestamp_seconds is None:
self.start_timestamp_seconds = self._get_time(data)
+ if 'run_info' in data:
+ self.flag_specific = data['run_info'].get('flag_specific', '')
def test_start(self, data):
test_name = data["test"]
@@ -325,6 +327,7 @@ class ChromiumFormatter(base.BaseFormatter): # type: ignore
"version": 3,
"seconds_since_epoch": self.start_timestamp_seconds,
"num_failures_by_type": self.num_failures_by_status,
+ "flag_name": self.flag_specific,
"tests": self.tests
}
return json.dumps(final_result)
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 35c75758f53..6cbe335cfe7 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
@@ -3,7 +3,7 @@
import json
import os
import sys
-from io import BytesIO
+from io import BytesIO, StringIO
from unittest import mock
import pytest
@@ -116,7 +116,7 @@ def create_updater(tests, url_base="/", **kwargs):
def create_log(entries):
- data = BytesIO()
+ data = StringIO()
if isinstance(entries, list):
logger = structuredlog.StructuredLogger("expected_test")
handler = handlers.StreamHandler(data, formatters.JSONFormatter())
@@ -127,7 +127,7 @@ def create_log(entries):
getattr(logger, action)(**kwargs)
logger.remove_handler(handler)
else:
- data.write(json.dumps(entries).encode())
+ data.write(json.dumps(entries))
data.seek(0)
return data
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py
index be5dc0d102c..f47308d88df 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py
@@ -95,6 +95,7 @@ class TestUsingH2Server:
http2=True, verify=False)
def teardown_method(self, test_method):
+ self.client.close()
self.server.stop()
diff --git a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html
index 73af4634b6d..883c438fa93 100644
--- a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html
+++ b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html
@@ -10,7 +10,6 @@
assert_throws_dom("InvalidStateError", () => {
let request = new XMLHttpRequest();
request.setPrivateToken({
- type: 'private-state-token',
version: 1,
operation: 'token-request'
});
@@ -23,7 +22,6 @@
request.open('GET', 'https://privatetoken.example');
request.send();
request.setPrivateToken({
- type: 'private-state-token',
version: 1,
operation: 'token-request'
});
@@ -34,26 +32,7 @@
assert_throws_js(TypeError, () => {
let request = new XMLHttpRequest();
request.open('GET', 'https://privatetoken.example');
- request.setPrivateToken({});
- });
- }, 'Private Token operations require present `type` values.');
-
- test(() => {
- assert_throws_js(TypeError, () => {
- let request = new XMLHttpRequest();
- request.open('GET', 'https://privatetoken.example');
- request.setPrivateToken({
- type: "invalid"
- });
- });
- }, 'Private Token operations require valid `type` values.');
-
- test(() => {
- assert_throws_js(TypeError, () => {
- let request = new XMLHttpRequest();
- request.open('GET', 'https://privatetoken.example');
request.setPrivateToken({
- type: "private-state-token",
version: 1,
operation: "token-request",
refreshPolicy: "not a member of the refreshPolicy enum",
@@ -66,7 +45,6 @@
let request = new XMLHttpRequest();
request.open('GET', 'https://privatetoken.example');
request.setPrivateToken({
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: []
@@ -79,7 +57,6 @@
let request = new XMLHttpRequest();
request.open('GET', 'https://privatetoken.example');
request.setPrivateToken({
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: [3]
@@ -92,7 +69,6 @@
let request = new XMLHttpRequest();
request.open('GET', 'https://privatetoken.example');
request.setPrivateToken({
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: ["not a valid URL"]
@@ -105,7 +81,6 @@
let request = new XMLHttpRequest();
request.open('GET', 'https://privatetoken.example');
request.setPrivateToken({
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: ["http://not-secure.com"]
@@ -117,7 +92,6 @@
let request = new XMLHttpRequest();
request.open('GET', 'https://privatetoken.example');
request.setPrivateToken({
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: ["http://localhost"]
diff --git a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html
index e2ab079434b..cf24b232e83 100644
--- a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html
+++ b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html
@@ -9,26 +9,7 @@
test(() => {
assert_throws_js(TypeError, () => {
new Request('https://example.com', {
- privateToken: {}
- });
- });
- }, 'Private Token fetches require present `type` values.');
-
- test(() => {
- assert_throws_js(TypeError, () => {
- new Request('https://example.com', {
- privateToken: {
- type: "invalid"
- }
- });
- });
- }, 'Private Token fetches require valid `type` values.');
-
- test(() => {
- assert_throws_js(TypeError, () => {
- new Request('https://example.com', {
privateToken: {
- type: "private-state-token",
version: 1,
operation: "token-request",
refreshPolicy: "not a member of the refreshPolicy enum",
@@ -41,7 +22,6 @@
assert_throws_js(TypeError, () => {
new Request('https://example.com', {
privateToken: {
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: []
@@ -54,7 +34,6 @@
assert_throws_js(TypeError, () => {
new Request('https://example.com', {
privateToken: {
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: [3]
@@ -67,7 +46,6 @@
assert_throws_js(TypeError, () => {
new Request('https://example.com', {
privateToken: {
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: ["not a valid URL"]
@@ -80,7 +58,6 @@
assert_throws_js(TypeError, () => {
new Request('https://example.com', {
privateToken: {
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: ["http://not-secure.com"]
@@ -92,7 +69,6 @@
test(() => {
new Request('https://example.com', {
privateToken: {
- type: "private-state-token",
version: 1,
operation: "send-redemption-record",
issuers: ["http://localhost"]
diff --git a/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js b/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js
index b5c511d4062..229ae32edd4 100644
--- a/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js
+++ b/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js
@@ -295,7 +295,7 @@ promise_test(async t => {
encoder.configure(defaultConfig);
- assert_throws_dom("OperationError", () => {
+ assert_throws_js(TypeError, () => {
encoder.encode(frame);
});
}, 'Verify encoding closed frames throws.');
diff --git a/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html b/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html
index cb02ad4bcc3..8fe7cf44cc6 100644
--- a/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html
+++ b/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html
@@ -208,11 +208,11 @@ function createVideoFrame(ts) {
});
}
-function canSerializeVideoFrame(target, vf, transfer) {
+function canSerializeVideoFrame(target, vf) {
return canPostVideoFrame(target, vf, false);
};
-function canTransferVideoFrame(target, vf, transfer) {
+function canTransferVideoFrame(target, vf) {
return canPostVideoFrame(target, vf, true);
};
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py
index 486414aa3cd..9723ee4a4ed 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py
@@ -135,3 +135,14 @@ async def test_document_write(bidi_session, subscribe_events, top_context, wait_
event = await on_entry
assert_navigation_info(event, {"context": top_context["context"]})
+
+
+async def test_page_with_base_tag(bidi_session, subscribe_events, inline, new_tab, wait_for_event):
+ await subscribe_events(events=[DOM_CONTENT_LOADED_EVENT])
+
+ on_entry = wait_for_event(DOM_CONTENT_LOADED_EVENT)
+ url = inline("""<base href="/relative-path">""")
+ await bidi_session.browsing_context.navigate(context=new_tab["context"], url=url)
+ event = await on_entry
+
+ assert_navigation_info(event, {"context": new_tab["context"], "url": url})
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py
index 878d26eaad8..b4b174818cf 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py
@@ -124,3 +124,14 @@ async def test_document_write(bidi_session, subscribe_events, top_context, wait_
event = await on_entry
assert_navigation_info(event, {"context": top_context["context"]})
+
+
+async def test_page_with_base_tag(bidi_session, subscribe_events, inline, new_tab, wait_for_event):
+ await subscribe_events(events=[CONTEXT_LOAD_EVENT])
+
+ on_entry = wait_for_event(CONTEXT_LOAD_EVENT)
+ url = inline("""<base href="/relative-path">""")
+ await bidi_session.browsing_context.navigate(context=new_tab["context"], url=url)
+ event = await on_entry
+
+ assert_navigation_info(event, {"context": new_tab["context"], "url": url})
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py
index dd1fbcb9ae7..b66fb9881e5 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py
@@ -4,13 +4,20 @@ pytestmark = pytest.mark.asyncio
@pytest.mark.parametrize(
- "page, expected_dimensions",
+ "page, orientation, expected_dimensions",
[
- (None, {"width": 21.59, "height": 27.94}),
- ({}, {"width": 21.59, "height": 27.94}),
- ({"width": 4.5}, {"width": 4.5, "height": 27.94}),
- ({"height": 23}, {"width": 21.59, "height": 23}),
- ({"width": 4.5, "height": 12}, {"width": 4.5, "height": 12}),
+ (None, "portrait", {"width": 21.59, "height": 27.94}),
+ ({}, "portrait",{"width": 21.59, "height": 27.94}),
+ ({"width": 4.5}, "portrait", {"width": 4.5, "height": 27.94}),
+ ({"height": 23}, "portrait", {"width": 21.59, "height": 23}),
+ ({"width": 4.5, "height": 12}, "portrait", {"width": 4.5, "height": 12}),
+ ({"height": 12}, "portrait", {"width": 21.59, "height": 12}),
+ (None, "landscape", {"width": 27.94, "height": 21.59}),
+ ({}, "landscape",{"width": 27.94, "height": 21.59}),
+ ({"width": 4.5}, "landscape", {"width": 27.94, "height": 4.5}),
+ ({"height": 23}, "landscape", {"width": 23, "height": 21.59}),
+ ({"width": 4.5, "height": 12}, "landscape", {"width": 12, "height": 4.5}),
+ ({"height": 12}, "landscape", {"width": 12, "height": 21.59}),
],
)
async def test_page(
@@ -19,13 +26,14 @@ async def test_page(
inline,
assert_pdf_dimensions,
page,
+ orientation,
expected_dimensions,
):
await bidi_session.browsing_context.navigate(
context=top_context["context"], url=inline(""), wait="complete"
)
value = await bidi_session.browsing_context.print(
- context=top_context["context"], page=page, orientation="portrait"
+ context=top_context["context"], page=page, orientation=orientation
)
await assert_pdf_dimensions(value, expected_dimensions)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/__init__.py
new file mode 100644
index 00000000000..3aa0c3a19d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/__init__.py
@@ -0,0 +1,28 @@
+import json
+
+from webdriver.bidi.modules.script import ContextTarget
+
+
+async def get_events(context, bidi_session):
+ """Return list of key events recorded on the test_actions.html page."""
+ events_str = await bidi_session.script.evaluate(
+ expression="JSON.stringify(allEvents.events)",
+ target=ContextTarget(context),
+ await_promise=False,
+ )
+ events = json.loads(events_str["value"])
+
+ # `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in
+ # test_actions.html), so this converts them back into unicode literals.
+ for e in events:
+ # example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char)
+ if "key" in e and e["key"].startswith("U+"):
+ key = e["key"]
+ hex_suffix = key[key.index("+") + 1 :]
+ e["key"] = chr(int(hex_suffix, 16))
+
+ # WebKit sets code as 'Unidentified' for unidentified key codes, but
+ # tests expect ''.
+ if "code" in e and e["code"] == "Unidentified":
+ e["code"] = ""
+ return events
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/conftest.py
new file mode 100644
index 00000000000..0ec3174163f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/conftest.py
@@ -0,0 +1,21 @@
+import pytest
+
+from webdriver.bidi.modules.script import ContextTarget
+
+
+@pytest.fixture
+def get_focused_key_input(bidi_session, top_context):
+ """Get focused input element, containing pressed key data."""
+
+ async def get_focused_key_input(context=top_context):
+ return await bidi_session.script.call_function(
+ function_declaration="""() => {
+ const elem = document.getElementById("keys");
+ elem.focus();
+ return elem;
+ }""",
+ target=ContextTarget(context["context"]),
+ await_promise=False,
+ )
+
+ return get_focused_key_input
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/invalid.py
new file mode 100644
index 00000000000..4dee9e33654
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/invalid.py
@@ -0,0 +1,22 @@
+import pytest
+
+from webdriver.bidi.modules.input import Actions
+from webdriver.bidi.error import InvalidArgumentException, NoSuchFrameException
+
+
+pytestmark = pytest.mark.asyncio
+
+
+@pytest.mark.parametrize("value", [None, True, 42, {}, []])
+async def test_params_context_invalid_type(bidi_session, value):
+ actions = Actions()
+ actions.add_key()
+ with pytest.raises(InvalidArgumentException):
+ await bidi_session.input.perform_actions(actions=actions, context=value)
+
+
+async def test_params_contexts_value_invalid_value(bidi_session):
+ actions = Actions()
+ actions.add_key()
+ with pytest.raises(NoSuchFrameException):
+ await bidi_session.input.perform_actions(actions=actions, context="foo")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py
index 65f54ed7b38..e222776d1f9 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py
@@ -1,38 +1,14 @@
-import json
-
import pytest
from webdriver.bidi.modules.input import Actions
from webdriver.bidi.modules.script import ContextTarget
-from tests.support.helpers import filter_dict
+from tests.support.helpers import filter_supported_key_events
+from .. import get_events
pytestmark = pytest.mark.asyncio
-async def get_events(context, bidi_session):
- """Return list of key events recorded in the test_keys_page fixture."""
- events_str = await bidi_session.script.evaluate(expression="JSON.stringify(allEvents.events)",
- target=ContextTarget(context),
- await_promise=False)
- events = json.loads(events_str["value"])
-
- # `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in
- # test_actions.html), so this converts them back into unicode literals.
- for e in events:
- # example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char)
- if "key" in e and e["key"].startswith(u"U+"):
- key = e["key"]
- hex_suffix = key[key.index("+") + 1:]
- e["key"] = chr(int(hex_suffix, 16))
-
- # WebKit sets code as 'Unidentified' for unidentified key codes, but
- # tests expect ''.
- if "code" in e and e["code"] == "Unidentified":
- e["code"] = ""
- return events
-
-
@pytest.mark.parametrize("value,code", [
(u"a", "KeyA",),
("a", "KeyA",),
@@ -44,20 +20,11 @@ async def get_events(context, bidi_session):
(u"\u2603", ""),
(u"\uF6C2", ""), # PUA
])
-async def test_printable_key_sends_correct_events(bidi_session, top_context, url, value, code):
- await bidi_session.browsing_context.navigate(
- context=top_context["context"],
- url=url("/webdriver/tests/support/html/test_actions.html"),
- wait="complete"
- )
- await bidi_session.script.call_function(function_declaration="""
-() => {
- let elem = document.getElementById("keys");
- elem.focus();
- resetEvents();
-}""",
- target=ContextTarget(top_context["context"]),
- await_promise=False)
+async def test_printable_key_sends_correct_events(
+ bidi_session, top_context, test_actions_page_bidi, get_focused_key_input, value, code
+):
+ await test_actions_page_bidi()
+ elem = await get_focused_key_input()
actions = Actions()
(actions.add_key()
@@ -74,19 +41,15 @@ async def test_printable_key_sends_correct_events(bidi_session, top_context, url
{"code": code, "key": value, "type": "keyup"},
]
- events = [filter_dict(e, expected[0]) for e in all_events]
- if len(events) > 0 and events[0]["code"] is None:
- # Remove 'code' entry if browser doesn't support it
- expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
- events = [filter_dict(e, expected[0]) for e in events]
+ (events, expected) = filter_supported_key_events(all_events, expected)
assert events == expected
keys_value = await bidi_session.script.call_function(function_declaration="""
-() => {
- let elem = document.getElementById("keys");
+(elem) => {
return elem.value
}""",
target=ContextTarget(top_context["context"]),
+ arguments=[elem],
await_promise=False)
assert keys_value["value"] == value
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/context.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/context.py
new file mode 100644
index 00000000000..0cb407606d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/context.py
@@ -0,0 +1,42 @@
+import pytest
+from webdriver.bidi.modules.input import Actions
+from webdriver.bidi.modules.script import ContextTarget
+
+from tests.support.helpers import filter_supported_key_events
+from .. import get_events
+
+pytestmark = pytest.mark.asyncio
+
+
+async def test_different_top_level_contexts(
+ bidi_session, new_tab, top_context, test_actions_page_bidi, get_focused_key_input
+):
+ await test_actions_page_bidi()
+ await get_focused_key_input()
+
+ actions = Actions()
+ actions.add_key().key_down("a")
+ await bidi_session.input.perform_actions(
+ actions=actions, context=top_context["context"]
+ )
+ # Reset so we only see the release events
+ await bidi_session.script.evaluate(
+ expression="resetEvents()",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ )
+ # Release actions in another context
+ await bidi_session.input.release_actions(context=new_tab["context"])
+
+ events = await get_events(top_context["context"], bidi_session)
+ assert len(events) == 0
+
+ # Release actions in right context
+ await bidi_session.input.release_actions(context=top_context["context"])
+
+ expected = [
+ {"code": "KeyA", "key": "a", "type": "keyup"},
+ ]
+ all_events = await get_events(top_context["context"], bidi_session)
+ (events, expected) = filter_supported_key_events(all_events, expected)
+ assert events == expected
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/invalid.py
new file mode 100644
index 00000000000..2adc0aa9538
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/invalid.py
@@ -0,0 +1,16 @@
+import pytest
+from webdriver.bidi.error import InvalidArgumentException, NoSuchFrameException
+
+
+pytestmark = pytest.mark.asyncio
+
+
+@pytest.mark.parametrize("value", [None, True, 42, {}, []])
+async def test_params_context_invalid_type(bidi_session, value):
+ with pytest.raises(InvalidArgumentException):
+ await bidi_session.input.release_actions(context=value)
+
+
+async def test_params_contexts_value_invalid_value(bidi_session):
+ with pytest.raises(NoSuchFrameException):
+ await bidi_session.input.release_actions(context="foo")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/release.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/release.py
new file mode 100644
index 00000000000..c4990b702ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/release.py
@@ -0,0 +1,28 @@
+import pytest
+from webdriver.bidi.modules.script import ContextTarget
+
+from .. import get_events
+
+pytestmark = pytest.mark.asyncio
+
+
+async def test_release_no_actions_sends_no_events(
+ bidi_session, top_context, test_actions_page_bidi, get_focused_key_input
+):
+ await test_actions_page_bidi()
+ elem = await get_focused_key_input()
+
+ await bidi_session.input.release_actions(context=top_context["context"])
+
+ keys = await bidi_session.script.call_function(
+ function_declaration="""(elem) => {
+ return elem.value;
+ }""",
+ arguments=[elem],
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ )
+ events = await get_events(top_context["context"], bidi_session)
+
+ assert len(keys["value"]) == 0
+ assert len(events) == 0
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/sequence.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/sequence.py
new file mode 100644
index 00000000000..bd1d7752303
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/sequence.py
@@ -0,0 +1,84 @@
+import pytest
+from webdriver.bidi.modules.input import Actions
+from webdriver.bidi.modules.script import ContextTarget
+
+from tests.support.helpers import filter_dict, filter_supported_key_events
+from .. import get_events
+
+pytestmark = pytest.mark.asyncio
+
+
+async def test_release_char_sequence_sends_keyup_events_in_reverse(
+ bidi_session, top_context, test_actions_page_bidi, get_focused_key_input
+):
+ await test_actions_page_bidi()
+ await get_focused_key_input()
+
+ actions = Actions()
+ actions.add_key().key_down("a").key_down("b")
+ await bidi_session.input.perform_actions(
+ actions=actions, context=top_context["context"]
+ )
+ # Reset so we only see the release events
+ await bidi_session.script.evaluate(
+ expression="resetEvents()",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ )
+ await bidi_session.input.release_actions(context=top_context["context"])
+ expected = [
+ {"code": "KeyB", "key": "b", "type": "keyup"},
+ {"code": "KeyA", "key": "a", "type": "keyup"},
+ ]
+ all_events = await get_events(top_context["context"], bidi_session)
+ (events, expected) = filter_supported_key_events(all_events, expected)
+ assert events == expected
+
+
+@pytest.mark.parametrize(
+ "release_actions",
+ [True, False],
+ ids=["with release actions", "without release actions"],
+)
+async def test_release_mouse_sequence_resets_dblclick_state(
+ bidi_session,
+ top_context,
+ test_actions_page_bidi,
+ release_actions
+):
+ await test_actions_page_bidi()
+ reporter = await bidi_session.script.evaluate(
+ expression="document.querySelector('#outer')",
+ target=ContextTarget(top_context["context"]),
+ await_promise=False,
+ )
+ actions = Actions()
+ actions.add_pointer(pointer_type="mouse").pointer_move(
+ x=0, y=0, origin=reporter["value"]
+ ).pointer_down(button=0).pointer_up(button=0)
+ await bidi_session.input.perform_actions(
+ actions=actions, context=top_context["context"]
+ )
+
+ if release_actions:
+ await bidi_session.input.release_actions(context=top_context["context"])
+
+ await bidi_session.input.perform_actions(
+ actions=actions, context=top_context["context"]
+ )
+ events = await get_events(top_context["context"], bidi_session)
+
+ expected = [
+ {"type": "mousedown", "button": 0},
+ {"type": "mouseup", "button": 0},
+ {"type": "click", "button": 0},
+ {"type": "mousedown", "button": 0},
+ {"type": "mouseup", "button": 0},
+ {"type": "click", "button": 0},
+ ]
+
+ if not release_actions:
+ expected.append({"type": "dblclick", "button": 0})
+
+ filtered_events = [filter_dict(e, expected[0]) for e in events]
+ assert expected == filtered_events[1:]
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py
index e6ca1f999b0..21a037a0f77 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py
@@ -11,25 +11,30 @@ PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html"
@pytest.fixture
-def fetch(bidi_session, top_context):
+def fetch(bidi_session, top_context, configuration):
"""Perform a fetch from the page of the provided context, default to the
top context.
"""
- async def fetch(url, method="GET", headers=None, context=top_context):
+ async def fetch(url, method="GET", headers=None, context=top_context, timeout_in_seconds=1):
method_arg = f"method: '{method}',"
headers_arg = ""
if headers != None:
headers_arg = f"headers: {json.dumps(headers)},"
+ timeout_in_seconds = timeout_in_seconds * configuration["timeout_multiplier"]
+
# Wait for fetch() to resolve a response and for response.text() to
# resolve as well to make sure the request/response is completed when
# the helper returns.
await bidi_session.script.evaluate(
expression=f"""
+ const controller = new AbortController();
+ setTimeout(() => controller.abort(), {timeout_in_seconds * 1000});
fetch("{url}", {{
{method_arg}
{headers_arg}
+ signal: controller.signal
}}).then(response => response.text());""",
target=ContextTarget(context["context"]),
await_promise=True,
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py
index d73705c6724..015fd40cf90 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py
@@ -118,6 +118,21 @@ async def test_params_arguments_handle_invalid_type(
target=ContextTarget(top_context["context"]))
+async def test_params_arguments_handle_unknown_value(
+ bidi_session, top_context
+):
+ serialized_value = {
+ "handle": "foo",
+ }
+
+ with pytest.raises(error.NoSuchHandleException):
+ await bidi_session.script.call_function(
+ function_declaration="(arg) => arg",
+ arguments=[serialized_value],
+ await_promise=False,
+ target=ContextTarget(top_context["context"]))
+
+
@pytest.mark.parametrize("value", [None, False, 42, {}, []])
async def test_params_arguments_sharedId_invalid_type(
bidi_session, top_context, value
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py
index d4a51457662..e1226463a5c 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py
@@ -27,7 +27,7 @@ async def test_basic_handle(bidi_session, top_context, call_function):
handles=[remote_value["handle"]], target=ContextTarget(top_context["context"])
)
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [remote_value])
@@ -67,10 +67,10 @@ async def test_multiple_handles_for_different_objects(
)
# using handle a or b should raise an exception
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [remote_value_a])
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.b", [remote_value_b])
# remote value c should still work
@@ -84,7 +84,7 @@ async def test_multiple_handles_for_different_objects(
)
# using handle c should raise an exception
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.c", [remote_value_c])
@@ -126,7 +126,7 @@ async def test_multiple_handles_for_same_object(
)
# Using handle 1 should raise an exception
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [remote_value1])
# Using handle 2 should still work
@@ -139,7 +139,7 @@ async def test_multiple_handles_for_same_object(
)
# Using handle 2 should raise an exception
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [remote_value2])
@@ -169,5 +169,5 @@ async def test_unknown_handle(bidi_session, top_context, call_function):
target=ContextTarget(top_context["context"]),
)
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [remote_value])
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py
index d8439c2be3d..67d857a0414 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py
@@ -29,7 +29,7 @@ async def test_realm(bidi_session, top_context, call_function):
target=RealmTarget(remote_value["realm"]),
)
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [remote_value["result"]])
@@ -83,7 +83,7 @@ async def test_sandbox(bidi_session, top_context, call_function):
target=ContextTarget(top_context["context"], "basic_sandbox"),
)
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [sandbox_value], sandbox="basic_sandbox")
# Disown the non-sandboxed remote value from the top context
@@ -91,5 +91,5 @@ async def test_sandbox(bidi_session, top_context, call_function):
handles=[remote_value["handle"]], target=ContextTarget(top_context["context"])
)
- with pytest.raises(error.InvalidArgumentException):
+ with pytest.raises(error.NoSuchHandleException):
await call_function("arg => arg.a", [remote_value], sandbox="basic_sandbox")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py
index f28fb06ce29..30069a02386 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py
@@ -69,7 +69,7 @@ def release_actions(session, request):
@pytest.fixture
def key_reporter(session, test_actions_page, request):
- """Represents focused input element from `test_keys_page` fixture."""
+ """Represents focused input element from `test_actions_page` fixture."""
input_el = session.find.css("#keys", all=False)
input_el.click()
session.execute_script("resetEvents();")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py
index 8dbe024d183..9f912684c76 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py
@@ -6,7 +6,7 @@ import pytest
from tests.perform_actions.support.keys import ALL_EVENTS, Keys, ALTERNATIVE_KEY_NAMES
from tests.perform_actions.support.refine import get_events, get_keys
-from tests.support.helpers import filter_dict
+from tests.support.helpers import filter_dict, filter_supported_key_events
def test_keyup_only_sends_no_events(session, key_reporter, key_chain):
@@ -48,11 +48,7 @@ def test_modifier_key_sends_correct_events(session, key_reporter, key_chain, key
{"code": code, "key": value, "type": "keyup"},
]
- events = [filter_dict(e, expected[0]) for e in all_events]
- if len(events) > 0 and events[0]["code"] is None:
- # Remove 'code' entry if browser doesn't support it
- expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
- events = [filter_dict(e, expected[0]) for e in events]
+ (events, expected) = filter_supported_key_events(all_events, expected)
assert events == expected
assert len(get_keys(key_reporter)) == 0
@@ -85,12 +81,8 @@ def test_non_printable_key_sends_events(session, key_reporter, key_chain, key, e
alt_expected[0]["key"] = ALTERNATIVE_KEY_NAMES[event]
alt_expected[2]["key"] = ALTERNATIVE_KEY_NAMES[event]
- events = [filter_dict(e, expected[0]) for e in all_events]
- if len(events) > 0 and events[0]["code"] is None:
- # Remove 'code' entry if browser doesn't support it
- expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
- alt_expected = [filter_dict(e, {"key": "", "type": ""}) for e in alt_expected]
- events = [filter_dict(e, expected[0]) for e in events]
+ (_, expected) = filter_supported_key_events(all_events, expected)
+ (events, alt_expected) = filter_supported_key_events(all_events, alt_expected)
if len(events) == 2:
# most browsers don't send a keypress for non-printable keys
assert events == [expected[0], expected[2]] or events == [alt_expected[0], alt_expected[2]]
@@ -124,11 +116,7 @@ def test_printable_key_sends_correct_events(session, key_reporter, key_chain, va
{"code": code, "key": value, "type": "keyup"},
]
- events = [filter_dict(e, expected[0]) for e in all_events]
- if len(events) > 0 and events[0]["code"] is None:
- # Remove 'code' entry if browser doesn't support it
- expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
- events = [filter_dict(e, expected[0]) for e in events]
+ (events, expected) = filter_supported_key_events(all_events, expected)
assert events == expected
assert get_keys(key_reporter) == value
@@ -148,11 +136,7 @@ def test_sequence_of_keydown_printable_keys_sends_events(session, key_reporter,
{"code": "KeyB", "key": "b", "type": "keypress"},
]
- events = [filter_dict(e, expected[0]) for e in all_events]
- if len(events) > 0 and events[0]["code"] is None:
- # Remove 'code' entry if browser doesn't support it
- expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
- events = [filter_dict(e, expected[0]) for e in events]
+ (events, expected) = filter_supported_key_events(all_events, expected)
assert events == expected
assert get_keys(key_reporter) == "ab"
@@ -171,11 +155,7 @@ def test_sequence_of_keydown_printable_characters_sends_events(session, key_repo
{"code": "KeyF", "key": "f", "type": "keyup"},
]
- events = [filter_dict(e, expected[0]) for e in all_events]
- if len(events) > 0 and events[0]["code"] is None:
- # Remove 'code' entry if browser doesn't support it
- expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
- events = [filter_dict(e, expected[0]) for e in events]
+ (events, expected) = filter_supported_key_events(all_events, expected)
assert events == expected
assert get_keys(key_reporter) == "ef"
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py
index 34c8e5de183..8275efc23b7 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py
@@ -28,7 +28,7 @@ def release_actions(session, request):
@pytest.fixture
def key_reporter(session, test_actions_page, request):
- """Represents focused input element from `test_keys_page` fixture."""
+ """Represents focused input element from `test_actions_page` fixture."""
input_el = session.find.css("#keys", all=False)
input_el.click()
session.execute_script("resetEvents();")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py
index 75143d85ca6..24ca16c8604 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py
@@ -1,7 +1,7 @@
# META: timeout=long
from tests.release_actions.support.refine import get_events, get_keys
-from tests.support.helpers import filter_dict
+from tests.support.helpers import filter_dict, filter_supported_key_events
def test_release_no_actions_sends_no_events(session, key_reporter):
@@ -25,11 +25,7 @@ def test_release_char_sequence_sends_keyup_events_in_reverse(session,
{"code": "KeyA", "key": "a", "type": "keyup"},
]
all_events = get_events(session)
- events = [filter_dict(e, expected[0]) for e in all_events]
- if len(events) > 0 and events[0]["code"] is None:
- # Remove 'code' entry if browser doesn't support it
- expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
- events = [filter_dict(e, expected[0]) for e in events]
+ (events, expected) = filter_supported_key_events(all_events, expected)
assert events == expected
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py
index 90f722587c3..d4052097493 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py
@@ -1,5 +1,5 @@
def get_events(session):
- """Return list of key events recorded in the test_keys_page fixture."""
+ """Return list of key events recorded in the test_actions_page fixture."""
events = session.execute_script("return allEvents.events;") or []
# `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in
# test_keys_wdspec.html), so this converts them back into unicode literals.
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/test_actions_wdspec.html b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/test_actions_wdspec.html
deleted file mode 100644
index 6f844cd255a..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/test_actions_wdspec.html
+++ /dev/null
@@ -1,197 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<html>
-<head>
- <title>Test Actions</title>
- <style>
- div { padding:0px; margin: 0px; }
- #trackPointer { position: fixed; }
- #resultContainer { width: 600px; height: 60px; }
- .area { width: 100px; height: 50px; background-color: #ccc; }
- .block { width: 5px; height: 5px; border: solid 1px red; }
- #dragArea { position: relative; }
- #dragTarget { position: absolute; top:22px; left:47px;}
- </style>
- <script>
- "use strict";
- var els = {};
- var allEvents = { events: [] };
- function displayMessage(message) {
- document.getElementById("events").innerHTML = "<p>" + message + "</p>";
- }
-
- function appendMessage(message) {
- document.getElementById("events").innerHTML += "<p>" + message + "</p>";
- }
-
- /**
- * Escape |key| if it's in a surrogate-half character range.
- *
- * Example: given "\ud83d" return "U+d83d".
- *
- * Otherwise JSON.stringify will convert it to U+FFFD (REPLACEMENT CHARACTER)
- * when returning a value from executeScript, for example.
- */
- function escapeSurrogateHalf(key) {
- if (typeof key !== "undefined" && key.length === 1) {
- var charCode = key.charCodeAt(0);
- var highSurrogate = charCode >= 0xD800 && charCode <= 0xDBFF;
- var surrogate = highSurrogate || (charCode >= 0xDC00 && charCode <= 0xDFFF);
- if (surrogate) {
- key = "U+" + charCode.toString(16);
- }
- }
- return key;
- }
-
- function recordKeyboardEvent(event) {
- var key = escapeSurrogateHalf(event.key);
- allEvents.events.push({
- "code": event.code,
- "key": key,
- "which": event.which,
- "location": event.location,
- "ctrl": event.ctrlKey,
- "meta": event.metaKey,
- "shift": event.shiftKey,
- "repeat": event.repeat,
- "type": event.type
- });
- appendMessage(event.type + " " +
- "code: " + event.code + ", " +
- "key: " + key + ", " +
- "which: " + event.which + ", " +
- "keyCode: " + event.keyCode);
- }
-
- function recordPointerEvent(event) {
- if (event.type === "contextmenu") {
- event.preventDefault();
- }
- allEvents.events.push({
- "type": event.type,
- "button": event.button,
- "buttons": event.buttons,
- "pageX": event.pageX,
- "pageY": event.pageY,
- "ctrlKey": event.ctrlKey,
- "metaKey": event.metaKey,
- "altKey": event.altKey,
- "shiftKey": event.shiftKey,
- "target": event.target.id
- });
- appendMessage(event.type + " " +
- "button: " + event.button + ", " +
- "pageX: " + event.pageX + ", " +
- "pageY: " + event.pageY + ", " +
- "button: " + event.button + ", " +
- "buttons: " + event.buttons + ", " +
- "ctrlKey: " + event.ctrlKey + ", " +
- "altKey: " + event.altKey + ", " +
- "metaKey: " + event.metaKey + ", " +
- "shiftKey: " + event.shiftKey + ", " +
- "target id: " + event.target.id);
- }
-
- function recordFirstPointerMove(event) {
- recordPointerEvent(event);
- window.removeEventListener("mousemove", recordFirstPointerMove);
- }
-
- function grabOnce(event) {
- grab(event);
- els.dragTarget.removeEventListener("mousedown", grabOnce);
- }
-
- function dropOnce(moveHandler) {
- return function (event) {
- moveHandler(event);
- els.dragArea.removeEventListener("mouseup", dropOnce);
- }
- }
-
- function resetEvents() {
- allEvents.events.length = 0;
- displayMessage("");
- }
-
- function drop(moveHandler) {
- return function (event) {
- els.dragArea.removeEventListener("mousemove", moveHandler);
- els.dragTarget.style.backgroundColor = "yellow";
- els.dragTarget.addEventListener("mousedown", grab);
- recordPointerEvent(event);
- };
- }
-
- function move(el, offsetX, offsetY, timeout) {
- return function(event) {
- setTimeout(function() {
- el.style.top = event.clientY + offsetY + "px";
- el.style.left = event.clientX + offsetX + "px";
- }, timeout);
- };
- }
-
- function grab(event) {
- event.target.style.backgroundColor = "red";
- let boxRect = event.target.getBoundingClientRect();
- let areaRect = event.target.parentElement.getBoundingClientRect();
- let moveHandler = move(
- event.target,
- // coordinates of dragTarget must be relative to dragArea such that
- // dragTarget remains under the pointer
- -(areaRect.left + (event.clientX - boxRect.left)),
- -(areaRect.top + (event.clientY - boxRect.top)),
- 20);
- els.dragArea.addEventListener("mousemove", moveHandler);
- els.dragArea.addEventListener("mouseup", dropOnce(drop(moveHandler)));
- }
-
- document.addEventListener("DOMContentLoaded", function() {
- var keyReporter = document.getElementById("keys");
- keyReporter.addEventListener("keyup", recordKeyboardEvent);
- keyReporter.addEventListener("keypress", recordKeyboardEvent);
- keyReporter.addEventListener("keydown", recordKeyboardEvent);
-
- var outer = document.getElementById("outer");
- outer.addEventListener("click", recordPointerEvent);
- outer.addEventListener("dblclick", recordPointerEvent);
- outer.addEventListener("mousedown", recordPointerEvent);
- outer.addEventListener("mouseup", recordPointerEvent);
- outer.addEventListener("contextmenu", recordPointerEvent);
-
- window.addEventListener("mousemove", recordFirstPointerMove);
- //visual cue for mousemove
- var pointer = document.getElementById("trackPointer");
- window.addEventListener("mousemove", move(pointer, 15, 15, 30));
- // drag and drop
- els.dragArea = document.getElementById("dragArea");
- els.dragTarget = document.getElementById("dragTarget");
- els.dragTarget.addEventListener("mousedown", grabOnce);
- });
- </script>
-</head>
-<body>
- <div id="trackPointer" class="block"></div>
- <div>
- <h2>KeyReporter</h2>
- <input type="text" id="keys" size="80">
- </div>
- <div>
- <h2>ClickReporter</h2>
- <div id="outer" class="area">
- </div>
- </div>
- <div>
- <h2>DragReporter</h2>
- <div id="dragArea" class="area">
- <div id="dragTarget" class="block"></div>
- </div>
- </div>
- <div id="resultContainer">
- <h2>Events</h2>
- <div id="events"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py b/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py
index 9407dc16070..612718b89e5 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py
@@ -334,3 +334,17 @@ def render_pdf_to_png_bidi(bidi_session, new_tab, url):
return base64.b64decode(image_string_without_data_type)
return render_pdf_to_png_bidi
+
+
+@pytest.fixture
+def test_actions_page_bidi(bidi_session, url, top_context):
+ """Navigate to test_actions.html."""
+
+ async def test_actions_page_bidi(context=top_context):
+ await bidi_session.browsing_context.navigate(
+ context=context["context"],
+ url=url("/webdriver/tests/support/html/test_actions.html"),
+ wait="complete",
+ )
+
+ return test_actions_page_bidi
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py b/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py
index b0c065dca11..45f4f4d2392 100644
--- a/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py
@@ -245,6 +245,16 @@ def filter_dict(source, d):
return {k: source[k] for k in d.keys()}
+def filter_supported_key_events(all_events, expected):
+ events = [filter_dict(e, expected[0]) for e in all_events]
+ if len(events) > 0 and events[0]["code"] is None:
+ # Remove 'code' entry if browser doesn't support it
+ expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected]
+ events = [filter_dict(e, expected[0]) for e in events]
+
+ return (events, expected)
+
+
def wait_for_new_handle(session, handles_before):
def find_new_handle(session):
new_handles = list(set(session.handles) - set(handles_before))
diff --git a/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json b/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json
index f3855b0f4e1..e1bf6782619 100644
--- a/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json
+++ b/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json
@@ -514,7 +514,82 @@
"type": "float32"
},
"slope": {
- "shape": [1],
+ "shape": [3], // broadcast [3] --> [2, 2, 2, 3]
+ "data": [
+ 5.073923296191488,
+ 0.48077445494619653,
+ -7.091750168010829
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "name": "ouput",
+ "shape": [2, 2, 2, 3],
+ "data": [
+ -12.934283256530762,
+ -2.3052449226379395,
+ 8.413617134094238,
+ 6.108623504638672,
+ -4.082877159118652,
+ 3.3143365383148193,
+ 1.1687211990356445,
+ -0.06815595179796219,
+ 47.61863327026367,
+ 5.787421703338623,
+ -1.8056097030639648,
+ 34.737422943115234,
+ 7.3295159339904785,
+ -1.901092767715454,
+ 7.067296981811523,
+ 9.439736366271973,
+ -1.2299076318740845,
+ 61.40629196166992,
+ 8.47507381439209,
+ 4.551425457000732,
+ 65.72542572021484,
+ -1.330268144607544,
+ 1.3258955478668213,
+ 52.60881042480469
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "prelu float32 broadcast 4D x 1D slope of shape [1]",
+ "inputs": {
+ "x": {
+ "shape": [2, 2, 2, 3],
+ "data": [
+ -2.5491681672317235,
+ -4.794857500523286,
+ 8.413617520687886,
+ 6.108623511441287,
+ -8.492292847462334,
+ 3.3143364551069876,
+ 1.1687212422078108,
+ -0.1417628422981423,
+ -6.714651930677875,
+ 5.787421746282195,
+ -3.7556274239369847,
+ -4.898286418001732,
+ 7.329515995865023,
+ -3.9542297833176665,
+ 7.067297201348715,
+ 9.439736453375971,
+ -2.5581801134299775,
+ -8.658834185932482,
+ 8.475073893236225,
+ 4.551425642121982,
+ -9.267870491380243,
+ -0.26217744010265776,
+ 1.325895534951659,
+ -7.418311114031475
+ ],
+ "type": "float32"
+ },
+ "slope": {
+ "shape": [1], // broadcast [1] --> [2, 2, 2, 3]
"data": [
5.0114545056636395
],
@@ -587,7 +662,7 @@
"type": "float32"
},
"slope": {
- "shape": [2, 3],
+ "shape": [2, 3], // broadcast [2, 3] --> [2, 2, 2, 3]
"data": [
4.8742760041637645,
-8.50163357869285,
@@ -665,7 +740,7 @@
"type": "float32"
},
"slope": {
- "shape": [1, 1, 3],
+ "shape": [1, 1, 3], // broadcast [1, 1, 3] --> [2, 2, 2, 3]
"data": [
5.073923296191488,
0.48077445494619653,
@@ -740,7 +815,7 @@
"type": "float32"
},
"slope": {
- "shape": [1, 1, 1, 1],
+ "shape": [1, 1, 1, 1], // broadcast [1, 1, 1, 1] --> [2, 2, 2, 3]
"data": [
5.0114545056636395
],
diff --git a/tests/wpt/web-platform-tests/webnn/resources/test_data/softsign.json b/tests/wpt/web-platform-tests/webnn/resources/test_data/softsign.json
new file mode 100644
index 00000000000..e3208b18ad4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webnn/resources/test_data/softsign.json
@@ -0,0 +1,400 @@
+{ // softsign: The calculation follows the expression x / (1 + |x|).
+ "tests": [
+ {
+ "name": "softsign positive float32 1D tensor",
+ "inputs": {
+ "x": {
+ "shape": [24],
+ "data": [
+ 1.5834133593790956,
+ 4.0787189411490115,
+ 8.883356617490337,
+ 8.070860233252166,
+ 8.211773633019915,
+ 2.4554003891197818,
+ 0.653374178120758,
+ 7.866281154604682,
+ 3.1239552336192666,
+ 8.013792390668268,
+ 3.9409862749371283,
+ 1.8131727337833081,
+ 2.390676102273188,
+ 1.3359680092645565,
+ 9.416410839467265,
+ 0.44325690899325254,
+ 5.236662013213598,
+ 9.424242359034539,
+ 7.816190418459348,
+ 5.849185795081855,
+ 8.780370640491928,
+ 5.1205157788312246,
+ 7.1172223514005095,
+ 4.59910661262345
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "name": "output",
+ "shape": [24],
+ "data": [
+ 0.6129152178764343,
+ 0.8030999898910522,
+ 0.8988198041915894,
+ 0.8897568583488464,
+ 0.8914432525634766,
+ 0.7105979323387146,
+ 0.3951762318611145,
+ 0.8872131109237671,
+ 0.7575143575668335,
+ 0.8890588879585266,
+ 0.7976112365722656,
+ 0.6445294618606567,
+ 0.7050735354423523,
+ 0.5719119310379028,
+ 0.9039976596832275,
+ 0.30712267756462097,
+ 0.8396578431129456,
+ 0.9040697813034058,
+ 0.8865723013877869,
+ 0.8539972305297852,
+ 0.8977543711662292,
+ 0.8366150856018066,
+ 0.8768051266670227,
+ 0.8214001059532166
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "softsign negative float32 1D tensor",
+ "inputs": {
+ "x": {
+ "shape": [24],
+ "data": [
+ -2.5978440095516913,
+ -0.4449555447737712,
+ -9.095475232407683,
+ -3.7480076975512873,
+ -1.3867289790255697,
+ -8.220328902868987,
+ -3.538342320320556,
+ -9.364588742025619,
+ -6.283252341501335,
+ -5.0020120266550006,
+ -8.245729151019969,
+ -3.775470497728266,
+ -4.087254829132392,
+ -7.3816760861585795,
+ -5.882921529710956,
+ -8.338910337100263,
+ -6.6015492897072185,
+ -4.491942000901396,
+ -3.524778486355298,
+ -4.439912258765581,
+ -5.2342625634221225,
+ -1.5911732471016933,
+ -9.106277545690418,
+ -8.523774275382141
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "name": "output",
+ "shape": [24],
+ "data": [
+ -0.7220557928085327,
+ -0.3079372048377991,
+ -0.9009457230567932,
+ -0.7893853783607483,
+ -0.5810165405273438,
+ -0.891543984413147,
+ -0.7796552181243896,
+ -0.9035176634788513,
+ -0.8626986742019653,
+ -0.8333892226219177,
+ -0.8918419480323792,
+ -0.7905965447425842,
+ -0.8034303188323975,
+ -0.8806921243667603,
+ -0.8547128438949585,
+ -0.8929211497306824,
+ -0.8684478402137756,
+ -0.8179150223731995,
+ -0.7789947390556335,
+ -0.8161734938621521,
+ -0.8395960927009583,
+ -0.6140744686126709,
+ -0.9010515809059143,
+ -0.894999623298645
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "softsign float32 2D tensor",
+ "inputs": {
+ "x": {
+ "shape": [4, 6],
+ "data": [
+ -8.343496173533422,
+ -6.92015211612679,
+ 2.699638761922575,
+ -8.663104577031863,
+ -3.190534368785616,
+ 7.657887080586452,
+ 6.650215091182602,
+ 6.058011004380681,
+ 0.6634320403254037,
+ 5.805803683155526,
+ -0.32821124531446344,
+ 1.270430403469046,
+ -9.946119978610852,
+ 6.905375202832072,
+ -0.031071535439890496,
+ -3.9696409293645862,
+ 6.270823207970878,
+ -2.6392608577007914,
+ 3.051350503137261,
+ 7.42647683445869,
+ -8.454667518154086,
+ 7.135868292466057,
+ -4.9860941550065885,
+ -7.859615086397076
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "name": "output",
+ "shape": [4, 6],
+ "data": [
+ -0.8929736614227295,
+ -0.8737397789955139,
+ 0.7297033667564392,
+ -0.8965135812759399,
+ -0.7613669633865356,
+ 0.8844983577728271,
+ 0.8692847490310669,
+ 0.8583170175552368,
+ 0.3988332748413086,
+ 0.8530665636062622,
+ -0.24710771441459656,
+ 0.5595548748970032,
+ -0.9086434245109558,
+ 0.8735038042068481,
+ -0.03013519011437893,
+ -0.798778235912323,
+ 0.8624640107154846,
+ -0.7252188920974731,
+ 0.7531687617301941,
+ 0.88132643699646,
+ -0.8942321538925171,
+ 0.8770874738693237,
+ -0.8329461812973022,
+ -0.8871282935142517
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "softsign float32 3D tensor",
+ "inputs": {
+ "x": {
+ "shape": [2, 3, 4],
+ "data": [
+ -8.343496173533422,
+ -6.92015211612679,
+ 2.699638761922575,
+ -8.663104577031863,
+ -3.190534368785616,
+ 7.657887080586452,
+ 6.650215091182602,
+ 6.058011004380681,
+ 0.6634320403254037,
+ 5.805803683155526,
+ -0.32821124531446344,
+ 1.270430403469046,
+ -9.946119978610852,
+ 6.905375202832072,
+ -0.031071535439890496,
+ -3.9696409293645862,
+ 6.270823207970878,
+ -2.6392608577007914,
+ 3.051350503137261,
+ 7.42647683445869,
+ -8.454667518154086,
+ 7.135868292466057,
+ -4.9860941550065885,
+ -7.859615086397076
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "name": "output",
+ "shape": [2, 3, 4],
+ "data": [
+ -0.8929736614227295,
+ -0.8737397789955139,
+ 0.7297033667564392,
+ -0.8965135812759399,
+ -0.7613669633865356,
+ 0.8844983577728271,
+ 0.8692847490310669,
+ 0.8583170175552368,
+ 0.3988332748413086,
+ 0.8530665636062622,
+ -0.24710771441459656,
+ 0.5595548748970032,
+ -0.9086434245109558,
+ 0.8735038042068481,
+ -0.03013519011437893,
+ -0.798778235912323,
+ 0.8624640107154846,
+ -0.7252188920974731,
+ 0.7531687617301941,
+ 0.88132643699646,
+ -0.8942321538925171,
+ 0.8770874738693237,
+ -0.8329461812973022,
+ -0.8871282935142517
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "softsign float32 4D tensor",
+ "inputs": {
+ "x": {
+ "shape": [1, 2, 3, 4],
+ "data": [
+ -8.343496173533422,
+ -6.92015211612679,
+ 2.699638761922575,
+ -8.663104577031863,
+ -3.190534368785616,
+ 7.657887080586452,
+ 6.650215091182602,
+ 6.058011004380681,
+ 0.6634320403254037,
+ 5.805803683155526,
+ -0.32821124531446344,
+ 1.270430403469046,
+ -9.946119978610852,
+ 6.905375202832072,
+ -0.031071535439890496,
+ -3.9696409293645862,
+ 6.270823207970878,
+ -2.6392608577007914,
+ 3.051350503137261,
+ 7.42647683445869,
+ -8.454667518154086,
+ 7.135868292466057,
+ -4.9860941550065885,
+ -7.859615086397076
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "name": "output",
+ "shape": [1, 2, 3, 4],
+ "data": [
+ -0.8929736614227295,
+ -0.8737397789955139,
+ 0.7297033667564392,
+ -0.8965135812759399,
+ -0.7613669633865356,
+ 0.8844983577728271,
+ 0.8692847490310669,
+ 0.8583170175552368,
+ 0.3988332748413086,
+ 0.8530665636062622,
+ -0.24710771441459656,
+ 0.5595548748970032,
+ -0.9086434245109558,
+ 0.8735038042068481,
+ -0.03013519011437893,
+ -0.798778235912323,
+ 0.8624640107154846,
+ -0.7252188920974731,
+ 0.7531687617301941,
+ 0.88132643699646,
+ -0.8942321538925171,
+ 0.8770874738693237,
+ -0.8329461812973022,
+ -0.8871282935142517
+ ],
+ "type": "float32"
+ }
+ },
+ {
+ "name": "softsign float32 5D tensor",
+ "inputs": {
+ "x": {
+ "shape": [1, 2, 1, 3, 4],
+ "data": [
+ -8.343496173533422,
+ -6.92015211612679,
+ 2.699638761922575,
+ -8.663104577031863,
+ -3.190534368785616,
+ 7.657887080586452,
+ 6.650215091182602,
+ 6.058011004380681,
+ 0.6634320403254037,
+ 5.805803683155526,
+ -0.32821124531446344,
+ 1.270430403469046,
+ -9.946119978610852,
+ 6.905375202832072,
+ -0.031071535439890496,
+ -3.9696409293645862,
+ 6.270823207970878,
+ -2.6392608577007914,
+ 3.051350503137261,
+ 7.42647683445869,
+ -8.454667518154086,
+ 7.135868292466057,
+ -4.9860941550065885,
+ -7.859615086397076
+ ],
+ "type": "float32"
+ }
+ },
+ "expected": {
+ "name": "output",
+ "shape": [1, 2, 1, 3, 4],
+ "data": [
+ -0.8929736614227295,
+ -0.8737397789955139,
+ 0.7297033667564392,
+ -0.8965135812759399,
+ -0.7613669633865356,
+ 0.8844983577728271,
+ 0.8692847490310669,
+ 0.8583170175552368,
+ 0.3988332748413086,
+ 0.8530665636062622,
+ -0.24710771441459656,
+ 0.5595548748970032,
+ -0.9086434245109558,
+ 0.8735038042068481,
+ -0.03013519011437893,
+ -0.798778235912323,
+ 0.8624640107154846,
+ -0.7252188920974731,
+ 0.7531687617301941,
+ 0.88132643699646,
+ -0.8942321538925171,
+ 0.8770874738693237,
+ -0.8329461812973022,
+ -0.8871282935142517
+ ],
+ "type": "float32"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/webnn/resources/utils.js b/tests/wpt/web-platform-tests/webnn/resources/utils.js
index a91dfa04c6e..427b47e28cc 100644
--- a/tests/wpt/web-platform-tests/webnn/resources/utils.js
+++ b/tests/wpt/web-platform-tests/webnn/resources/utils.js
@@ -287,6 +287,7 @@ const PrecisionMetrics = {
sigmoid: {ULP: {float32: 32+2, float16: 3}}, // float32 (leaving a few ULP for roundoff)
slice: {ULP: {float32: 0, float16: 0}},
softmax: {ULP: {float32: getSoftmaxPrecisionTolerance, float16: getSoftmaxPrecisionTolerance}},
+ softsign: {ULP: {float32: 3, float16: 3}},
split: {ULP: {float32: 0, float16: 0}},
squeeze: {ULP: {float32: 0, float16: 0}},
tanh: {ATOL: {float32: 1/1024, float16: 1/512}},
diff --git a/tests/wpt/web-platform-tests/webnn/softsign.https.any.js b/tests/wpt/web-platform-tests/webnn/softsign.https.any.js
new file mode 100644
index 00000000000..61a7d5365fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webnn/softsign.https.any.js
@@ -0,0 +1,10 @@
+// META: title=test WebNN API softsign operation
+// META: global=window,dedicatedworker
+// META: script=./resources/utils.js
+// META: timeout=long
+
+'use strict';
+
+// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-softsign
+
+testWebNNOperation('softsign', buildOperationWithSingleInput); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html
index b6dc7da5d40..79eba02727b 100644
--- a/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html
+++ b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html
@@ -16,61 +16,88 @@ async function negotiate(pc1, pc2) {
await pc1.setRemoteDescription(pc2.localDescription);
}
-test(function(t) {
- const pc = new RTCPeerConnection();
- t.add_cleanup(() => pc.close());
- const transceiver = pc.addTransceiver('video');
- const capabilities = transceiver.getHeaderExtensionsToNegotiate();
- let capability = capabilities.find((capability) => {
- return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid" &&
- capability.direction != "stopped";
- });
- assert_not_equals(capability, undefined);
-}, `the video transceiver.getHeaderExtensionsToNegotiate() includes mandatory extensions`);
+['audio', 'video'].forEach(kind => {
+ test(t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ const transceiver = pc.addTransceiver(kind);
+ const capabilities = transceiver.getHeaderExtensionsToNegotiate();
+ const capability = capabilities.find((capability) => {
+ return capability.uri === 'urn:ietf:params:rtp-hdrext:sdes:mid';
+ });
+ assert_not_equals(capability, undefined);
+ assert_equals(capability.direction, 'sendrecv');
+ }, `the ${kind} transceiver.getHeaderExtensionsToNegotiate() includes mandatory extensions`);
+});
-test(function(t) {
+test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
- let capability = capabilities.find((capability) => {
- return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid" &&
- capability.direction != "stopped";
- });
- assert_not_equals(capability, undefined);
-}, `the audio transceiver.getHeaderExtensionsToNegotiate() includes mandatory extensions`);
+ capabilities[0].uri = '';
+ assert_throws_js(TypeError, () => {
+ transceiver.setHeaderExtensionsToNegotiate(capabilities);
+ }, 'transceiver should throw TypeError when setting an empty URI');
+}, `setHeaderExtensionsToNegotiate throws TypeError on encountering missing URI`);
-test(function(t) {
+test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
- capabilities[0].uri = "";
+ capabilities[0].direction = '';
assert_throws_js(TypeError, () => {
transceiver.setHeaderExtensionsToNegotiate(capabilities);
- }, 'transceiver should throw TypeError when setting an empty URI');
-}, `setHeaderExtensionsToNegotiate throws TypeError on encountering missing URI`);
+ }, 'transceiver should throw TypeError when setting an empty direction');
+}, `setHeaderExtensionsToNegotiate throws TypeError on encountering missing direction`);
-test(function(t) {
+test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
- capabilities[0].uri = "4711";
+ capabilities[0].uri = '4711';
assert_throws_dom('InvalidModificationError', () => {
transceiver.setHeaderExtensionsToNegotiate(capabilities);
}, 'transceiver should throw InvalidModificationError when setting an unknown URI');
}, `setHeaderExtensionsToNegotiate throws InvalidModificationError on encountering unknown URI`);
-test(function(t) {
+test(t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ const transceiver = pc.addTransceiver('video');
+ const capabilities = transceiver.getHeaderExtensionsToNegotiate().filter(capability => {
+ return capability.uri === 'urn:ietf:params:rtp-hdrext:sdes:mid';
+ });
+ assert_throws_dom('InvalidModificationError', () => {
+ transceiver.setHeaderExtensionsToNegotiate(capabilities);
+ }, 'transceiver should throw InvalidModificationError when removing elements from the list');
+}, `setHeaderExtensionsToNegotiate throws InvalidModificationError when removing elements from the list`);
+
+test(t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+ const transceiver = pc.addTransceiver('video');
+ const capabilities = transceiver.getHeaderExtensionsToNegotiate();
+ capabilities.push({
+ uri: '4711',
+ direction: 'recvonly',
+ });
+ assert_throws_dom('InvalidModificationError', () => {
+ transceiver.setHeaderExtensionsToNegotiate(capabilities);
+ }, 'transceiver should throw InvalidModificationError when adding elements to the list');
+}, `setHeaderExtensionsToNegotiate throws InvalidModificationError when adding elements to the list`);
+
+test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
let capability = capabilities.find((capability) => {
- return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid";
+ return capability.uri === 'urn:ietf:params:rtp-hdrext:sdes:mid';
});
- ["sendonly", "recvonly", "inactive", "stopped"].map(direction => {
+ ['sendonly', 'recvonly', 'inactive', 'stopped'].map(direction => {
capability.direction = direction;
assert_throws_dom('InvalidModificationError', () => {
transceiver.setHeaderExtensionsToNegotiate(capabilities);
@@ -78,23 +105,23 @@ test(function(t) {
});
}, `setHeaderExtensionsToNegotiate throws InvalidModificationError when setting a mandatory header extension\'s direction to something else than "sendrecv"`);
-test(function(t) {
+test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
let capabilities = transceiver.getHeaderExtensionsToNegotiate();
let selected_capability = capabilities.find((capability) => {
- return capability.direction == "sendrecv" &&
- capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid";
+ return capability.direction === 'sendrecv' &&
+ capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid';
});
- selected_capability.direction = "stopped";
- const offered_capabilities = transceiver.getHeaderExtensionsToNegotiate;
+ selected_capability.direction = 'stopped';
+ const offered_capabilities = transceiver.getHeaderExtensionsToNegotiate();
let altered_capability = capabilities.find((capability) => {
- return capability.uri == selected_capability.uri &&
- capability.direction == "stopped";
+ return capability.uri === selected_capability.uri &&
+ capability.direction === 'stopped';
});
assert_not_equals(altered_capability, undefined);
-}, `modified direction set by setHeaderExtensionsToNegotiate is visible in headerExtensionsOffered`);
+}, `modified direction set by setHeaderExtensionsToNegotiate is visible in subsequent getHeaderExtensionsToNegotiate`);
promise_test(async t => {
const pc = new RTCPeerConnection();
@@ -102,19 +129,16 @@ promise_test(async t => {
const transceiver = pc.addTransceiver('video');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
const offer = await pc.createOffer();
- const extmaps = offer
- .sdp
- .split("\n")
- .filter(line => { return line.includes("a=extmap:"); })
- .join("\n");
+ const extensions = SDPUtils.matchPrefix(SDPUtils.splitSections(offer.sdp)[1], 'a=extmap:')
+ .map(line => SDPUtils.parseExtmap(line));
for (const capability of capabilities) {
- if (capability.direction == "stopped") {
- assert_false(extmaps.includes(capability.uri));
+ if (capability.direction === 'stopped') {
+ assert_equals(undefined, extensions.find(e => e.uri === capability.uri));
} else {
- assert_true(extmaps.includes(capability.uri));
+ assert_not_equals(undefined, extensions.find(e => e.uri === capability.uri));
}
}
-}, `unstopped extensions turn up in offer`);
+}, `Unstopped extensions turn up in offer`);
promise_test(async t => {
const pc = new RTCPeerConnection();
@@ -122,25 +146,22 @@ promise_test(async t => {
const transceiver = pc.addTransceiver('video');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
const selected_capability = capabilities.find((capability) => {
- return capability.direction == "sendrecv" &&
- capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid";
+ return capability.direction === 'sendrecv' &&
+ capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid';
});
- selected_capability.direction = "stopped";
+ selected_capability.direction = 'stopped';
transceiver.setHeaderExtensionsToNegotiate(capabilities);
const offer = await pc.createOffer();
- const extmaps = offer
- .sdp
- .split("\n")
- .filter(line => { return line.includes("a=extmap:"); })
- .join("\n");
+ const extensions = SDPUtils.matchPrefix(SDPUtils.splitSections(offer.sdp)[1], 'a=extmap:')
+ .map(line => SDPUtils.parseExtmap(line));
for (const capability of capabilities) {
- if (capability.direction == "stopped") {
- assert_false(extmaps.includes(capability.uri));
+ if (capability.direction === 'stopped') {
+ assert_equals(undefined, extensions.find(e => e.uri === capability.uri));
} else {
- assert_true(extmaps.includes(capability.uri));
+ assert_not_equals(undefined, extensions.find(e => e.uri === capability.uri));
}
}
-}, `stopped extensions do not turn up in offers`);
+}, `Stopped extensions do not turn up in offers`);
promise_test(async t => {
const pc1 = new RTCPeerConnection();
@@ -152,27 +173,17 @@ promise_test(async t => {
const transceiver = pc1.addTransceiver('video');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
const selected_capability = capabilities.find((capability) => {
- return capability.direction == "sendrecv" &&
- capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid";
+ return capability.direction === 'sendrecv' &&
+ capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid';
});
- selected_capability.direction = "stopped";
+ selected_capability.direction = 'stopped';
transceiver.setHeaderExtensionsToNegotiate(capabilities);
await negotiate(pc1, pc2);
const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions();
- // Attempt enabling the extension.
- selected_capability.direction = "sendrecv";
-
- // The enabled extension should not be part of the negotiated set.
- transceiver.setHeaderExtensionsToNegotiate(capabilities);
- await negotiate(pc1, pc2);
- assert_not_equals(
- transceiver.getNegotiatedHeaderExtensions().find(capability => {
- return capability.uri == selected_capability.uri &&
- capability.direction == "sendrecv";
- }), undefined);
-}, `the set of negotiated extensions grows with subsequent offers`);
+ assert_equals(capabilities.length, negotiated_capabilites.length);
+}, `The set of negotiated extensions has the same size as the set of extensions to negotiate`);
promise_test(async t => {
const pc1 = new RTCPeerConnection();
@@ -184,28 +195,27 @@ promise_test(async t => {
const transceiver = pc1.addTransceiver('video');
const capabilities = transceiver.getHeaderExtensionsToNegotiate();
const selected_capability = capabilities.find((capability) => {
- return capability.direction == "sendrecv" &&
- capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid";
+ return capability.direction === 'sendrecv' &&
+ capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid';
});
- selected_capability.direction = "stopped";
+ selected_capability.direction = 'stopped';
transceiver.setHeaderExtensionsToNegotiate(capabilities);
await negotiate(pc1, pc2);
const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions();
- for (const capability of negotiated_capabilites) {
- assert_not_equals(capabilities.find((cap) => {
- return cap.uri == capability.uri && cap.direction != "stopped";
- }), undefined);
- }
- for (const capability of capabilities) {
- if (capability.direction != "stopped") {
- assert_not_equals(negotiated_capabilites.find((cap) => {
- return cap.uri == capability.uri;
+ // Attempt enabling the extension.
+ selected_capability.direction = 'sendrecv';
+
+ // The enabled extension should not be part of the negotiated set.
+ transceiver.setHeaderExtensionsToNegotiate(capabilities);
+ await negotiate(pc1, pc2);
+ assert_not_equals(
+ transceiver.getNegotiatedHeaderExtensions().find(capability => {
+ return capability.uri === selected_capability.uri &&
+ capability.direction === 'sendrecv';
}), undefined);
- }
- }
-}, `the set of negotiated extensions is the set of unstopped extensions`);
+}, `Header extensions can be reactivated in subsequent offers`);
promise_test(async t => {
const pc = new RTCPeerConnection();
@@ -235,6 +245,51 @@ promise_test(async t => {
assert_equals(extensions.length, 2);
assert_false(!!extensions[0].find(extension => extension.uri === extensionUri));
assert_true(!!extensions[1].find(extension => extension.uri === extensionUri));
-}, 'Extensions can be deactivated on a per-mline basis');
+}, 'Header extensions can be deactivated on a per-mline basis');
+
+promise_test(async t => {
+ const pc1 = new RTCPeerConnection();
+ t.add_cleanup(() => pc1.close());
+ const pc2 = new RTCPeerConnection();
+ t.add_cleanup(() => pc2.close());
+
+ const t1 = pc1.addTransceiver('video');
+
+ await pc1.setLocalDescription();
+ await pc2.setRemoteDescription(pc1.localDescription);
+ // Get the transceiver after it is created by SRD.
+ const t2 = pc2.getTransceivers()[0];
+ const t2_capabilities = t2.getHeaderExtensionsToNegotiate();
+ const t2_capability_to_stop = t2_capabilities
+ .find(capability => capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid');
+ assert_not_equals(undefined, t2_capability_to_stop);
+ t2_capability_to_stop.direction = 'stopped';
+ t2.setHeaderExtensionsToNegotiate(t2_capabilities);
+
+ await pc2.setLocalDescription();
+ await pc1.setRemoteDescription(pc2.localDescription);
+
+ const t1_negotiated = t1.getNegotiatedHeaderExtensions()
+ .find(extension => extension.uri === t2_capability_to_stop.uri);
+ assert_not_equals(undefined, t1_negotiated);
+ assert_equals(t1_negotiated.direction, 'stopped');
+ const t1_capability = t1.getHeaderExtensionsToNegotiate()
+ .find(extension => extension.uri === t2_capability_to_stop.uri);
+ assert_not_equals(undefined, t1_capability);
+ assert_equals(t1_capability.direction, 'sendrecv');
+}, 'Extensions not negotiated by the peer are `stopped` in getNegotiatedHeaderExtensions');
+
+promise_test(async t => {
+ const pc = new RTCPeerConnection();
+ t.add_cleanup(() => pc.close());
+
+ const transceiver = pc.addTransceiver('video');
+ const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions();
+ assert_equals(negotiated_capabilites.length,
+ transceiver.getHeaderExtensionsToNegotiate().length);
+ for (const capability of negotiated_capabilites) {
+ assert_equals(capability.direction, 'stopped');
+ }
+}, 'Prior to negotiation, getNegotiatedHeaderExtensions() returns `stopped` for all extensions.');
</script>
diff --git a/tests/wpt/web-platform-tests/webtransport/close.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/close.https.any.js.ini
deleted file mode 100644
index 6f118ff5f27..00000000000
--- a/tests/wpt/web-platform-tests/webtransport/close.https.any.js.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[close.https.any.html]
- disabled:
- if product != "chrome": true
-
-[close.https.any.window.html]
- disabled:
- if product != "chrome": true
-
-[close.https.any.worker.html]
- disabled:
- if product != "chrome": true
-
-[close.https.any.sharedworker.html]
- disabled:
- if product != "chrome": true
-
-[close.https.any.serviceworker.html]
- disabled:
- if product != "chrome": true
diff --git a/tests/wpt/web-platform-tests/webtransport/connect.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/connect.https.any.js.ini
deleted file mode 100644
index d53cd702ccd..00000000000
--- a/tests/wpt/web-platform-tests/webtransport/connect.https.any.js.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[connect.https.any.html]
- disabled:
- if product != "chrome": true
-
-[connect.https.any.window.html]
- disabled:
- if product != "chrome": true
-
-[connect.https.any.worker.html]
- disabled:
- if product != "chrome": true
-
-[connect.https.any.sharedworker.html]
- disabled:
- if product != "chrome": true
-
-[connect.https.any.serviceworker.html]
- disabled:
- if product != "chrome": true
diff --git a/tests/wpt/web-platform-tests/webtransport/csp-fail.https.window.js.ini b/tests/wpt/web-platform-tests/webtransport/csp-fail.https.window.js.ini
deleted file mode 100644
index adbd3c13592..00000000000
--- a/tests/wpt/web-platform-tests/webtransport/csp-fail.https.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[csp-fail.https.window.html]
- disabled:
- if product != "chrome": true
diff --git a/tests/wpt/web-platform-tests/webtransport/csp-pass.https.window.js.ini b/tests/wpt/web-platform-tests/webtransport/csp-pass.https.window.js.ini
deleted file mode 100644
index 28d68410bbe..00000000000
--- a/tests/wpt/web-platform-tests/webtransport/csp-pass.https.window.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[csp-pass.https.window.html]
- disabled:
- if product != "chrome": true
diff --git a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js
index b96b36fc369..dc7133bb867 100644
--- a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js
+++ b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js
@@ -23,6 +23,20 @@ async function write_datagrams(writer, signal) {
return sentTokens;
}
+// Write N datagrams without waiting, then wait for them
+async function write_N_datagrams(writer, n) {
+ const encoder = new TextEncoder();
+ const sentTokens = [];
+ const promises = [];
+ while (sentTokens.length < n) {
+ const token = sentTokens.length.toString();
+ sentTokens.push(token);
+ promises.push(writer.write(encoder.encode(token)));
+ }
+ await Promise.all(promises);
+ return sentTokens;
+}
+
// Read datagrams until the consumer has received enough i.e. N datagrams. Call
// abort() after reading.
async function read_datagrams(reader, controller, N) {
@@ -156,6 +170,37 @@ promise_test(async t => {
}, 'Reading datagrams with insufficient buffer should be rejected.');
promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ const writer = wt.datagrams.writable.getWriter();
+ const reader = wt.datagrams.readable.getReader();
+
+ // Write and read max-size datagram.
+ await writer.write(new Uint8Array(wt.datagrams.maxDatagramSize));
+ const { value: token, done } = await reader.read();
+ assert_false(done);
+ assert_equals(token.length, wt.datagrams.maxDatagramSize);
+}, 'Transfer max-size datagram');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ const writer = wt.datagrams.writable.getWriter();
+ const reader = wt.datagrams.readable.getReader();
+
+ // Write and read max-size datagram.
+ await writer.write(new Uint8Array(wt.datagrams.maxDatagramSize+1));
+ // This should resolve with no datagram sent, which is hard to test for.
+ // Wait for incoming datagrams to arrive, and if they do, fail.
+ const result = await Promise.race([reader.read(), wait(500)]);
+ assert_equals(result, undefined);
+}, 'Fail to transfer max-size+1 datagram');
+
+promise_test(async t => {
// Make a WebTransport connection, but session is not necessarily established.
const wt = new WebTransport(webtransport_url('echo.py'));
@@ -166,9 +211,10 @@ promise_test(async t => {
const signal = controller.signal;
// Write and read datagrams.
- const N = 1;
+ const N = 5;
+ wt.datagrams.outgoingHighWaterMark = N;
const [sentTokens, receivedTokens] = await Promise.all([
- write_datagrams(writer, signal),
+ write_N_datagrams(writer, N),
read_datagrams(reader, controller, N)
]);
@@ -269,3 +315,56 @@ promise_test(async t => {
// incomingHighWaterMark.
assert_less_than_equal(receivedDatagrams, N);
}, 'Datagrams read is less than or equal to the incomingHighWaterMark');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ assert_equals(wt.datagrams.incomingMaxAge, Infinity);
+ assert_equals(wt.datagrams.outgoingMaxAge, Infinity);
+
+ wt.datagrams.incomingMaxAge = 5;
+ assert_equals(wt.datagrams.incomingMaxAge, 5);
+ wt.datagrams.outgoingMaxAge = 5;
+ assert_equals(wt.datagrams.outgoingMaxAge, 5);
+
+ assert_throws_js(RangeError, () => { wt.datagrams.incomingMaxAge = -1; });
+ assert_throws_js(RangeError, () => { wt.datagrams.outgoingMaxAge = -1; });
+ assert_throws_js(RangeError, () => { wt.datagrams.incomingMaxAge = NaN; });
+ assert_throws_js(RangeError, () => { wt.datagrams.outgoingMaxAge = NaN; });
+
+ wt.datagrams.incomingMaxAge = 0;
+ assert_equals(wt.datagrams.incomingMaxAge, Infinity);
+ wt.datagrams.outgoingMaxAge = 0;
+ assert_equals(wt.datagrams.outgoingMaxAge, Infinity);
+}, 'Datagram MaxAge getters/setters work correctly');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Initial values are implementation-defined
+ assert_greater_than_equal(wt.datagrams.incomingHighWaterMark, 1);
+ assert_greater_than_equal(wt.datagrams.outgoingHighWaterMark, 1);
+
+ wt.datagrams.incomingHighWaterMark = 5;
+ assert_equals(wt.datagrams.incomingHighWaterMark, 5);
+ wt.datagrams.outgoingHighWaterMark = 5;
+ assert_equals(wt.datagrams.outgoingHighWaterMark, 5);
+
+ assert_throws_js(RangeError, () => { wt.datagrams.incomingHighWaterMark = -1; });
+ assert_throws_js(RangeError, () => { wt.datagrams.outgoingHighWaterMark = -1; });
+ assert_throws_js(RangeError, () => { wt.datagrams.incomingHighWaterMark = NaN; });
+ assert_throws_js(RangeError, () => { wt.datagrams.outgoingHighWaterMark = NaN; });
+
+ wt.datagrams.incomingHighWaterMark = 0.5;
+ assert_equals(wt.datagrams.incomingHighWaterMark, 1);
+ wt.datagrams.outgoingHighWaterMark = 0.5;
+ assert_equals(wt.datagrams.outgoingHighWaterMark, 1);
+ wt.datagrams.incomingHighWaterMark = 0;
+ assert_equals(wt.datagrams.incomingHighWaterMark, 1);
+ wt.datagrams.outgoingHighWaterMark = 0;
+ assert_equals(wt.datagrams.outgoingHighWaterMark, 1);
+}, 'Datagram HighWaterMark getters/setters work correctly');
diff --git a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js.ini
deleted file mode 100644
index 49ad1548df3..00000000000
--- a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[datagrams.https.any.html]
- disabled:
- if product != "chrome": true
-
-[datagrams.https.any.window.html]
- disabled:
- if product != "chrome": true
-
-[datagrams.https.any.worker.html]
- disabled:
- if product != "chrome": true
-
-[datagrams.https.any.sharedworker.html]
- disabled:
- if product != "chrome": true
-
-[datagrams.https.any.serviceworker.html]
- disabled:
- if product != "chrome": true
diff --git a/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js b/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js
index 733153e1202..9f9127b22f9 100644
--- a/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js
+++ b/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js
@@ -20,6 +20,23 @@ function webtransport_code_to_http_code(n) {
return first + n + Math.floor(n / 0x1e);
}
+// Read all chunks from |readable_stream| and return as an array of arrays
+async function read_stream(readable_stream) {
+ const reader = readable_stream.getReader();
+
+ let chunks = [];
+ while (true) {
+ const {value: chunk, done} = await reader.read();
+ if (done) {
+ break;
+ }
+ chunks.push(chunk);
+ }
+ reader.releaseLock();
+
+ return chunks;
+}
+
// Read all chunks from |readable_stream|, decode chunks to a utf-8 string, then
// return the string.
async function read_stream_as_string(readable_stream) {
diff --git a/tests/wpt/web-platform-tests/webtransport/streams-close.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/streams-close.https.any.js.ini
deleted file mode 100644
index 0d60f7e54db..00000000000
--- a/tests/wpt/web-platform-tests/webtransport/streams-close.https.any.js.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[streams-close.https.any.html]
- disabled:
- if product != "chrome": true
-
-[streams-close.https.any.window.html]
- disabled:
- if product != "chrome": true
-
-[streams-close.https.any.worker.html]
- disabled:
- if product != "chrome": true
-
-[streams-close.https.any.sharedworker.html]
- disabled:
- if product != "chrome": true
-
-[streams-close.https.any.serviceworker.html]
- disabled:
- if product != "chrome": true
diff --git a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js b/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js
index 32781419ebf..3b402d00e08 100644
--- a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js
+++ b/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js
@@ -151,3 +151,83 @@ promise_test(async t => {
}
reader.releaseLock();
}, 'Can read data from a unidirectional stream with BYOB reader');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a bidirectional stream.
+ const bidi_stream = await wt.createBidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const writer = bidi_stream.writable.getWriter();
+ const bytes = new Uint8Array(16384);
+ const [reply] = await Promise.all([
+ read_stream(bidi_stream.readable),
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.close()
+ ]);
+ let len = 0;
+ for (chunk of reply) {
+ len += chunk.length;
+ }
+ // Check that the message from the readable end matches the writable end.
+ assert_equals(len, 3*bytes.length);
+}, 'Transfer large chunks of data on a bidirectional stream');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a unidirectional stream.
+ const uni_stream = await wt.createUnidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const writer = uni_stream.getWriter();
+ const bytes = new Uint8Array(16384);
+ await Promise.all([
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.close()
+ ]);
+ // XXX Update once chrome fixes https://crbug.com/929585
+ // The echo handler creates a new unidirectional stream to echo back data from
+ // the server to client. Accept the unidirectional stream.
+ const readable = wt.incomingUnidirectionalStreams;
+ const stream_reader = readable.getReader();
+ const { value: recv_stream } = await stream_reader.read();
+ stream_reader.releaseLock();
+
+ // Read the data on the readable end.
+ const reply = await read_stream(recv_stream);
+ let len = 0;
+ for (chunk of reply) {
+ len += chunk.length;
+ }
+ // Check that the message from the readable end matches the writable end.
+ assert_equals(len, 3*bytes.length);
+}, 'Transfer large chunks of data on a unidirectional stream');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a bidirectional stream.
+ const bidi_stream = await wt.createBidirectionalStream();
+
+ // Close the writable end with no data at all.
+ const writer = bidi_stream.writable.getWriter();
+ writer.close();
+
+ // Read the data on the readable end.
+ const chunks = await read_stream(bidi_stream.readable);
+ assert_equals(chunks.length, 0);
+
+ await bidi_stream.readable.closed;
+}, 'Closing the stream with no data still resolves the read request');
diff --git a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js.ini
deleted file mode 100644
index eb11ca786f1..00000000000
--- a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[streams-echo.https.any.html]
- disabled:
- if product != "chrome": true
-
-[streams-echo.https.any.window.html]
- disabled:
- if product != "chrome": true
-
-[streams-echo.https.any.worker.html]
- disabled:
- if product != "chrome": true
-
-[streams-echo.https.any.sharedworker.html]
- disabled:
- if product != "chrome": true
-
-[streams-echo.https.any.serviceworker.html]
- disabled:
- if product != "chrome": true
diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini
index 4e4810ca509..278f0d1eb20 100644
--- a/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini
+++ b/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini
@@ -2,6 +2,3 @@
expected: ERROR
[WebGL test #2: Unable to fetch WebGL rendering context for Canvas]
expected: FAIL
-
- [WebGL test #0: img was loaded]
- expected: FAIL
diff --git a/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini b/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini
index 4e4810ca509..278f0d1eb20 100644
--- a/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini
+++ b/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini
@@ -2,6 +2,3 @@
expected: ERROR
[WebGL test #2: Unable to fetch WebGL rendering context for Canvas]
expected: FAIL
-
- [WebGL test #0: img was loaded]
- expected: FAIL