aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-color/system-color-compute.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/dynamic-grid-flex-abspos.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-max-height-002.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-computed.html.ini19
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-valid.html.ini22
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-100.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-101.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-102.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-103.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-104.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-105.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-106.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-112.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transitions/transition-duration-shorthand.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/css/cssom/CSSStyleSheet-modify-after-removal.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini12
-rw-r--r--tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini2
-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-1.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webmessaging/with-ports/017.html.ini (renamed from tests/wpt/metadata-layout-2020/webmessaging/without-ports/017.html.ini)0
-rw-r--r--tests/wpt/metadata-layout-2020/webmessaging/without-ports/018.html.ini5
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/dom-overlay/ar_dom_overlay.https.html.ini19
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/events_input_source_recreation.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/events_session_select.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/events_session_select_subframe.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/events_session_squeeze.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/getInputPose_handedness.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/getInputPose_pointer.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini13
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini10
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini10
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/navigator_xr_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_immersive.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_inline.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrBoundedReferenceSpace_updates.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrDevice_disconnect_ends.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_immersive.https.html.ini10
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini13
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrFrame_getPose.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrFrame_getViewerPose_getPose.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrFrame_lifetime.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrFrame_session_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrInputSource_add_remove.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrInputSource_profiles.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrInputSource_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrPose_transform_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_relationships.https.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_constructor.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_inverse.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_end.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_requestReferenceSpace_features.https.html.ini37
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrSession_viewer_referenceSpace.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrView_eyes.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrView_match.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrView_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrViewerPose_views_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrViewport_valid.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_viewports.https.html.ini7
-rw-r--r--tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json2071
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-color/system-color-compute.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-flexbox/dynamic-grid-flex-abspos.html.ini7
-rw-r--r--tests/wpt/metadata/css/css-flexbox/percentage-max-height-002.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini6
-rw-r--r--tests/wpt/metadata/css/css-fonts/variations/font-variation-settings-parsing.html.ini70
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-100.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-101.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-102.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-103.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-104.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-105.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-106.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-112.html.ini2
-rw-r--r--tests/wpt/metadata/css/css-transitions/transition-duration-shorthand.html.ini4
-rw-r--r--tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini7
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini12
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini2
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini4
-rw-r--r--tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit.html.ini4
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-classic.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-module.html.ini2
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini7
-rw-r--r--tests/wpt/metadata/webmessaging/with-ports/017.html.ini (renamed from tests/wpt/metadata/webmessaging/without-ports/017.html.ini)0
-rw-r--r--tests/wpt/metadata/webmessaging/without-ports/018.html.ini5
-rw-r--r--tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/dom-overlay/ar_dom_overlay.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/events_session_select.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/events_session_squeeze.https.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini1
-rw-r--r--tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/getInputPose_pointer.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini10
-rw-r--r--tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/navigator_xr_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/render_state_vertical_fov_immersive.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/render_state_vertical_fov_inline.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/xrDevice_requestSession_immersive.https.html.ini10
-rw-r--r--tests/wpt/metadata/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini12
-rw-r--r--tests/wpt/metadata/webxr/xrFrame_getPose.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrFrame_getViewerPose_getPose.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrFrame_lifetime.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrFrame_session_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrReferenceSpace_originOffset.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrReferenceSpace_relationships.https.html.ini3
-rw-r--r--tests/wpt/metadata/webxr/xrRigidTransform_constructor.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrRigidTransform_inverse.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrRigidTransform_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini5
-rw-r--r--tests/wpt/metadata/webxr/xrSession_end.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrSession_requestReferenceSpace_features.https.html.ini37
-rw-r--r--tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrSession_viewer_referenceSpace.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrView_eyes.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrView_match.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrView_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrViewerPose_views_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrViewport_valid.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini4
-rw-r--r--tests/wpt/metadata/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini7
-rw-r--r--tests/wpt/metadata/webxr/xrWebGLLayer_viewports.https.html.ini7
-rw-r--r--tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/.taskcluster.yml3
-rw-r--r--[-rwxr-xr-x]tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html40
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-tentative.https.sub.html24
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin-tentative.https.sub.html29
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html39
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html40
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-tentative.https.sub.html24
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin-tentative.https.sub.html29
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html39
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/echo.py6
-rw-r--r--[-rwxr-xr-x]tests/wpt/web-platform-tests/common/security-features/subresource/__init__.py0
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/audio.py12
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/document.py5
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/empty.py10
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/font.py109
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/image.py36
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/referrer.py6
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/script.py8
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/shared-worker.py7
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/static-import.py15
-rw-r--r--tests/wpt/web-platform-tests/common/security-features/subresource/stylesheet.py55
-rw-r--r--[-rwxr-xr-x]tests/wpt/web-platform-tests/common/security-features/subresource/xhr.py0
-rw-r--r--tests/wpt/web-platform-tests/common/slow.py2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/reporting/support/redirect-throw-function.sub.py12
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/borders/border-width-011.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/css-break/margin-after-overflowed-block.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-color/system-color-compute.html102
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/dynamic-grid-flex-abspos.html82
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox/percentage-max-height-002.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html8
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html11
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts/variations/font-variation-settings-parsing.html59
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-align-001.html140
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-justify-001.html142
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014-ref.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014.html54
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-align-001-ref.html129
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-justify-001-ref.html130
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-columns-001.html5
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-rows-001.html5
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-columns-001.html6
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-rows-001.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-gutters-and-tracks-001.html116
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-background-image.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-border-image.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-cursor.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-iframe.html11
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-list-style-image.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-background-image-ref.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-border-image-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-iframe-ref.html5
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-list-style-image-ref.html8
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-mask-image-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-images/image-orientation/support/cursor-8-llo.jpgbin0 -> 1270 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-000.html11
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-001.html10
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners-crash.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-000.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-001.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-002.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-003.html12
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-004.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-005.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-006.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-007.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-008.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index-ref.html8
-rw-r--r--tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-100.html67
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-101.html69
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-102.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-103.html71
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-104.html82
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-105.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-106.html101
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-111.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-112.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-100-ref.html52
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-101-ref.html50
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-102-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-103-ref.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-104-ref.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-105-ref.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-106-ref.html84
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-111-ref.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-112-ref.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/letter-spacing/support/swatch-orange.pngbin0 -> 84 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-text/white-space/white-space-letter-spacing-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions/transition-duration-shorthand.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssTransformComponent-toMatrix.html4
-rw-r--r--tests/wpt/web-platform-tests/css/cssom-view/MediaQueryList-change-event-matches-value.html32
-rw-r--r--tests/wpt/web-platform-tests/css/cssom/CSSStyleSheet-modify-after-removal.html29
-rw-r--r--tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md4
-rw-r--r--tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-tentative.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/experimental-features/unsized-media.tentative.https.sub.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-01.tentative.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/reporting/oversized-images-reporting.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting-onload.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/reporting/unsized-media-reporting.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html8
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html4
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html12
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html14
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html12
-rw-r--r--tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html.headers4
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-read.html20
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-write.html20
-rw-r--r--tests/wpt/web-platform-tests/fetch/content-type/resources/content-type.py20
-rwxr-xr-xtests/wpt/web-platform-tests/fetch/http-cache/resources/http-cache.py114
-rw-r--r--tests/wpt/web-platform-tests/fetch/http-cache/resources/securedimage.py16
-rw-r--r--tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-json.py30
-rw-r--r--tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-script.py17
-rw-r--r--tests/wpt/web-platform-tests/fetch/metadata/resources/post-to-owner.py16
-rw-r--r--tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py110
-rw-r--r--tests/wpt/web-platform-tests/fetch/origin/resources/redirect-and-stash.py26
-rw-r--r--tests/wpt/web-platform-tests/fetch/origin/resources/referrer-policy.py10
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/element/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html9
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.html9
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.worker.js9
-rwxr-xr-xtests/wpt/web-platform-tests/html/canvas/tools/build.sh2
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/tools/yaml/element/drawing-text-to-the-canvas.yaml9
-rw-r--r--tests/wpt/web-platform-tests/html/canvas/tools/yaml/offscreen/text.yaml9
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py41
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/dispatcher.py20
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/report.py39
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/reporting-common.js18
-rw-r--r--tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/coop-coep.py34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/blank.py2
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/css-tmpl.py10
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/manifest.py16
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/page-using-manifest.py20
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/resource.py128
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/stash.py13
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/aqua-yellow-32x32.pngbin0 -> 156 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/blue-16x20-green-16x20.pngbin0 -> 132 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/fuchsia-32x32.pngbin0 -> 110 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/red-32x32.pngbin0 -> 110 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/yellow-32x32.pngbin0 -> 110 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print-ref.html42
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print.html46
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox-toggle-in-inactive-document-crash.html9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/number-input-lang-validationMessage-crash.html15
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action-in-inactive-document-crash.html6
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-classic-manual.html (renamed from tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-classic.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-module-manual.html (renamed from tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-module.html)0
-rwxr-xr-xtests/wpt/web-platform-tests/html/tools/build.sh2
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py6
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py6
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/support/promise-access-control.py10
-rw-r--r--tests/wpt/web-platform-tests/images/blue-png-cachable.py8
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/testdriver/file_upload.py2
-rw-r--r--tests/wpt/web-platform-tests/interfaces/ambient-light.idl3
-rw-r--r--tests/wpt/web-platform-tests/interfaces/intervention-reporting.idl14
-rw-r--r--tests/wpt/web-platform-tests/interfaces/native-file-system.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/payment-handler.idl6
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webauthn.idl4
-rw-r--r--tests/wpt/web-platform-tests/intervention-reporting/idlharness.any.js14
-rw-r--r--tests/wpt/web-platform-tests/layout-instability/resources/slow-image.py2
-rw-r--r--tests/wpt/web-platform-tests/lint.ignore2
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/containerNames.html54
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html19
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-IndexedDB-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-IndexedDB-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-isSameEntry-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-isSameEntry-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-Error-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-Error-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-frames-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-frames-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-windows-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-windows-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-workers-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-workers-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getDirectoryHandle-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getDirectory-manual.https.tentative.html)2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getEntries-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getEntries-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getFileHandle-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getFile-manual.https.tentative.html)2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-removeEntry-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-removeEntry-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-resolve-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-resolve-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemFileHandle-getFile-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemFileHandle-getFile-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write-manual.https.html (renamed from tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write-manual.https.tentative.html)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/resources/message-target.js6
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/resources/messaging-serialize-helpers.js52
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js3
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/resources/sandboxed-fs-test-helpers.js2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/resources/test-helpers.js6
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.tentative.https.window.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectory.tentative.https.any.js)2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.js)2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemFileHandle-getFile.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.https.any.js (renamed from tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js)0
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemBaseHandle-isSameEntry.js4
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js (renamed from tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getDirectory.js)76
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFile.js100
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFileHandle.js102
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-removeEntry.js4
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js2
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js8
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/showDirectoryPicker-manual.https.html3
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/showOpenFilePicker-manual.https.html3
-rw-r--r--tests/wpt/web-platform-tests/native-file-system/showSaveFilePicker-manual.https.html3
-rw-r--r--tests/wpt/web-platform-tests/native-io/close_async.tentative.https.any.js15
-rw-r--r--tests/wpt/web-platform-tests/native-io/close_sync.tentative.https.any.js11
-rw-r--r--tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.js31
-rw-r--r--tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.js33
-rw-r--r--tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.js34
-rw-r--r--tests/wpt/web-platform-tests/native-io/concurrent_io/operation_helpers.js67
-rw-r--r--tests/wpt/web-platform-tests/native-io/concurrent_io_async.tentative.https.any.js105
-rw-r--r--tests/wpt/web-platform-tests/native-io/resources/support.js19
-rw-r--r--tests/wpt/web-platform-tests/native-io/write_getLength_async_basic.tentative.https.any.js26
-rw-r--r--tests/wpt/web-platform-tests/native-io/write_getLength_sync_basic.tentative.https.any.js25
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-ports-yes.sub.https.html40
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-subdomain-yes.sub.https.html40
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain-yes.sub.https.html40
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain2-yes.sub.https.html41
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain-no.sub.https.html40
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html41
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html41
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html41
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-no-child-yes-ports.sub.https.html24
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-no-child2-yes-children-ports.sub.https.html32
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-yes-child2-no-not-subdomain.sub.https.html37
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html23
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html23
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html33
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html36
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html33
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/origin-isolation/resources/helpers.mjs19
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/basetest.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/border-image.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/buffered-flag.window.js1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/child-painting-first-image.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-canvas-context.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-gradient.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-text-input.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-frame.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-poster.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-with-rtl.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-image-child.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-paint-only.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/input-text.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/mask-image.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/paint-visited.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/replaced-content-image.html1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/resources/utils.js1
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/sibling-painting-first-image.html1
-rw-r--r--tests/wpt/web-platform-tests/picture-in-picture/idlharness.window.js1
-rw-r--r--tests/wpt/web-platform-tests/portals/portal-activate-default.html58
-rw-r--r--tests/wpt/web-platform-tests/portals/portals-focus.sub.html4
-rw-r--r--tests/wpt/web-platform-tests/portals/resources/portal-activate-broadcastchannel.html8
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/svg.html38
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/webxr-test.js33
-rw-r--r--tests/wpt/web-platform-tests/resources/test-only-api.js68
-rw-r--r--tests/wpt/web-platform-tests/resources/test-only-api.js.headers2
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.js5
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-before-phase.html62
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-cascade.html50
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-inactive-phase.html59
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-orientation.html129
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-sampling.html52
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-source.html135
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-start-end.html187
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-time-range.html75
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-cssom.tentative.html1
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-version.py8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding-with-flush.py6
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding.py2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/malformed-worker.py14
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-type-worker.py6
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/mint-new-worker.py18
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/multipart-image.py22
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-body.py10
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py10
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html1
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/declarative/getinnerhtml.tentative.html3
-rw-r--r--tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html.html13
-rw-r--r--tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg.html15
-rw-r--r--tests/wpt/web-platform-tests/tools/.coveragerc1
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/commands.json10
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/manifest_build.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tc/decision.py28
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tc/sink_task.py41
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml16
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py176
-rw-r--r--tests/wpt/web-platform-tests/tools/docker/Dockerfile7
-rw-r--r--tests/wpt/web-platform-tests/tools/gitignore/gitignore.py136
-rw-r--r--tests/wpt/web-platform-tests/tools/gitignore/tests/test_gitignore.py93
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/fnmatch.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/lint.py149
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/rules.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py40
-rw-r--r--tests/wpt/web-platform-tests/tools/localpaths.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/XMLParser.py30
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/download.py21
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/item.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/manifest.py165
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/sourcefile.py66
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/tests/test_manifest.py89
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/utils.py58
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/vcs.py75
-rw-r--r--tests/wpt/web-platform-tests/tools/pytest.ini4
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/RECORD8
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/INSTALLER (renamed from tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/INSTALLER)0
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/LICENSE (renamed from tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/LICENSE)2
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/METADATA (renamed from tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/METADATA)9
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/RECORD8
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/WHEEL (renamed from tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/WHEEL)2
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/top_level.txt (renamed from tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/top_level.txt)0
-rw-r--r--tests/wpt/web-platform-tests/tools/third_party/six/six.py73
-rw-r--r--tests/wpt/web-platform-tests/tools/tox.ini18
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/revlist.py17
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/testfiles.py97
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tests/test_testfiles.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/utils.py10
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/virtualenv.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py21
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py16
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js2
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-duration-loop.html52
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html229
-rw-r--r--tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_create_move.https.html95
-rw-r--r--tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html123
-rw-r--r--tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_failure.https.html73
-rw-r--r--tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html116
-rw-r--r--tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_states.https.html8
-rw-r--r--tests/wpt/web-platform-tests/webxr/resources/webxr_util.js53
-rw-r--r--tests/wpt/web-platform-tests/webxr/xrInputSourceArray_iterable.html34
-rwxr-xr-xtests/wpt/web-platform-tests/wpt2
567 files changed, 9821 insertions, 2331 deletions
diff --git a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini
index 76b44d9e9cf..3605e8f3fc9 100644
--- a/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/FileAPI/url/url-in-tags-revoke.window.js.ini
@@ -4,7 +4,7 @@
expected: TIMEOUT
[Opening a blob URL in a new window immediately before revoking it works.]
- expected: FAIL
+ expected: TIMEOUT
[Fetching a blob URL immediately before revoking it works in an iframe.]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini
deleted file mode 100644
index 4bfb0c2053a..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-004.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[hit-test-floats-004.html]
- [Miss float below something else]
- expected: FAIL
-
diff --git a/tests/wpt/metadata-layout-2020/css/css-color/system-color-compute.html.ini b/tests/wpt/metadata-layout-2020/css/css-color/system-color-compute.html.ini
new file mode 100644
index 00000000000..b1408cd97b6
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-color/system-color-compute.html.ini
@@ -0,0 +1,4 @@
+[system-color-compute.html]
+ [color-scheme property affects Menu system color keyword]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/dynamic-grid-flex-abspos.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/dynamic-grid-flex-abspos.html.ini
new file mode 100644
index 00000000000..6205691956d
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/dynamic-grid-flex-abspos.html.ini
@@ -0,0 +1,7 @@
+[dynamic-grid-flex-abspos.html]
+ [.relpos 4]
+ expected: FAIL
+
+ [.relpos 8]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-max-height-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-max-height-002.html.ini
new file mode 100644
index 00000000000..fa77972eac5
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/percentage-max-height-002.html.ini
@@ -0,0 +1,2 @@
+[percentage-max-height-002.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-computed.html.ini b/tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-computed.html.ini
new file mode 100644
index 00000000000..4040932214f
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-computed.html.ini
@@ -0,0 +1,19 @@
+[font-variation-settings-computed.html]
+ [Property font-variation-settings value 'normal']
+ expected: FAIL
+
+ [Property font-variation-settings value '"wght" 700, "wght" 500' duplicate values should be removed, keeping the rightmost occurrence.]
+ expected: FAIL
+
+ [Property font-variation-settings value '"wght" 700, "XHGT" 0.7']
+ expected: FAIL
+
+ [Property font-variation-settings value '"wght" 700']
+ expected: FAIL
+
+ [Property font-variation-settings value '"AB@D" 0.5']
+ expected: FAIL
+
+ [Property font-variation-settings value '"XHGT" calc(0.4 + 0.3)']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-valid.html.ini b/tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-valid.html.ini
new file mode 100644
index 00000000000..ffe7b3f7efe
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-fonts/parsing/font-variation-settings-valid.html.ini
@@ -0,0 +1,22 @@
+[font-variation-settings-valid.html]
+ [e.style['font-variation-settings'\] = "\\"wght\\" 700" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "'wght' 1e3, 'slnt' -450.0e-1" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "\\"a cd\\" 0.5" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "\\"ab@d\\" 0.5" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "normal" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "\\"wght\\" 700, \\"XHGT\\" 0.7" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "'wght' 700" should set the property value]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-100.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-100.html.ini
new file mode 100644
index 00000000000..f29c7ce67c8
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-100.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-100.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-101.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-101.html.ini
new file mode 100644
index 00000000000..105e019839b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-101.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-101.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-102.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-102.html.ini
new file mode 100644
index 00000000000..780ae75d22c
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-102.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-102.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-103.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-103.html.ini
new file mode 100644
index 00000000000..feb4120085f
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-103.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-103.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-104.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-104.html.ini
new file mode 100644
index 00000000000..d5abf4a4388
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-104.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-104.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-105.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-105.html.ini
new file mode 100644
index 00000000000..2d1ed90756c
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-105.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-105.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-106.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-106.html.ini
new file mode 100644
index 00000000000..9f666bb8923
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-106.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-106.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-112.html.ini b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-112.html.ini
new file mode 100644
index 00000000000..1a4d3f7c2c9
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-text/letter-spacing/letter-spacing-112.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-112.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/transition-duration-shorthand.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/transition-duration-shorthand.html.ini
new file mode 100644
index 00000000000..7d363f15d45
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transitions/transition-duration-shorthand.html.ini
@@ -0,0 +1,4 @@
+[transition-duration-shorthand.html]
+ [transition-duration when looking at shorthand properties should be correct]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/css/cssom/CSSStyleSheet-modify-after-removal.html.ini b/tests/wpt/metadata-layout-2020/css/cssom/CSSStyleSheet-modify-after-removal.html.ini
new file mode 100644
index 00000000000..dd01fab5f42
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/cssom/CSSStyleSheet-modify-after-removal.html.ini
@@ -0,0 +1,7 @@
+[CSSStyleSheet-modify-after-removal.html]
+ [Modify sheet from removed iframe]
+ expected: FAIL
+
+ [Modify constructed sheet from removed iframe]
+ 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 b6cda2233a8..f83ba5155f5 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
@@ -315,15 +315,9 @@
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;" text/plain]
- expected: FAIL
-
[<iframe>: separate response Content-Type: text/plain */*]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
- expected: FAIL
-
[<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
@@ -333,3 +327,9 @@
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
+ [<iframe>: separate response Content-Type: text/html;x=" text/plain]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/html;" \\" text/plain]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini
index 58de838d890..70efd28ddfc 100644
--- a/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata-layout-2020/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,6 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
expected: FAIL
- [X-Content-Type-Options%3A%20%22nosniFF%22]
+ [X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
deleted file mode 100644
index 87b07c3e670..00000000000
--- a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_1.html]
- [Multiple history traversals from the same task]
- expected: FAIL
-
diff --git a/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
new file mode 100644
index 00000000000..385376c7321
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_4.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index f45aaafe1c5..3538891dae8 100644
--- a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,4 +1,5 @@
[supported-elements.html]
+ expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
@@ -9,7 +10,7 @@
expected: FAIL
[Area element should support autofocus]
- expected: FAIL
+ expected: TIMEOUT
[Host element with delegatesFocus should support autofocus]
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 42ebcc9d57e..88f4ddd0e9a 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,5 +1,5 @@
[iframe_sandbox_popups_escaping-1.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
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 338d283eb0e..295031c1812 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,4 +1,5 @@
[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-1.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index 3080be9afc0..d913fcbb129 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-1.html]
- expected: CRASH
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index 0407f0cc2b7..9eb581fcf1f 100644
--- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,5 +1,5 @@
[iframe_sandbox_popups_nonescaping-2.html]
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini
new file mode 100644
index 00000000000..9f416703229
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini
@@ -0,0 +1,4 @@
+[form-double-submit-3.html]
+ [<button> should have the same double-submit protection as <input type=submit>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit.html.ini
new file mode 100644
index 00000000000..b193c33c2b6
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit.html.ini
@@ -0,0 +1,4 @@
+[form-double-submit.html]
+ [default submit action should supersede onclick submit()]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini
new file mode 100644
index 00000000000..cc188ee4006
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini
@@ -0,0 +1,7 @@
+[osc-basic-waveform.html]
+ [Executing "Test 5"]
+ expected: FAIL
+
+ [Executing "Test 4"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webmessaging/without-ports/017.html.ini b/tests/wpt/metadata-layout-2020/webmessaging/with-ports/017.html.ini
index 064cf47545b..064cf47545b 100644
--- a/tests/wpt/metadata-layout-2020/webmessaging/without-ports/017.html.ini
+++ b/tests/wpt/metadata-layout-2020/webmessaging/with-ports/017.html.ini
diff --git a/tests/wpt/metadata-layout-2020/webmessaging/without-ports/018.html.ini b/tests/wpt/metadata-layout-2020/webmessaging/without-ports/018.html.ini
new file mode 100644
index 00000000000..663a1f8fa30
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webmessaging/without-ports/018.html.ini
@@ -0,0 +1,5 @@
+[018.html]
+ expected: TIMEOUT
+ [origin of the script that invoked the method, javascript:]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini
new file mode 100644
index 00000000000..70d9b449e7a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini
@@ -0,0 +1,4 @@
+[ar_anchor_freefloating_create_move.https.html]
+ [Ensures free-floating anchor move gets propagated to anchor poses]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini
new file mode 100644
index 00000000000..9230c90b6d2
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini
@@ -0,0 +1,7 @@
+[ar_anchor_freefloating_delay_creation.https.html]
+ [Ensures free-floating anchor creation with delayed failure is handled correctly]
+ expected: FAIL
+
+ [Ensures free-floating anchor creation with delayed success is handled correctly]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini
new file mode 100644
index 00000000000..a35e5ba16b8
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini
@@ -0,0 +1,4 @@
+[ar_anchor_freefloating_failure.https.html]
+ [Ensures free-floating anchor creation failure is handled correctly]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini
new file mode 100644
index 00000000000..85cc42a65b0
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini
@@ -0,0 +1,4 @@
+[ar_anchor_freefloating_pause_resume_stop.https.html]
+ [Ensures free-floating anchor state changes get propagated]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini
new file mode 100644
index 00000000000..4718874f28d
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini
@@ -0,0 +1,4 @@
+[xrDevice_requestSession_immersive-ar.https.html]
+ [Tests requestSession accepts immersive-ar mode]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
new file mode 100644
index 00000000000..aab2d4efa19
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_environmentBlendMode.https.html]
+ [Tests environmentBlendMode for a VR device]
+ expected: FAIL
+
+ [Tests environmentBlendMode for an AR device]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/dom-overlay/ar_dom_overlay.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/dom-overlay/ar_dom_overlay.https.html.ini
new file mode 100644
index 00000000000..0cf3f7ac974
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/dom-overlay/ar_dom_overlay.https.html.ini
@@ -0,0 +1,19 @@
+[ar_dom_overlay.https.html]
+ [Ensures DOM Overlay input deduplication works]
+ expected: FAIL
+
+ [Ensures DOM Overlay feature works for immersive-ar, body element]
+ expected: FAIL
+
+ [Ensures DOM Overlay rejected without root element]
+ expected: FAIL
+
+ [Ensures DOM Overlay Fullscreen API doesn't change DOM overlay]
+ expected: FAIL
+
+ [Ensures DOM Overlay feature works for immersive-ar, div element]
+ expected: FAIL
+
+ [Ensures DOM Overlay interactions on cross origin iframe are ignored]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/events_input_source_recreation.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/events_input_source_recreation.https.html.ini
new file mode 100644
index 00000000000..976a3ad323d
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/events_input_source_recreation.https.html.ini
@@ -0,0 +1,4 @@
+[events_input_source_recreation.https.html]
+ [Input sources are re-created when handedness or target ray mode changes]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/events_session_select.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/events_session_select.https.html.ini
new file mode 100644
index 00000000000..59dac282700
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/events_session_select.https.html.ini
@@ -0,0 +1,4 @@
+[events_session_select.https.html]
+ [XRInputSources primary input presses properly fires off the right events]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/events_session_select_subframe.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/events_session_select_subframe.https.html.ini
new file mode 100644
index 00000000000..d2dbc3fef51
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/events_session_select_subframe.https.html.ini
@@ -0,0 +1,4 @@
+[events_session_select_subframe.https.html]
+ [Ensures that an XRInputSources primary input being pressed and released in the space of a single frame properly fires off the right events]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/events_session_squeeze.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/events_session_squeeze.https.html.ini
new file mode 100644
index 00000000000..9e8141bb04b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/events_session_squeeze.https.html.ini
@@ -0,0 +1,4 @@
+[events_session_squeeze.https.html]
+ [XRInputSources primary input presses properly fires off the right events]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
new file mode 100644
index 00000000000..3735666ae5e
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_gamepad_input_registered.https.html]
+ [WebXR InputSource's gamepad properly registers input]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/getInputPose_handedness.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/getInputPose_handedness.https.html.ini
new file mode 100644
index 00000000000..0f61faf25dc
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/getInputPose_handedness.https.html.ini
@@ -0,0 +1,4 @@
+[getInputPose_handedness.https.html]
+ [XRInputSources properly communicate their handedness]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/getInputPose_pointer.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/getInputPose_pointer.https.html.ini
new file mode 100644
index 00000000000..c7ab709ce6d
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/getInputPose_pointer.https.html.ini
@@ -0,0 +1,4 @@
+[getInputPose_pointer.https.html]
+ [XRInputSources with a target ray mode of 'tracked-pointer' properly communicate their poses]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
new file mode 100644
index 00000000000..694dd586a5d
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
@@ -0,0 +1,13 @@
+[ar_hittest_subscription_refSpaces.https.html]
+ [Ensures subscription to hit test works with viewer space - straight up - no results]
+ expected: FAIL
+
+ [Ensures subscription to hit test works with viewer space - straight ahead - plane]
+ expected: FAIL
+
+ [Ensures subscription to hit test works with local space]
+ expected: FAIL
+
+ [Ensures subscription to hit test works with local-floor space]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini
new file mode 100644
index 00000000000..c82ddf9b4af
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini
@@ -0,0 +1,10 @@
+[ar_hittest_subscription_states_regular.https.html]
+ [Hit test subscription succeeds if the feature was requested]
+ expected: FAIL
+
+ [Hit test subscription fails if the feature was not requested]
+ expected: FAIL
+
+ [Hit test subscription fails if the feature was requested but the session already ended]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
new file mode 100644
index 00000000000..77ee3e16b32
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
@@ -0,0 +1,10 @@
+[ar_hittest_subscription_transientInputSources.https.html]
+ [Ensures subscription to transient hit test works with an XRSpace from input source - after move - 1 result]
+ expected: FAIL
+
+ [Ensures subscription to transient hit test works with an XRSpace from input source - after move - no results]
+ expected: FAIL
+
+ [Ensures subscription to transient hit test works with an XRSpace from input source - no move]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/navigator_xr_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/navigator_xr_sameObject.https.html.ini
new file mode 100644
index 00000000000..b9fb8d94210
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/navigator_xr_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[navigator_xr_sameObject.https.html]
+ [Navigator.xr meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_immersive.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_immersive.https.html.ini
new file mode 100644
index 00000000000..2ae6711642c
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_immersive.https.html.ini
@@ -0,0 +1,4 @@
+[render_state_vertical_fov_immersive.https.html]
+ [inlineVerticalFieldOfView is set appropriately on immersively sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_inline.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_inline.https.html.ini
new file mode 100644
index 00000000000..d9762ab91bc
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/render_state_vertical_fov_inline.https.html.ini
@@ -0,0 +1,4 @@
+[render_state_vertical_fov_inline.https.html]
+ [inlineVerticalFieldOfView is set appropriately on inline sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrBoundedReferenceSpace_updates.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrBoundedReferenceSpace_updates.https.html.ini
new file mode 100644
index 00000000000..febd879d9a0
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrBoundedReferenceSpace_updates.https.html.ini
@@ -0,0 +1,4 @@
+[xrBoundedReferenceSpace_updates.https.html]
+ ['XRBoundedReferenceSpace updates properly when the changes are applied]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrDevice_disconnect_ends.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrDevice_disconnect_ends.https.html.ini
new file mode 100644
index 00000000000..adfe53ea1b6
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrDevice_disconnect_ends.https.html.ini
@@ -0,0 +1,4 @@
+[xrDevice_disconnect_ends.https.html]
+ [Immersive session ends when device is disconnected]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_immersive.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_immersive.https.html.ini
new file mode 100644
index 00000000000..1feed04bc79
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_immersive.https.html.ini
@@ -0,0 +1,10 @@
+[xrDevice_requestSession_immersive.https.html]
+ [Tests requestSession ignores unknown optionalFeatures]
+ expected: FAIL
+
+ [Tests requestSession accepts XRSessionInit dictionary]
+ expected: FAIL
+
+ [Tests requestSession resolves when supported]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
new file mode 100644
index 00000000000..ad5d37bd599
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
@@ -0,0 +1,13 @@
+[xrDevice_requestSession_optionalFeatures.https.html]
+ [Tests requestSession ignores unknown objects in optionalFeatures]
+ expected: FAIL
+
+ [Tests requestSession ignores unknown strings in optionalFeatures]
+ expected: FAIL
+
+ [Tests requestSession accepts XRSessionInit dictionary]
+ expected: FAIL
+
+ [Tests requestSession accepts XRSessionInit dictionary with empty feature lists]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrFrame_getPose.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrFrame_getPose.https.html.ini
new file mode 100644
index 00000000000..13082ca9797
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrFrame_getPose.https.html.ini
@@ -0,0 +1,7 @@
+[xrFrame_getPose.https.html]
+ [XRFrame.getPose works for immersive sessions]
+ expected: FAIL
+
+ [XRFrame.getPose works for non-immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrFrame_getViewerPose_getPose.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrFrame_getViewerPose_getPose.https.html.ini
new file mode 100644
index 00000000000..176132f98c3
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrFrame_getViewerPose_getPose.https.html.ini
@@ -0,0 +1,4 @@
+[xrFrame_getViewerPose_getPose.https.html]
+ [XRFrame getViewerPose(refSpace) matches getPose(viewer, refSpace).]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrFrame_lifetime.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrFrame_lifetime.https.html.ini
new file mode 100644
index 00000000000..e6867166ccd
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrFrame_lifetime.https.html.ini
@@ -0,0 +1,7 @@
+[xrFrame_lifetime.https.html]
+ [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for non-immersive sessions]
+ expected: FAIL
+
+ [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrFrame_session_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrFrame_session_sameObject.https.html.ini
new file mode 100644
index 00000000000..b6c20337194
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrFrame_session_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrFrame_session_sameObject.https.html]
+ [XRFrame.session meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrInputSource_add_remove.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrInputSource_add_remove.https.html.ini
new file mode 100644
index 00000000000..d6125717313
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrInputSource_add_remove.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_add_remove.https.html]
+ [XRInputSources can be properly added and removed from the session]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrInputSource_profiles.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrInputSource_profiles.https.html.ini
new file mode 100644
index 00000000000..3e2806dfae7
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrInputSource_profiles.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_profiles.https.html]
+ [WebXR InputSource's profiles list can be set]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrInputSource_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrInputSource_sameObject.https.html.ini
new file mode 100644
index 00000000000..980f9d31c32
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrInputSource_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_sameObject.https.html]
+ [XRInputSource attributes meet [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrPose_transform_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrPose_transform_sameObject.https.html.ini
new file mode 100644
index 00000000000..3e442625aa8
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrPose_transform_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrPose_transform_sameObject.https.html]
+ [XRPose.transform meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset.https.html.ini
new file mode 100644
index 00000000000..8ba221772e5
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset.https.html.ini
@@ -0,0 +1,4 @@
+[xrReferenceSpace_originOffset.https.html]
+ [Updating XRReferenceSpace origin offset updates view and input matrices.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
new file mode 100644
index 00000000000..a3fb0379bb0
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
@@ -0,0 +1,4 @@
+[xrReferenceSpace_originOffsetBounded.https.html]
+ [Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
new file mode 100644
index 00000000000..dd44bffa639
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
@@ -0,0 +1,4 @@
+[xrReferenceSpace_originOffset_viewer.https.html]
+ [Creating XRReferenceSpace origin offset off of `viewer` space works.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_relationships.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_relationships.https.html.ini
index bc5e1b0b573..293a38132c2 100644
--- a/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_relationships.https.html.ini
+++ b/tests/wpt/metadata-layout-2020/webxr/xrReferenceSpace_relationships.https.html.ini
@@ -1,5 +1,4 @@
[xrReferenceSpace_relationships.https.html]
- expected: ERROR
[Bounded space, viewer space, local and local-floor space have correct poses w.r.t. each other]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_constructor.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_constructor.https.html.ini
new file mode 100644
index 00000000000..637e266aaa2
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_constructor.https.html.ini
@@ -0,0 +1,4 @@
+[xrRigidTransform_constructor.https.html]
+ [XRRigidTransform constructor works]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_inverse.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_inverse.https.html.ini
new file mode 100644
index 00000000000..8c7f90b61e7
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_inverse.https.html.ini
@@ -0,0 +1,4 @@
+[xrRigidTransform_inverse.https.html]
+ [XRRigidTransform inverse works]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_sameObject.https.html.ini
new file mode 100644
index 00000000000..92751e2c79f
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrRigidTransform_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrRigidTransform_sameObject.https.html]
+ [XRRigidTransform position and orientation meet [SameObject\] requirements]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame.https.html.ini
new file mode 100644
index 00000000000..e43f56bd74e
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_cancelAnimationFrame.https.html]
+ [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for non-immersive sessions]
+ expected: FAIL
+
+ [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
new file mode 100644
index 00000000000..603023c9992
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_cancelAnimationFrame_invalidhandle.https.html]
+ [XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on immersive testSession]
+ expected: FAIL
+
+ [XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on non-immersive testSession]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_end.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_end.https.html.ini
new file mode 100644
index 00000000000..4d09e769ae8
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_end.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_end.https.html]
+ [end event fires when non-immersive session ends]
+ expected: FAIL
+
+ [end event fires when immersive session ends]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini
new file mode 100644
index 00000000000..de062c9f543
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_requestAnimationFrame_callback_calls.https.html]
+ [XRSession requestAnimationFrame calls the provided callback a non-immersive session]
+ expected: FAIL
+
+ [XRSession requestAnimationFrame calls the provided callback for an immersive session]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini
new file mode 100644
index 00000000000..d64bcd941e3
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini
@@ -0,0 +1,4 @@
+[xrSession_requestAnimationFrame_data_valid.https.html]
+ [RequestAnimationFrame resolves with good data]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
new file mode 100644
index 00000000000..5ee23ba9713
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_requestAnimationFrame_getViewerPose.https.html]
+ [XRFrame getViewerPose updates on the next frame for non-immersive sessions]
+ expected: FAIL
+
+ [XRFrame getViewerPose updates on the next frame for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
new file mode 100644
index 00000000000..85fce01757f
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_requestAnimationFrame_timestamp.https.html]
+ [XRFrame getViewerPose updates on the next frame for immersive]
+ expected: FAIL
+
+ [XRFrame getViewerPose updates on the next frame for non-immersive]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_requestReferenceSpace_features.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestReferenceSpace_features.https.html.ini
new file mode 100644
index 00000000000..84a5e1496a8
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_requestReferenceSpace_features.https.html.ini
@@ -0,0 +1,37 @@
+[xrSession_requestReferenceSpace_features.https.html]
+ [Non-immersive session rejects unbounded space even when requested]
+ expected: FAIL
+
+ [Immersive session supports local space by default]
+ expected: FAIL
+
+ [Non-immersive session supports local-floor space when required]
+ expected: FAIL
+
+ [Immersive session rejects local-floor space if not requested]
+ expected: FAIL
+
+ [Immersive session supports local-floor space when required]
+ expected: FAIL
+
+ [Non-immersive session rejects bounded-floor space even when requested]
+ expected: FAIL
+
+ [Non-immersive session supports local space when optional]
+ expected: FAIL
+
+ [Immersive session supports local-floor space when optional]
+ expected: FAIL
+
+ [Non-immersive session supports local space when required]
+ expected: FAIL
+
+ [Non-immersive session supports viewer space by default]
+ expected: FAIL
+
+ [Non-immersive session rejects local space if not requested]
+ expected: FAIL
+
+ [Immersive session supports viewer space by default]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_sameObject.https.html.ini
new file mode 100644
index 00000000000..09170ad4d6a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrSession_sameObject.https.html]
+ [XRSession attributes meet [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrSession_viewer_referenceSpace.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrSession_viewer_referenceSpace.https.html.ini
new file mode 100644
index 00000000000..b6af7d5f905
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrSession_viewer_referenceSpace.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_viewer_referenceSpace.https.html]
+ [Identity reference space provides correct poses for immersive sessions]
+ expected: FAIL
+
+ [Identity reference space provides correct poses for inline sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrView_eyes.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrView_eyes.https.html.ini
new file mode 100644
index 00000000000..77bf402064a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrView_eyes.https.html.ini
@@ -0,0 +1,7 @@
+[xrView_eyes.https.html]
+ [XRView.eye is correct for non-immersive sessions]
+ expected: FAIL
+
+ [XRView.eye is correct for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrView_match.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrView_match.https.html.ini
new file mode 100644
index 00000000000..a767630fd30
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrView_match.https.html.ini
@@ -0,0 +1,4 @@
+[xrView_match.https.html]
+ [XRFrame contains the expected views]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrView_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrView_sameObject.https.html.ini
new file mode 100644
index 00000000000..0bb0534886b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrView_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrView_sameObject.https.html]
+ [XRView attributes meet [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrViewerPose_views_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrViewerPose_views_sameObject.https.html.ini
new file mode 100644
index 00000000000..376386ed9ea
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrViewerPose_views_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrViewerPose_views_sameObject.https.html]
+ [XRViewerPose.views meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrViewport_valid.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrViewport_valid.https.html.ini
new file mode 100644
index 00000000000..7f6950b2cb0
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrViewport_valid.https.html.ini
@@ -0,0 +1,4 @@
+[xrViewport_valid.https.html]
+ [XRViewport attributes are valid]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
new file mode 100644
index 00000000000..bf7eed9a971
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
@@ -0,0 +1,4 @@
+[xrWebGLLayer_framebuffer_draw.https.html]
+ [Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini
new file mode 100644
index 00000000000..d59b6c7434f
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrWebGLLayer_framebuffer_sameObject.https.html]
+ [XRWebGLLayer.framebuffer meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
new file mode 100644
index 00000000000..63c92e14304
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
@@ -0,0 +1,7 @@
+[xrWebGLLayer_opaque_framebuffer.https.html]
+ [Ensure that the framebuffer given by the WebGL layer is opaque for immersive]
+ expected: FAIL
+
+ [Ensure that the framebuffer given by the WebGL layer is opaque for non-immersive]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_viewports.https.html.ini b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_viewports.https.html.ini
new file mode 100644
index 00000000000..a489b6968a3
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/webxr/xrWebGLLayer_viewports.https.html.ini
@@ -0,0 +1,7 @@
+[xrWebGLLayer_viewports.https.html]
+ [XRWebGLLayer reports a valid viewports for inline sessions]
+ expected: FAIL
+
+ [XRWebGLLayer reports a valid viewports for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini
deleted file mode 100644
index 80f9a4f15b8..00000000000
--- a/tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[Worker-constructor.html]
- expected: ERROR
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 d4f62ed7113..faa00f45ecf 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 03cd7fea305..0ef3ddb7f4e 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -235,6 +235,13 @@
{}
]
],
+ "remove-inline-with-block-beside-spanners-crash.html": [
+ "d48ff19b99afd6e96e070749798ccc8b37fdeefe",
+ [
+ null,
+ {}
+ ]
+ ],
"with-custom-layout-on-same-element-crash.https.html": [
"7e1c804258ab54290047a4b712f0bff613acd168",
[
@@ -619,6 +626,15 @@
]
]
},
+ "the-iframe-element": {
+ "sandbox-toggle-in-inactive-document-crash.html": [
+ "654542f6a8e21a23f70d50c1c547e9dac6971c36",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"the-img-element": {
"image-loading-lazy-subframe-detached-crash.html": [
"86a290d50db16d9f19d08bb8a9ad07b0aa52f66d",
@@ -662,6 +678,24 @@
}
},
"forms": {
+ "constraints": {
+ "number-input-lang-validationMessage-crash.html": [
+ "7affb1d65bfad4606a8e7a4374dd748539fe723c",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
+ "the-form-element": {
+ "form-action-in-inactive-document-crash.html": [
+ "8a3543fcbcf4a51b1a3e95a549c5b345fa39dcf3",
+ [
+ null,
+ {}
+ ]
+ ]
+ },
"the-input-element": {
"time-datalist-crash.html": [
"2964032e35283ef4cae28af2b736fa9ba3924260",
@@ -15973,14 +16007,14 @@
]
],
"protectedDragDataTransfer-manual.html": [
- "81d4c4214b26b77ef6e69e6114ec59a5f0f27f10",
+ "ac7b844d2e15fdd1938adda81924f001d6d84575",
[
null,
{}
]
],
"protectedPasteDataTransfer-manual.html": [
- "bedfb4622713db92237928b024df3d7a00c92a1d",
+ "20bf9c7a9ab3f0ec0f57480b429b4fb0d455422d",
[
null,
{}
@@ -16846,6 +16880,28 @@
}
}
},
+ "scripting-1": {
+ "the-script-element": {
+ "module": {
+ "dynamic-import": {
+ "no-active-script-classic-manual.html": [
+ "b01f595c03e9456b1da62bb4259a923a73ad8a34",
+ [
+ null,
+ {}
+ ]
+ ],
+ "no-active-script-module-manual.html": [
+ "359b71d821c310e86b8d34086c14fef0d7f02454",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
+ }
+ }
+ },
"selectors": {
"pseudo-classes": {
"checked-001-manual.html": [
@@ -17252,133 +17308,133 @@
]
},
"native-file-system": {
- "native_FileSystemBaseHandle-IndexedDB-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-IndexedDB-manual.https.html": [
"c68df06de9ac53034f13fc39cbdfb876db29d60e",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-isSameEntry-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-isSameEntry-manual.https.html": [
"1d13d8bab6685dee9a6579707bf3e51a2ffe8939",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.html": [
"07f8d9620d8e9466e63e1faa1f3dce27b2ba7d37",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-Error-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-Error-manual.https.html": [
"19fcb3ea71604d16011b33d49b8fac6db91e4625",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.html": [
"81e545c5190b5f09e02ddd5034587d2bf5c796a0",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.html": [
"1b583d0c395d6475565be6516e3d12199362a5dd",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.html": [
"22d0bf5a72319f24b4b4541054a937e918aa3d8e",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-frames-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-frames-manual.https.html": [
"6d5c5ab78ab8ef8f4fd68d3c6a540b17a4a4ca29",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-windows-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-windows-manual.https.html": [
"ad1e8e7bcf31b200b84f7c2415cea1b308f75052",
[
null,
{}
]
],
- "native_FileSystemBaseHandle-postMessage-workers-manual.https.tentative.html": [
+ "native_FileSystemBaseHandle-postMessage-workers-manual.https.html": [
"bc1fc5087a61f2df630e23c0e7efaa69ee4c4fab",
[
null,
{}
]
],
- "native_FileSystemDirectoryHandle-getDirectory-manual.https.tentative.html": [
- "afd95af99d3bb0822ee00439d130c6602bf4643d",
+ "native_FileSystemDirectoryHandle-getDirectoryHandle-manual.https.html": [
+ "03672321e2d8d7464dbe9a688a69bf78e4dc8f2b",
[
null,
{}
]
],
- "native_FileSystemDirectoryHandle-getEntries-manual.https.tentative.html": [
+ "native_FileSystemDirectoryHandle-getEntries-manual.https.html": [
"858bf02f1fa2f5fd2dd01acc96bac149a02896fe",
[
null,
{}
]
],
- "native_FileSystemDirectoryHandle-getFile-manual.https.tentative.html": [
- "085d4371c48271076deb04c3c399b0226cda14a8",
+ "native_FileSystemDirectoryHandle-getFileHandle-manual.https.html": [
+ "94b31226f8d600ef60c2412203b9b941d60d0930",
[
null,
{}
]
],
- "native_FileSystemDirectoryHandle-removeEntry-manual.https.tentative.html": [
+ "native_FileSystemDirectoryHandle-removeEntry-manual.https.html": [
"cedb87587cee3b68f4edf76060679407f61b3c59",
[
null,
{}
]
],
- "native_FileSystemDirectoryHandle-resolve-manual.https.tentative.html": [
+ "native_FileSystemDirectoryHandle-resolve-manual.https.html": [
"9c001b366b9d24e5d55e88409650b4454f2ddac7",
[
null,
{}
]
],
- "native_FileSystemFileHandle-getFile-manual.https.tentative.html": [
+ "native_FileSystemFileHandle-getFile-manual.https.html": [
"5a0b1d97b05a48c178cf86e6c766565fa87a7ef0",
[
null,
{}
]
],
- "native_FileSystemWritableFileStream-manual.https.tentative.html": [
+ "native_FileSystemWritableFileStream-manual.https.html": [
"56ff51cd05a7e7088520ab0fbf77ff378a530b4f",
[
null,
{}
]
],
- "native_FileSystemWritableFileStream-piped-manual.https.tentative.html": [
+ "native_FileSystemWritableFileStream-piped-manual.https.html": [
"f6c6e6009aadf2b4c37b7926dfcd06962701fefa",
[
null,
{}
]
],
- "native_FileSystemWritableFileStream-write-manual.https.tentative.html": [
+ "native_FileSystemWritableFileStream-write-manual.https.html": [
"280edc27e5ad6f7a18e5f4c476a189efd6418e43",
[
null,
@@ -17386,21 +17442,21 @@
]
],
"showDirectoryPicker-manual.https.html": [
- "b19287877f759d87c565548fe32b0c9895ae1bd2",
+ "5dadbe1a9d5c605378415f4b5be3f430c634aa5b",
[
null,
{}
]
],
"showOpenFilePicker-manual.https.html": [
- "b55157ad20fc75b12e7850d422af9492c5f28cbc",
+ "2289b8f8d8bb98ab45f38f51f6a6123967ecee9c",
[
null,
{}
]
],
"showSaveFilePicker-manual.https.html": [
- "f8280d29ff59cf8558f7adfec83df77ef7dfa14f",
+ "022f67771d7f17d5b0e9ef0186887224f18f4e51",
[
null,
{}
@@ -24125,6 +24181,19 @@
"rendering": {
"non-replaced-elements": {
"tables": {
+ "table-background-print.html": [
+ "0cbaca601922e403fed54ce5a489c2c8170ab847",
+ [
+ null,
+ [
+ [
+ "/html/rendering/non-replaced-elements/tables/table-background-print-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"table-row-pagination-001-print.html": [
"3a14558a8b21f78a3de04b13b1b0e1f86cecb11c",
[
@@ -46823,7 +46892,7 @@
]
],
"border-width-011.xht": [
- "9401fb1b18db0d29fa51628e9394be634bed50af",
+ "ae8d514ab3c19bd0640574b254404de285f7214a",
[
null,
[
@@ -124083,6 +124152,19 @@
{}
]
],
+ "margin-after-overflowed-block.html": [
+ "26a2eb22aa69b134847dcb8cc3305625bd47100b",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"overflowed-block-with-no-room-after-000.html": [
"084e16fb38de072fb83f92ba01302a2e404cdd97",
[
@@ -139420,6 +139502,19 @@
{}
]
],
+ "percentage-max-height-002.html": [
+ "f674ec57d78521d5604afa93bbfe18f80a07dcec",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"percentage-size-subitems-001.html": [
"70f3953052a3a770c6cd15ee169607a00fc452b0",
[
@@ -142705,6 +142800,19 @@
{}
]
],
+ "grid-baseline-align-001.html": [
+ "e32031779fc30ca54e7283f2317b6e9ae5b7d105",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/alignment/references/grid-baseline-align-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"grid-baseline-align-cycles-001.html": [
"cc6b3b50f984a97838f05e340c51f33f335e0f97",
[
@@ -142718,6 +142826,19 @@
{}
]
],
+ "grid-baseline-justify-001.html": [
+ "171fcd3fcde8dd0b7b9e866569cf4d29449ece44",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/alignment/references/grid-baseline-justify-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"grid-block-axis-alignment-auto-margins-008.html": [
"9b489ac11940b14e45fb2c4a03219f605ffe0e47",
[
@@ -143550,6 +143671,19 @@
{}
]
],
+ "grid-gutters-014.html": [
+ "404e694ec8698a4efa3361eb6b3a5c20f8865b42",
+ [
+ null,
+ [
+ [
+ "/css/css-grid/alignment/grid-gutters-014-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"grid-inline-axis-alignment-auto-margins-008.html": [
"eb9666465542a34cc29853dd71dc326ff4cbbd63",
[
@@ -148554,7 +148688,7 @@
],
"image-orientation": {
"image-orientation-background-image.html": [
- "2687a5c64b51c5e96375307f52297540c2dffebf",
+ "d294b669e35d36f834c7393202350a3d9cee3f2f",
[
null,
[
@@ -148612,7 +148746,7 @@
]
],
"image-orientation-border-image.html": [
- "85b363ecc2fd7b2dd1abf21b75960f3b3ebad2e5",
+ "312c6736fb529d73d627aee4d28e65cf1f353abb",
[
null,
[
@@ -148885,8 +149019,21 @@
}
]
],
+ "image-orientation-iframe.html": [
+ "69cfb5ceae4fce69c0e677aaaf9fa13f4e9de1f8",
+ [
+ null,
+ [
+ [
+ "/css/css-images/image-orientation/reference/image-orientation-iframe-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"image-orientation-list-style-image.html": [
- "33730a323ada45d763a37a9dc4e0a20c13a642c6",
+ "926b3ab9ff02ba530cc06f5bd64b94e6d1e238ff",
[
null,
[
@@ -157785,6 +157932,32 @@
{}
]
],
+ "non-adjacent-spanners-000.html": [
+ "7e6ec67e298b38a4bfcec401d32476643fc8194f",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "non-adjacent-spanners-001.html": [
+ "fa8dfc8bcdf243277f37daccdf3d3991bf2eda33",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"orthogonal-writing-mode-shrink-to-fit.html": [
"b087f56ac6e06d7e11d719976ae66459c97722d7",
[
@@ -157798,6 +157971,136 @@
{}
]
],
+ "remove-inline-with-block-beside-spanners.html": [
+ "c943e549860c002ab96ed8974c739b1c83aee328",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square-only.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-000.html": [
+ "f700235621a5833a53185ef2ab12d31343c3d35c",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-001.html": [
+ "2cfbd2defa54fac99fd25cf9a1f6d1d8a0c90ce0",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-002.html": [
+ "970a1ecbfe78c8e43f24f6cc245e0e962ea4d2da",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-003.html": [
+ "857ccf92ba9dc337f38b2c5fdeda527ce2768a9d",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-004.html": [
+ "2199a9340b563f08ddfa3513b295226c618b946b",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-005.html": [
+ "56e35c74dafc960f2ef49eb97a92cd0ed29f157e",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-006.html": [
+ "60325b1d17886283446cb99c4b319ad579b4d7f7",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-007.html": [
+ "ea71c779fea2e02469b7b9d0a579f79f7265870d",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "spanner-fragmentation-008.html": [
+ "d28eafe6555e047cc028e0399dec2b70d9d8dfb4",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"with-custom-layout-on-same-element.https.html": [
"5388b08cde3936088978f09ccb0fd438347421e1",
[
@@ -160278,6 +160581,19 @@
{}
]
],
+ "invalidate-opacity-negative-z-index.html": [
+ "52deaa080617f7d813449be8e1a007c568871842",
+ [
+ null,
+ [
+ [
+ "/css/css-position/invalidate-opacity-negative-z-index-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"position-absolute-center-001.tentative.html": [
"1baf1d7827d7a1c08f30693c1ce9735ac99b52f7",
[
@@ -171268,6 +171584,123 @@
]
},
"letter-spacing": {
+ "letter-spacing-100.html": [
+ "57fad60d7f31af3aa6ad85bc5ac0e089d0ab5b74",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-100-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-101.html": [
+ "dcf5e96cd80db188e0887230ced36c6b839c9072",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-101-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-102.html": [
+ "6e045c6c430c3843257c704b4289d2d70e5a6c24",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-102-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-103.html": [
+ "42e78822d71fd0c06f9b025284cbe2183df61142",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-103-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-104.html": [
+ "763c6666e2366fe00a1e9b3bef04058c5eda2762",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-104-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-105.html": [
+ "a94daa0aff289c479369bd6253e873b9b1670e8d",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-105-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-106.html": [
+ "4ebf9a3d46558ed253308e05eb7db84cfa59ece0",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-106-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-111.html": [
+ "d143cf0713a51a6a55b324050bf21d792796c881",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-111-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "letter-spacing-112.html": [
+ "a998c4ffdec9f8d6bc13011043b7d2ef0be65eef",
+ [
+ null,
+ [
+ [
+ "/css/css-text/letter-spacing/reference/letter-spacing-112-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"letter-spacing-bidi-001.html": [
"4720e1d13c399b6009b2bcfed14e8fe59feffc60",
[
@@ -179531,7 +179964,7 @@
]
],
"white-space-letter-spacing-001.html": [
- "5d65c67c320cf2d3d846cda61f4be6683161de67",
+ "8d8ab401e833e5c161cb0dc25505bd1abc1edd50",
[
null,
[
@@ -241108,6 +241541,32 @@
{}
]
],
+ "isolation-with-html.html": [
+ "df9f64824b182acedb608d79e35d944fc682a955",
+ [
+ null,
+ [
+ [
+ "/svg/extensibility/foreignObject/isolation-with-html-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "isolation-with-svg.html": [
+ "df5b37c8a69279866bd1432d3248f3ca04166794",
+ [
+ null,
+ [
+ [
+ "/svg/extensibility/foreignObject/isolation-with-svg-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"masked.html": [
"ad18e8931aa9bbbac967b4d0ae694d68e92dbbb2",
[
@@ -246760,7 +247219,7 @@
[]
],
".taskcluster.yml": [
- "1716de40cf3b3ebf9691811f4bdd02049a4c05e2",
+ "5d431c5ac4a9e5804ab7fbb0e0dec3e0db4e3d51",
[]
],
".well-known": {
@@ -249970,6 +250429,44 @@
"ecbac54806cb0d3a915c551f0a684fdc84acdd5e",
[]
],
+ "feature-policy": {
+ "clipboard-read": {
+ "clipboard-read-disabled-by-feature-policy.tentative.https.sub.html.headers": [
+ "ee9a2b6fb6fa4ad8e25bc2abb9346535b630406c",
+ []
+ ],
+ "clipboard-read-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers": [
+ "a147e2a64fe2f08b88dd7f6d1c7441be960f65d2",
+ []
+ ],
+ "clipboard-read-enabled-by-feature-policy.tentative.https.sub.html.headers": [
+ "a147e2a64fe2f08b88dd7f6d1c7441be960f65d2",
+ []
+ ],
+ "clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers": [
+ "752d7faff469aecf661c00058ef0982cb177a8b2",
+ []
+ ]
+ },
+ "clipboard-write": {
+ "clipboard-write-disabled-by-feature-policy.tentative.https.sub.html.headers": [
+ "f35f5b6a0927f8013325efc6b425a433de23e981",
+ []
+ ],
+ "clipboard-write-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers": [
+ "81b10d8e33089a7db9cbc49ec947deb6d5e736fd",
+ []
+ ],
+ "clipboard-write-enabled-by-feature-policy.tentative.https.sub.html.headers": [
+ "81b10d8e33089a7db9cbc49ec947deb6d5e736fd",
+ []
+ ],
+ "clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers": [
+ "e226f41c6ade1f0e7bba4a9d288ebb682c5e362c",
+ []
+ ]
+ }
+ },
"resources": {
"greenbox.png": [
"6e555e3b197ce2f448f59d61e1488a0175490145",
@@ -250027,7 +250524,7 @@
[]
],
"echo.py": [
- "2ee403645b1bb27cdb27bcea716e166729b81af8",
+ "911b54a0b488b9c148a29d5d1cd942d4fbca57b4",
[]
],
"get-host-info.sub.js": [
@@ -250131,43 +250628,43 @@
[]
],
"audio.py": [
- "eb95045e0315ab5c24a826325e1e16a6cd45827d",
+ "0c1a5b65c7c72e668c2931a8e85c0628b9ca48a5",
[]
],
"document.py": [
- "59e0dcd7bc6cd3904b1aa8079ea161a24d2f51e6",
+ "8d04b99875ccfad78025fab00c1220c466068f73",
[]
],
"empty.py": [
- "132e85ddeec9119c03a11e030c3e6f09c32735c4",
+ "d168383eb52c6d6b03a3f7c45282f9692b3819af",
[]
],
"font.py": [
- "26311a9f079080e7fc11995e8c180b12a6201b16",
+ "7778175b06a7f24a8c1323278d8a420b2af1b5e6",
[]
],
"image.py": [
- "42ebc0767bbea9d3d50f4a3f23c7863748e6908d",
+ "bbc1382df1a1a699856dbe3f67a745276d77632e",
[]
],
"referrer.py": [
- "ad9e24847a108826db1e7124c7bff6f6f1a3fd5c",
+ "e36631479e60fab893de7e02d55a3f2ec2a32a15",
[]
],
"script.py": [
- "9d7cd0469f0ef9d2da9c322db4257cbdfbf310e8",
+ "535ee300104ac73228fe53652a4445e89f8aede4",
[]
],
"shared-worker.py": [
- "d8fd6876449ee844a758b2b1028588d866746d9e",
+ "aea5a32b1db0a7ff71a7f27b1b687659ac4e5dad",
[]
],
"static-import.py": [
- "0a97dd1a32652b9f41edcb56eefe197ec4276ce1",
+ "e84a4b4bfbb31f6f03565646ec6092d5708cdadf",
[]
],
"stylesheet.py": [
- "ec62a8cd5f282130f66c1bdfe47240ca4cc625af",
+ "58b5b8dea1d2341966676fc8c6947d3e1d37075c",
[]
],
"subresource.py": [
@@ -250275,7 +250772,7 @@
]
},
"slow.py": [
- "f3b1c7e2ea61b571bd56cc1c70c5f89bb8e7e4dc",
+ "5329a04ed2d7b8a8de09673d9d8a5d3768f3cb5a",
[]
],
"square.png": [
@@ -269191,7 +269688,7 @@
[]
],
"redirect-throw-function.sub.py": [
- "6c53e0d538cde435beb14f19fd86d03c4c1216cf",
+ "1bc89abf7176bbada8f0c8c35fd699f52bb0e8a9",
[]
],
"set-cookie.py": [
@@ -300884,6 +301381,10 @@
}
},
"alignment": {
+ "grid-gutters-014-ref.html": [
+ "a6ca7c5aa7a80313786abc97ffe4581e9a6d7341",
+ []
+ ],
"grid-item-content-baseline-001-ref.html": [
"e55fe0b9f96c3f3ae4a4f6b66bfd2283fb88659b",
[]
@@ -300941,9 +301442,17 @@
"446c42f1a29694445b485e413dde57aa40b4b7ea",
[]
],
+ "grid-baseline-align-001-ref.html": [
+ "7f8bb12cd638eeb63f0d87664faff97655522bfa",
+ []
+ ],
"grid-baseline-align-cycles-001-ref.html": [
"ca1097e171e8f4b18fd72c1e7614bff860b2cb36",
[]
+ ],
+ "grid-baseline-justify-001-ref.html": [
+ "d4db58e0906a503cc0035cb50a15d715ef3e1093",
+ []
]
},
"self-baseline": {
@@ -301804,7 +302313,7 @@
"image-orientation": {
"reference": {
"image-orientation-background-image-ref.html": [
- "e570906479841cf84c1d141f7b93ffe5afd31094",
+ "a3e2ece6e7c26d79d1198c2abecc8d99bf23e1f5",
[]
],
"image-orientation-background-properties-ref.html": [
@@ -301812,7 +302321,7 @@
[]
],
"image-orientation-border-image-ref.html": [
- "3f9b68832b1223acafeb8bfe876fba9fc3efbfc3",
+ "51aa8d0e4672d5929d8125313f4f41c206bb566f",
[]
],
"image-orientation-default-ref.html": [
@@ -301831,12 +302340,16 @@
"c569690967ed1494c48464922272dccc7a6aad7f",
[]
],
+ "image-orientation-iframe-ref.html": [
+ "a9e9b3fbe308329defb6ecd6612eb10ff07cba13",
+ []
+ ],
"image-orientation-list-style-image-ref.html": [
- "433cf98e636b87010569aba9f42a2cafc1f99933",
+ "8dcef6a243927f927f9d6e42709959f265332db9",
[]
],
"image-orientation-mask-image-ref.html": [
- "ff07824415122d56379165942706ca022fce8480",
+ "ba593032456fba28ed5131b00784f72320a67821",
[]
],
"image-orientation-none-content-images-ref.html": [
@@ -301865,6 +302378,10 @@
]
},
"support": {
+ "cursor-8-llo.jpg": [
+ "ef26ad4aaaee12269323379e36c5274aad44d00b",
+ []
+ ],
"exif-orientation-1-ul-pre-rotated.jpg": [
"33abbd152a775cfed8802fd3084167328533ac87",
[]
@@ -304479,6 +304996,10 @@
"12e109bd0b2be3d7cef2717306900426db7a23fc",
[]
],
+ "invalidate-opacity-negative-z-index-ref.html": [
+ "4f8d043e5a3f108b0ce26f335ddbc405c047ac17",
+ []
+ ],
"position-absolute-root-element-ref.html": [
"d4649f2d5abc240f09551cc9efebfa2029406101",
[]
@@ -307319,6 +307840,42 @@
},
"letter-spacing": {
"reference": {
+ "letter-spacing-100-ref.html": [
+ "d6e87a56d9260c45eb6601ec799e65691889d678",
+ []
+ ],
+ "letter-spacing-101-ref.html": [
+ "6898da609d235f2436daac678b6f6bb70cba92ca",
+ []
+ ],
+ "letter-spacing-102-ref.html": [
+ "08ea8e56e3d97dd426d6f7cf4384d52b5ba4e8cb",
+ []
+ ],
+ "letter-spacing-103-ref.html": [
+ "3461347a28e3be63d3b83ad53681c21260ec3bd1",
+ []
+ ],
+ "letter-spacing-104-ref.html": [
+ "078656c4631faad7b011732e87eb37c9c9412923",
+ []
+ ],
+ "letter-spacing-105-ref.html": [
+ "3c6e2aa60e4b9dc914b076221911c04d2eb98b0e",
+ []
+ ],
+ "letter-spacing-106-ref.html": [
+ "36bad163f0af3a66cf105210c76dae892d6e4327",
+ []
+ ],
+ "letter-spacing-111-ref.html": [
+ "9b3499ed7c583c8c0e1219c3de6114011262b171",
+ []
+ ],
+ "letter-spacing-112-ref.html": [
+ "889803699d4b0871e6e36d8324607e8b4ddf5532",
+ []
+ ],
"letter-spacing-bidi-001-ref.html": [
"e34dbc313f2bb5f93cbf36d3e9fb42e5b901414b",
[]
@@ -307359,6 +307916,12 @@
"996f2a1e30435038e1e02ff7b78bd361c06efc17",
[]
]
+ },
+ "support": {
+ "swatch-orange.png": [
+ "d3cd498b52bd88ea6c991f050f1ecb1cfdd136bb",
+ []
+ ]
}
},
"line-break": {
@@ -321050,7 +321613,7 @@
[]
],
"testharness-api.md": [
- "bd7d42be9682b3405a0702fefd21f7df5466d88f",
+ "72263dbd4ead3d0dc2340bcdc83064f9ea8dffa5",
[]
],
"testharness-tutorial.md": [
@@ -321081,7 +321644,7 @@
[]
],
"echo-policy-nested.html.headers": [
- "fe839ef5bb6dfa3cc9460e6175b345a2249fd79c",
+ "a6c7386bda08d7af692b7c949e1e36a29ee3504a",
[]
],
"echo-policy.py": [
@@ -321090,15 +321653,15 @@
],
"experimental-features": {
"layout-animations-disabled-tentative.html.headers": [
- "bebb5d054826ce19d4a0d4f1381deeb5e72f7270",
+ "745da550ee5162cffcdf3913a37efa6d355ca47e",
[]
],
"layout-animations-disabled-violation-report-js-tentative.html.headers": [
- "bebb5d054826ce19d4a0d4f1381deeb5e72f7270",
+ "745da550ee5162cffcdf3913a37efa6d355ca47e",
[]
],
"layout-animations-disabled-violation-report-keyframes-tentative.html.headers": [
- "bebb5d054826ce19d4a0d4f1381deeb5e72f7270",
+ "745da550ee5162cffcdf3913a37efa6d355ca47e",
[]
],
"resources": {
@@ -321132,7 +321695,7 @@
]
},
"unsized-media.tentative.https.sub.html.headers": [
- "d73d2520cb20e4665766e886cafa1b7f41b1a101",
+ "cf59933e8dd61a728ada5644a71808c36e7b0876",
[]
]
},
@@ -321142,15 +321705,15 @@
[]
],
"font-display-document-policy-01.tentative.html.headers": [
- "e1387f50deead65859267b376367a5eb2a92482d",
+ "01b8bbccd44d7f265c321227ba4052baac9471ec",
[]
],
"font-display-document-policy-report-only.tentative.html.headers": [
- "e090edd0da42f4e98c400f84fb42232adbe95ab6",
+ "1509127277798c1fae2c4acff201a1b8ee518d12",
[]
],
"font-display-document-policy-reporting.tentative.html.headers": [
- "84ad7cbf97bcbfd9f56bfeef5bc5928b8819ae4e",
+ "273ca3564dfd7c3a5f1fa6368ef9a4c8fad529de",
[]
]
},
@@ -321160,7 +321723,7 @@
[]
],
"oversized-images-reporting.html.headers": [
- "206db539c1ea12e962b279e4b550e85f12bc50d1",
+ "10f5be1c33409e9c06304430ee5e8cbe45157ca1",
[]
],
"oversized.jpg": [
@@ -321172,29 +321735,29 @@
[]
],
"unoptimized-lossy-images-reporting-onload.html.headers": [
- "261d5db13e3c1879ba8a582e84485b717851dbb9",
+ "3cad9badac38ec53f88b98b53ca6450e7942dc69",
[]
],
"unoptimized-lossy-images-reporting.html.headers": [
- "261d5db13e3c1879ba8a582e84485b717851dbb9",
+ "3cad9badac38ec53f88b98b53ca6450e7942dc69",
[]
],
"unsized-media-reporting.html.headers": [
- "d73d2520cb20e4665766e886cafa1b7f41b1a101",
+ "cf59933e8dd61a728ada5644a71808c36e7b0876",
[]
]
},
"required-policy": {
"document-policy.html.headers": [
- "d321c265d1502c364a8d1caa5ab24710e853983e",
+ "8ea51b103f9e3f365c16e41ded5c87a646984433",
[]
],
"required-document-policy.html.headers": [
- "1b671dafe06d44e5b267bbfc54691f5f911297eb",
+ "7f5cd92a482b3b29e7bfa89461cc4812b1e349a8",
[]
],
"separate-document-policies.html.headers": [
- "0dcb2328ae7c48f451f43a7f89fcf90828d5f8a2",
+ "c90842175d92cff67627f397fdce63d6e95c7b2f",
[]
]
},
@@ -323719,6 +324282,14 @@
"dff4b3290d66c4c804267ecfe2fb9717a6449cff",
[]
],
+ "feature-policy-clipboard-read.html": [
+ "10fc45fd933ef0f77e5d53d4fac9ec70d372ce48",
+ []
+ ],
+ "feature-policy-clipboard-write.html": [
+ "7eb96e3db011762599b03c102505110bda37285d",
+ []
+ ],
"feature-policy-generic-sensor.html": [
"59652e2e7ae0056a6cc4be7f004b6d0151fb9d44",
[]
@@ -324157,7 +324728,7 @@
],
"resources": {
"content-type.py": [
- "0b5e93b937c293250b33ae2cb2e5cbe43e381a86",
+ "91fcd97a7cb67d8596c021d82bcce07ee85b3149",
[]
],
"content-types.json": [
@@ -324373,11 +324944,11 @@
],
"resources": {
"http-cache.py": [
- "351b2eb3c9eec006d8976dc5fad1f6db990cd733",
+ "c176b255a3f256738d514e37905ed77373986b30",
[]
],
"securedimage.py": [
- "445b0bdd2ec95a1ac9be08228503475b386cf961",
+ "cac9cfedd27ea811147150b42ff89c58cbcaed17",
[]
],
"split-cache-popup-with-iframe.html": [
@@ -324409,11 +324980,11 @@
[]
],
"echo-as-json.py": [
- "7644a8507d97f9f4d30106dc38fd22cfc6b10796",
+ "44f68e8fe9e2025b2940ef2a6cd8390be6376582",
[]
],
"echo-as-script.py": [
- "7884b096d994b41a365cdbc19979633e9cf65419",
+ "1e7bc91184fdd6de9fdf9982146e009211737c9c",
[]
],
"fetch-via-serviceworker--fallback--frame.html": [
@@ -324441,11 +325012,11 @@
[]
],
"post-to-owner.py": [
- "096f33b04a22f34eccbcf9981010ff6e43c8ea79",
+ "c5ee11653ef2a8d291aceac3ae97670463fda7fe",
[]
],
"record-header.py": [
- "364c800a19ce6f2060a97019d222acbf71045e93",
+ "05b60eba13b1cf46155576f910580b1db8affec5",
[]
],
"redirectTestHelper.sub.js": [
@@ -324501,11 +325072,11 @@
"origin": {
"resources": {
"redirect-and-stash.py": [
- "aa9eb35db2bddb59acb1c7ebcbb971ab38d344b9",
+ "9bf9e1f18c2b171bd891b9276e1c40d549b8539f",
[]
],
"referrer-policy.py": [
- "22b71e33b54160c451f1bbfc8a157600eeb7059f",
+ "15716e068b9e3fd376b995373bcd9c4af6fe750e",
[]
]
}
@@ -327995,7 +328566,7 @@
[]
],
"build.sh": [
- "f69fa4ff17d9ffe18559c34546139872c6a8e2e2",
+ "ae1563ad85de7f5cc502d75b079121236de9b249",
[]
],
"current-work-canvas.xhtml": [
@@ -328053,7 +328624,7 @@
[]
],
"drawing-text-to-the-canvas.yaml": [
- "f5feb7b4c65ddb643d86aad1846eb565c0db1ea2",
+ "58fa119d32fb522c15f9f6a240b6e3d4dd6ad3b8",
[]
],
"fill-and-stroke-styles.yaml": [
@@ -328147,7 +328718,7 @@
[]
],
"text.yaml": [
- "f9c09baf4842f3bc163f8483a9449484cd4fbf6f",
+ "7b8159810473a86e9721dbfe3c3bd3680dfc0b18",
[]
],
"the-canvas-state.yaml": [
@@ -328301,7 +328872,7 @@
[]
],
"report.py": [
- "dd1a047c72a155997eaf019f4bdb13002d219574",
+ "2fe40526ea9523ab4a7de45ffcfdb6ba39f92ce7",
[]
],
"reporting-empty-frame.html": [
@@ -328570,7 +329141,7 @@
[]
],
"dispatcher.py": [
- "67b8cc3d3dde0ad4272e2000fe75efab214d9d9f",
+ "2617361b0b369bd9efd3aedd42a88f8f46906fe3",
[]
],
"executor.html": [
@@ -328578,11 +329149,11 @@
[]
],
"report.py": [
- "f51d27f2991098c7079c515fda582c490dce05ad",
+ "8e5ec6d1b9b14168c92eedd6e9098e51a61f31c8",
[]
],
"reporting-common.js": [
- "0a0553ae8051e0098d4c025d434c89f0f7aaceab",
+ "ea71f6ce863db9f1695348d8ff4434dc28d42c85",
[]
],
"try-access.js": [
@@ -328601,7 +329172,7 @@
[]
],
"coop-coep.py": [
- "483f313faca6f79668c66fb38eaac84357916574",
+ "e0a3d90050a6242580eeffd5bb6353055b3033d7",
[]
],
"iframe-popup.sub.html": [
@@ -332916,19 +333487,19 @@
"query-encoding": {
"resources": {
"blank.py": [
- "6274a4e3cbfe67552402179eb3af6e284acd6761",
+ "bbd269d17036bdb8cf9a1501c44168618a145f5d",
[]
],
"css-tmpl.py": [
- "d7c9bce2786b44cbd3c4fa755ad60191032188d1",
+ "673b2fca324aa863afb474b199ce3882ef2dd513",
[]
],
"manifest.py": [
- "05b47f8163f967cb794423b0ff3b8910b66b6a8c",
+ "92947d8d8314ab84cffc6e8b135667ad585c4388",
[]
],
"page-using-manifest.py": [
- "401d741a4bc65960f32a471a85c7e2a34c27f944",
+ "9e6836c183e8730ce44d2a8ad37a57292e2927ea",
[]
],
"resolve-url.js": [
@@ -332936,11 +333507,11 @@
[]
],
"resource.py": [
- "a1736f0d7005354224a7310de50be8d770104c86",
+ "60eb4a15a06cd481aefbdd4d6c75b5280cf9fccf",
[]
],
"stash.py": [
- "d6e3dd5ea50b3a5e493f50f048fe377a76293bb3",
+ "a6b589d2acfef2daa3d9c7e24b08b9848a6751c3",
[]
]
}
@@ -333137,6 +333708,32 @@
"7d21ce1180794a23c72ea6c7a9f8ef06ffe5e6c9",
[]
],
+ "resources": {
+ "aqua-yellow-32x32.png": [
+ "42f8a2100b241aebf5c62e5057a51a933e6ff4d6",
+ []
+ ],
+ "blue-16x20-green-16x20.png": [
+ "9bf59ebdf1a83a44011253587fd1c4e6d13872dd",
+ []
+ ],
+ "fuchsia-32x32.png": [
+ "7902bc31e09b58fbe224fb8047e84332eb132cce",
+ []
+ ],
+ "red-32x32.png": [
+ "191e13ea11d03f0446f6f3bc185d7ef2ab2946be",
+ []
+ ],
+ "yellow-32x32.png": [
+ "a45f8111b446ceaea47b2ef50c46742333c177b1",
+ []
+ ]
+ },
+ "table-background-print-ref.html": [
+ "3aa0abd3207469be60d54475e92b4f882f69dcdc",
+ []
+ ],
"table-border-1-ref.html": [
"ceac88e9a3c82013165b1a64e7acd3d3841271fb",
[]
@@ -336572,7 +337169,7 @@
},
"tools": {
"build.sh": [
- "21403090b8e1df5a6e445daa4969175ad16fe8de",
+ "a416d05dd4dc18a5dfed97f49d3e609769188cf2",
[]
],
"html5lib_test.xml": [
@@ -336837,11 +337434,11 @@
[]
],
"http-refresh.py": [
- "d323f967b2177a431a4b118710dbfdfe6148315d",
+ "161a34b6b506aaa501b88e9458d1e160c748e8c6",
[]
],
"meta-refresh.py": [
- "dd3cef44b44252beb3c7729271c51490a475a660",
+ "2dfbab6e76087a38164cd2bf66ee8f9eafe9b43d",
[]
],
"page-with-frame.html": [
@@ -337016,7 +337613,7 @@
"unhandled-promise-rejections": {
"support": {
"promise-access-control.py": [
- "be74a36034eda86e1c6d77b84aef3fd631a8a9ef",
+ "cf8ed5e49244a614dbe44acf2dc9146629e79290",
[]
],
"promise-rejection-events.js": [
@@ -337195,7 +337792,7 @@
[]
],
"blue-png-cachable.py": [
- "e87975343f697267ca724f83f215ee9ceae35d3d",
+ "6d8556542ab50d3e8c9dc163ddd2e41bec8f774e",
[]
],
"blue.png": [
@@ -337918,7 +338515,7 @@
]
},
"file_upload.py": [
- "89ed67a79efdef5e6febc9df225774345341cea8",
+ "9c4dd75438454b852a1590018361ee682f1106df",
[]
],
"file_upload_data.txt": [
@@ -338001,7 +338598,7 @@
[]
],
"ambient-light.idl": [
- "ce335161a2570fa9f2ab8051c75c0ab71aa2df76",
+ "06d6eec690ba8c70ab10f61fe9a9a1de286b6e70",
[]
],
"appmanifest.idl": [
@@ -338260,6 +338857,10 @@
"46fad3522ed2539d04a688cc4f5d05c8e76ef24f",
[]
],
+ "intervention-reporting.idl": [
+ "95905fe3b58ec9b38ad26671dda1f68519b887ad",
+ []
+ ],
"is-input-pending.idl": [
"191fafdb96c8c7502e5a297719562053cf23907d",
[]
@@ -338329,7 +338930,7 @@
[]
],
"native-file-system.idl": [
- "92d05fe4659e5520aa55f99051cdb4b4da5c2f67",
+ "1fd2cb8b3a1da36a1b403c7e8970a4e40dc7beb2",
[]
],
"navigation-timing.idl": [
@@ -338369,7 +338970,7 @@
[]
],
"payment-handler.idl": [
- "824210a5c1835923f719c434629a5124a3dd8e10",
+ "66732945ca67f638998da5771ae413b8fb76b327",
[]
],
"payment-method-basic-card.idl": [
@@ -338585,7 +339186,7 @@
[]
],
"webauthn.idl": [
- "9de7f64919d6a5f674bd684423491ddacbd2f96e",
+ "607c4765485041e5a8e5fe65571469bedf1d6fd0",
[]
],
"webdriver.idl": [
@@ -338784,7 +339385,7 @@
],
"resources": {
"slow-image.py": [
- "ee7988c551f6429eea2b929af083ad30cbd5c73d",
+ "d9f09b8bca78dd1e054fdfcb108fe9066a31db3b",
[]
],
"test-adapter.js": [
@@ -338838,7 +339439,7 @@
]
},
"lint.ignore": [
- "8d0ac45b8c88ab625cca30770488c9a4d0a3def8",
+ "23cf8609bf254070786af58f19deb901c37b7aee",
[]
],
"loading": {
@@ -340426,7 +341027,7 @@
[]
],
"message-target.js": [
- "423bcf42e16bdbc17fd4fc337d6bc070169eb983",
+ "ab8012dfca5ae7117fda1e7c06a10041f2750d9a",
[]
],
"messaging-blob-helpers.js": [
@@ -340438,11 +341039,11 @@
[]
],
"messaging-serialize-helpers.js": [
- "ff7e59cf45a26339afce28270731fdc88dfe2804",
+ "b4d41aa91c018f867240969297ba4a5c5ae8930d",
[]
],
"native-fs-test-helpers.js": [
- "cf9f39a9a87e96398c468f8bd3c51169f2f18d6b",
+ "231bc0675320e5862107c603fc48076a841492cf",
[]
],
"opaque-origin-sandbox.html": [
@@ -340450,11 +341051,11 @@
[]
],
"sandboxed-fs-test-helpers.js": [
- "3ec31436a0397ff4f7e8b8c83d504240e63bf4bd",
+ "1b27445e95117a7b15030a3762fb8cc817208409",
[]
],
"test-helpers.js": [
- "eb123bf6da6eec15ea9bb228c87fe6a799cf1f1e",
+ "0d8bdfde8d747faab170e99abb5ed7ddfa43e1a3",
[]
]
},
@@ -340464,7 +341065,7 @@
[]
],
"FileSystemBaseHandle-isSameEntry.js": [
- "e8a8725b95ead6c57cd6e179b1e1bb727812ab0d",
+ "8c0b3521c3faed445e95f4fded160d5ac497e578",
[]
],
"FileSystemBaseHandle-postMessage-BroadcastChannel.js": [
@@ -340499,20 +341100,20 @@
"db8e55491f230c1d3767bf2c57625ffc08bb7d09",
[]
],
- "FileSystemDirectoryHandle-getDirectory.js": [
- "cd910fd361f1c49956581c7ed19f3d5f133a9646",
+ "FileSystemDirectoryHandle-getDirectoryHandle.js": [
+ "48a4ce4ce69e8f6823db6fdd0c83a2a0c3378f32",
[]
],
"FileSystemDirectoryHandle-getEntries.js": [
"571683ccfd1182631a0398017a9f67fa04bb255c",
[]
],
- "FileSystemDirectoryHandle-getFile.js": [
- "383f19a4b2be6cb20e733d2063ec968ace25cf1e",
+ "FileSystemDirectoryHandle-getFileHandle.js": [
+ "dddd67a705808c65f759741956c3b2e16114f43d",
[]
],
"FileSystemDirectoryHandle-removeEntry.js": [
- "ffd24a5eb7b9e937355d9e8e28c698f0a6e9a61c",
+ "5b25ed6874fe95d4b076af974d5d2d27e471378d",
[]
],
"FileSystemDirectoryHandle-resolve.js": [
@@ -340528,11 +341129,11 @@
[]
],
"FileSystemWritableFileStream-write.js": [
- "516894bcf95603328885e7f3370b646664ea9af4",
+ "c49f0f62848d9687847eadada46ffcbb7841790b",
[]
],
"FileSystemWritableFileStream.js": [
- "778437e2a592120c05e8872ec11ab76986861023",
+ "1cebb993556f0da7785e9f9df8b3d47f4d4229cd",
[]
]
}
@@ -340546,9 +341147,15 @@
"eb1a8d268cebf1f308925cbc1fe30a2478b9fa2c",
[]
],
+ "concurrent_io": {
+ "operation_helpers.js": [
+ "71cbc29efa0c4832ac828fee00bf75fd93409212",
+ []
+ ]
+ },
"resources": {
"support.js": [
- "adbfbc45d1977a05657dc3fddfa7344ed91b1371",
+ "90bb9120bc538ff3fb669bd75e5661957cc0d85b",
[]
]
}
@@ -340816,6 +341423,18 @@
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
],
+ "navigation-parent-yes-1-same-no-2-ports-no.sub.https.html.headers": [
+ "ea3f6b335c7620acf59f546fd48484bf624ccb38",
+ []
+ ],
+ "navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html.headers": [
+ "ea3f6b335c7620acf59f546fd48484bf624ccb38",
+ []
+ ],
+ "parent-yes-child-no-ports.sub.https.html.headers": [
+ "ea3f6b335c7620acf59f546fd48484bf624ccb38",
+ []
+ ],
"parent-yes-child-no-same.sub.https.html.headers": [
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
@@ -340824,6 +341443,10 @@
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
],
+ "parent-yes-child-yes-ports.sub.https.html.headers": [
+ "ea3f6b335c7620acf59f546fd48484bf624ccb38",
+ []
+ ],
"parent-yes-child-yes-same.sub.https.html.headers": [
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
@@ -340844,6 +341467,10 @@
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
],
+ "parent-yes-child1-no-child2-yes-children-ports.sub.https.html.headers": [
+ "ea3f6b335c7620acf59f546fd48484bf624ccb38",
+ []
+ ],
"parent-yes-child1-no-child2-yes-children-same.sub.https.html.headers": [
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
@@ -340852,10 +341479,18 @@
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
],
+ "parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html.headers": [
+ "ea3f6b335c7620acf59f546fd48484bf624ccb38",
+ []
+ ],
"parent-yes-child1-yes-child2-yes-children-different.sub.https.html.headers": [
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
],
+ "parent-yes-child1-yes-child2-yes-children-ports.sub.https.html.headers": [
+ "ea3f6b335c7620acf59f546fd48484bf624ccb38",
+ []
+ ],
"parent-yes-child1-yes-child2-yes-children-same.sub.https.html.headers": [
"ea3f6b335c7620acf59f546fd48484bf624ccb38",
[]
@@ -340878,7 +341513,7 @@
[]
],
"helpers.mjs": [
- "50ca1ab48745c539fc94b2b8222cb5a6585efd54",
+ "e8425c240b5e5821bc16708044863f73bf5f4697",
[]
],
"helpers.mjs.headers": [
@@ -341104,7 +341739,7 @@
[]
],
"utils.js": [
- "2ee0e3d0626da211089f43e5484b7fc7d8140e52",
+ "975e84dadd4693b8a484221b5ce52f28b554ff01",
[]
]
}
@@ -341437,6 +342072,10 @@
"f7580bd15212234c36b55a368efa0c729bd64e5b",
[]
],
+ "portal-activate-broadcastchannel.html": [
+ "b922afaec26333b1b7f96276f5a0e59e1c8d1929",
+ []
+ ],
"portal-activate-data-portal.html": [
"f57e4b196be471783316a6749a58ebd4a5b962a7",
[]
@@ -343838,7 +344477,7 @@
[]
],
"webxr-test.js": [
- "7854b4f85ff907c718eca4fc3bc2f94d9b6c5895",
+ "3ecb18e5556710cd7f9d4bc6a92a41949de725c1",
[]
],
"webxr-test.js.headers": [
@@ -344270,6 +344909,14 @@
[]
]
},
+ "test-only-api.js": [
+ "53891d21bd4ea57f788d3525a7bb9145e168f2c7",
+ []
+ ],
+ "test-only-api.js.headers": [
+ "5e8f640c6659d176eaca4c71cc1798b7285540b7",
+ []
+ ],
"testdriver-actions.js": [
"870a2e8e26678085f80c030d436dd13686fb9b0b",
[]
@@ -344291,7 +344938,7 @@
[]
],
"testharness.js": [
- "7e2d4600f0f1302b5131ef81086ab283c0a83fc1",
+ "274dc9d7d890dba7d98985feac9533dd62450433",
[]
],
"testharness.js.headers": [
@@ -346145,7 +346792,7 @@
[]
],
"import-scripts-get.py": [
- "9e376bc092889f1b231628ec7c17339674d284f4",
+ "ab7b84e3e34e3f6ccff48a497d10f9bdc356fda3",
[]
],
"import-scripts-mime-types-worker.js": [
@@ -346173,7 +346820,7 @@
[]
],
"import-scripts-version.py": [
- "91caa1a41ed2f76f23425bc7978b6056e42d3c2f",
+ "cde28544e60a0613debe98bfe6c44bdfb610317b",
[]
],
"imported-classic-script.js": [
@@ -346209,11 +346856,11 @@
[]
],
"invalid-chunked-encoding-with-flush.py": [
- "c91250a9d1f9bcf1930f0d3dd685ebcca2932558",
+ "22a696508f44162927d396daa2ffad39780eaff2",
[]
],
"invalid-chunked-encoding.py": [
- "ae2c1f21b2ec01ff26b8fcc7f80a6aff69ccbf2f",
+ "a8edd06b8dcd435ec82cfc5d4a2e75519d647d7e",
[]
],
"invalid-header-iframe.https.html": [
@@ -346253,7 +346900,7 @@
[]
],
"malformed-worker.py": [
- "501521ff3e37dfc75bc61f3213c8282410f91fbe",
+ "562c44eddc118a20fafba23edb3350218a36b196",
[]
],
"message-vs-microtask.html": [
@@ -346265,11 +346912,11 @@
[]
],
"mime-type-worker.py": [
- "a16684de5cb6ae60356c225191744b4ef433c2ac",
+ "92a602e634cbf8b66d28f36eb0d1616f06ba239c",
[]
],
"mint-new-worker.py": [
- "cbe70304d89c3835663d6ab9782a44482134af7c",
+ "ebee4ff8e8da785cf4b4a339c6514b5fe9b98f9b",
[]
],
"module-worker.js": [
@@ -346285,7 +346932,7 @@
[]
],
"multipart-image.py": [
- "f94ee1c64fd9bec0be9879df8a4c166e9fa5e0f1",
+ "9a3c035f492d9019ad23aaaf94409818ebae9d18",
[]
],
"navigate-window-worker.js": [
@@ -346297,7 +346944,7 @@
[]
],
"navigation-redirect-body.py": [
- "601f818cff6ad47a2c232f4f0b127d756cb0f6c1",
+ "d10329e7836c5267e2e725871b0002c8341976b8",
[]
],
"navigation-redirect-other-origin.html": [
@@ -346305,7 +346952,7 @@
[]
],
"navigation-redirect-out-scope.py": [
- "16850723f968fd3fac51a33c6e983c4f013a8823",
+ "9b90b146955b86b15e828da7111faefaa25699c2",
[]
],
"navigation-redirect-scope1.py": [
@@ -347578,6 +348225,14 @@
"e0b17a2c4a287ee6fe339b23cc9df94de54c0bfb",
[]
],
+ "isolation-with-html-ref.html": [
+ "91ccd6165ffaee1e83491ad3face940d3f578276",
+ []
+ ],
+ "isolation-with-svg-ref.html": [
+ "91ccd6165ffaee1e83491ad3face940d3f578276",
+ []
+ ],
"masked-ref.html": [
"1a3b13c94516521266cf77e55abc11c3e81df8f8",
[]
@@ -348564,7 +349219,7 @@
[]
],
"commands.json": [
- "c9cd7c458989ec77bacd645cd5145351443ff73c",
+ "929d2c091457b34f085397a1a525c3ae5e5248fb",
[]
],
"epochs_update.sh": [
@@ -348580,7 +349235,7 @@
[]
],
"manifest_build.py": [
- "20f96d9a3eeec639974ca461d9d45f91c96c0170",
+ "0ea13627538974b6a27fe0f364edb39275b334ce",
[]
],
"pr_preview.py": [
@@ -348605,20 +349260,24 @@
[]
],
"decision.py": [
- "f8f186f744d8082790a8c3bec8654fa15ca7f3e8",
+ "070ae5f1903b6dbf56f535990611c04b89690bdf",
[]
],
"download.py": [
"359ec33405048c134ddcfac7a564ea9a17ac1b14",
[]
],
+ "sink_task.py": [
+ "ba76d27640c86197736d7edc9e8ed86fe8ec4bd0",
+ []
+ ],
"taskgraph.py": [
- "6a6cb497f2d406862d18bc214d36c1ea2ecd7c3e",
+ "8c78f7b5dbe728806453c084ce44255fce86fc46",
[]
],
"tasks": {
"test.yml": [
- "7943e671282c4f137c4df74c1b2c2ed2fd2acd67",
+ "9396ce02afab697f3d63d5a55519f8536e356b0d",
[]
]
},
@@ -348650,7 +349309,7 @@
[]
],
"test_valid.py": [
- "a116ca89310d808bd7ef8c512436a5c483b988a8",
+ "6ac76f484e14bc919102b7d76cb85f5d36daac66",
[]
]
}
@@ -348680,7 +349339,7 @@
[]
],
"Dockerfile": [
- "f3927fd0d71ccf292d9699d597a479945a8e5114",
+ "cf44e13cb1d905cbdc2dbd2791e9f9fb3c778d2f",
[]
],
"README.md": [
@@ -348724,7 +349383,7 @@
[]
],
"gitignore.py": [
- "0f3d9450d123449c0dcc3ff3c04ca86c81b24bef",
+ "2a2761518663ca949011fa3dc7dd7fc390f7936c",
[]
],
"tests": {
@@ -348733,7 +349392,7 @@
[]
],
"test_gitignore.py": [
- "8131a71875b4d569fed95f6781feca06470ea68d",
+ "317f3799b62bb2db3f3053016c22142a72c9b561",
[]
]
}
@@ -348748,15 +349407,15 @@
[]
],
"fnmatch.py": [
- "3d9ee23c97e5baf1657758ef18244104c7f7c1e3",
+ "0c45029b23915f0f94db411d201b16a2a1e38f90",
[]
],
"lint.py": [
- "fc1a816f8abf85efce31a3a8e614ba591b600954",
+ "75fac67dc8d22cc408205bafcdfe4195ba85a91f",
[]
],
"rules.py": [
- "695f6cd4e5328caf2f085a115d31a9c0b4ae2712",
+ "6ffd749b9ad539b56ab93f4cd3dfffe8ed324aa1",
[]
],
"tests": {
@@ -348957,7 +349616,7 @@
[]
],
"test_lint.py": [
- "10d9728b405751bdb28db5e0193162ec7f6df486",
+ "5857f02b6fa0b6bf580008180dbb66efe2d9a18d",
[]
],
"test_path_lints.py": [
@@ -348967,12 +349626,12 @@
}
},
"localpaths.py": [
- "ce3b41e300c9f11380ea065f5b288d5aef812588",
+ "93cff2b8e085b90d670d80f5598dcd77e512bad0",
[]
],
"manifest": {
"XMLParser.py": [
- "6f5ff4d35dab679599b1155c6bbb334b2f07f7b1",
+ "80aa3b5b920b67bfb728a53b25c870e81319cbbe",
[]
],
"__init__.py": [
@@ -348990,11 +349649,11 @@
[]
],
"download.py": [
- "f8be03efb2750ad754c6038f7341a9761291df22",
+ "9d763181d82db70bfd468ffebc040ad6a6dc97b3",
[]
],
"item.py": [
- "e232925ed635c6984bcc8d0200229ffceaa2aa47",
+ "efb49d7f4ec9ef8011035c79277fc98bc3dea707",
[]
],
"log.py": [
@@ -349002,11 +349661,11 @@
[]
],
"manifest.py": [
- "c0832d7475175131e1755ab2dcd28b612c47b886",
+ "449cd245acbc599389a76cd71f1f8ae29323066b",
[]
],
"sourcefile.py": [
- "524eb0bddb255fbb8847aa4b064a105657418e85",
+ "09316bd052c066a2dbb92d26be4ca4aa610d216a",
[]
],
"testpaths.py": [
@@ -349027,7 +349686,7 @@
[]
],
"test_manifest.py": [
- "2b42c023a58c0411b79897ae30effbdf1aaa221f",
+ "26a8fdc17633db1c49183fb5498da3979cdd54e0",
[]
],
"test_sourcefile.py": [
@@ -349048,11 +349707,11 @@
[]
],
"utils.py": [
- "aefc2c94f40e1ae29d3657fe4114f79f97568ba1",
+ "36c1a983101a8e70bdc7483351457d6dd57666d6",
[]
],
"vcs.py": [
- "7c0feeb816479975275b1a1c4d84f1215fac1406",
+ "80c0512807a95937061fdea672ba75562e60a2f8",
[]
]
},
@@ -349069,7 +349728,7 @@
[]
],
"pytest.ini": [
- "140ce236ffd54cd149bd9926d7938255a6652cf5",
+ "c1e428d0717ed923a6011198e84757cb3cc96f87",
[]
],
"quic": {
@@ -354282,25 +354941,25 @@
"97c685b5a50bd9769804861f4ad7a8396215d239",
[]
],
- "six-1.13.0.dist-info": {
+ "six-1.15.0.dist-info": {
"INSTALLER": [
"a1b589e38a32041e49332e5e81c2d363dc418d68",
[]
],
"LICENSE": [
- "4b05a545261c0f9b31abe3edec710587587a659a",
+ "de6633112c1f9951fd688e1fb43457a1ec11d6d8",
[]
],
"METADATA": [
- "b0c8f51e1f366138d3816abe0ddb3efee4175c3c",
+ "869bf25a884325e37cd8f415f5e1f1f37b832039",
[]
],
"RECORD": [
- "e57665c9964255d1702f016c8bd11daede5166ef",
+ "d9754c61c4d7f2dda4114ec9885eba7bcfdb007f",
[]
],
"WHEEL": [
- "10012355333e0664fac31238aa04216ff5362217",
+ "ef99c6cf3283b50a273ac4c6d009a0aa85597070",
[]
],
"top_level.txt": [
@@ -354309,7 +354968,7 @@
]
},
"six.py": [
- "d0aece89fa4aae948d75e8ef2277ce24951ebb2f",
+ "83f69783d1a2dcb81e613268bc77afbd517be887",
[]
],
"test_six.py": [
@@ -354383,7 +355042,7 @@
}
},
"tox.ini": [
- "bbec1afbb6dd2fd6c0422ed893e09aa2fc9f38c1",
+ "45358c081efbb00d528d6d176b93d28dd081b8cb",
[]
],
"wave": {
@@ -355034,7 +355693,7 @@
[]
],
"revlist.py": [
- "1893fdefa8346e8f969e41789df6e3ddd8540629",
+ "bd85612e2c2a7cfafde1ec812baf0a95932d76b9",
[]
],
"run.py": [
@@ -355042,7 +355701,7 @@
[]
],
"testfiles.py": [
- "f2960e8f51e445e3f6f53ba8e7c0145aa5072038",
+ "c990aa21a65f6f8f6d87f62157d0fb65fc8fc974",
[]
],
"tests": {
@@ -355067,7 +355726,7 @@
[]
],
"test_testfiles.py": [
- "9fd6c6f9b851537df044286123ba64c9b3e19e87",
+ "81f528457c6d6820e1f011a4732351269bf55ec2",
[]
],
"test_wpt.py": [
@@ -355084,11 +355743,11 @@
[]
],
"utils.py": [
- "9a6c0646712064e183f366dfd5629a1b52e8119e",
+ "18551481ab8cae42a6707156922619df3fa59b48",
[]
],
"virtualenv.py": [
- "18edcc04fb4d528e6566da10902a9ac964b42a65",
+ "51b97cead8dca52b8b69ed448de41ff7581ea0a0",
[]
],
"wpt.py": [
@@ -355702,11 +356361,11 @@
[]
],
"test_update.py": [
- "6dc04cedf34c7a8fb6673f1c5f477d0561eb1ffa",
+ "a1ba8de28780647544b22cb1127568d57d4dcac4",
[]
],
"test_wpttest.py": [
- "dbccd90e339580a8d5fa1005be0434095c468268",
+ "4eee9ccb1b699356815ae7c50fdced7c0441c732",
[]
]
},
@@ -357025,7 +357684,7 @@
"animation-model": {
"animation-types": {
"property-list.js": [
- "32de670ed3c8f302baa5f156372fbd539485840c",
+ "3c3bf5de56d921fdc583e0a4216b4946e2c8a0c0",
[]
],
"property-types.js": [
@@ -361028,7 +361687,7 @@
[]
],
"webxr_util.js": [
- "81dc3d620aa1f739fc7402857ef394a17768e9cd",
+ "a987ca1f4420c16b3e55620115d536a635ae3695",
[]
]
},
@@ -362244,7 +362903,7 @@
}
},
"wpt": [
- "9930d77d0c9b78030ebd0a6d5f5476c6bfbf58e1",
+ "329ea66852cb8f4dac846af30ebbccb1e68fd29d",
[]
],
"wpt.py": [
@@ -379682,6 +380341,120 @@
]
]
},
+ "feature-policy": {
+ "clipboard-read": {
+ "clipboard-read-disabled-by-feature-policy.tentative.https.sub.html": [
+ "7af2b8944e8b41a48f33e15c163fa4fe7b7a676b",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-read-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html": [
+ "3b1cfd52ad7c9f4166fa9e529c80a227dd93bbb3",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-read-enabled-by-feature-policy-attribute-tentative.https.sub.html": [
+ "15d268426163727a3dbf2adbb01db40ea7fecd1f",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-read-enabled-by-feature-policy-cross-origin-tentative.https.sub.html": [
+ "1b6f4929a19deaf7779643944fb7f90020235ff4",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-read-enabled-by-feature-policy.tentative.https.sub.html": [
+ "f8c5bcb129f9324056ad57368dab3a85b982117c",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html": [
+ "47aa6511ec599be99f685b5a419511b81ee0baef",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ },
+ "clipboard-write": {
+ "clipboard-write-disabled-by-feature-policy.tentative.https.sub.html": [
+ "5d19d8dd6f26211db48206fbae5cb4a7f2506341",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-write-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html": [
+ "c931bbbb89f32f8035cac150d0eb658e31e8bf8b",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-write-enabled-by-feature-policy-attribute-tentative.https.sub.html": [
+ "a2858c638e6c05f08ea8d4b71dd8891a21b63b43",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-write-enabled-by-feature-policy-cross-origin-tentative.https.sub.html": [
+ "0f3164d9b02a13f8d5296bdbdd65b11041889a13",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-write-enabled-by-feature-policy.tentative.https.sub.html": [
+ "1c6fc49a056605a1dfab3fb96cd1155ea72716c7",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ],
+ "clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html": [
+ "51db5a427d2b4140786555e07c7f57624a8ae505",
+ [
+ null,
+ {
+ "testdriver": true
+ }
+ ]
+ ]
+ }
+ },
"permissions": {
"readText-denied.https.html": [
"935f520e7de2dd15e0019c798dd0966c454235cd",
@@ -389241,6 +390014,13 @@
null,
{}
]
+ ],
+ "system-color-compute.html": [
+ "9b3946c6de56f56959146f2dc751cbb83c929684",
+ [
+ null,
+ {}
+ ]
]
},
"css-color-adjust": {
@@ -390075,6 +390855,13 @@
{}
]
],
+ "dynamic-grid-flex-abspos.html": [
+ "73318466f0e415dd3ce3c5959344590dcf53a8d7",
+ [
+ null,
+ {}
+ ]
+ ],
"flex-aspect-ratio-img-column-011.html": [
"66cb0e015f6618eb7cc3daee99f29ddbf7ed4729",
[
@@ -391892,21 +392679,21 @@
]
],
"font-variation-settings-computed.html": [
- "0b01320a7f6e2a473a44bc435bfe9507321ce135",
+ "521461657e8d4b4749042c102685c1491e67f3dd",
[
null,
{}
]
],
"font-variation-settings-invalid.html": [
- "b957c31009222be77397b82f7f044594e31d1866",
+ "bd9370b350ea5ae8551724f85b9a4fbe4cd97dff",
[
null,
{}
]
],
"font-variation-settings-valid.html": [
- "fe7f6bf7806891540a5fc495e7568cc5763c59b9",
+ "fc0c3ef703352facc083aecb8bbebb98161475df",
[
null,
{}
@@ -392023,13 +392810,6 @@
{}
]
],
- "font-variation-settings-parsing.html": [
- "3d6bc5fa1c059d2c95e95a3a411b3a2be8f8e88a",
- [
- null,
- {}
- ]
- ],
"font-weight-interpolation.html": [
"745be060aba32ec6270b156e4e8e9254270586f2",
[
@@ -394110,28 +394890,28 @@
]
],
"grid-auto-fill-columns-001.html": [
- "83ab583797dceb0a78f3692999606932706be67d",
+ "44c60801010a5585f144a8bf5775ae86620d9529",
[
null,
{}
]
],
"grid-auto-fill-rows-001.html": [
- "d3078b7b3ad9ac633de08c4db0e66e784976db6b",
+ "55462fa8d05dba0b407e75372e473be319223fd1",
[
null,
{}
]
],
"grid-auto-fit-columns-001.html": [
- "524bb209a569f066e994cfe3174ac9f2d2fd743a",
+ "b19881f5ac832418d0606f13a3bdaf9d01a6cb0a",
[
null,
{}
]
],
"grid-auto-fit-rows-001.html": [
- "fef304b2188c07a69c9dd5d07dbb316dc1a18b8e",
+ "627a980c088fb4c9d0bbd94c0599b4d45de3ebda",
[
null,
{}
@@ -394660,7 +395440,7 @@
]
],
"grid-gutters-and-tracks-001.html": [
- "ebf914dbe98018d8df9058bb42705a3b89de6f91",
+ "caa83e1d8f71bc54d9d463ceedb0f730a59a9d9c",
[
null,
{}
@@ -404765,6 +405545,13 @@
{}
]
],
+ "transition-duration-shorthand.html": [
+ "181d52b38899ddbfb8f018c7536a79560e90ca97",
+ [
+ null,
+ {}
+ ]
+ ],
"transition-property-001.html": [
"47a1417070f0c2e7b8171259d9c4f63c44e96bcc",
[
@@ -405101,7 +405888,7 @@
]
],
"cssTransformComponent-toMatrix.html": [
- "14d819be40a8de60912ad161025e01b60e33897b",
+ "d3e510296bdc550c4cbb71a34444866d670b12b8",
[
null,
{}
@@ -408959,6 +409746,13 @@
{}
]
],
+ "CSSStyleSheet-modify-after-removal.html": [
+ "010c0b93281f3afdfabf4ff764e3c4abd95729b0",
+ [
+ null,
+ {}
+ ]
+ ],
"CSSStyleSheet.html": [
"c744382b55e8b9da394132406f22492807f7160e",
[
@@ -409747,6 +410541,13 @@
{}
]
],
+ "MediaQueryList-change-event-matches-value.html": [
+ "d96c6bdff7842efdaff7f0e3e54f0b3a6a03c323",
+ [
+ null,
+ {}
+ ]
+ ],
"MediaQueryList-extends-EventTarget-interop.html": [
"2ac4b46647b210e5e71b2120f6ce8a4f1d9190a4",
[
@@ -412888,35 +413689,35 @@
},
"required-policy": {
"document-policy.html": [
- "1935be3dd0a961add3d80aa35ded92734d9f8869",
+ "b7fbceb2acd3c798d04b0bf9651b9499f2c6ca9f",
[
null,
{}
]
],
"no-document-policy.html": [
- "9af2e51c2acd9657861e00824c2a74631a370b00",
+ "8a3624440f3358381e3e51f9850dfc9285c4487f",
[
null,
{}
]
],
"required-document-policy-nested.html": [
- "39e2a92f77379319c1c9cd6619c02c9724c2a6dd",
+ "15281fcc2877538616e11d76d4628aa529c94239",
[
null,
{}
]
],
"required-document-policy.html": [
- "12cebdd292a2311f951a78dd1f8aab1ecd8c60e0",
+ "99b64efab343a8d6ef5d489d67659484e240ef0b",
[
null,
{}
]
],
"separate-document-policies.html": [
- "c2611a5dcf23eb165eec4edd34493c654c88a5a8",
+ "347d0a9d92c3e767e51d79ea1c0f0101fdb3030a",
[
null,
{}
@@ -438874,7 +439675,7 @@
]
],
"2d.text.measure.actualBoundingBox.html": [
- "e3238520a6122f08e010d6ca7f1a3db7e6c3b55c",
+ "44cff25d1afa82ba5f960784548b81e50025e787",
[
null,
{}
@@ -453301,14 +454102,14 @@
]
],
"2d.text.measure.actualBoundingBox.html": [
- "997b316033bd3a0561eab95f01561568bc4917e7",
+ "d454e1202b01239830ea78a0264f44a75836e578",
[
null,
{}
]
],
"2d.text.measure.actualBoundingBox.worker.js": [
- "6d2eed79b389b41b68cd4a4bc38d3f5d907f5fcb",
+ "497c8f92b2c96a29133034dcd5d448ac6ad4c584",
[
"html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.worker.html",
{}
@@ -467013,20 +467814,6 @@
{}
]
],
- "no-active-script-manual-classic.html": [
- "b01f595c03e9456b1da62bb4259a923a73ad8a34",
- [
- null,
- {}
- ]
- ],
- "no-active-script-manual-module.html": [
- "359b71d821c310e86b8d34086c14fef0d7f02454",
- [
- null,
- {}
- ]
- ],
"propagate-nonce-external-classic.html": [
"0958cfbeba21fa0ced503c17e96b97709fb66423",
[
@@ -474070,6 +474857,41 @@
]
]
},
+ "intervention-reporting": {
+ "idlharness.any.js": [
+ "c7a4d6095f867dc164b195ab7dad49725e7a2b7e",
+ [
+ "intervention-reporting/idlharness.any.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/WebIDLParser.js"
+ ],
+ [
+ "script",
+ "/resources/idlharness.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "intervention-reporting/idlharness.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "script",
+ "/resources/WebIDLParser.js"
+ ],
+ [
+ "script",
+ "/resources/idlharness.js"
+ ]
+ ]
+ }
+ ]
+ ]
+ },
"is-input-pending": {
"idlharness.window.js": [
"e6bb26a5a710d0dbd35bddae78143b433cb5bb1b",
@@ -474837,6 +475659,13 @@
{}
]
],
+ "containerNames.html": [
+ "cfde4a304330357e21da4bcce8a0e8c5b5148ce8",
+ [
+ null,
+ {}
+ ]
+ ],
"containerTypes.html": [
"5a703f3995cec7f1aa3f3d4a274bdc1780c2fcc7",
[
@@ -477416,7 +478245,7 @@
]
],
"MediaStreamTrack-getSettings.https.html": [
- "1bc1f9b5740e30ef3635ed76f974c535563ac9da",
+ "d94b43c9cf9a137d2520fbf69622a62011220a46",
[
null,
{
@@ -479202,10 +480031,10 @@
{}
]
],
- "sandboxed_FileSystemBaseHandle-IndexedDB.tentative.https.any.js": [
+ "sandboxed_FileSystemBaseHandle-IndexedDB.https.any.js": [
"7f0fc4a7212db3c4bc19f59d0ce265ccf5536bae",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.html",
{
"script_metadata": [
[
@@ -479236,7 +480065,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.worker.html",
{
"script_metadata": [
[
@@ -479267,10 +480096,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-isSameEntry.tentative.https.any.js": [
+ "sandboxed_FileSystemBaseHandle-isSameEntry.https.any.js": [
"67d36dfae8ae05a4013af598ec72cda89f964628",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.html",
{
"script_metadata": [
[
@@ -479289,7 +480118,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.worker.html",
{
"script_metadata": [
[
@@ -479308,10 +480137,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.js": [
"ca25b548cbbb4920bda1175c7af160b95b4de0f7",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.html",
{
"script_metadata": [
[
@@ -479347,10 +480176,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-Error.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.js": [
"16a7002a2add7950393756074cc8a94e4b21c5a8",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.html",
{
"script_metadata": [
[
@@ -479394,10 +480223,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.js": [
"612c823295b6a338d48160e662dae424904b9b2c",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.html",
{
"script_metadata": [
[
@@ -479433,10 +480262,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.js": [
"28cec810ee34906bf7566900b3993c8ea57f2ab9",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.html",
{
"script_metadata": [
[
@@ -479472,10 +480301,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.js": [
"1599ba969d87b54ee870ad2732466fa272658813",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.html",
{
"script_metadata": [
[
@@ -479515,10 +480344,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-frames.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.js": [
"a0e41c51b181e0d787876811ae4e5949afcc7117",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.html",
{
"script_metadata": [
[
@@ -479554,10 +480383,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-windows.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.js": [
"1e3de1ea399cf4b75531f3cf3a6c10242ca6c4f9",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.html",
{
"script_metadata": [
[
@@ -479593,10 +480422,10 @@
}
]
],
- "sandboxed_FileSystemBaseHandle-postMessage-workers.tentative.https.window.js": [
+ "sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.js": [
"e690682b6ff7c388cfd8875665997f6b2e6f6283",
[
- "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.tentative.https.window.html",
+ "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.html",
{
"script_metadata": [
[
@@ -479636,10 +480465,10 @@
}
]
],
- "sandboxed_FileSystemDirectoryHandle-getDirectory.tentative.https.any.js": [
- "6fcf566e31fbf061e7545280198562d9e41cad11",
+ "sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.js": [
+ "69ca2bf3677f25e2fac3dcc130894d783bc62231",
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectory.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.html",
{
"script_metadata": [
[
@@ -479652,13 +480481,13 @@
],
[
"script",
- "script-tests/FileSystemDirectoryHandle-getDirectory.js"
+ "script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js"
]
]
}
],
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectory.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.worker.html",
{
"script_metadata": [
[
@@ -479671,16 +480500,16 @@
],
[
"script",
- "script-tests/FileSystemDirectoryHandle-getDirectory.js"
+ "script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js"
]
]
}
]
],
- "sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.js": [
+ "sandboxed_FileSystemDirectoryHandle-getEntries.https.any.js": [
"da620e2a3b17a97bc4db3872484f217a3fa2c582",
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.https.any.html",
{
"script_metadata": [
[
@@ -479699,7 +480528,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.https.any.worker.html",
{
"script_metadata": [
[
@@ -479718,10 +480547,10 @@
}
]
],
- "sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.js": [
- "65ae891cd44418554800e12801617097f6a72c91",
+ "sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.js": [
+ "afe362e757cf9ac98e840c31003a8a85d20100e5",
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.html",
{
"script_metadata": [
[
@@ -479734,13 +480563,13 @@
],
[
"script",
- "script-tests/FileSystemDirectoryHandle-getFile.js"
+ "script-tests/FileSystemDirectoryHandle-getFileHandle.js"
]
]
}
],
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.worker.html",
{
"script_metadata": [
[
@@ -479753,16 +480582,16 @@
],
[
"script",
- "script-tests/FileSystemDirectoryHandle-getFile.js"
+ "script-tests/FileSystemDirectoryHandle-getFileHandle.js"
]
]
}
]
],
- "sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.js": [
+ "sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.js": [
"a4be8bd267e743ee617c29c1cce1188e6b9d377a",
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.html",
{
"script_metadata": [
[
@@ -479781,7 +480610,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.worker.html",
{
"script_metadata": [
[
@@ -479800,10 +480629,10 @@
}
]
],
- "sandboxed_FileSystemDirectoryHandle-resolve.tentative.https.any.js": [
+ "sandboxed_FileSystemDirectoryHandle-resolve.https.any.js": [
"6ee32709307cb930c8d56374841792fd70235915",
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.html",
{
"script_metadata": [
[
@@ -479822,7 +480651,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.worker.html",
{
"script_metadata": [
[
@@ -479841,10 +480670,10 @@
}
]
],
- "sandboxed_FileSystemFileHandle-getFile.tentative.https.any.js": [
+ "sandboxed_FileSystemFileHandle-getFile.https.any.js": [
"fb93858fe7934b27244fa0ff828eac75c34b6629",
[
- "native-file-system/sandboxed_FileSystemFileHandle-getFile.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.html",
{
"script_metadata": [
[
@@ -479863,7 +480692,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemFileHandle-getFile.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.worker.html",
{
"script_metadata": [
[
@@ -479882,10 +480711,10 @@
}
]
],
- "sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js": [
+ "sandboxed_FileSystemWritableFileStream-piped.https.any.js": [
"eed6a561dc40e658b6b6c8d51766cdacc42a024c",
[
- "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.html",
{
"script_metadata": [
[
@@ -479908,7 +480737,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.worker.html",
{
"script_metadata": [
[
@@ -479931,10 +480760,10 @@
}
]
],
- "sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js": [
+ "sandboxed_FileSystemWritableFileStream-write.https.any.js": [
"7ef0ea0ef82626eae74f152b94f898859aca6832",
[
- "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.html",
{
"script_metadata": [
[
@@ -479953,7 +480782,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.worker.html",
{
"script_metadata": [
[
@@ -479972,10 +480801,10 @@
}
]
],
- "sandboxed_FileSystemWritableFileStream.tentative.https.any.js": [
+ "sandboxed_FileSystemWritableFileStream.https.any.js": [
"16dbbe6a808a603c9b81482f733dcf09e84670ff",
[
- "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.html",
+ "native-file-system/sandboxed_FileSystemWritableFileStream.https.any.html",
{
"script_metadata": [
[
@@ -479994,7 +480823,7 @@
}
],
[
- "native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.worker.html",
+ "native-file-system/sandboxed_FileSystemWritableFileStream.https.any.worker.html",
{
"script_metadata": [
[
@@ -480030,7 +480859,7 @@
},
"native-io": {
"close_async.tentative.https.any.js": [
- "6ad27ffb4478262578a69b62b15acc496f81f81e",
+ "a2b692e295086564f25730eace0a677529c168d9",
[
"native-io/close_async.tentative.https.any.html",
{
@@ -480093,7 +480922,7 @@
]
],
"close_sync.tentative.https.any.js": [
- "e4f5871a65e6bab61a5df808d8f88a9d28494373",
+ "b5fb2880919c30592edcf0687a0ac8ed9fcbc7f8",
[
"native-io/close_sync.tentative.https.any.worker.html",
{
@@ -480110,69 +480939,293 @@
}
]
],
- "concurrent_io_async.tentative.https.any.js": [
- "d7752004678ef2762dc0ec01736bf1d81ef4cb25",
- [
- "native-io/concurrent_io_async.tentative.https.any.html",
- {
- "script_metadata": [
- [
- "title",
- "NativeIO API: close()."
- ],
- [
- "global",
- "window,worker"
+ "concurrent_io": {
+ "concurrent_io_getLength_async.tentative.https.any.js": [
+ "d542188738e5d55377f9eefe39ea7a67fb792f54",
+ [
+ "native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while getLength is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
]
- ]
- }
- ],
- [
- "native-io/concurrent_io_async.tentative.https.any.serviceworker.html",
- {
- "script_metadata": [
- [
- "title",
- "NativeIO API: close()."
- ],
- [
- "global",
- "window,worker"
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while getLength is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
]
- ]
- }
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while getLength is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while getLength is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ]
],
- [
- "native-io/concurrent_io_async.tentative.https.any.sharedworker.html",
- {
- "script_metadata": [
- [
- "title",
- "NativeIO API: close()."
- ],
- [
- "global",
- "window,worker"
+ "concurrent_io_read_async.tentative.https.any.js": [
+ "0cc4ad3e930bbe9de379af308939ad329a2af75e",
+ [
+ "native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while read is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
]
- ]
- }
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while read is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while read is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while read is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ]
],
- [
- "native-io/concurrent_io_async.tentative.https.any.worker.html",
- {
- "script_metadata": [
- [
- "title",
- "NativeIO API: close()."
- ],
- [
- "global",
- "window,worker"
+ "concurrent_io_write_async.tentative.https.any.js": [
+ "0deb7652ee7f0a17693310443265b3a2d8d3a9b4",
+ [
+ "native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while write is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
]
- ]
- }
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while write is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while write is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "NativeIO API: Concurrent IO while write is resolving."
+ ],
+ [
+ "global",
+ "window,worker"
+ ],
+ [
+ "script",
+ "operation_helpers.js"
+ ],
+ [
+ "script",
+ "../resources/support.js"
+ ]
+ ]
+ }
+ ]
]
- ],
+ },
"delete_async_basic.tentative.https.any.js": [
"1229ecf0f3db12bd32e50b8490eaeabd7069f1e6",
[
@@ -480597,6 +481650,87 @@
]
}
]
+ ],
+ "write_getLength_async_basic.tentative.https.any.js": [
+ "bf886cca3973087527ef6eb747794d7dba72c28b",
+ [
+ "native-io/write_getLength_async_basic.tentative.https.any.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Synchronous NativeIO API: getLength reports written bytes."
+ ],
+ [
+ "global",
+ "window,worker"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/write_getLength_async_basic.tentative.https.any.serviceworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Synchronous NativeIO API: getLength reports written bytes."
+ ],
+ [
+ "global",
+ "window,worker"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/write_getLength_async_basic.tentative.https.any.sharedworker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Synchronous NativeIO API: getLength reports written bytes."
+ ],
+ [
+ "global",
+ "window,worker"
+ ]
+ ]
+ }
+ ],
+ [
+ "native-io/write_getLength_async_basic.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Synchronous NativeIO API: getLength reports written bytes."
+ ],
+ [
+ "global",
+ "window,worker"
+ ]
+ ]
+ }
+ ]
+ ],
+ "write_getLength_sync_basic.tentative.https.any.js": [
+ "e0fead326a5718af1acb3cb2b37f587b7dc0042b",
+ [
+ "native-io/write_getLength_sync_basic.tentative.https.any.worker.html",
+ {
+ "script_metadata": [
+ [
+ "title",
+ "Synchronous NativeIO API: getLength reports written bytes."
+ ],
+ [
+ "global",
+ "dedicatedworker"
+ ]
+ ]
+ }
+ ]
]
},
"navigation-timing": {
@@ -481679,6 +482813,62 @@
{}
]
],
+ "navigation-parent-no-1-same-no-2-ports-yes.sub.https.html": [
+ "dc449e22509b41d89bce9e71bce65c605299280e",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigation-parent-no-1-same-no-2-subdomain-yes.sub.https.html": [
+ "6815aa97a6530c56d14aa354d1a6bb1beedafc0f",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigation-parent-no-1-subdomain-no-2-subdomain-yes.sub.https.html": [
+ "2887ea85f6058771e15aa9ca422188b7e4406cd3",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigation-parent-no-1-subdomain-no-2-subdomain2-yes.sub.https.html": [
+ "cd01f969d4f4030f8f2fcbda0edfae8127513371",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigation-parent-no-1-subdomain-yes-2-subdomain-no.sub.https.html": [
+ "245a833192e68d5c61ee3bd2846aa0eebd92055a",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigation-parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html": [
+ "a4ee8e1f927c0ac62d007b1313e4a7a5d49455e6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigation-parent-yes-1-same-no-2-ports-no.sub.https.html": [
+ "9b554c3cecfc9db497c2b0cc0fc567dda31e7443",
+ [
+ null,
+ {}
+ ]
+ ],
+ "navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html": [
+ "07a6b01d9f0699e4107eb7f6fce263da734e3df5",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-no-child-bad-subdomain.sub.https.html": [
"cfa39aaee034b0fe5e680e4f796a35d25a1e9a0a",
[
@@ -481686,6 +482876,13 @@
{}
]
],
+ "parent-no-child-yes-ports.sub.https.html": [
+ "e203d0c3c67b6ff9300fef7f0296bcabf4c57119",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-no-child-yes-same.sub.https.html": [
"ece3b9732a5acbfaa22178404683999f8f0f9dc0",
[
@@ -481714,6 +482911,13 @@
{}
]
],
+ "parent-no-child1-no-child2-yes-children-ports.sub.https.html": [
+ "f5de8877f675645748eae5deb187472901cb0f7a",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-no-child1-no-child2-yes-children-same.sub.https.html": [
"17b82bc09df5cbe5c10a25099a99f04a45128c38",
[
@@ -481728,6 +482932,20 @@
{}
]
],
+ "parent-no-child1-yes-child2-no-not-subdomain.sub.https.html": [
+ "7b7b2a2f191d0bb629e9e64fc4cd11b7f267bc70",
+ [
+ null,
+ {}
+ ]
+ ],
+ "parent-yes-child-no-ports.sub.https.html": [
+ "a33dcd25ee38b6e0a8a69c232a9862e68dc32fdc",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-yes-child-no-same.sub.https.html": [
"7edebe9bd88d96be9552a2a514653a35940f1eac",
[
@@ -481742,6 +482960,13 @@
{}
]
],
+ "parent-yes-child-yes-ports.sub.https.html": [
+ "d20bd347a5125370e86f305cd5b0c723f38e1977",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-yes-child-yes-same.sub.https.html": [
"c4917819617fc9f99a306c75b070299bab8f6302",
[
@@ -481777,6 +483002,13 @@
{}
]
],
+ "parent-yes-child1-no-child2-yes-children-ports.sub.https.html": [
+ "230162471cf76c24e516fbd66d31d4863132a683",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-yes-child1-no-child2-yes-children-same.sub.https.html": [
"dc157a9eef9125fd9bd66171b1e10045a9ee0e7a",
[
@@ -481791,6 +483023,13 @@
{}
]
],
+ "parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html": [
+ "784e100f617615c8b9f2b2570b476567d475b6d8",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-yes-child1-yes-child2-yes-children-different.sub.https.html": [
"2c1f1341df5187bdd294ef9727cb190265898c48",
[
@@ -481798,6 +483037,13 @@
{}
]
],
+ "parent-yes-child1-yes-child2-yes-children-ports.sub.https.html": [
+ "bf8731663bec8bfddf026bbedfb71281ebd7ee48",
+ [
+ null,
+ {}
+ ]
+ ],
"parent-yes-child1-yes-child2-yes-children-same.sub.https.html": [
"2de08307fcb79f843a20d48f8a78e974a61345b9",
[
@@ -482228,28 +483474,28 @@
},
"paint-timing": {
"basetest.html": [
- "1c875984598024a7d483486e102e91a71b37132f",
+ "759dfaa97a5fd24ec9df82fabed858ff826384b2",
[
null,
{}
]
],
"border-image.html": [
- "636874817670489a47f23d0936a6a37dd5189594",
+ "4614fecd2101c8457722e8b65a7ba39f1cf2eff6",
[
null,
{}
]
],
"buffered-flag.window.js": [
- "b3a6a6374c70badf103ced74de9b4c54d47da672",
+ "0b7c8bea2e42ea54acc4e24f0ca548b51dea567d",
[
"paint-timing/buffered-flag.window.html",
{}
]
],
"child-painting-first-image.html": [
- "a7ed2c6f10111911fa4205c4f3a7c0143adfbeac",
+ "38cf499ccaf8a5da96424c17dba675cbd5eff6e8",
[
null,
{}
@@ -482278,14 +483524,14 @@
]
],
"fcp-canvas-context.html": [
- "077c1aa3ddc3c415a12ff2055394d24d4dc30cc8",
+ "726e4516ee7838bd6b3840dfbb6c2e76d877c9f3",
[
null,
{}
]
],
"fcp-gradient.html": [
- "b9f86d8dd7381cf07f6d20515313240e93729167",
+ "c1e147472ff076cb2aa72b7dfc45cd6d3a00ed34",
[
null,
{}
@@ -482397,7 +483643,7 @@
]
],
"fcp-text-input.html": [
- "0b7e568359fc382c8ed6c18216e334abcd05958d",
+ "e50449abbe912ee271bef3538854bec363c11b51",
[
null,
{}
@@ -482411,14 +483657,14 @@
]
],
"fcp-video-frame.html": [
- "9089883cdfbd0a836a3211e24a0208dd5edf0ee9",
+ "c54648f0010933945563f83ac732ebbaad51cbac",
[
null,
{}
]
],
"fcp-video-poster.html": [
- "eb9b1399b52f50dbcf99639d50db5ad153d7e33a",
+ "e7eeee3f12fd0b984e6c324ee05574328d29d009",
[
null,
{}
@@ -482432,7 +483678,7 @@
]
],
"fcp-with-rtl.html": [
- "e9fc2857832b83fdd191697c5aa37c9140763447",
+ "5541fcbc7235e278ae5e01302eeee88f0e1da63a",
[
null,
{}
@@ -482440,42 +483686,42 @@
]
},
"first-contentful-bg-image.html": [
- "3da3d2553ee81d65c2b9540d49f8ac8352d41e8d",
+ "00224b33ec9ecd2d15ee41c5ff609ad44592dff7",
[
null,
{}
]
],
"first-contentful-canvas.html": [
- "667591cfe363ec4e677b6f808f63790178f9a354",
+ "e6a4365b760c7126be458c505a49ef1ea7234d53",
[
null,
{}
]
],
"first-contentful-image.html": [
- "5c29bfe070f5144fbd3f52c3e049486fd611ebef",
+ "18abfe731d6bbfe27fb738331ae3137ebaf47a23",
[
null,
{}
]
],
"first-contentful-paint.html": [
- "de2ac0352328bb007ccac39756578ca4e91db9f2",
+ "a93f1b73263efb7a57e1e8be3145d5aee85b9646",
[
null,
{}
]
],
"first-contentful-svg.html": [
- "9909ec659eff2a110f8ff7d8e867509913bf6d60",
+ "c68e72c01065310f2d23bba3154dd49cd9c9482c",
[
null,
{}
]
],
"first-image-child.html": [
- "9b48ff89056cf261a5e469e42569d8df726845b5",
+ "d707d437b61457679ff890a6dfb71c2133416298",
[
null,
{
@@ -482484,14 +483730,14 @@
]
],
"first-paint-bg-color.html": [
- "21271da4cefba4fe06611ec345372d8477ee806c",
+ "a4f799045f1c6430a37a0e091cf613193a82c163",
[
null,
{}
]
],
"first-paint-only.html": [
- "99f41f97b175cc55d29628d0e9f052a7b5b581e3",
+ "473b1aa121d37815360bd0d49729c16971189dd6",
[
null,
{}
@@ -482516,35 +483762,35 @@
]
],
"input-text.html": [
- "e55c8d2d4747c1507636e6bfcd51158f37767522",
+ "da1e0e837678cd12656ba453bc42c63eb332e2c3",
[
null,
{}
]
],
"mask-image.html": [
- "35a6213f6ff817a1e8540f0663d9b8fc9f0eaa18",
+ "d022f43039f00ddc629aaa503d03931caab4a315",
[
null,
{}
]
],
"paint-visited.html": [
- "d611197b28873b2a549dd4c90220be5d1f5af92b",
+ "c02ea2405258f34df3c88b17e4b6d383913ed8f9",
[
null,
{}
]
],
"replaced-content-image.html": [
- "244833ffdd07a67993b81d974254a1958dd28901",
+ "b3199aa0f6d54cc102ed5262c71021e232816ccc",
[
null,
{}
]
],
"sibling-painting-first-image.html": [
- "d8fec53047f91ec20faa4a6959f580d3643794c3",
+ "266d5d7af3248d086bb4e903bd8edbb768ca29b2",
[
null,
{}
@@ -483879,7 +485125,7 @@
]
],
"idlharness.window.js": [
- "c74894a45f438dc493fefbec24df65acc0d6c261",
+ "89775884788d071f2b5ca6199a118fa429fee491",
[
"picture-in-picture/idlharness.window.html",
{
@@ -484967,6 +486213,15 @@
{}
]
],
+ "portal-activate-default.html": [
+ "b1a8feb1f4de4936f3c8b5b21a9629a5da02a0a2",
+ [
+ null,
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"portal-activate-event-constructor.html": [
"1931e8fc8652d6f45c9a8909f2b9a2f004ae0fc4",
[
@@ -485075,7 +486330,7 @@
]
],
"portals-focus.sub.html": [
- "ccbac7db906054b4914f179f1a9aadcbd6960cc3",
+ "168e74aa9c816ef56c4618b34e5fe01370b3cb6c",
[
null,
{
@@ -496195,7 +497450,7 @@
]
],
"svg.html": [
- "b05a10c82e8054d2ade6b0b0e86317660086d283",
+ "8a6def18964946695448a86cb820992138ffb1c3",
[
null,
{}
@@ -497244,8 +498499,64 @@
{}
]
],
+ "at-scroll-timeline-before-phase.html": [
+ "878f9def212b2d1c8d4a0e6d22f515d60b30a4da",
+ [
+ null,
+ {}
+ ]
+ ],
+ "at-scroll-timeline-cascade.html": [
+ "7103491c0d0fcc557e37ea5e82ea22f56d63c5a8",
+ [
+ null,
+ {}
+ ]
+ ],
+ "at-scroll-timeline-inactive-phase.html": [
+ "a8db8e63238bc3f547094733e302a659646eefde",
+ [
+ null,
+ {}
+ ]
+ ],
+ "at-scroll-timeline-orientation.html": [
+ "2c76f7a111769e09dd9593219281393fffa84e38",
+ [
+ null,
+ {}
+ ]
+ ],
+ "at-scroll-timeline-sampling.html": [
+ "474364f38fd97fa8f3fd9654cfe72225c9befbb6",
+ [
+ null,
+ {}
+ ]
+ ],
+ "at-scroll-timeline-source.html": [
+ "f2c50a1cd3826e45f7d9609c01085619da435140",
+ [
+ null,
+ {}
+ ]
+ ],
+ "at-scroll-timeline-start-end.html": [
+ "fbe53d0fc0cf8716c0582c422e5b0560cd242b33",
+ [
+ null,
+ {}
+ ]
+ ],
+ "at-scroll-timeline-time-range.html": [
+ "407e17f0748714951e97d1bea0e5e709040c5955",
+ [
+ null,
+ {}
+ ]
+ ],
"scroll-timeline-cssom.tentative.html": [
- "36fcbf704bd9ef50e6449135abaed9b97f3e727a",
+ "09ec90a04493c69d93c07a38e116150923582ffc",
[
null,
{}
@@ -500299,7 +501610,7 @@
]
],
"declarative-shadow-dom-attachment.tentative.html": [
- "33997b09ab74b7f3f52697e2c3387798aa96a182",
+ "1e1ac7a0561f639bce325224ab512233f32cf0ba",
[
null,
{}
@@ -500313,7 +501624,7 @@
]
],
"getinnerhtml.tentative.html": [
- "a1ac08ee1bacd11908f5f8928d8d45ef956597c1",
+ "2f8ecad418b818f35220550479f9c02e1889744e",
[
null,
{}
@@ -518436,13 +519747,6 @@
{}
]
],
- "audiobuffersource-duration-loop.html": [
- "faa70e11c4774991061e1d85a4a4b774e7368f5a",
- [
- null,
- {}
- ]
- ],
"audiobuffersource-ended.html": [
"b9922f61ef399bf558a2f6d3c61154b9f14a512f",
[
@@ -519663,6 +520967,13 @@
null,
{}
]
+ ],
+ "osc-basic-waveform.html": [
+ "bebcc6abc43779569c47c8f02866a610295e8ee1",
+ [
+ null,
+ {}
+ ]
]
},
"the-pannernode-interface": {
@@ -527858,8 +529169,36 @@
},
"webxr": {
"anchors": {
+ "ar_anchor_freefloating_create_move.https.html": [
+ "af1898cac2eba38a8b769621708cbc95772c8a2b",
+ [
+ null,
+ {}
+ ]
+ ],
+ "ar_anchor_freefloating_delay_creation.https.html": [
+ "a2f438781813e963e829f224a4f79ee6aeb0d46f",
+ [
+ null,
+ {}
+ ]
+ ],
+ "ar_anchor_freefloating_failure.https.html": [
+ "1625538d7542965f07a19eb534fdb31b1fb49082",
+ [
+ null,
+ {}
+ ]
+ ],
+ "ar_anchor_freefloating_pause_resume_stop.https.html": [
+ "d3cc4c72dd2e88016abe7afabe3e5abd12b91019",
+ [
+ null,
+ {}
+ ]
+ ],
"ar_anchor_states.https.html": [
- "06bc6798839a5eff01792325d8a5c90921f6c2e3",
+ "1872cf527b8b5ec1f25d044b8021f5b75ea9e4a6",
[
null,
{}
@@ -528290,13 +529629,6 @@
{}
]
],
- "xrInputSourceArray_iterable.html": [
- "de784d5d1a60fc15c0bea92e65a8a2a3ef0acf97",
- [
- null,
- {}
- ]
- ],
"xrInputSource_add_remove.https.html": [
"7764017910d2e5ada78febe954e9543aca89226b",
[
@@ -555148,7 +556480,16 @@
null,
{}
]
- ]
+ ],
+ "image-orientation": {
+ "image-orientation-cursor.html": [
+ "00a80d46ba9f384ec3ff907c3501d000eb6d29b2",
+ [
+ null,
+ {}
+ ]
+ ]
+ }
},
"css-lists": {
"change-list-style-type.html": [
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini
deleted file mode 100644
index 4bfb0c2053a..00000000000
--- a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[hit-test-floats-004.html]
- [Miss float below something else]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/css-color/system-color-compute.html.ini b/tests/wpt/metadata/css/css-color/system-color-compute.html.ini
new file mode 100644
index 00000000000..b1408cd97b6
--- /dev/null
+++ b/tests/wpt/metadata/css/css-color/system-color-compute.html.ini
@@ -0,0 +1,4 @@
+[system-color-compute.html]
+ [color-scheme property affects Menu system color keyword]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-flexbox/dynamic-grid-flex-abspos.html.ini b/tests/wpt/metadata/css/css-flexbox/dynamic-grid-flex-abspos.html.ini
new file mode 100644
index 00000000000..6205691956d
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/dynamic-grid-flex-abspos.html.ini
@@ -0,0 +1,7 @@
+[dynamic-grid-flex-abspos.html]
+ [.relpos 4]
+ expected: FAIL
+
+ [.relpos 8]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-flexbox/percentage-max-height-002.html.ini b/tests/wpt/metadata/css/css-flexbox/percentage-max-height-002.html.ini
new file mode 100644
index 00000000000..fa77972eac5
--- /dev/null
+++ b/tests/wpt/metadata/css/css-flexbox/percentage-max-height-002.html.ini
@@ -0,0 +1,2 @@
+[percentage-max-height-002.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini
index 4956456d560..629775a78af 100644
--- a/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini
+++ b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-computed.html.ini
@@ -23,3 +23,9 @@
[Property font-variation-settings value '"XHGT" calc(0.4 + 0.3)']
expected: FAIL
+ [Property font-variation-settings value '"wght" 700, "wght" 500' duplicate values should be removed, keeping the rightmost occurrence.]
+ expected: FAIL
+
+ [Property font-variation-settings value '"AB@D" 0.5']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini
index 5f9f7973d1d..1c06862e689 100644
--- a/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini
+++ b/tests/wpt/metadata/css/css-fonts/parsing/font-variation-settings-valid.html.ini
@@ -14,3 +14,9 @@
[e.style['font-variation-settings'\] = "\\"wght\\" 700, \\"XHGT\\" 0.7" should set the property value]
expected: FAIL
+ [e.style['font-variation-settings'\] = "'wght' 1e3, 'slnt' -450.0e-1" should set the property value]
+ expected: FAIL
+
+ [e.style['font-variation-settings'\] = "'wght' 700" should set the property value]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-fonts/variations/font-variation-settings-parsing.html.ini b/tests/wpt/metadata/css/css-fonts/variations/font-variation-settings-parsing.html.ini
deleted file mode 100644
index cb5e9f3568a..00000000000
--- a/tests/wpt/metadata/css/css-fonts/variations/font-variation-settings-parsing.html.ini
+++ /dev/null
@@ -1,70 +0,0 @@
-[font-variation-settings-parsing.html]
- [Property value: Axis tag with valid non-letter ascii characters]
- expected: FAIL
-
- [Property value: Invalid character below allowed range (first char)]
- expected: FAIL
-
- [Property value: Invalid character above allowed range (mid char)]
- expected: FAIL
-
- [Property value: Axis values in scientific form are valid]
- expected: FAIL
-
- [Property value: 'normal' value is valid]
- expected: FAIL
-
- [Property value: Tag with less than 4 characters is invalid]
- expected: FAIL
-
- [Property value: Tag with more than 4 characters is invalid]
- expected: FAIL
-
- [Property value: Trailing comma is invalid]
- expected: FAIL
-
- [Property value: Unquoted tags are invalid]
- expected: FAIL
-
- [Property value: Unmatched quotes around tag are invalid]
- expected: FAIL
-
- [Property value: Tag without value isinvalid]
- expected: FAIL
-
- [Property value: Value without tag is invalid]
- expected: FAIL
-
- [Property value: Value before tag is invalid]
- expected: FAIL
-
- [Property value: Missing comma between axes is invalid]
- expected: FAIL
-
- [Property value: Calculations should be supported]
- expected: FAIL
-
- [Property value: Units should not be supported]
- expected: FAIL
-
- [Property value: Units should not be supported (in calc)]
- expected: FAIL
-
- [Property value: Percentages should not be supported]
- expected: FAIL
-
- [Property value: Percentages should not be supported (in calc)]
- expected: FAIL
-
- [@supports: Axis tag with valid non-letter ascii characters]
- expected: FAIL
-
- [@supports: Axis values in scientific form are valid]
- expected: FAIL
-
- [@supports: 'normal' value is valid]
- expected: FAIL
-
- [@supports: Calculations should be supported]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-100.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-100.html.ini
new file mode 100644
index 00000000000..f29c7ce67c8
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-100.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-100.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-101.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-101.html.ini
new file mode 100644
index 00000000000..105e019839b
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-101.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-101.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-102.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-102.html.ini
new file mode 100644
index 00000000000..780ae75d22c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-102.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-102.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-103.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-103.html.ini
new file mode 100644
index 00000000000..feb4120085f
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-103.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-103.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-104.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-104.html.ini
new file mode 100644
index 00000000000..d5abf4a4388
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-104.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-104.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-105.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-105.html.ini
new file mode 100644
index 00000000000..2d1ed90756c
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-105.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-105.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-106.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-106.html.ini
new file mode 100644
index 00000000000..9f666bb8923
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-106.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-106.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-112.html.ini b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-112.html.ini
new file mode 100644
index 00000000000..1a4d3f7c2c9
--- /dev/null
+++ b/tests/wpt/metadata/css/css-text/letter-spacing/letter-spacing-112.html.ini
@@ -0,0 +1,2 @@
+[letter-spacing-112.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata/css/css-transitions/transition-duration-shorthand.html.ini b/tests/wpt/metadata/css/css-transitions/transition-duration-shorthand.html.ini
new file mode 100644
index 00000000000..7d363f15d45
--- /dev/null
+++ b/tests/wpt/metadata/css/css-transitions/transition-duration-shorthand.html.ini
@@ -0,0 +1,4 @@
+[transition-duration-shorthand.html]
+ [transition-duration when looking at shorthand properties should be correct]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini b/tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini
new file mode 100644
index 00000000000..dd01fab5f42
--- /dev/null
+++ b/tests/wpt/metadata/css/cssom/CSSStyleSheet-modify-after-removal.html.ini
@@ -0,0 +1,7 @@
+[CSSStyleSheet-modify-after-removal.html]
+ [Modify sheet from removed iframe]
+ expected: FAIL
+
+ [Modify constructed sheet from removed iframe]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
index 1b48648b68e..633e9cff9d1 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -315,15 +315,9 @@
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL
- [<iframe>: combined response Content-Type: text/html;" text/plain]
- expected: FAIL
-
[<iframe>: separate response Content-Type: text/plain */*]
expected: FAIL
- [<iframe>: separate response Content-Type: text/html */*;charset=gbk]
- expected: FAIL
-
[<iframe>: separate response Content-Type: text/html */*]
expected: FAIL
@@ -333,3 +327,9 @@
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
+ [<iframe>: separate response Content-Type: text/html;x=" text/plain]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/html;" \\" text/plain]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
index 58de838d890..70efd28ddfc 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,6 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
expected: FAIL
- [X-Content-Type-Options%3A%20%22nosniFF%22]
+ [X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
deleted file mode 100644
index 87b07c3e670..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_1.html]
- [Multiple history traversals from the same task]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
new file mode 100644
index 00000000000..385376c7321
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini
@@ -0,0 +1,4 @@
+[traverse_the_history_4.html]
+ [Multiple history traversals, last would be aborted]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
index 6b68e9094e4..d1ca01ebc5f 100644
--- a/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
+++ b/tests/wpt/metadata/html/interaction/focus/the-autofocus-attribute/supported-elements.html.ini
@@ -1,4 +1,5 @@
[supported-elements.html]
+ expected: TIMEOUT
[Contenteditable element should support autofocus]
expected: FAIL
@@ -9,7 +10,7 @@
expected: FAIL
[Area element should support autofocus]
- expected: FAIL
+ expected: TIMEOUT
[Host element with delegatesFocus should support autofocus]
expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
index fc37df7e3fa..2a166bb97b7 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
@@ -1,6 +1,6 @@
[iframe_sandbox_popups_escaping-1.html]
type: testharness
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
index f6a7aca3306..5f60c78e73c 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -1,5 +1,6 @@
[iframe_sandbox_popups_escaping-3.html]
type: testharness
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
- expected: FAIL
+ expected: TIMEOUT
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 963d4cd20ef..9df1ac56f2a 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,6 +1,6 @@
[iframe_sandbox_popups_nonescaping-1.html]
type: testharness
- expected: CRASH
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
index d43f38b40cd..45d8be1c898 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -1,6 +1,6 @@
[iframe_sandbox_popups_nonescaping-2.html]
type: testharness
- expected: TIMEOUT
+ expected: CRASH
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini
new file mode 100644
index 00000000000..9f416703229
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini
@@ -0,0 +1,4 @@
+[form-double-submit-3.html]
+ [<button> should have the same double-submit protection as <input type=submit>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit.html.ini
new file mode 100644
index 00000000000..b193c33c2b6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit.html.ini
@@ -0,0 +1,4 @@
+[form-double-submit.html]
+ [default submit action should supersede onclick submit()]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-classic.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-classic.html.ini
deleted file mode 100644
index 0d96b3da42f..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-classic.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[no-active-script-manual-classic.html]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-module.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-module.html.ini
deleted file mode 100644
index 84452ca39e0..00000000000
--- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-module.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[no-active-script-manual-module.html]
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini
new file mode 100644
index 00000000000..cc188ee4006
--- /dev/null
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html.ini
@@ -0,0 +1,7 @@
+[osc-basic-waveform.html]
+ [Executing "Test 5"]
+ expected: FAIL
+
+ [Executing "Test 4"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini b/tests/wpt/metadata/webmessaging/with-ports/017.html.ini
index 064cf47545b..064cf47545b 100644
--- a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini
+++ b/tests/wpt/metadata/webmessaging/with-ports/017.html.ini
diff --git a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini b/tests/wpt/metadata/webmessaging/without-ports/018.html.ini
new file mode 100644
index 00000000000..663a1f8fa30
--- /dev/null
+++ b/tests/wpt/metadata/webmessaging/without-ports/018.html.ini
@@ -0,0 +1,5 @@
+[018.html]
+ expected: TIMEOUT
+ [origin of the script that invoked the method, javascript:]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini
new file mode 100644
index 00000000000..70d9b449e7a
--- /dev/null
+++ b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini
@@ -0,0 +1,4 @@
+[ar_anchor_freefloating_create_move.https.html]
+ [Ensures free-floating anchor move gets propagated to anchor poses]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini
new file mode 100644
index 00000000000..9230c90b6d2
--- /dev/null
+++ b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini
@@ -0,0 +1,7 @@
+[ar_anchor_freefloating_delay_creation.https.html]
+ [Ensures free-floating anchor creation with delayed failure is handled correctly]
+ expected: FAIL
+
+ [Ensures free-floating anchor creation with delayed success is handled correctly]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini
new file mode 100644
index 00000000000..a35e5ba16b8
--- /dev/null
+++ b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini
@@ -0,0 +1,4 @@
+[ar_anchor_freefloating_failure.https.html]
+ [Ensures free-floating anchor creation failure is handled correctly]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini
new file mode 100644
index 00000000000..85cc42a65b0
--- /dev/null
+++ b/tests/wpt/metadata/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini
@@ -0,0 +1,4 @@
+[ar_anchor_freefloating_pause_resume_stop.https.html]
+ [Ensures free-floating anchor state changes get propagated]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini b/tests/wpt/metadata/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini
new file mode 100644
index 00000000000..4718874f28d
--- /dev/null
+++ b/tests/wpt/metadata/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini
@@ -0,0 +1,4 @@
+[xrDevice_requestSession_immersive-ar.https.html]
+ [Tests requestSession accepts immersive-ar mode]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini b/tests/wpt/metadata/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
index 76f40939f59..c5f3f7a9ff1 100644
--- a/tests/wpt/metadata/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
+++ b/tests/wpt/metadata/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
@@ -2,3 +2,6 @@
[Tests environmentBlendMode for an AR device]
expected: FAIL
+ [Tests environmentBlendMode for a VR device]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/dom-overlay/ar_dom_overlay.https.html.ini b/tests/wpt/metadata/webxr/dom-overlay/ar_dom_overlay.https.html.ini
index 5e168fd4be5..224197c5a20 100644
--- a/tests/wpt/metadata/webxr/dom-overlay/ar_dom_overlay.https.html.ini
+++ b/tests/wpt/metadata/webxr/dom-overlay/ar_dom_overlay.https.html.ini
@@ -1,5 +1,4 @@
[ar_dom_overlay.https.html]
- expected: ERROR
[Ensures DOM Overlay element selection works]
expected: FAIL
@@ -7,7 +6,7 @@
expected: FAIL
[Ensures DOM Overlay input deduplication works]
- expected: TIMEOUT
+ expected: FAIL
[Ensures DOM Overlay feature works for immersive-ar, body element]
expected: FAIL
@@ -16,11 +15,11 @@
expected: FAIL
[Ensures DOM Overlay Fullscreen API doesn't change DOM overlay]
- expected: NOTRUN
+ expected: FAIL
[Ensures DOM Overlay feature works for immersive-ar, div element]
expected: FAIL
[Ensures DOM Overlay interactions on cross origin iframe are ignored]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini b/tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini
new file mode 100644
index 00000000000..976a3ad323d
--- /dev/null
+++ b/tests/wpt/metadata/webxr/events_input_source_recreation.https.html.ini
@@ -0,0 +1,4 @@
+[events_input_source_recreation.https.html]
+ [Input sources are re-created when handedness or target ray mode changes]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/events_session_select.https.html.ini b/tests/wpt/metadata/webxr/events_session_select.https.html.ini
new file mode 100644
index 00000000000..59dac282700
--- /dev/null
+++ b/tests/wpt/metadata/webxr/events_session_select.https.html.ini
@@ -0,0 +1,4 @@
+[events_session_select.https.html]
+ [XRInputSources primary input presses properly fires off the right events]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini b/tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini
new file mode 100644
index 00000000000..d2dbc3fef51
--- /dev/null
+++ b/tests/wpt/metadata/webxr/events_session_select_subframe.https.html.ini
@@ -0,0 +1,4 @@
+[events_session_select_subframe.https.html]
+ [Ensures that an XRInputSources primary input being pressed and released in the space of a single frame properly fires off the right events]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/events_session_squeeze.https.html.ini b/tests/wpt/metadata/webxr/events_session_squeeze.https.html.ini
index 63b20530a3f..9e8141bb04b 100644
--- a/tests/wpt/metadata/webxr/events_session_squeeze.https.html.ini
+++ b/tests/wpt/metadata/webxr/events_session_squeeze.https.html.ini
@@ -1,5 +1,4 @@
[events_session_squeeze.https.html]
- expected: ERROR
[XRInputSources primary input presses properly fires off the right events]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini b/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
index 21d7102822a..3735666ae5e 100644
--- a/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
+++ b/tests/wpt/metadata/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
@@ -1,5 +1,4 @@
[xrInputSource_gamepad_input_registered.https.html]
- expected: ERROR
[WebXR InputSource's gamepad properly registers input]
expected: FAIL
diff --git a/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini b/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini
new file mode 100644
index 00000000000..0f61faf25dc
--- /dev/null
+++ b/tests/wpt/metadata/webxr/getInputPose_handedness.https.html.ini
@@ -0,0 +1,4 @@
+[getInputPose_handedness.https.html]
+ [XRInputSources properly communicate their handedness]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/getInputPose_pointer.https.html.ini b/tests/wpt/metadata/webxr/getInputPose_pointer.https.html.ini
new file mode 100644
index 00000000000..c7ab709ce6d
--- /dev/null
+++ b/tests/wpt/metadata/webxr/getInputPose_pointer.https.html.ini
@@ -0,0 +1,4 @@
+[getInputPose_pointer.https.html]
+ [XRInputSources with a target ray mode of 'tracked-pointer' properly communicate their poses]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini b/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
index eca12b3d24c..6c0ff688564 100644
--- a/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
+++ b/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
@@ -8,3 +8,6 @@
[Ensures subscription to hit test works with local-floor space]
expected: FAIL
+ [Ensures subscription to hit test works with viewer space - straight up - no results]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini b/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini
new file mode 100644
index 00000000000..c82ddf9b4af
--- /dev/null
+++ b/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini
@@ -0,0 +1,10 @@
+[ar_hittest_subscription_states_regular.https.html]
+ [Hit test subscription succeeds if the feature was requested]
+ expected: FAIL
+
+ [Hit test subscription fails if the feature was not requested]
+ expected: FAIL
+
+ [Hit test subscription fails if the feature was requested but the session already ended]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini b/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
index 95708a29336..77ee3e16b32 100644
--- a/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
+++ b/tests/wpt/metadata/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
@@ -1,11 +1,10 @@
[ar_hittest_subscription_transientInputSources.https.html]
- expected: ERROR
[Ensures subscription to transient hit test works with an XRSpace from input source - after move - 1 result]
- expected: NOTRUN
+ expected: FAIL
[Ensures subscription to transient hit test works with an XRSpace from input source - after move - no results]
- expected: NOTRUN
+ expected: FAIL
[Ensures subscription to transient hit test works with an XRSpace from input source - no move]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/navigator_xr_sameObject.https.html.ini b/tests/wpt/metadata/webxr/navigator_xr_sameObject.https.html.ini
new file mode 100644
index 00000000000..b9fb8d94210
--- /dev/null
+++ b/tests/wpt/metadata/webxr/navigator_xr_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[navigator_xr_sameObject.https.html]
+ [Navigator.xr meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/render_state_vertical_fov_immersive.https.html.ini b/tests/wpt/metadata/webxr/render_state_vertical_fov_immersive.https.html.ini
new file mode 100644
index 00000000000..2ae6711642c
--- /dev/null
+++ b/tests/wpt/metadata/webxr/render_state_vertical_fov_immersive.https.html.ini
@@ -0,0 +1,4 @@
+[render_state_vertical_fov_immersive.https.html]
+ [inlineVerticalFieldOfView is set appropriately on immersively sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/render_state_vertical_fov_inline.https.html.ini b/tests/wpt/metadata/webxr/render_state_vertical_fov_inline.https.html.ini
new file mode 100644
index 00000000000..d9762ab91bc
--- /dev/null
+++ b/tests/wpt/metadata/webxr/render_state_vertical_fov_inline.https.html.ini
@@ -0,0 +1,4 @@
+[render_state_vertical_fov_inline.https.html]
+ [inlineVerticalFieldOfView is set appropriately on inline sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
index 27f6c5ed7a2..febd879d9a0 100644
--- a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini
@@ -1,5 +1,4 @@
[xrBoundedReferenceSpace_updates.https.html]
- expected: ERROR
['XRBoundedReferenceSpace updates properly when the changes are applied]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini b/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini
index 36724622cc6..adfe53ea1b6 100644
--- a/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini
@@ -1,5 +1,4 @@
[xrDevice_disconnect_ends.https.html]
- expected: TIMEOUT
[Immersive session ends when device is disconnected]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/xrDevice_requestSession_immersive.https.html.ini b/tests/wpt/metadata/webxr/xrDevice_requestSession_immersive.https.html.ini
new file mode 100644
index 00000000000..1feed04bc79
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrDevice_requestSession_immersive.https.html.ini
@@ -0,0 +1,10 @@
+[xrDevice_requestSession_immersive.https.html]
+ [Tests requestSession ignores unknown optionalFeatures]
+ expected: FAIL
+
+ [Tests requestSession accepts XRSessionInit dictionary]
+ expected: FAIL
+
+ [Tests requestSession resolves when supported]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini b/tests/wpt/metadata/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
index 4e60af060a6..47bd754530f 100644
--- a/tests/wpt/metadata/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
@@ -2,3 +2,15 @@
[Tests requestSession ignores unknown optionalFeatures]
expected: FAIL
+ [Tests requestSession ignores unknown objects in optionalFeatures]
+ expected: FAIL
+
+ [Tests requestSession ignores unknown strings in optionalFeatures]
+ expected: FAIL
+
+ [Tests requestSession accepts XRSessionInit dictionary]
+ expected: FAIL
+
+ [Tests requestSession accepts XRSessionInit dictionary with empty feature lists]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrFrame_getPose.https.html.ini b/tests/wpt/metadata/webxr/xrFrame_getPose.https.html.ini
new file mode 100644
index 00000000000..13082ca9797
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrFrame_getPose.https.html.ini
@@ -0,0 +1,7 @@
+[xrFrame_getPose.https.html]
+ [XRFrame.getPose works for immersive sessions]
+ expected: FAIL
+
+ [XRFrame.getPose works for non-immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrFrame_getViewerPose_getPose.https.html.ini b/tests/wpt/metadata/webxr/xrFrame_getViewerPose_getPose.https.html.ini
new file mode 100644
index 00000000000..176132f98c3
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrFrame_getViewerPose_getPose.https.html.ini
@@ -0,0 +1,4 @@
+[xrFrame_getViewerPose_getPose.https.html]
+ [XRFrame getViewerPose(refSpace) matches getPose(viewer, refSpace).]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrFrame_lifetime.https.html.ini b/tests/wpt/metadata/webxr/xrFrame_lifetime.https.html.ini
new file mode 100644
index 00000000000..e6867166ccd
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrFrame_lifetime.https.html.ini
@@ -0,0 +1,7 @@
+[xrFrame_lifetime.https.html]
+ [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for non-immersive sessions]
+ expected: FAIL
+
+ [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrFrame_session_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrFrame_session_sameObject.https.html.ini
new file mode 100644
index 00000000000..b6c20337194
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrFrame_session_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrFrame_session_sameObject.https.html]
+ [XRFrame.session meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini b/tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini
new file mode 100644
index 00000000000..d6125717313
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrInputSource_add_remove.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_add_remove.https.html]
+ [XRInputSources can be properly added and removed from the session]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini b/tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini
new file mode 100644
index 00000000000..3e2806dfae7
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrInputSource_profiles.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_profiles.https.html]
+ [WebXR InputSource's profiles list can be set]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini
new file mode 100644
index 00000000000..980f9d31c32
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrInputSource_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrInputSource_sameObject.https.html]
+ [XRInputSource attributes meet [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini
new file mode 100644
index 00000000000..3e442625aa8
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrPose_transform_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrPose_transform_sameObject.https.html]
+ [XRPose.transform meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrReferenceSpace_originOffset.https.html.ini b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffset.https.html.ini
new file mode 100644
index 00000000000..8ba221772e5
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffset.https.html.ini
@@ -0,0 +1,4 @@
+[xrReferenceSpace_originOffset.https.html]
+ [Updating XRReferenceSpace origin offset updates view and input matrices.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
index 21b3815f4da..a3fb0379bb0 100644
--- a/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
@@ -1,5 +1,4 @@
[xrReferenceSpace_originOffsetBounded.https.html]
- expected: ERROR
[Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry.]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
new file mode 100644
index 00000000000..dd44bffa639
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
@@ -0,0 +1,4 @@
+[xrReferenceSpace_originOffset_viewer.https.html]
+ [Creating XRReferenceSpace origin offset off of `viewer` space works.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrReferenceSpace_relationships.https.html.ini b/tests/wpt/metadata/webxr/xrReferenceSpace_relationships.https.html.ini
index bc5e1b0b573..293a38132c2 100644
--- a/tests/wpt/metadata/webxr/xrReferenceSpace_relationships.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrReferenceSpace_relationships.https.html.ini
@@ -1,5 +1,4 @@
[xrReferenceSpace_relationships.https.html]
- expected: ERROR
[Bounded space, viewer space, local and local-floor space have correct poses w.r.t. each other]
- expected: TIMEOUT
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/xrRigidTransform_constructor.https.html.ini b/tests/wpt/metadata/webxr/xrRigidTransform_constructor.https.html.ini
new file mode 100644
index 00000000000..637e266aaa2
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrRigidTransform_constructor.https.html.ini
@@ -0,0 +1,4 @@
+[xrRigidTransform_constructor.https.html]
+ [XRRigidTransform constructor works]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrRigidTransform_inverse.https.html.ini b/tests/wpt/metadata/webxr/xrRigidTransform_inverse.https.html.ini
new file mode 100644
index 00000000000..8c7f90b61e7
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrRigidTransform_inverse.https.html.ini
@@ -0,0 +1,4 @@
+[xrRigidTransform_inverse.https.html]
+ [XRRigidTransform inverse works]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrRigidTransform_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrRigidTransform_sameObject.https.html.ini
new file mode 100644
index 00000000000..92751e2c79f
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrRigidTransform_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrRigidTransform_sameObject.https.html]
+ [XRRigidTransform position and orientation meet [SameObject\] requirements]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame.https.html.ini b/tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame.https.html.ini
new file mode 100644
index 00000000000..e43f56bd74e
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_cancelAnimationFrame.https.html]
+ [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for non-immersive sessions]
+ expected: FAIL
+
+ [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini b/tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
index eab756254f7..603023c9992 100644
--- a/tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
@@ -1,8 +1,7 @@
[xrSession_cancelAnimationFrame_invalidhandle.https.html]
- expected: TIMEOUT
[XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on immersive testSession]
- expected: TIMEOUT
+ expected: FAIL
[XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on non-immersive testSession]
- expected: NOTRUN
+ expected: FAIL
diff --git a/tests/wpt/metadata/webxr/xrSession_end.https.html.ini b/tests/wpt/metadata/webxr/xrSession_end.https.html.ini
new file mode 100644
index 00000000000..4d09e769ae8
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_end.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_end.https.html]
+ [end event fires when non-immersive session ends]
+ expected: FAIL
+
+ [end event fires when immersive session ends]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini
new file mode 100644
index 00000000000..de062c9f543
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_requestAnimationFrame_callback_calls.https.html]
+ [XRSession requestAnimationFrame calls the provided callback a non-immersive session]
+ expected: FAIL
+
+ [XRSession requestAnimationFrame calls the provided callback for an immersive session]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini
new file mode 100644
index 00000000000..d64bcd941e3
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini
@@ -0,0 +1,4 @@
+[xrSession_requestAnimationFrame_data_valid.https.html]
+ [RequestAnimationFrame resolves with good data]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
new file mode 100644
index 00000000000..5ee23ba9713
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_requestAnimationFrame_getViewerPose.https.html]
+ [XRFrame getViewerPose updates on the next frame for non-immersive sessions]
+ expected: FAIL
+
+ [XRFrame getViewerPose updates on the next frame for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
new file mode 100644
index 00000000000..85fce01757f
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_requestAnimationFrame_timestamp.https.html]
+ [XRFrame getViewerPose updates on the next frame for immersive]
+ expected: FAIL
+
+ [XRFrame getViewerPose updates on the next frame for non-immersive]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_requestReferenceSpace_features.https.html.ini b/tests/wpt/metadata/webxr/xrSession_requestReferenceSpace_features.https.html.ini
new file mode 100644
index 00000000000..84a5e1496a8
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_requestReferenceSpace_features.https.html.ini
@@ -0,0 +1,37 @@
+[xrSession_requestReferenceSpace_features.https.html]
+ [Non-immersive session rejects unbounded space even when requested]
+ expected: FAIL
+
+ [Immersive session supports local space by default]
+ expected: FAIL
+
+ [Non-immersive session supports local-floor space when required]
+ expected: FAIL
+
+ [Immersive session rejects local-floor space if not requested]
+ expected: FAIL
+
+ [Immersive session supports local-floor space when required]
+ expected: FAIL
+
+ [Non-immersive session rejects bounded-floor space even when requested]
+ expected: FAIL
+
+ [Non-immersive session supports local space when optional]
+ expected: FAIL
+
+ [Immersive session supports local-floor space when optional]
+ expected: FAIL
+
+ [Non-immersive session supports local space when required]
+ expected: FAIL
+
+ [Non-immersive session supports viewer space by default]
+ expected: FAIL
+
+ [Non-immersive session rejects local space if not requested]
+ expected: FAIL
+
+ [Immersive session supports viewer space by default]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini
new file mode 100644
index 00000000000..09170ad4d6a
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrSession_sameObject.https.html]
+ [XRSession attributes meet [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrSession_viewer_referenceSpace.https.html.ini b/tests/wpt/metadata/webxr/xrSession_viewer_referenceSpace.https.html.ini
new file mode 100644
index 00000000000..b6af7d5f905
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrSession_viewer_referenceSpace.https.html.ini
@@ -0,0 +1,7 @@
+[xrSession_viewer_referenceSpace.https.html]
+ [Identity reference space provides correct poses for immersive sessions]
+ expected: FAIL
+
+ [Identity reference space provides correct poses for inline sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrView_eyes.https.html.ini b/tests/wpt/metadata/webxr/xrView_eyes.https.html.ini
new file mode 100644
index 00000000000..77bf402064a
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrView_eyes.https.html.ini
@@ -0,0 +1,7 @@
+[xrView_eyes.https.html]
+ [XRView.eye is correct for non-immersive sessions]
+ expected: FAIL
+
+ [XRView.eye is correct for immersive sessions]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrView_match.https.html.ini b/tests/wpt/metadata/webxr/xrView_match.https.html.ini
new file mode 100644
index 00000000000..a767630fd30
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrView_match.https.html.ini
@@ -0,0 +1,4 @@
+[xrView_match.https.html]
+ [XRFrame contains the expected views]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrView_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrView_sameObject.https.html.ini
new file mode 100644
index 00000000000..0bb0534886b
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrView_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrView_sameObject.https.html]
+ [XRView attributes meet [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrViewerPose_views_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrViewerPose_views_sameObject.https.html.ini
new file mode 100644
index 00000000000..376386ed9ea
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrViewerPose_views_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrViewerPose_views_sameObject.https.html]
+ [XRViewerPose.views meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrViewport_valid.https.html.ini b/tests/wpt/metadata/webxr/xrViewport_valid.https.html.ini
new file mode 100644
index 00000000000..7f6950b2cb0
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrViewport_valid.https.html.ini
@@ -0,0 +1,4 @@
+[xrViewport_valid.https.html]
+ [XRViewport attributes are valid]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini b/tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
new file mode 100644
index 00000000000..bf7eed9a971
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
@@ -0,0 +1,4 @@
+[xrWebGLLayer_framebuffer_draw.https.html]
+ [Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini b/tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini
new file mode 100644
index 00000000000..d59b6c7434f
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini
@@ -0,0 +1,4 @@
+[xrWebGLLayer_framebuffer_sameObject.https.html]
+ [XRWebGLLayer.framebuffer meets [SameObject\] requirement]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini b/tests/wpt/metadata/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
new file mode 100644
index 00000000000..63c92e14304
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
@@ -0,0 +1,7 @@
+[xrWebGLLayer_opaque_framebuffer.https.html]
+ [Ensure that the framebuffer given by the WebGL layer is opaque for immersive]
+ expected: FAIL
+
+ [Ensure that the framebuffer given by the WebGL layer is opaque for non-immersive]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webxr/xrWebGLLayer_viewports.https.html.ini b/tests/wpt/metadata/webxr/xrWebGLLayer_viewports.https.html.ini
new file mode 100644
index 00000000000..a489b6968a3
--- /dev/null
+++ b/tests/wpt/metadata/webxr/xrWebGLLayer_viewports.https.html.ini
@@ -0,0 +1,7 @@
+[xrWebGLLayer_viewports.https.html]
+ [XRWebGLLayer reports a valid viewports for inline sessions]
+ expected: FAIL
+
+ [XRWebGLLayer reports a valid viewports for immersive sessions]
+ 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
deleted file mode 100644
index 80f9a4f15b8..00000000000
--- a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[Worker-constructor.html]
- expected: ERROR
diff --git a/tests/wpt/web-platform-tests/.taskcluster.yml b/tests/wpt/web-platform-tests/.taskcluster.yml
index 1716de40cf3..5d431c5ac4a 100644
--- a/tests/wpt/web-platform-tests/.taskcluster.yml
+++ b/tests/wpt/web-platform-tests/.taskcluster.yml
@@ -1,4 +1,5 @@
version: 1
+reporting: checks-v1
policy:
pullRequests: public
tasks:
@@ -56,7 +57,7 @@ tasks:
owner: ${owner}
source: ${event.repository.clone_url}
payload:
- image: webplatformtests/wpt:0.37
+ image: webplatformtests/wpt:0.41
maxRunTime: 7200
artifacts:
public/results:
diff --git a/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py b/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py
index 6fcbe920703..6fcbe920703 100755..100644
--- a/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py
+++ b/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html
new file mode 100644
index 00000000000..7af2b8944e8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-read.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+promise_test(async t => {
+ await test_driver.set_permission({ name: 'clipboard-read' }, 'granted');
+ return promise_rejects_dom(t, 'NotAllowedError',
+ navigator.clipboard.readText('test text'));
+}, 'Feature-Policy header clipboard-read "none" disallows the top-level document.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ same_origin_src,
+ expect_feature_unavailable_default
+ );
+}, 'Feature-Policy header clipboard-read "none" disallows same-origin iframes.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ cross_origin_src,
+ expect_feature_unavailable_default
+ );
+}, 'Feature-Policy header clipboard-read "none" disallows cross-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..ee9a2b6fb6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-read 'none'
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html
new file mode 100644
index 00000000000..3b1cfd52ad7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-read.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+// TODO(https://github.com/whatwg/html/issues/5493, https://crbug.com/1074482):
+// In Chrome and Firefox, Cross-origin focus requires user gesture. In Chrome
+// only, cross-origin focus is asynchronous. Implement WPT support for
+// cross-origin focus.
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ cross_origin_src,
+ expect_feature_available_default,
+ 'clipboard-read'
+ );
+}, 'Feature policy "clipboard-read" can be enabled in cross-origin iframe using allow="clipboard-read" attribute');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-tentative.https.sub.html
new file mode 100644
index 00000000000..15d26842616
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-tentative.https.sub.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-read.html';
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ same_origin_src,
+ expect_feature_available_default,
+ 'clipboard-read'
+ );
+}, 'Feature policy "clipboard-read" can be enabled in same-origin iframe using allow="clipboard-read" attribute');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin-tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin-tentative.https.sub.html
new file mode 100644
index 00000000000..1b6f4929a19
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin-tentative.https.sub.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-read.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+// TODO(https://github.com/whatwg/html/issues/5493, https://crbug.com/1074482):
+// In Chrome and Firefox, Cross-origin focus requires user gesture. In Chrome
+// only, cross-origin focus is asynchronous. Implement WPT support for
+// cross-origin focus.
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ cross_origin_src,
+ expect_feature_available_default
+ );
+}, 'Feature-Policy header clipboard-read "*" allows cross-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..a147e2a64fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-read *
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html
new file mode 100644
index 00000000000..f8c5bcb129f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-read.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+promise_test(async t => {
+ await test_driver.set_permission({ name: 'clipboard-read' }, 'granted');
+ await navigator.clipboard.readText('test text');
+}, 'Feature-Policy header clipboard-read "*" allows the top-level document.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ same_origin_src,
+ expect_feature_available_default
+ );
+}, 'Feature-Policy header clipboard-read "*" allows same-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..a147e2a64fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-read *
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html
new file mode 100644
index 00000000000..47aa6511ec5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-read.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+promise_test(async t => {
+ await test_driver.set_permission({ name: 'clipboard-read' }, 'granted');
+ await navigator.clipboard.readText('test text');
+}, 'Feature-Policy header clipboard-read "self" allows the top-level document.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ same_origin_src,
+ expect_feature_available_default
+ );
+}, 'Feature-Policy header clipboard-read "self" allows same-origin iframes.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.readText()',
+ t,
+ cross_origin_src,
+ expect_feature_unavailable_default
+ );
+}, 'Feature-Policy header clipboard-read "self" disallows cross-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..752d7faff46
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-read 'self'
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html
new file mode 100644
index 00000000000..5d19d8dd6f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-write.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+promise_test(async t => {
+ await test_driver.set_permission({ name: 'clipboard-write' }, 'granted');
+ return promise_rejects_dom(t, 'NotAllowedError',
+ navigator.clipboard.writeText('test text'));
+}, 'Feature-Policy header clipboard-write "none" disallows the top-level document.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ same_origin_src,
+ expect_feature_unavailable_default
+ );
+}, 'Feature-Policy header clipboard-write "none" disallows same-origin iframes.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ cross_origin_src,
+ expect_feature_unavailable_default
+ );
+}, 'Feature-Policy header clipboard-write "none" disallows cross-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..f35f5b6a092
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-write 'none'
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html
new file mode 100644
index 00000000000..c931bbbb89f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-write.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+// TODO(https://github.com/whatwg/html/issues/5493, https://crbug.com/1074482):
+// In Chrome and Firefox, Cross-origin focus requires user gesture. In Chrome
+// only, cross-origin focus is asynchronous. Implement WPT support for
+// cross-origin focus.
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ cross_origin_src,
+ expect_feature_available_default,
+ 'clipboard-write'
+ );
+}, 'Feature policy "clipboard-write" can be enabled in cross-origin iframe using allow="clipboard-write" attribute');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-tentative.https.sub.html
new file mode 100644
index 00000000000..a2858c638e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-tentative.https.sub.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-write.html';
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ same_origin_src,
+ expect_feature_available_default,
+ 'clipboard-write'
+ );
+}, 'Feature policy "clipboard-write" can be enabled in same-origin iframe using allow="clipboard-write" attribute');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin-tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin-tentative.https.sub.html
new file mode 100644
index 00000000000..0f3164d9b02
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin-tentative.https.sub.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-write.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+// TODO(https://github.com/whatwg/html/issues/5493, https://crbug.com/1074482):
+// In Chrome and Firefox, Cross-origin focus requires user gesture. In Chrome
+// only, cross-origin focus is asynchronous. Implement WPT support for
+// cross-origin focus.
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ cross_origin_src,
+ expect_feature_available_default
+ );
+}, 'Feature-Policy header clipboard-write "*" allows cross-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..81b10d8e330
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-write *
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html
new file mode 100644
index 00000000000..1c6fc49a056
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-write.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+promise_test(async t => {
+ await test_driver.set_permission({ name: 'clipboard-write' }, 'granted');
+ await navigator.clipboard.writeText('test text');
+}, 'Feature-Policy header clipboard-write "*" allows the top-level document.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ same_origin_src,
+ expect_feature_available_default
+ );
+}, 'Feature-Policy header clipboard-write "*" allows same-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..81b10d8e330
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-write *
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html
new file mode 100644
index 00000000000..51db5a427d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<body>
+<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="/feature-policy/resources/featurepolicy.js"></script>
+<script>
+'use strict';
+
+const same_origin_src =
+ '/feature-policy/resources/feature-policy-clipboard-write.html';
+const cross_origin_src =
+ 'https://{{domains[www]}}:{{ports[https][0]}}' + same_origin_src;
+
+promise_test(async t => {
+ await test_driver.set_permission({ name: 'clipboard-write' }, 'granted');
+ await navigator.clipboard.writeText('test text');
+}, 'Feature-Policy header clipboard-write "self" allows the top-level document.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ same_origin_src,
+ expect_feature_available_default
+ );
+}, 'Feature-Policy header clipboard-write "self" allows same-origin iframes.');
+
+async_test(t => {
+ test_feature_availability(
+ 'navigator.clipboard.writeText("test text")',
+ t,
+ cross_origin_src,
+ expect_feature_unavailable_default
+ );
+}, 'Feature-Policy header clipboard-write "self" disallows cross-origin iframes.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers
new file mode 100644
index 00000000000..e226f41c6ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: clipboard-write 'self'
diff --git a/tests/wpt/web-platform-tests/common/echo.py b/tests/wpt/web-platform-tests/common/echo.py
index 2ee403645b1..911b54a0b48 100644
--- a/tests/wpt/web-platform-tests/common/echo.py
+++ b/tests/wpt/web-platform-tests/common/echo.py
@@ -1,6 +1,6 @@
def main(request, response):
# Without X-XSS-Protection to disable non-standard XSS protection the functionality this
# resource offers is useless
- response.headers.set("X-XSS-Protection", "0")
- response.headers.set("Content-Type", "text/html")
- response.content = request.GET.first("content")
+ response.headers.set(b"X-XSS-Protection", b"0")
+ response.headers.set(b"Content-Type", b"text/html")
+ response.content = request.GET.first(b"content")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/__init__.py b/tests/wpt/web-platform-tests/common/security-features/subresource/__init__.py
index e69de29bb2d..e69de29bb2d 100755..100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/__init__.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/__init__.py
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/audio.py b/tests/wpt/web-platform-tests/common/security-features/subresource/audio.py
index eb95045e031..0c1a5b65c7c 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/audio.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/audio.py
@@ -1,10 +1,11 @@
import os, sys
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(request, server_data):
- file = os.path.join(request.doc_root, "webaudio", "resources",
- "sin_440Hz_-6dBFS_1s.wav")
+ file = os.path.join(request.doc_root, u"webaudio", u"resources",
+ u"sin_440Hz_-6dBFS_1s.wav")
return open(file, "rb").read()
@@ -13,6 +14,5 @@ def main(request, response):
subresource.respond(request,
response,
payload_generator = handler,
- access_control_allow_origin = "*",
- content_type = "audio/wav")
-
+ access_control_allow_origin = b"*",
+ content_type = b"audio/wav")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/document.py b/tests/wpt/web-platform-tests/common/security-features/subresource/document.py
index 59e0dcd7bc6..8d04b99875c 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/document.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/document.py
@@ -1,9 +1,10 @@
import os, sys
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(server_data):
- return subresource.get_template("document.html.template") % server_data
+ return subresource.get_template(u"document.html.template") % server_data
def main(request, response):
subresource.respond(request,
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/empty.py b/tests/wpt/web-platform-tests/common/security-features/subresource/empty.py
index 132e85ddeec..d168383eb52 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/empty.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/empty.py
@@ -1,14 +1,14 @@
import os, sys
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(server_data):
- return ''
+ return u''
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
- access_control_allow_origin = "*",
- content_type = "text/plain")
-
+ access_control_allow_origin = b"*",
+ content_type = b"text/plain")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/font.py b/tests/wpt/web-platform-tests/common/security-features/subresource/font.py
index 26311a9f079..7778175b06a 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/font.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/font.py
@@ -1,72 +1,73 @@
import os, sys, base64
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(request, server_data):
- data = ('{"headers": %(headers)s}') % server_data
- if "id" in request.GET:
- request.server.stash.put(request.GET["id"], data)
+ data = (u'{"headers": %(headers)s}') % server_data
+ if b"id" in request.GET:
+ request.server.stash.put(request.GET[b"id"], data)
# Simple base64 encoded .tff font
- return base64.decodestring("AAEAAAANAIAAAwBQRkZUTU6u6MkAAAXcAAAAHE9TLzJWYW"
- "QKAAABWAAAAFZjbWFwAA8D7wAAAcAAAAFCY3Z0IAAhAnkA"
- "AAMEAAAABGdhc3D//wADAAAF1AAAAAhnbHlmCC6aTwAAAx"
- "QAAACMaGVhZO8ooBcAAADcAAAANmhoZWEIkAV9AAABFAAA"
- "ACRobXR4EZQAhQAAAbAAAAAQbG9jYQBwAFQAAAMIAAAACm"
- "1heHAASQA9AAABOAAAACBuYW1lehAVOgAAA6AAAAIHcG9z"
- "dP+uADUAAAWoAAAAKgABAAAAAQAAMhPyuV8PPPUACwPoAA"
- "AAAMU4Lm0AAAAAxTgubQAh/5wFeAK8AAAACAACAAAAAAAA"
- "AAEAAAK8/5wAWgXcAAAAAAV4AAEAAAAAAAAAAAAAAAAAAA"
- "AEAAEAAAAEAAwAAwAAAAAAAgAAAAEAAQAAAEAALgAAAAAA"
- "AQXcAfQABQAAAooCvAAAAIwCigK8AAAB4AAxAQIAAAIABg"
- "kAAAAAAAAAAAABAAAAAAAAAAAAAAAAUGZFZABAAEEAQQMg"
- "/zgAWgK8AGQAAAABAAAAAAAABdwAIQAAAAAF3AAABdwAZA"
- "AAAAMAAAADAAAAHAABAAAAAAA8AAMAAQAAABwABAAgAAAA"
- "BAAEAAEAAABB//8AAABB////wgABAAAAAAAAAQYAAAEAAA"
- "AAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- "AAAAAAAAAAAAAAAAAAAhAnkAAAAqACoAKgBGAAAAAgAhAA"
- "ABKgKaAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCx"
- "AwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIREnMxEjIQEJ6M"
- "fHApr9ZiECWAAAAwBk/5wFeAK8AAMABwALAAABNSEVATUh"
- "FQE1IRUB9AH0/UQDhPu0BRQB9MjI/tTIyP7UyMgAAAAAAA"
- "4ArgABAAAAAAAAACYATgABAAAAAAABAAUAgQABAAAAAAAC"
- "AAYAlQABAAAAAAADACEA4AABAAAAAAAEAAUBDgABAAAAAA"
- "AFABABNgABAAAAAAAGAAUBUwADAAEECQAAAEwAAAADAAEE"
- "CQABAAoAdQADAAEECQACAAwAhwADAAEECQADAEIAnAADAA"
- "EECQAEAAoBAgADAAEECQAFACABFAADAAEECQAGAAoBRwBD"
- "AG8AcAB5AHIAaQBnAGgAdAAgACgAYwApACAAMgAwADAAOA"
- "AgAE0AbwB6AGkAbABsAGEAIABDAG8AcgBwAG8AcgBhAHQA"
- "aQBvAG4AAENvcHlyaWdodCAoYykgMjAwOCBNb3ppbGxhIE"
- "NvcnBvcmF0aW9uAABNAGEAcgBrAEEAAE1hcmtBAABNAGUA"
- "ZABpAHUAbQAATWVkaXVtAABGAG8AbgB0AEYAbwByAGcAZQ"
- "AgADIALgAwACAAOgAgAE0AYQByAGsAQQAgADoAIAA1AC0A"
- "MQAxAC0AMgAwADAAOAAARm9udEZvcmdlIDIuMCA6IE1hcm"
- "tBIDogNS0xMS0yMDA4AABNAGEAcgBrAEEAAE1hcmtBAABW"
- "AGUAcgBzAGkAbwBuACAAMAAwADEALgAwADAAMAAgAABWZX"
- "JzaW9uIDAwMS4wMDAgAABNAGEAcgBrAEEAAE1hcmtBAAAA"
- "AgAAAAAAAP+DADIAAAABAAAAAAAAAAAAAAAAAAAAAAAEAA"
- "AAAQACACQAAAAAAAH//wACAAAAAQAAAADEPovuAAAAAMU4"
- "Lm0AAAAAxTgubQ==");
+ return base64.decodestring(b"AAEAAAANAIAAAwBQRkZUTU6u6MkAAAXcAAAAHE9TLzJWYW"
+ b"QKAAABWAAAAFZjbWFwAA8D7wAAAcAAAAFCY3Z0IAAhAnkA"
+ b"AAMEAAAABGdhc3D//wADAAAF1AAAAAhnbHlmCC6aTwAAAx"
+ b"QAAACMaGVhZO8ooBcAAADcAAAANmhoZWEIkAV9AAABFAAA"
+ b"ACRobXR4EZQAhQAAAbAAAAAQbG9jYQBwAFQAAAMIAAAACm"
+ b"1heHAASQA9AAABOAAAACBuYW1lehAVOgAAA6AAAAIHcG9z"
+ b"dP+uADUAAAWoAAAAKgABAAAAAQAAMhPyuV8PPPUACwPoAA"
+ b"AAAMU4Lm0AAAAAxTgubQAh/5wFeAK8AAAACAACAAAAAAAA"
+ b"AAEAAAK8/5wAWgXcAAAAAAV4AAEAAAAAAAAAAAAAAAAAAA"
+ b"AEAAEAAAAEAAwAAwAAAAAAAgAAAAEAAQAAAEAALgAAAAAA"
+ b"AQXcAfQABQAAAooCvAAAAIwCigK8AAAB4AAxAQIAAAIABg"
+ b"kAAAAAAAAAAAABAAAAAAAAAAAAAAAAUGZFZABAAEEAQQMg"
+ b"/zgAWgK8AGQAAAABAAAAAAAABdwAIQAAAAAF3AAABdwAZA"
+ b"AAAAMAAAADAAAAHAABAAAAAAA8AAMAAQAAABwABAAgAAAA"
+ b"BAAEAAEAAABB//8AAABB////wgABAAAAAAAAAQYAAAEAAA"
+ b"AAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA"
+ b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAA"
+ b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ b"AAAAAAAAAAAAAAAAAAAhAnkAAAAqACoAKgBGAAAAAgAhAA"
+ b"ABKgKaAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCx"
+ b"AwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIREnMxEjIQEJ6M"
+ b"fHApr9ZiECWAAAAwBk/5wFeAK8AAMABwALAAABNSEVATUh"
+ b"FQE1IRUB9AH0/UQDhPu0BRQB9MjI/tTIyP7UyMgAAAAAAA"
+ b"4ArgABAAAAAAAAACYATgABAAAAAAABAAUAgQABAAAAAAAC"
+ b"AAYAlQABAAAAAAADACEA4AABAAAAAAAEAAUBDgABAAAAAA"
+ b"AFABABNgABAAAAAAAGAAUBUwADAAEECQAAAEwAAAADAAEE"
+ b"CQABAAoAdQADAAEECQACAAwAhwADAAEECQADAEIAnAADAA"
+ b"EECQAEAAoBAgADAAEECQAFACABFAADAAEECQAGAAoBRwBD"
+ b"AG8AcAB5AHIAaQBnAGgAdAAgACgAYwApACAAMgAwADAAOA"
+ b"AgAE0AbwB6AGkAbABsAGEAIABDAG8AcgBwAG8AcgBhAHQA"
+ b"aQBvAG4AAENvcHlyaWdodCAoYykgMjAwOCBNb3ppbGxhIE"
+ b"NvcnBvcmF0aW9uAABNAGEAcgBrAEEAAE1hcmtBAABNAGUA"
+ b"ZABpAHUAbQAATWVkaXVtAABGAG8AbgB0AEYAbwByAGcAZQ"
+ b"AgADIALgAwACAAOgAgAE0AYQByAGsAQQAgADoAIAA1AC0A"
+ b"MQAxAC0AMgAwADAAOAAARm9udEZvcmdlIDIuMCA6IE1hcm"
+ b"tBIDogNS0xMS0yMDA4AABNAGEAcgBrAEEAAE1hcmtBAABW"
+ b"AGUAcgBzAGkAbwBuACAAMAAwADEALgAwADAAMAAgAABWZX"
+ b"JzaW9uIDAwMS4wMDAgAABNAGEAcgBrAEEAAE1hcmtBAAAA"
+ b"AgAAAAAAAP+DADIAAAABAAAAAAAAAAAAAAAAAAAAAAAEAA"
+ b"AAAQACACQAAAAAAAH//wACAAAAAQAAAADEPovuAAAAAMU4"
+ b"Lm0AAAAAxTgubQ==")
def generate_report_headers_payload(request, server_data):
- stashed_data = request.server.stash.take(request.GET["id"])
+ stashed_data = request.server.stash.take(request.GET[b"id"])
return stashed_data
def main(request, response):
handler = lambda data: generate_payload(request, data)
- content_type = 'application/x-font-truetype'
+ content_type = b'application/x-font-truetype'
- if "report-headers" in request.GET:
+ if b"report-headers" in request.GET:
handler = lambda data: generate_report_headers_payload(request, data)
- content_type = 'application/json'
+ content_type = b'application/json'
subresource.respond(request,
response,
payload_generator = handler,
content_type = content_type,
- access_control_allow_origin = "*")
+ access_control_allow_origin = b"*")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/image.py b/tests/wpt/web-platform-tests/common/security-features/subresource/image.py
index 42ebc0767bb..bbc1382df1a 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/image.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/image.py
@@ -1,7 +1,13 @@
-import os, sys, array, math, StringIO
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+import os, sys, array, math
+
+from six import BytesIO
+
import subresource
+from wptserve.utils import isomorphic_decode
+
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
+
class Image:
"""This class partially implements the interface of the PIL.Image.Image.
One day in the future WPT might support the PIL module or another imaging
@@ -36,9 +42,9 @@ class Image:
def save(self, f, type):
assert type == "BMP"
# 54 bytes of preambule + image color data.
- filesize = 54 + 3 * self.width * self.height;
+ filesize = 54 + 3 * self.width * self.height
# 14 bytes of header.
- bmpfileheader = bytearray(['B', 'M'] + self._int_to_bytes(filesize) +
+ bmpfileheader = bytearray([ord('B'), ord('M')] + self._int_to_bytes(filesize) +
[0, 0, 0, 0, 54, 0, 0, 0])
# 40 bytes of info.
bmpinfoheader = bytearray([40, 0, 0, 0] +
@@ -47,7 +53,7 @@ class Image:
[1, 0, 24] + (25 * [0]))
padlength = (4 - (self.width * 3) % 4) % 4
- bmppad = bytearray([0, 0, 0]);
+ bmppad = bytearray([0, 0, 0])
padding = bmppad[0 : padlength]
f.write(bmpfileheader)
@@ -59,7 +65,7 @@ class Image:
f.write(padding)
def encode_string_as_bmp_image(string_data):
- data_bytes = array.array("B", string_data)
+ data_bytes = array.array("B", string_data.encode("utf-8"))
num_bytes = len(data_bytes)
@@ -79,33 +85,33 @@ def encode_string_as_bmp_image(string_data):
img.putdata(color_data)
# Flush image to string.
- f = StringIO.StringIO()
+ f = BytesIO()
img.save(f, "BMP")
f.seek(0)
return f.read()
def generate_payload(request, server_data):
- data = ('{"headers": %(headers)s}') % server_data
- if "id" in request.GET:
- request.server.stash.put(request.GET["id"], data)
+ data = (u'{"headers": %(headers)s}') % server_data
+ if b"id" in request.GET:
+ request.server.stash.put(request.GET[b"id"], data)
data = encode_string_as_bmp_image(data)
return data
def generate_report_headers_payload(request, server_data):
- stashed_data = request.server.stash.take(request.GET["id"])
+ stashed_data = request.server.stash.take(request.GET[b"id"])
return stashed_data
def main(request, response):
handler = lambda data: generate_payload(request, data)
- content_type = 'image/bmp'
+ content_type = b'image/bmp'
- if "report-headers" in request.GET:
+ if b"report-headers" in request.GET:
handler = lambda data: generate_report_headers_payload(request, data)
- content_type = 'application/json'
+ content_type = b'application/json'
subresource.respond(request,
response,
payload_generator = handler,
content_type = content_type,
- access_control_allow_origin = "*")
+ access_control_allow_origin = b"*")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/referrer.py b/tests/wpt/web-platform-tests/common/security-features/subresource/referrer.py
index ad9e24847a1..e36631479e6 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/referrer.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/referrer.py
@@ -1,4 +1,4 @@
def main(request, response):
- referrer = request.headers.get("referer", "")
- response_headers = [("Content-Type", "text/javascript")];
- return (200, response_headers, "window.referrer = '" + referrer + "'")
+ referrer = request.headers.get(b"referer", b"")
+ response_headers = [(b"Content-Type", b"text/javascript")]
+ return (200, response_headers, b"window.referrer = '" + referrer + b"'")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/script.py b/tests/wpt/web-platform-tests/common/security-features/subresource/script.py
index 9d7cd0469f0..535ee300104 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/script.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/script.py
@@ -1,13 +1,13 @@
import os, sys
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(server_data):
- return subresource.get_template("script.js.template") % server_data
+ return subresource.get_template(u"script.js.template") % server_data
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
- content_type = "application/javascript")
-
+ content_type = b"application/javascript")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/shared-worker.py b/tests/wpt/web-platform-tests/common/security-features/subresource/shared-worker.py
index d8fd6876449..aea5a32b1db 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/shared-worker.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/shared-worker.py
@@ -1,12 +1,13 @@
import os, sys
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(server_data):
- return subresource.get_template("shared-worker.js.template") % server_data
+ return subresource.get_template(u"shared-worker.js.template") % server_data
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
- content_type = "application/javascript")
+ content_type = b"application/javascript")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/static-import.py b/tests/wpt/web-platform-tests/common/security-features/subresource/static-import.py
index 0a97dd1a326..e84a4b4bfbb 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/static-import.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/static-import.py
@@ -1,11 +1,14 @@
-import os, sys, urllib
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+import os, sys
+from six.moves.urllib.parse import unquote
+
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(request):
- import_url = urllib.unquote(request.GET['import_url'])
- return subresource.get_template("static-import.js.template") % {
- "import_url": import_url
+ import_url = unquote(isomorphic_decode(request.GET[b'import_url']))
+ return subresource.get_template(u"static-import.js.template") % {
+ u"import_url": import_url
}
def main(request, response):
@@ -13,4 +16,4 @@ def main(request, response):
subresource.respond(request,
response,
payload_generator = payload_generator,
- content_type = "application/javascript")
+ content_type = b"application/javascript")
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/stylesheet.py b/tests/wpt/web-platform-tests/common/security-features/subresource/stylesheet.py
index ec62a8cd5f2..58b5b8dea1d 100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/stylesheet.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/stylesheet.py
@@ -1,54 +1,55 @@
import os, sys
-sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from wptserve.utils import isomorphic_decode
+sys.path.insert(0, os.path.dirname(os.path.abspath(isomorphic_decode(__file__))))
import subresource
def generate_payload(request, server_data):
- data = ('{"headers": %(headers)s}') % server_data
- type = 'image'
- if "type" in request.GET:
- type = request.GET["type"]
+ data = (u'{"headers": %(headers)s}') % server_data
+ type = b'image'
+ if b"type" in request.GET:
+ type = request.GET[b"type"]
- if "id" in request.GET:
- request.server.stash.put(request.GET["id"], data)
+ if b"id" in request.GET:
+ request.server.stash.put(request.GET[b"id"], data)
- if type == 'image':
- return subresource.get_template("image.css.template") % {"id": request.GET["id"]}
+ if type == b'image':
+ return subresource.get_template(u"image.css.template") % {u"id": isomorphic_decode(request.GET[b"id"])}
- elif type == 'font':
- return subresource.get_template("font.css.template") % {"id": request.GET["id"]}
+ elif type == b'font':
+ return subresource.get_template(u"font.css.template") % {u"id": isomorphic_decode(request.GET[b"id"])}
- elif type == 'svg':
- return subresource.get_template("svg.css.template") % {
- "id": request.GET["id"],
- "property": request.GET["property"]}
+ elif type == b'svg':
+ return subresource.get_template(u"svg.css.template") % {
+ u"id": isomorphic_decode(request.GET[b"id"]),
+ u"property": isomorphic_decode(request.GET[b"property"])}
def generate_import_rule(request, server_data):
- return "@import url('%(url)s');" % {
- "url": subresource.create_url(request, swap_origin=True,
- query_parameter_to_remove="import-rule")
+ return u"@import url('%(url)s');" % {
+ u"url": subresource.create_url(request, swap_origin=True,
+ query_parameter_to_remove=u"import-rule")
}
def generate_report_headers_payload(request, server_data):
- stashed_data = request.server.stash.take(request.GET["id"])
+ stashed_data = request.server.stash.take(request.GET[b"id"])
return stashed_data
def main(request, response):
payload_generator = lambda data: generate_payload(request, data)
- content_type = "text/css"
- referrer_policy = "unsafe-url"
- if "import-rule" in request.GET:
+ content_type = b"text/css"
+ referrer_policy = b"unsafe-url"
+ if b"import-rule" in request.GET:
payload_generator = lambda data: generate_import_rule(request, data)
- if "report-headers" in request.GET:
+ if b"report-headers" in request.GET:
payload_generator = lambda data: generate_report_headers_payload(request, data)
- content_type = 'application/json'
+ content_type = b'application/json'
- if "referrer-policy" in request.GET:
- referrer_policy = request.GET["referrer-policy"]
+ if b"referrer-policy" in request.GET:
+ referrer_policy = request.GET[b"referrer-policy"]
subresource.respond(
request,
response,
payload_generator = payload_generator,
content_type = content_type,
- maybe_additional_headers = { "Referrer-Policy": referrer_policy })
+ maybe_additional_headers = { b"Referrer-Policy": referrer_policy })
diff --git a/tests/wpt/web-platform-tests/common/security-features/subresource/xhr.py b/tests/wpt/web-platform-tests/common/security-features/subresource/xhr.py
index 82a4cb0b657..82a4cb0b657 100755..100644
--- a/tests/wpt/web-platform-tests/common/security-features/subresource/xhr.py
+++ b/tests/wpt/web-platform-tests/common/security-features/subresource/xhr.py
diff --git a/tests/wpt/web-platform-tests/common/slow.py b/tests/wpt/web-platform-tests/common/slow.py
index f3b1c7e2ea6..5329a04ed2d 100644
--- a/tests/wpt/web-platform-tests/common/slow.py
+++ b/tests/wpt/web-platform-tests/common/slow.py
@@ -2,4 +2,4 @@ import time
def main(request, response):
time.sleep(2)
- return 200, [], ''
+ return 200, [], b''
diff --git a/tests/wpt/web-platform-tests/content-security-policy/reporting/support/redirect-throw-function.sub.py b/tests/wpt/web-platform-tests/content-security-policy/reporting/support/redirect-throw-function.sub.py
index 6c53e0d538c..1bc89abf717 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/reporting/support/redirect-throw-function.sub.py
+++ b/tests/wpt/web-platform-tests/content-security-policy/reporting/support/redirect-throw-function.sub.py
@@ -1,8 +1,10 @@
import re
+from wptserve.utils import isomorphic_encode
+
def main(request, response):
- response.status = 302;
- location = re.sub('redirect-throw-function.*',
- 'throw-function.js?secret=1234#ref',
- request.url)
- response.headers.set("Location", location);
+ response.status = 302
+ location = re.sub(b'redirect-throw-function.*',
+ b'throw-function.js?secret=1234#ref',
+ isomorphic_encode(request.url))
+ response.headers.set(b"Location", location)
diff --git a/tests/wpt/web-platform-tests/css/CSS2/borders/border-width-011.xht b/tests/wpt/web-platform-tests/css/CSS2/borders/border-width-011.xht
index 9401fb1b18d..ae8d514ab3c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/borders/border-width-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/borders/border-width-011.xht
@@ -7,10 +7,14 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/border/width/001.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/box.html#border-style-properties"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/box.html#border-width-properties"/>
+ <link rel="help" href="https://www.w3.org/Style/css2-updates/REC-CSS2-20110607-errata.html#s.6.2.1"/>
+ <link rel="help" href="https://github.com/w3c/csswg-drafts/issues/2768"/>
<link rel="match" href="../reference/ref-this-text-should-be-green.xht" />
<style type="text/css">
+ /* this results in a specified value of 2em and a computed value of 0 as border-style is none */
body { border-width: 2em; }
+ /* this then inherits from the above border-width, and checks the computed value is inherited */
p { border-width: inherit; border-style: solid; border-color: red; color: green; }
</style>
</head>
diff --git a/tests/wpt/web-platform-tests/css/css-break/margin-after-overflowed-block.html b/tests/wpt/web-platform-tests/css/css-break/margin-after-overflowed-block.html
new file mode 100644
index 00000000000..26a2eb22aa6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-break/margin-after-overflowed-block.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:100px; height:100px; background:red;">
+ <div style="margin-bottom:20px; height:50px;">
+ <div style="height:70px; background:green;"></div>
+ <div style="height:90px;"></div>
+ <div style="height:40px; background:green;"></div>
+ </div>
+ <div style="height:50px; background:green;"></div>
+ <div style="height:40px; background:green;"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-color/system-color-compute.html b/tests/wpt/web-platform-tests/css/css-color/system-color-compute.html
new file mode 100644
index 00000000000..9b3946c6de5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-color/system-color-compute.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<title>CSS Color 4: System colors should compute to themselves</title>
+<link rel="help" href="https://www.w3.org/TR/css-color-4/#resolving-color-values">
+<meta name="assert" content="Tests if system color keywords compute to themselves">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+.parent {
+ border: 1px solid black;
+ width: 100px;
+ height: 170px;
+ margin: 5px;
+ padding: 5px;
+ color-scheme: light;
+}
+
+.child {
+ position: relative;
+ border: 1px solid black;
+ width: 80px;
+ height: 50px;
+ margin: 4px;
+ padding: 4px;
+ color-scheme: dark;
+}
+
+.specified {
+ background-color: Menu;
+ box-shadow: 2px 2px Menu;
+ text-shadow: 2px 2px Menu;
+ border-color: Menu;
+ column-rule-color: Menu;
+ outline-color: Menu;
+ caret-color: Menu;
+ fill: Menu;
+ stroke: Menu;
+}
+
+.inherit {
+ background-color: inherit;
+ box-shadow: inherit;
+ text-shadow: inherit;
+ border-color: inherit;
+ column-rule-color: inherit;
+ outline-color: inherit;
+ caret-color: inherit;
+ fill: inherit;
+ stroke: inherit;
+}
+</style>
+
+<div id="parent" class="specified parent">Parent
+ <div id="specified" class="specified child">Specified Child</div>
+ <div id="inherited" class="inherit child">Inherit Child</div>
+</div>
+
+<script>
+ // The premise behind this test is that if a system color keyword computes to
+ // itself, then child elements inheriting a system color value will inherit
+ // the keyword, not the color it resolves to. We can detect this by applying
+ // different color schemes to parent and child, then comparing the results we
+ // get between a child that inherited a system color versus a child that
+ // received the system color directly.
+
+ // As a precondition check, validate that the color-scheme property results
+ // in a different resolved color.
+ test(function() {
+ let light_value =
+ getComputedStyle(document.getElementById("parent")).backgroundColor;
+ let dark_value =
+ getComputedStyle(document.getElementById("specified")).backgroundColor;
+ assert_not_equals(light_value, dark_value);
+ }, "color-scheme property affects Menu system color keyword");
+
+ // Test several color properties.
+ const properties_to_test = [
+ "background-color",
+ "box-shadow",
+ "text-shadow",
+ "border-left-color",
+ "border-top-color",
+ "border-right-color",
+ "border-bottom-color",
+ "column-rule-color",
+ "outline-color",
+ "caret-color",
+ "fill",
+ "stroke",
+ ];
+
+ for (let property of properties_to_test) {
+ test(function() {
+ let specified_value =
+ getComputedStyle(document.getElementById("specified"))
+ .getPropertyValue(property);
+ let inherited_value =
+ getComputedStyle(document.getElementById("inherited"))
+ .getPropertyValue(property);
+ assert_equals(inherited_value, specified_value);
+ }, "System color computes to itself on " + property);
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-grid-flex-abspos.html b/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-grid-flex-abspos.html
new file mode 100644
index 00000000000..73318466f0e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-grid-flex-abspos.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<title>grid items and abspos flex children</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org" />
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-overview" title="Note at bottom of this section: 'the size of a grid item which is stretched is also considered definite.'">
+<link rel="bookmark" href="https://crbug.com/1091588" />
+<link rel="bookmark" href="https://crbug.com/1018439" />
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+
+<style>
+.grid {
+ display: grid;
+}
+
+.flexbox {
+ display: flex;
+}
+
+.relpos {
+ position: relative;
+}
+
+.abspos {
+ position: absolute;
+ border: 1px solid;
+}
+
+/* These are just for making the test look better. */
+p {
+ margin: 0px;
+}
+p + div {
+ margin-bottom: 40px;
+}
+</style>
+
+<p>This crashed Chrome 84.</p>
+<div class=grid>
+ <div class="relpos flexbox" data-expected-height=20>
+ <div class=abspos>Test</div>
+ <div style="height: 20px;"></div>
+ </div>
+</div>
+
+<p>Outer is a regular div.</p>
+<div>
+ <div class="relpos flexbox" data-expected-height=20>
+ <div class=abspos>Test</div>
+ <div style="height: 20px;"></div>
+ </div>
+</div>
+
+<p>relpos element is a regular div, not flexbox.</p>
+<div class=grid>
+ <div class="relpos" data-expected-height=20>
+ <div class=abspos>Test</div>
+ <div style="height: 20px;"></div>
+ </div>
+</div>
+
+<p>Relpos flexbox has a % height descendant. The height of the flexbox grid item is supposed to be definite, allowing the %height flex item to resolve.
+
+This fails in chrome because of https://crbug.com/1018439</p>
+<div class=grid>
+ <div class="relpos flexbox" data-expected-height=20>
+ <div class=abspos>Test</div>
+ <div style="height: 20px;"></div>
+ <div style="height: 50%" data-expected-height=10></div>
+ </div>
+</div>
+
+<script>
+ checkLayout('.relpos');
+ // Changing the abspos border shouldn't change the size of any inflow element.
+ for (abspos of document.querySelectorAll(".abspos")) {
+ abspos.style.borderWidth = "10px";
+ }
+ checkLayout('.relpos');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/percentage-max-height-002.html b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-max-height-002.html
new file mode 100644
index 00000000000..f674ec57d78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox/percentage-max-height-002.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="bookmark" href="https://crbug.com/1092934">
+<meta name="assert" content="Replaced children with % max-height are sized correctly when their parents are flex items with imposed definite heights." />
+
+<p>Test passes if there is a filled green square.</p>
+
+<div style="display: flex; height: 100px;">
+ <div>
+ <!-- This is a 200x200 green square. It's inline so that there is no
+ raciness when an image resource loads, which affects chrome's behavior
+ on this test. -->
+ <img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200' width='200' height='200'><rect width='200' height='200' fill='green'/></svg>" style="max-height: 100%">
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html
index 0b01320a7f6..521461657e8 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-computed.html
@@ -15,7 +15,13 @@
test_computed_value('font-variation-settings', 'normal');
test_computed_value('font-variation-settings', '"wght" 700');
-test_computed_value('font-variation-settings', '"wght" 700, "XHGT" 0.7');
+test_computed_value('font-variation-settings', '"AB@D" 0.5');
+
+test_computed_value('font-variation-settings', '"wght" 700, "wght" 500', '"wght" 500',
+ "duplicate values should be removed, keeping the rightmost occurrence.");
+
+test_computed_value('font-variation-settings', '"wght" 700, "XHGT" 0.7',
+ ['"wght" 700, "XHGT" 0.7', '"XHGT" 0.7, "wght" 700']);
test_computed_value('font-variation-settings', '"XHGT" calc(0.4 + 0.3)', '"XHGT" 0.7');
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html
index b957c310092..bd9370b350e 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-invalid.html
@@ -22,6 +22,17 @@ test_invalid_value('font-variation-settings', '"XHGTX" 0.7');
test_invalid_value('font-variation-settings', '"abc\1F" 0.5');
test_invalid_value('font-variation-settings', '"abc\7F" 0.5');
test_invalid_value('font-variation-settings', '"abc\A9" 0.5');
+
+test_invalid_value('font-variation-settings', "'wght' 200 'abcd' 400");
+test_invalid_value('font-variation-settings', "'a' 1234");
+test_invalid_value('font-variation-settings', "'abcde' 1234");
+test_invalid_value('font-variation-settings', "'wght' 200, ");
+test_invalid_value('font-variation-settings', "'abcd\" 123");
+
+test_invalid_value('font-variation-settings', "'wght' 100px");
+test_invalid_value('font-variation-settings', "'wght' calc(100px + 200px)");
+test_invalid_value('font-variation-settings', "'wght' 42%");
+test_invalid_value('font-variation-settings', "'wght' calc(100%)");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html
index fe7f6bf7806..fc0c3ef7033 100644
--- a/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html
+++ b/tests/wpt/web-platform-tests/css/css-fonts/parsing/font-variation-settings-valid.html
@@ -15,10 +15,12 @@
test_valid_value('font-variation-settings', 'normal');
test_valid_value('font-variation-settings', '"wght" 700');
+test_valid_value('font-variation-settings', "'wght' 700", '"wght" 700');
test_valid_value('font-variation-settings', '"wght" 700, "XHGT" 0.7');
test_valid_value('font-variation-settings', '"a cd" 0.5');
test_valid_value('font-variation-settings', '"ab@d" 0.5');
+test_valid_value('font-variation-settings', "'wght' 1e3, 'slnt' -450.0e-1", '"wght" 1000, "slnt" -45');
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts/variations/font-variation-settings-parsing.html b/tests/wpt/web-platform-tests/css/css-fonts/variations/font-variation-settings-parsing.html
deleted file mode 100644
index 3d6bc5fa1c0..00000000000
--- a/tests/wpt/web-platform-tests/css/css-fonts/variations/font-variation-settings-parsing.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Testing the parsing of the font-variation-settings property</title>
- <link rel="help" href="https://www.w3.org/TR/css-fonts-4/#propdef-font-variation-settings" />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <div id="value-parser-test"></div>
- <script>
-
- var valueParserTests = [
- { value: "'wght' 1000, '9 ~A' -45", expectedComputedValue: "\"wght\" 1000, \"9 ~A\" -45", isValid: true, message: "Axis tag with valid non-letter ascii characters" },
- { value: "'\u001Fbdc' 123", expectedComputedValue: "", isValid: false, message: "Invalid character below allowed range (first char)"},
- { value: "'abc\u007F' 123", expectedComputedValue: "", isValid: false, message: "Invalid character above allowed range (mid char)"},
- { value: "'wght' 1e3, 'slnt' -450.0e-1 ", expectedComputedValue: "\"wght\" 1000, \"slnt\" -45", isValid: true, message: "Axis values in scientific form are valid" },
- { value: "normal", expectedComputedValue: "normal", isValid: true, message: "'normal' value is valid" },
- { value: "'a' 1234", expectedComputedValue: "", isValid: false, message: "Tag with less than 4 characters is invalid"},
- { value: "'abcde' 1234", expectedComputedValue: "", isValid: false, message: "Tag with more than 4 characters is invalid"},
- { value: "'wght' 200, ", expectedComputedValue: "", isValid: false, message: "Trailing comma is invalid"},
- { value: "abcd 123", expectedComputedValue: "", isValid: false, message: "Unquoted tags are invalid"},
- { value: "'abcd\" 123", expectedComputedValue: "", isValid: false, message: "Unmatched quotes around tag are invalid" },
- { value: "'abcd'", expectedComputedValue: "", isValid: false, message: "Tag without value isinvalid"},
- { value: "123", expectedComputedValue: "", isValid: false, message: "Value without tag is invalid"},
- { value: "123 'abcd'", expectedComputedValue: "", isValid: false, message: "Value before tag is invalid"},
- { value: "'wght' 200 'abcd' 400", expectedComputedValue: "", isValid: false, message: "Missing comma between axes is invalid"},
- { value: "'wght' calc(100 + 200)", expectedComputedValue: "\"wght\" 300", isValid: true, message: "Calculations should be supported" },
- { value: "'wght' 100px", expectedComputedValue: "", isValid: false, message: "Units should not be supported" },
- { value: "'wght' calc(100px + 200px)", expectedComputedValue: "", isValid: false, message: "Units should not be supported (in calc)" },
- { value: "'wght' 42%", expectedComputedValue: "", isValid: false, message: "Percentages should not be supported" },
- { value: "'wght' calc(100%)", expectedComputedValue: "", isValid: false, message: "Percentages should not be supported (in calc)" },
- ];
-
- valueParserTests.forEach(function (testCase) {
- test(() => {
- var element = document.getElementById("value-parser-test");
- // Reset to empty in order for testing to continue in case the next test would not parse as valid
- element.style.fontVariationSettings = "";
- element.style.fontVariationSettings = testCase.value;
- var computed = window.getComputedStyle(element).fontVariationSettings;
- if (testCase.isValid) {
- assert_equals(computed, testCase.expectedComputedValue, testCase.message);
- }
- else {
- assert_equals(computed, "normal", testCase.message);
- }
-
- element.style.fontVariationSettings = "";
- }, "Property value: " + testCase.message);
- });
-
- valueParserTests.forEach(function (testCase) {
- test(() => { assert_equals(window.CSS.supports("font-variation-settings", testCase.value), testCase.isValid, testCase.message); }, "@supports: " + testCase.message);
- });
-
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-align-001.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-align-001.html
new file mode 100644
index 00000000000..e32031779fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-align-001.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<title>
+ Grid Item (First) Baseline Block-Axis Alignment: auto-height grid, auto row, auto items
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://www.w3.org/TR/css-grid-1/#algo-content">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#baseline-values">
+<link rel="match" href="references/grid-baseline-align-001-ref.html">
+
+<style>
+ @import "/fonts/ahem.css";
+ .grid {
+ border: solid silver;
+ margin: 1em 2px;
+ font: 20px/1 Ahem;
+
+ display: inline-grid;
+ vertical-align: top;
+ grid-template-columns: repeat(4, max-content);
+ }
+ .grid > div {
+ border: black 10px;
+ border-style: solid none;
+ color: orange;
+ }
+ div + div {
+ font-size: 2em;
+ }
+ div + div + div {
+ font-size: 50%;
+ }
+ .self > div {
+ align-self: baseline;
+ }
+ .content > div {
+ align-content: baseline;
+ }
+ div.stretch {
+ align-self: stretch;
+ }
+
+ .ref {
+ position: relative;
+ width: 80px;
+ height: 96px;
+ }
+ .ref > div {
+ position: absolute;
+ }
+ .ref1 { top: 16px; }
+ .ref2 { left: 20px; }
+ .ref3 { top: 24px;
+ left: 60px; }
+ .ref4 { right: 0px;
+ top: 0px;
+ bottom: 0px;
+ width: 10px; }
+
+ .ref.content > div:not(.stripe) {
+ border-color: transparent;
+ }
+ .stripe {
+ width: 80px;
+ height: 76px;
+ }
+</style>
+
+<p>Test passes if each pair of boxes is identical.</p>
+
+<div class="grid self">
+ <div>
+ p<br>
+ p<br>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div class="stretch">
+ &nbsp;
+ </div>
+</div>
+
+<div class="grid self ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+</div>
+
+<br>
+
+<div class="grid content">
+ <div>
+ p<br>
+ p<br>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div class="stretch">
+ &nbsp;
+ </div>
+</div>
+
+<div class="grid content ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+ <div class="stripe">
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-justify-001.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-justify-001.html
new file mode 100644
index 00000000000..171fcd3fcde
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-baseline-justify-001.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<title>
+ Grid Item (First) Baseline Inline-Axis Alignment: auto-width grid, auto column, auto items
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://www.w3.org/TR/css-grid-1/#algo-content">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#baseline-values">
+<link rel="match" href="references/grid-baseline-justify-001-ref.html">
+
+<style>
+ @import "/fonts/ahem.css";
+ .grid {
+ border: solid silver;
+ margin: 1em 2px;
+ font: 20px/1 Ahem;
+
+ display: inline-grid;
+ vertical-align: top;
+ grid-template-rows: repeat(4, max-content);
+ }
+ .grid > div {
+ border: black 10px;
+ border-style: none solid;
+ color: orange;
+ writing-mode: vertical-rl;
+ }
+ div + div {
+ font-size: 2em;
+ }
+ div + div + div {
+ font-size: 50%;
+ }
+ .self > div {
+ justify-self: baseline;
+ }
+ .content > div {
+ align-content: baseline;
+ }
+ div.stretch {
+ justify-self: stretch;
+ }
+
+ .ref {
+ position: relative;
+ width: 96px;
+ height: 80px;
+ }
+ .ref > div {
+ position: absolute;
+ }
+ .ref1 { right: 16px; }
+ .ref2 { top: 20px;
+ right: 0px; }
+ .ref3 { right: 24px;
+ top: 60px; }
+ .ref4 { bottom: 0px;
+ right: 0px;
+ left: 0px;
+ height: 10px; }
+
+ .ref.content > div:not(.stripe) {
+ border-color: transparent;
+ }
+ .stripe {
+ width: 76px;
+ height: 80px;
+ }
+</style>
+
+<p>Test passes if each pair of boxes is identical.</p>
+
+<div class="grid self">
+ <div>
+ p<br>
+ p<br>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div class="stretch">
+ &nbsp;
+ </div>
+</div>
+
+<div class="grid self ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+</div>
+
+<br>
+
+<div class="grid content">
+ <div>
+ p<br>
+ p<br>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div>
+ p
+ </div>
+ <div class="stretch">
+ &nbsp;
+ </div>
+</div>
+
+<div class="grid content ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+ <div class="stripe">
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014-ref.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014-ref.html
new file mode 100644
index 00000000000..a6ca7c5aa7a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014-ref.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Reference: Percentage gap, content-based width/height (via float)</title>
+<style>
+ #grid {
+ border: solid 5px teal;
+ width: 200px;
+ height: 100px;
+ padding: 10px 0 0 10px;
+ }
+
+ #grid > div {
+ float: left;
+ border: solid 5px aqua;
+ width: 70px;
+ height: 30px;
+ margin-left: 5px;
+ }
+
+ /* highlight manual pass condition */
+ #grid > div:nth-child(even) {
+ border-right: none;
+ margin-left: 40px;
+ }
+ #grid > div:nth-child(n + 3) {
+ border-bottom: none;
+ margin-top: 25px;
+ }
+</style>
+
+<p>Test passes if there is no red.
+
+<div id="grid">
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014.html
new file mode 100644
index 00000000000..404e694ec86
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/grid-gutters-014.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Percentage gap, content-based width/height (via float)</title>
+<link rel="help" href="https://www.w3.org/TR/css-grid-1/#gutters">
+<link rel="help" href="https://www.w3.org/TR/css-align-3/#gaps">
+<link rel="match" href="grid-gutters-014-ref.html">
+<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact">
+<meta name="assert" content="Tests that percentage gaps contribute zero to intrinsic sizing, then resolve against corresponding axis of containing block for layout.">
+
+<style>
+ #grid {
+ display: grid;
+ border: solid 5px teal;
+ padding: 5px;
+ grid-gap: 15% 10%;
+ gap: 15% 10%;
+ float: left;
+ grid: auto auto / auto auto;
+ /* content box width = 200px height = 100px -> gap x = 20px y = 15px */
+ position: relative;
+ }
+
+ #grid > div {
+ margin: 5px 10px;
+ border: solid 5px aqua;
+ width: 70px;
+ height: 30px;
+ /* margin box height = 50px width = 100px */
+ }
+
+ /* highlight manual pass condition */
+ #grid > div:nth-child(even) {
+ border-right-color: red;
+ }
+ #grid > div:nth-child(n + 3) {
+ border-bottom-color: red;
+ }
+ #mask {
+ position: absolute;
+ border: 5px teal;
+ border-style: none solid solid none;
+ bottom: -5px; right: -5px;
+ top: 10px; left: 15px;
+ }
+</style>
+
+<p>Test passes if there is no red.
+<div id="grid">
+ <div></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <span id="mask"></span>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-align-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-align-001-ref.html
new file mode 100644
index 00000000000..7f8bb12cd63
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-align-001-ref.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<title>
+ Reference for Grid Item (First) Baseline Block-Axis Alignment: auto-height grid, auto row, auto items
+</title>
+
+<style>
+ @import "/fonts/ahem.css";
+ .grid {
+ border: solid silver;
+ margin: 1em 2px;
+ font: 20px/1 Ahem;
+
+ display: inline-block;
+ vertical-align: top;
+ }
+ .grid > div {
+ border: black 10px;
+ border-style: solid none;
+ color: orange;
+ }
+ div + div {
+ font-size: 2em;
+ }
+ div + div + div {
+ font-size: 50%;
+ }
+
+ .ref {
+ position: relative;
+ width: 80px;
+ height: 96px;
+ }
+ .ref > div {
+ position: absolute;
+ }
+ .ref1 { top: 16px; }
+ .ref2 { left: 20px; }
+ .ref3 { top: 24px;
+ left: 60px; }
+ .ref4 { right: 0px;
+ top: 0px;
+ bottom: 0px;
+ width: 10px; }
+
+ .ref.content > div:not(.stripe) {
+ border-color: transparent;
+ }
+ .stripe {
+ width: 80px;
+ height: 76px;
+ }
+</style>
+
+<p>Test passes if each pair of boxes is identical.</p>
+
+<div class="grid self ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+</div>
+
+<div class="grid self ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+</div>
+
+<br>
+
+<div class="grid content ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+ <div class="stripe">
+ </div>
+</div>
+
+
+<div class="grid content ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+ <div class="stripe">
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-justify-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-justify-001-ref.html
new file mode 100644
index 00000000000..d4db58e0906
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/alignment/references/grid-baseline-justify-001-ref.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<title>
+ Reference for Grid Item (First) Baseline Inline-Axis Alignment: auto-width grid, auto column, auto items
+</title>
+
+<style>
+ @import "/fonts/ahem.css";
+ .grid {
+ border: solid silver;
+ margin: 1em 2px;
+ font: 20px/1 Ahem;
+
+ display: inline-block;
+ vertical-align: top;
+ }
+ .grid > div {
+ border: black 10px;
+ border-style: none solid;
+ color: orange;
+ writing-mode: vertical-rl;
+ }
+ div + div {
+ font-size: 2em;
+ }
+ div + div + div {
+ font-size: 50%;
+ }
+
+ .ref {
+ position: relative;
+ width: 96px;
+ height: 80px;
+ }
+ .ref > div {
+ position: absolute;
+ }
+ .ref1 { right: 16px; }
+ .ref2 { top: 20px;
+ right: 0px; }
+ .ref3 { right: 24px;
+ top: 60px; }
+ .ref4 { bottom: 0px;
+ right: 0px;
+ left: 0px;
+ height: 10px; }
+
+ .ref.content > div:not(.stripe) {
+ border-color: transparent;
+ }
+ .stripe {
+ width: 76px;
+ height: 80px;
+ }
+</style>
+
+<p>Test passes if each pair of boxes is identical.</p>
+
+<div class="grid self ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+</div>
+
+<div class="grid self ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+</div>
+
+<br>
+
+<div class="grid content ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+ <div class="stripe">
+ </div>
+</div>
+
+<div class="grid content ref">
+ <div class="ref1">
+ p<br>
+ p<br>
+ p
+ </div>
+ <div class="ref2">
+ p
+ </div>
+ <div class="ref3">
+ p
+ </div>
+ <div class="ref4">
+ &nbsp;
+ </div>
+ <div class="stripe">
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-columns-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-columns-001.html
index 83ab583797d..44c60801010 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-columns-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-columns-001.html
@@ -23,6 +23,7 @@
}
.gridOnlyAutoRepeat { grid-template-columns: repeat(auto-fill, 30px [autobar]); }
+.gridPercentAutoRepeat { grid-template-columns: repeat(auto-fit, 30% [autobar]); padding: 0 13px; }
.gridMinMaxAutoRepeat { grid-template-columns: repeat(auto-fill, minmax(13px, 30px)); }
.gridMaxMinAutoRepeat { grid-template-columns: repeat(auto-fill, minmax(30px, 13px)); }
.gridMaxMinPercentAutoRepeat { grid-template-columns: repeat(auto-fill, minmax(30px, 6.5%)); }
@@ -51,6 +52,10 @@
<div class="item" style="grid-column: 1 / -1" data-offset-x="0" data-offset-y="0" data-expected-width="180" data-expected-height="25"></div>
</div>
+<div class="grid gridPercentAutoRepeat">
+ <div class="item" style="grid-column: 1 / -1" data-offset-x="13" data-offset-y="0" data-expected-width="180" data-expected-height="25"></div>
+</div>
+
<div class="grid gridMinMaxAutoRepeat">
<div class="item" style="grid-column: 1 / -1" data-offset-x="0" data-offset-y="0" data-expected-width="180" data-expected-height="25"></div>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-rows-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-rows-001.html
index d3078b7b3ad..55462fa8d05 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-rows-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fill-rows-001.html
@@ -28,6 +28,7 @@
}
.gridOnlyAutoRepeat { grid-template-rows: repeat(auto-fill, 30px [autobar]); }
+.gridPercentAutoRepeat { grid-template-rows: repeat(auto-fill, 30%); padding: 13px 0; }
.gridMinMaxAutoRepeat { grid-template-rows: repeat(auto-fill, minmax(13px, 30px)); }
.gridMaxMinAutoRepeat { grid-template-rows: repeat(auto-fill, minmax(30px, 13px)); }
.gridMaxMinPercentAutoRepeat { grid-template-rows: repeat(auto-fill, minmax(30px, 6.5%)); }
@@ -57,6 +58,10 @@
<div class="item" style="grid-row: 1 / -1" data-offset-y="0" data-offset-x="0" data-expected-height="180" data-expected-width="25"></div>
</div>
+<div class="grid gridPercentAutoRepeat">
+ <div class="item" style="grid-row: 1 / -1" data-offset-y="13" data-offset-x="0" data-expected-height="180" data-expected-width="25"></div>
+</div>
+
<div class="grid gridMinMaxAutoRepeat">
<div class="item" style="grid-row: 1 / -1" data-offset-y="0" data-offset-x="0" data-expected-height="180" data-expected-width="25"></div>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-columns-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-columns-001.html
index 524bb209a56..b19881f5ac8 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-columns-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-columns-001.html
@@ -1,6 +1,5 @@
<!DOCTYPE html>
<title>CSS Grid: auto-fit columns</title>
-<base href="https://wpt.live/css/css-grid/grid-definition/grid-auto-fill-rows-001.html">
<link rel="author" title="Sergio Villar" href="mailto: svillar@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-grid-1/#valdef-repeat-auto-fit">
@@ -26,6 +25,7 @@
}
.gridOnlyAutoRepeat { grid-template-columns: repeat(auto-fit, 30px [autobar]); }
+.gridPercentAutoRepeat { grid-template-columns: repeat(auto-fit, 30% [autobar]); padding: 0 13px; }
.gridMinMaxAutoRepeat { grid-template-columns: repeat(auto-fill, minmax(13px, 30px)); }
.gridMaxMinAutoRepeat { grid-template-columns: repeat(auto-fill, minmax(30px, 13px)); }
.gridMaxMinPercentAutoRepeat { grid-template-columns: repeat(auto-fill, minmax(30px, 6.5%)); }
@@ -56,6 +56,10 @@
<div class="item" style="grid-column: 1 / -1" data-offset-x="0" data-offset-y="0" data-expected-width="180" data-expected-height="25"></div>
</div>
+<div class="grid gridPercentAutoRepeat">
+ <div class="item" style="grid-column: 1 / -1" data-offset-x="13" data-offset-y="0" data-expected-width="180" data-expected-height="25"></div>
+</div>
+
<div class="grid gridMinMaxAutoRepeat">
<div class="item" style="grid-column: 1 / -1" data-offset-x="0" data-offset-y="0" data-expected-width="180" data-expected-height="25"></div>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-rows-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-rows-001.html
index fef304b2188..627a980c088 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-rows-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/grid-definition/grid-auto-fit-rows-001.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<title>CSS Grid: auto-fit rows</title>
-h<link rel="author" title="Sergio Villar" href="mailto: svillar@igalia.com">
+<link rel="author" title="Sergio Villar" href="mailto: svillar@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-grid-1/#valdef-repeat-auto-fit">
<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-columns">
<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-rows">
@@ -27,6 +27,7 @@ h<link rel="author" title="Sergio Villar" href="mailto: svillar@igalia.com">
}
.gridOnlyAutoRepeat { grid-template-rows: repeat(auto-fit, 30px [autobar]); }
+.gridPercentAutoRepeat { grid-template-rows: repeat(auto-fill, 30%); padding: 13px 0; }
.gridMinMaxAutoRepeat { grid-template-rows: repeat(auto-fill, minmax(13px, 30px)); }
.gridMaxMinAutoRepeat { grid-template-rows: repeat(auto-fill, minmax(30px, 13px)); }
.gridMaxMinPercentAutoRepeat { grid-template-rows: repeat(auto-fill, minmax(30px, 6.5%)); }
@@ -56,6 +57,10 @@ h<link rel="author" title="Sergio Villar" href="mailto: svillar@igalia.com">
<div class="item" style="grid-row: 1 / span 6" data-offset-y="0" data-offset-x="0" data-expected-height="180" data-expected-width="25"></div>
</div>
+<div class="grid gridPercentAutoRepeat">
+ <div class="item" style="grid-row: 1 / -1" data-offset-y="13" data-offset-x="0" data-expected-height="180" data-expected-width="25"></div>
+</div>
+
<div class="grid gridMinMaxAutoRepeat">
<div class="item" style="grid-row: 1 / -1" data-offset-y="0" data-offset-x="0" data-expected-height="180" data-expected-width="25"></div>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-gutters-and-tracks-001.html b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-gutters-and-tracks-001.html
index ebf914dbe98..caa83e1d8f7 100644
--- a/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-gutters-and-tracks-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid/grid-model/grid-gutters-and-tracks-001.html
@@ -9,6 +9,8 @@
<style>
body { margin: 0px; }
+.grid { padding: 3px 7px 5px 1px; border: solid yellow 1px; }
+
.normalGap { grid-gap: normal; }
.gridGap { grid-gap: 16px; }
@@ -57,132 +59,132 @@ div.grid > div { font: 10px/1 Ahem; }
<!-- Check that gutters contribute to the size of the grid containers. -->
<div style="position: relative;">
- <div class="grid normalGap gridMultipleCols fit-content" data-expected-width="160" data-expected-height="0"></div>
- <div class="grid normalGap gridMultipleRows" style="width: 400px" data-expected-width="400" data-expected-height="160"></div>
+ <div class="grid normalGap gridMultipleCols fit-content" data-expected-width="170" data-expected-height="10"></div>
+ <div class="grid normalGap gridMultipleRows" style="width: 400px" data-expected-width="410" data-expected-height="170"></div>
</div>
<div style="position: relative">
- <div class="grid gridRowColumnGaps fit-content" data-expected-width="93" data-expected-height="52">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="10">XX</div>
- <div class="secondRowSecondColumn" data-offset-x="43" data-offset-y="22" data-expected-width="50" data-expected-height="30">XX<br>X<br>XX XX</div>
+ <div class="grid gridRowColumnGaps fit-content" data-expected-width="103" data-expected-height="62">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="20" data-expected-height="10">XX</div>
+ <div class="secondRowSecondColumn" data-offset-x="45" data-offset-y="26" data-expected-width="50" data-expected-height="30">XX<br>X<br>XX XX</div>
</div>
</div>
<div style="position: relative">
- <div class="grid gridMultipleCols gridRowColumnGaps fit-content" data-expected-width="206" data-expected-height="84">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="30" data-expected-height="10">XX</div>
- <div class="secondRowSecondColumn" data-offset-x="53" data-offset-y="22" data-expected-width="50" data-expected-height="20">XX<br>XX XX</div>
- <div class="thirdRowThirdColumn" data-offset-x="126" data-offset-y="54" data-expected-width="80" data-expected-height="30">XXXX XX<br>X<br>XX XX</div>
+ <div class="grid gridMultipleCols gridRowColumnGaps fit-content" data-expected-width="216" data-expected-height="94">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="30" data-expected-height="10">XX</div>
+ <div class="secondRowSecondColumn" data-offset-x="55" data-offset-y="26" data-expected-width="50" data-expected-height="20">XX<br>XX XX</div>
+ <div class="thirdRowThirdColumn" data-offset-x="128" data-offset-y="58" data-expected-width="80" data-expected-height="30">XXXX XX<br>X<br>XX XX</div>
</div>
</div>
<div style="position: relative">
- <div class="grid gridMultipleRows gridRowColumnGaps fit-content" data-expected-width="186" data-expected-height="214">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="90">XX</div>
- <div class="secondRowSecondColumn" data-offset-x="43" data-offset-y="102" data-expected-width="50" data-expected-height="70">XX<br>XX XX</div>
- <div class="thirdRowThirdColumn" data-offset-x="116" data-offset-y="184" data-expected-width="70" data-expected-height="30">XXXX XX<br>X<br>XX XX</div>
+ <div class="grid gridMultipleRows gridRowColumnGaps fit-content" data-expected-width="196" data-expected-height="224">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="20" data-expected-height="90">XX</div>
+ <div class="secondRowSecondColumn" data-offset-x="45" data-offset-y="106" data-expected-width="50" data-expected-height="70">XX<br>XX XX</div>
+ <div class="thirdRowThirdColumn" data-offset-x="118" data-offset-y="188" data-expected-width="70" data-expected-height="30">XXXX XX<br>X<br>XX XX</div>
</div>
</div>
<!-- Check that gutters do not alter grid items positioning. -->
<div style="position: relative">
<div class="grid gridMultipleFixed gridRowColumnGaps">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="37">X X X</div>
- <div class="secondRowSecondColumn" data-offset-x="38" data-offset-y="49" data-expected-width="25" data-expected-height="57">X X</div>
- <div class="thirdRowThirdColumn" data-offset-x="86" data-offset-y="118" data-expected-width="35" data-expected-height="77">XXX XX X XX XX</div>
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="15" data-expected-height="37">X X X</div>
+ <div class="secondRowSecondColumn" data-offset-x="40" data-offset-y="53" data-expected-width="25" data-expected-height="57">X X</div>
+ <div class="thirdRowThirdColumn" data-offset-x="88" data-offset-y="122" data-expected-width="35" data-expected-height="77">XXX XX X XX XX</div>
</div>
</div>
<div style="position: relative">
<div class="grid gridMultipleFixed gridRowColumnGaps">
- <div style="grid-row: 2; grid-column: -2 / -1;" data-offset-x="86" data-offset-y="49" data-expected-width="35" data-expected-height="57">X X X</div>
- <div style="grid-row: 1 / bar; grid-column: bar" data-offset-x="86" data-offset-y="0" data-expected-width="35" data-expected-height="106">X XX X XX XX XX X</div>
- <div style="grid-row: -2; grid-column-end: foo" data-offset-x="0" data-offset-y="118" data-expected-width="15" data-expected-height="77">X X</div>
+ <div style="grid-row: 2; grid-column: -2 / -1;" data-offset-x="88" data-offset-y="53" data-expected-width="35" data-expected-height="57">X X X</div>
+ <div style="grid-row: 1 / bar; grid-column: bar" data-offset-x="88" data-offset-y="4" data-expected-width="35" data-expected-height="106">X XX X XX XX XX X</div>
+ <div style="grid-row: -2; grid-column-end: foo" data-offset-x="2" data-offset-y="122" data-expected-width="15" data-expected-height="77">X X</div>
</div>
</div>
<!-- Check that gutters do not alter track sizing. -->
<div style="position: relative">
- <div class="grid gridRowColumnGaps fit-content" data-expected-width="156" data-expected-height="84">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="10">XX</div>
- <div class="secondRowSecondColumn" data-offset-x="43" data-offset-y="22" data-expected-width="30" data-expected-height="20">X X<br>X X</div>
- <div class="thirdRowThirdColumn" data-offset-x="96" data-offset-y="54" data-expected-width="60" data-expected-height="30">XXX XX<br>X<br>XX XX</div>
+ <div class="grid gridRowColumnGaps fit-content" data-expected-width="166" data-expected-height="94">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="20" data-expected-height="10">XX</div>
+ <div class="secondRowSecondColumn" data-offset-x="45" data-offset-y="26" data-expected-width="30" data-expected-height="20">X X<br>X X</div>
+ <div class="thirdRowThirdColumn" data-offset-x="98" data-offset-y="58" data-expected-width="60" data-expected-height="30">XXX XX<br>X<br>XX XX</div>
</div>
</div>
<div style="position: relative">
- <div class="grid gridRowColumnGaps gridMultipleCols gridMultipleRows fit-content" data-expected-width="206" data-expected-height="214">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="30" data-expected-height="90">XX</div>
- <div class="secondRowSecondColumn" data-offset-x="53" data-offset-y="102" data-expected-width="50" data-expected-height="70">X X<br>X X</div>
- <div class="thirdRowThirdColumn" data-offset-x="126" data-offset-y="184" data-expected-width="80" data-expected-height="30">XXX XX<br>X<br>XX XX</div>
+ <div class="grid gridRowColumnGaps gridMultipleCols gridMultipleRows fit-content" data-expected-width="216" data-expected-height="224">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="30" data-expected-height="90">XX</div>
+ <div class="secondRowSecondColumn" data-offset-x="55" data-offset-y="106" data-expected-width="50" data-expected-height="70">X X<br>X X</div>
+ <div class="thirdRowThirdColumn" data-offset-x="128" data-offset-y="188" data-expected-width="80" data-expected-height="30">XXX XX<br>X<br>XX XX</div>
</div>
</div>
<div style="position: relative">
- <div class="grid gridWithPercent width220 gridRowColumnGaps gridAutoRows20" data-expected-width="220" data-expected-height="84">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="10" data-expected-height="20"></div>
- <div class="secondRowSecondColumn" data-offset-x="33" data-offset-y="32" data-expected-width="44" data-expected-height="20"></div>
- <div class="thirdRowThirdColumn" data-offset-x="100" data-offset-y="64" data-expected-width="30" data-expected-height="20"></div>
+ <div class="grid gridWithPercent width220 gridRowColumnGaps gridAutoRows20" data-expected-width="230" data-expected-height="94">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="10" data-expected-height="20"></div>
+ <div class="secondRowSecondColumn" data-offset-x="35" data-offset-y="36" data-expected-width="44" data-expected-height="20"></div>
+ <div class="thirdRowThirdColumn" data-offset-x="102" data-offset-y="68" data-expected-width="30" data-expected-height="20"></div>
</div>
</div>
<div style="position: relative">
- <div class="grid gridWithRowPercent gridRowColumnGaps width220 height100" data-expected-width="220" data-expected-height="100">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="10"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="22" data-expected-width="20" data-expected-height="20"></div>
- <div class="thirdRowAutoColumn" data-offset-x="0" data-offset-y="54" data-expected-width="20" data-expected-height="30"></div>
+ <div class="grid gridWithRowPercent gridRowColumnGaps width220 height100" data-expected-width="230" data-expected-height="110">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="20" data-expected-height="10"></div>
+ <div class="secondRowFirstColumn" data-offset-x="2" data-offset-y="26" data-expected-width="20" data-expected-height="20"></div>
+ <div class="thirdRowAutoColumn" data-offset-x="2" data-offset-y="58" data-expected-width="20" data-expected-height="30"></div>
</div>
</div>
<!-- Check that gutters contribute to the size of spanning items. -->
<div style="position: relative">
<div class="grid gridGap gridAutoAuto constrainedContainer">
- <div class="secondRowBothColumn" data-offset-x="0" data-offset-y="26" data-expected-width="50" data-expected-height="10">XXXXX</div>
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="17" data-expected-height="10">X</div>
- <div class="firstRowSecondColumn" data-offset-x="33" data-offset-y="0" data-expected-width="17" data-expected-height="10">X</div>
+ <div class="secondRowBothColumn" data-offset-x="2" data-offset-y="30" data-expected-width="50" data-expected-height="10">XXXXX</div>
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="17" data-expected-height="10">X</div>
+ <div class="firstRowSecondColumn" data-offset-x="35" data-offset-y="4" data-expected-width="17" data-expected-height="10">X</div>
</div>
</div>
<div style="position: relative">
<div class="grid gridMultipleFixed gridRowColumnGaps">
- <div style="grid-row: 2; grid-column: 1 / -1;" data-offset-x="0" data-offset-y="49" data-expected-width="121" data-expected-height="57">XXXX X XXXX</div>
- <div style="grid-row: first / last; grid-column-start: 2" data-offset-x="38" data-offset-y="0" data-expected-width="25" data-expected-height="195">X XX X XX X</div>
- <div style="grid-row: 1 / 3; grid-column: first / bar" data-offset-x="0" data-offset-y="0" data-expected-width="63" data-expected-height="106">XXX XX<br>XX<br>XXXXX</div>
+ <div style="grid-row: 2; grid-column: 1 / -1;" data-offset-x="2" data-offset-y="53" data-expected-width="121" data-expected-height="57">XXXX X XXXX</div>
+ <div style="grid-row: first / last; grid-column-start: 2" data-offset-x="40" data-offset-y="4" data-expected-width="25" data-expected-height="195">X XX X XX X</div>
+ <div style="grid-row: 1 / 3; grid-column: first / bar" data-offset-x="2" data-offset-y="4" data-expected-width="63" data-expected-height="106">XXX XX<br>XX<br>XXXXX</div>
</div>
</div>
<div style="position: relative">
- <div class="grid gridWithDoublePercent width220 gridRowColumnGaps gridAutoRows20" data-expected-width="220" data-expected-height="52">
- <div class="firstRowFirstColumn sizedToGridArea" data-offset-x="0" data-offset-y="0" data-expected-width="132" data-expected-height="20"></div>
- <div class="secondRowSecondColumn sizedToGridArea" data-offset-x="155" data-offset-y="32" data-expected-width="88" data-expected-height="20"></div>
- <div class="secondRowBothColumn sizedToGridArea" data-offset-x="0" data-offset-y="32" data-expected-width="243" data-expected-height="20"></div>
+ <div class="grid gridWithDoublePercent width220 gridRowColumnGaps gridAutoRows20" data-expected-width="230" data-expected-height="62">
+ <div class="firstRowFirstColumn sizedToGridArea" data-offset-x="2" data-offset-y="4" data-expected-width="132" data-expected-height="20"></div>
+ <div class="secondRowSecondColumn sizedToGridArea" data-offset-x="157" data-offset-y="36" data-expected-width="88" data-expected-height="20"></div>
+ <div class="secondRowBothColumn sizedToGridArea" data-offset-x="2" data-offset-y="36" data-expected-width="243" data-expected-height="20"></div>
</div>
</div>
<div style="position: relative">
- <div class="grid gridWithRowDoublePercent gridRowColumnGaps width220 height100" data-expected-width="220" data-expected-height="100">
- <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="60"></div>
- <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="72" data-expected-width="20" data-expected-height="40"></div>
- <div class="bothRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="112"></div>
+ <div class="grid gridWithRowDoublePercent gridRowColumnGaps width220 height100" data-expected-width="230" data-expected-height="110">
+ <div class="firstRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="20" data-expected-height="60"></div>
+ <div class="secondRowFirstColumn" data-offset-x="2" data-offset-y="76" data-expected-width="20" data-expected-height="40"></div>
+ <div class="bothRowFirstColumn" data-offset-x="2" data-offset-y="4" data-expected-width="20" data-expected-height="112"></div>
</div>
</div>
<!-- Check that gutters do not interfere with margins computation. -->
<div style="position: relative">
<div class="grid gridFixed100 gridGap">
- <div class="gridItemMargins firstRowFirstColumn" data-offset-x="50" data-offset-y="20" data-expected-width="20" data-expected-height="40"></div>
- <div class="gridItemMargins firstRowSecondColumn" data-offset-x="166" data-offset-y="20" data-expected-width="20" data-expected-height="40"></div>
- <div class="gridItemMargins secondRowFirstColumn" data-offset-x="50" data-offset-y="136" data-expected-width="20" data-expected-height="40"></div>
- <div class="gridItemMargins secondRowSecondColumn" data-offset-x="166" data-offset-y="136" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins firstRowFirstColumn" data-offset-x="52" data-offset-y="24" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins firstRowSecondColumn" data-offset-x="168" data-offset-y="24" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins secondRowFirstColumn" data-offset-x="52" data-offset-y="140" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins secondRowSecondColumn" data-offset-x="168" data-offset-y="140" data-expected-width="20" data-expected-height="40"></div>
</div>
</div>
<div style="position: relative">
<div class="grid gridFixed100 verticalRL directionRTL gridGap">
- <div class="gridItemMargins firstRowFirstColumn" data-offset-x="166" data-offset-y="136" data-expected-width="20" data-expected-height="40"></div>
- <div class="gridItemMargins firstRowSecondColumn" data-offset-x="166" data-offset-y="20" data-expected-width="20" data-expected-height="40"></div>
- <div class="gridItemMargins secondRowFirstColumn" data-offset-x="50" data-offset-y="136" data-expected-width="20" data-expected-height="40"></div>
- <div class="gridItemMargins secondRowSecondColumn" data-offset-x="50" data-offset-y="20" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins firstRowFirstColumn" data-offset-x="168" data-offset-y="140" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins firstRowSecondColumn" data-offset-x="168" data-offset-y="24" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins secondRowFirstColumn" data-offset-x="52" data-offset-y="140" data-expected-width="20" data-expected-height="40"></div>
+ <div class="gridItemMargins secondRowSecondColumn" data-offset-x="52" data-offset-y="24" data-expected-width="20" data-expected-height="40"></div>
</div>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-background-image.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-background-image.html
index 2687a5c64b5..d294b669e35 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-background-image.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-background-image.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Images Module Level 3: image-orientation does not apply to background-image</title>
+<title>CSS Images Module Level 3: image-orientation does apply to background-image</title>
<link rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
<link rel="match" href="reference/image-orientation-background-image-ref.html">
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-border-image.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-border-image.html
index 85b363ecc2f..312c6736fb5 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-border-image.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-border-image.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Images Module Level 3: image-orientation does not apply to border images</title>
+<title>CSS Images Module Level 3: image-orientation does apply to border images</title>
<link rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
<link rel="match" href="reference/image-orientation-border-image-ref.html">
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-cursor.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-cursor.html
new file mode 100644
index 00000000000..00a80d46ba9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-cursor.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation does apply to cursor</title>
+<link rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="flags" content="interact">
+<style>
+div { width: 100px; height: 100px; border: solid blue; margin-left: 64px; }
+.orient { cursor: url(support/cursor-8-llo.jpg) 33 0, default; }
+.no-orient { cursor: url(support/cursor-8-llo.jpg) 64 33, default; image-orientation: none; }
+</style>
+<p>The test passes if</p>
+<ul>
+ <li>when moved inside either of the blue boxes, the cursor is shown as a
+ black arrow on a white background, with the point of the arrow at the current
+ cursor location</li>
+ <li>in the first box, the cursor points up and to the right</li>
+ <li>in the second box, the cursor points down and to the right</li>
+</ul>
+<div class="orient"></div>
+<div class="no-orient"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-iframe.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-iframe.html
new file mode 100644
index 00000000000..69cfb5ceae4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-iframe.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation does not apply to iframe contents</title>
+<link rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au">
+<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
+<link rel="match" href="reference/image-orientation-iframe-ref.html">
+<style>
+.no-orient { image-orientation: none; }
+</style>
+<iframe src="support/exif-orientation-2-ur.jpg"></iframe>
+<iframe src="support/exif-orientation-2-ur.jpg" class="no-orient"></iframe>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-list-style-image.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-list-style-image.html
index 33730a323ad..926b3ab9ff0 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-list-style-image.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-list-style-image.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>CSS Images Module Level 3: image-orientation does not apply to list-style-image</title>
+<title>CSS Images Module Level 3: image-orientation does apply to list-style-image</title>
<link rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au">
<link rel="help" href="https://drafts.csswg.org/css-images-3/#propdef-image-orientation">
<link rel="match" href="reference/image-orientation-list-style-image-ref.html">
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-background-image-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-background-image-ref.html
index e5709064798..a3e2ece6e7c 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-background-image-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-background-image-ref.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Reference</title>
<style>
-div { width: 100px; height: 50px; background-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg); }
+div { width: 100px; height: 50px; }
+.orient { background-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg); }
+.no-orient { background-image: url(../support/exif-orientation-9-u.jpg); }
</style>
-<div></div>
-<div></div>
-
+<div class="orient"></div>
+<div class="no-orient"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-border-image-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-border-image-ref.html
index 3f9b68832b1..51aa8d0e467 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-border-image-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-border-image-ref.html
@@ -6,8 +6,9 @@ div {
width: 100px;
height: 50px;
border: 10px solid black;
- border-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg) 10;
}
+.orient { border-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg) 10; }
+.no-orient { border-image: url(../support/exif-orientation-9-u.jpg) 10; }
</style>
-<div></div>
-<div></div>
+<div class="orient"></div>
+<div class="no-orient"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-iframe-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-iframe-ref.html
new file mode 100644
index 00000000000..a9e9b3fbe30
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-iframe-ref.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Reference</title>
+<iframe src="../support/exif-orientation-2-ur.jpg"></iframe>
+<iframe src="../support/exif-orientation-2-ur.jpg"></iframe>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-list-style-image-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-list-style-image-ref.html
index 433cf98e636..8dcef6a2439 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-list-style-image-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-list-style-image-ref.html
@@ -2,7 +2,9 @@
<meta charset="utf-8">
<title>CSS Reference</title>
<style>
-ul { margin-left: 100px; list-style-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg); }
+ul { margin-left: 100px; }
+.orient { list-style-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg); }
+.no-orient { list-style-image: url(../support/exif-orientation-9-u.jpg); }
</style>
-<ul><li>&nbsp;</li></ul>
-<ul><li>&nbsp;</li></ul>
+<ul class="orient"><li>&nbsp;</li></ul>
+<ul class="no-orient"><li>&nbsp;</li></ul>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-mask-image-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-mask-image-ref.html
index ff078244151..ba593032456 100644
--- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-mask-image-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-mask-image-ref.html
@@ -6,9 +6,10 @@ div {
width: 100px;
height: 50px;
background: blue;
- mask-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg);
mask-mode: luminance;
}
+.orient { mask-image: url(../support/exif-orientation-2-ur-pre-rotated.jpg); }
+.no-orient { mask-image: url(../support/exif-orientation-9-u.jpg); }
</style>
-<div></div>
-<div></div>
+<div class="orient"></div>
+<div class="no-orient"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/cursor-8-llo.jpg b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/cursor-8-llo.jpg
new file mode 100644
index 00000000000..ef26ad4aaae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/support/cursor-8-llo.jpg
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-000.html b/tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-000.html
new file mode 100644
index 00000000000..7e6ec67e298
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-000.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:100px; background:green;">
+ <div style="height:80px;">
+ <div style="column-span:all; height:10px; margin-bottom:20px;"></div>
+ </div>
+ <div style="column-span:all; height:10px; margin-top:20px;"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-001.html b/tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-001.html
new file mode 100644
index 00000000000..fa8dfc8bcdf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/non-adjacent-spanners-001.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:100px; background:red;">
+ <div style="height:200px; background:green;">
+ <div style="column-span:all;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners-crash.html b/tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners-crash.html
new file mode 100644
index 00000000000..d48ff19b99a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners-crash.html
@@ -0,0 +1,23 @@
+<!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=1102137">
+<div style="columns:3;">
+ <span id="inlineWithBlock"><div></div></span><div id="spanner1" style="column-span:all;"></div>
+ <div id="spanner2" style="display:none; column-span:all;"></div>
+ <div id="block1" style="display:none;"></div>
+ <div id="spanner3" style="display:none; column-span:all;"></div>
+ <div id="block2" style="display:none;"></div>
+</div>
+<script>
+ document.body.offsetTop;
+ inlineWithBlock.style.display = "none";
+ document.body.offsetTop;
+ spanner1.style.display = "none";
+ document.body.offsetTop;
+ spanner2.style.display = "block";
+ document.body.offsetTop;
+ block1.style.display = "block";
+ block2.style.display = "block";
+ document.body.offsetTop;
+ spanner3.style.display = "block";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners.html b/tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners.html
new file mode 100644
index 00000000000..c943e549860
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/remove-inline-with-block-beside-spanners.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#column-span">
+<meta name="assert" content="Margins of two adjacent spanners will collapse with each other">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<style>
+ #spanner1 {
+ column-span: all;
+ margin-bottom: 100px;
+ }
+ #spanner2 {
+ column-span: all;
+ margin-top: 100px;
+ }
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div style="columns:3; width:100px; background:green;">
+ <div id="spanner1"></div>
+ <span id="inlineWithBlock"><div></div></span><div id="spanner2"></div>
+</div>
+<script>
+ document.body.offsetTop;
+ inlineWithBlock.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-000.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-000.html
new file mode 100644
index 00000000000..f700235621a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-000.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<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; width:100px; height:100px; column-fill:auto; column-gap:0; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="height:40px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-001.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-001.html
new file mode 100644
index 00000000000..2cfbd2defa5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-001.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<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; width:100px; height:100px; column-fill:auto; column-gap:0; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="height:40px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-002.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-002.html
new file mode 100644
index 00000000000..970a1ecbfe7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-002.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<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; width:100px; height:100px; column-fill:auto; column-gap:0; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="height:20px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="height:20px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-003.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-003.html
new file mode 100644
index 00000000000..857ccf92ba9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-003.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<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; width:100px; height:100px; column-fill:auto; column-gap:0; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:60px; background:green;"></div>
+ <div style="column-span:all; height:80px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-004.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-004.html
new file mode 100644
index 00000000000..2199a9340b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-004.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="column-span:all; height:50px;">
+ <div style="height:50px; background:green;"></div>
+ <div style="height:50px;"></div>
+ <div style="height:100px; background:green;"></div>
+ </div>
+ <div style="column-span:all; height:10px; background:green;"></div>
+ <div style="height:80px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-005.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-005.html
new file mode 100644
index 00000000000..56e35c74daf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-005.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="column-span:all; height:50px;">
+ <div style="height:50px; background:green;"></div>
+ <div style="height:70px;"></div>
+ <div style="height:80px; background:green;"></div>
+ </div>
+ <div style="column-span:all; height:10px; background:green;"></div>
+ <div style="height:120px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-006.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-006.html
new file mode 100644
index 00000000000..60325b1d178
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-006.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
+<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:4; column-fill:auto; column-gap:0; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="column-span:all; height:10px;">
+ <div style="height:10px; background:green;"></div>
+ <div style="height:360px;"></div>
+ <div style="height:30px; background:green;"></div>
+ </div>
+ <div style="column-span:all; height:100px;">
+ <div style="height:100px; background:green;"></div>
+ <div style="height:240px;"></div>
+ <div style="height:20px; background:green;"></div>
+ </div>
+ <div style="column-span:all; height:240px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-007.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-007.html
new file mode 100644
index 00000000000..ea71c779fea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-007.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="column-span:all; margin-bottom:-30px; height:100px;">
+ <div style="height:70px; background:green;"></div>
+ </div>
+ <div style="column-span:all; height:130px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-008.html b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-008.html
new file mode 100644
index 00000000000..d28eafe6555
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol/spanner-fragmentation-008.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-multicol-1/#spanning-columns">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#parallel-flows">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns:2; column-fill:auto; column-gap:0; width:100px; height:100px; background:red;">
+ <div style="columns:2; column-gap:0;">
+ <div style="column-span:all; margin-bottom:30px; height:50px;">
+ <div style="height:80px; background:green;"></div>
+ <div style="height:40px;"></div>
+ <div style="height:80px; background:green;"></div>
+ </div>
+ <div style="column-span:all; margin-top:30px; height:40px; background:green;"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index-ref.html b/tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index-ref.html
new file mode 100644
index 00000000000..4f8d043e5a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/CSS2/visuren.html#propdef-z-index">
+<link rel="help" href="https://www.w3.org/TR/compositing-1/">
+<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+
+<div style="position: relative; will-change: transform; z-index: -1"></div>
+<div id="target"
+ style="width: 50px; height: 50px; background: blue; opacity: 0.99"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index.html b/tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index.html
new file mode 100644
index 00000000000..52deaa08061
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position/invalidate-opacity-negative-z-index.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+ <link rel="help" href="https://www.w3.org/TR/CSS2/visuren.html#propdef-z-index">
+ <link rel="help" href="https://www.w3.org/TR/compositing-1/">
+ <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+ <link rel="match" href="invalidate-opacity-negative-z-index-ref.html">
+
+ <div style="position: relative; will-change: transform; z-index: -1"></div>
+ <div id="target"
+ style="width: 50px; height: 50px; background: blue; opacity: 0.2"></div>
+ <script>
+ onload = () => {
+ requestAnimationFrame(() => requestAnimationFrame(() => {
+ target.style.opacity = 0.99;
+ document.documentElement.className = "";
+ }));
+ };
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-100.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-100.html
new file mode 100644
index 00000000000..57fad60d7f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-100.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at line endings (letters)</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='match' href='reference/letter-spacing-100-ref.html'>
+<meta name="assert" content="Letter spacing is not applied at the start/end of a line.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ width: 5em;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ span, .test {
+ letter-spacing: 1em;
+ }
+ .pre, .control p {
+ white-space: pre-wrap;
+ }
+ p { margin: 0; }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all four blue boxes.</div>
+
+<!-- Letter-spacing on Containing Block -->
+<div class="contain">
+ <!-- single line block test -->
+ <p class="test">1 2</p>
+ <!-- start/end line wrap test -->
+ <p class="test">12三456七89</p>
+ <!-- start/end forced line breaks test -->
+ <p class="test">123<br>4 5<br>678</p>
+ <p class="test pre">123&#x0A;4 5&#x0A;678</p>
+</div>
+
+<!-- Line Endings Coinciding with Inline Element Boundary (Internal Break) -->
+<div class="contain">
+ <!-- single line block test -->
+ <p><span>1 2</span></p>
+ <!-- start/end line wrap test -->
+ <p>1 2 三<span>456</span>七 8 9</p>
+ <!-- start/end forced line breaks test -->
+ <p>1 2 3<span><br>4 5<br></span>6 7 8</p>
+ <p class="pre">1 2 3<span>&#x0A;4 5&#x0A;</span>6 7 8</p>
+</div>
+
+<!-- Line Endings Coinciding with Inline Element Boundary (External Break) -->
+<div class="contain">
+ <!-- duplicate single line block test -->
+ <p><span>1 2</span></p>
+ <!-- start/end line wrap test -->
+ <p>1 2 三<span>456</span>七 8 9</p>
+ <!-- start/end forced line breaks test -->
+ <p>1 2 3<br><span>4 5</span><br>6 7 8</p>
+ <p class="pre">1 2 3&#x0A;<span>4 5</span>&#x0A;6 7 8</p>
+</div>
+
+<!-- Control -->
+<div class="contain control">
+ <p>1 2</p>
+ <p>1 2 三<br>4 5 6<br>七 8 9</p>
+ <p>1 2 3<br>4 5<br>6 7 8</p>
+ <p>1 2 3<br>4 5<br>6 7 8</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-101.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-101.html
new file mode 100644
index 00000000000..dcf5e96cd80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-101.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at line endings (spaces)</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='match' href='reference/letter-spacing-101-ref.html'>
+<meta name="assert" content="Letter spacing is not applied at the start/end of a line even on spaces.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ /* Setup Boxes */
+ font: 20px/1 Ahem;
+ width: 5em;
+ border: solid blue;
+ margin: 1em;
+ float: left;
+ }
+ span, .test {
+ letter-spacing: 1em;
+ }
+ p {
+ white-space: pre-wrap;
+ margin: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all four blue boxes.</div>
+
+<!-- Letter-spacing on Containing Block -->
+<div class="contain">
+ <!-- single line block test -->
+ <p class="test"> x </p>
+ <!-- start/end line wrap test -->
+ <p class="test">xx &#x200B; x &#x200B; xx</p>
+ <!-- start/end forced line breaks test -->
+ <p class="test">xx <br> x <br> xx</p>
+ <p class="test">xx &#x0A; x &#x0A; xx</p>
+</div>
+
+<!-- Line Endings Coinciding with Inline Element Boundary (Internal Break) -->
+<div class="contain">
+ <!-- single line block test -->
+ <p><span> x </span></p>
+ <!-- start/end line wrap test -->
+ <p>x x &#x200B;<span> x </span>&#x200B; x x</p>
+ <!-- start/end forced line breaks test -->
+ <p>x x <span><br> x <br></span> x x</p>
+ <p>x x <span>&#x0A; x &#x0A;</span> x x</p>
+</div>
+
+<!-- Line Endings Coinciding with Inline Element Boundary (External Break) -->
+<div class="contain">
+ <!-- duplicate single line block test -->
+ <p><span> x </span></p>
+ <!-- start/end line wrap test -->
+ <p>x x <span>&#x200B; x &#x200B;</span> x x</p>
+ <!-- start/end forced line breaks test -->
+ <p>x x <br><span> x </span><br> x x</p>
+ <p>x x &#x0A;<span> x </span>&#x0A; x x</p>
+</div>
+
+<!-- Control -->
+<div class="contain">
+ <p> x </p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-102.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-102.html
new file mode 100644
index 00000000000..6e045c6c430
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-102.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing on zero-width characters</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='match' href='reference/letter-spacing-102-ref.html'>
+<meta name="assert" content="Letter spacing ignores zero-width formatting characters.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .test { letter-spacing: 1em; float: left; color: green; background: red; font: 20px/1 Ahem; }
+ .spacing { position: absolute; width: 1em; height: 2em; margin: 0 1em; background: green; }
+</style>
+
+<div id='instructions'>Test passes if there is a green rectangle below and no red.</div>
+
+<div class="test">
+<div class="spacing"></div>
+<!--
+-->&#x200B;&#x200C;&#x200D;&#xFEFF;<!-- zwsp etc.
+-->&#x200E;&#x200F;&#x2066;&#x2067;&#x2068;&#x202A;&#x202B;&#x202C;&#x202D;&#x202E;&#x2069;&#x2069;<!-- bidi
+-->&#x206A;&#x206B;&#x206C;&#x206D;&#x206B;&#x206E;&#x206F;<!-- Arabic/compat
+-->&#x2060;&#x2061;&#x2062;&#x2063;&#x2064;<!-- math
+-->x<!--
+-->&#x200B;&#x200C;&#x200D;&#xFEFF;<!-- zwsp etc.
+-->&#x200E;&#x200F;&#x2066;&#x2067;&#x2068;&#x202A;&#x202B;&#x202C;&#x202D;&#x202E;&#x2069;&#x2069;<!-- bidi
+-->&#x206A;&#x206B;&#x206C;&#x206D;&#x206B;&#x206E;&#x206F;<!-- Arabic/compat
+-->&#x2060;&#x2061;&#x2062;&#x2063;&#x2064;<!-- math
+-->x<!--
+-->&#x200B;&#x200C;&#x200D;&#xFEFF;<!-- zwsp etc.
+-->&#x200E;&#x200F;&#x2066;&#x2067;&#x2068;&#x202A;&#x202B;&#x202C;&#x202D;&#x202E;&#x2069;&#x2069;<!-- bidi
+-->&#x206A;&#x206B;&#x206C;&#x206D;&#x206B;&#x206E;&#x206F;<!-- Arabic/compat
+-->&#x2060;&#x2061;&#x2062;&#x2063;&#x2064;<!-- math
+--><br>
+<!--
+-->&#x200B;&#x200C;&#x200D;&#xFEFF;<!-- zwsp etc.
+-->&#x200E;&#x200F;&#x2066;&#x2067;&#x2068;&#x202A;&#x202B;&#x202C;&#x202D;&#x202E;&#x2069;&#x2069;<!-- bidi
+-->&#x206A;&#x206B;&#x206C;&#x206D;&#x206B;&#x206E;&#x206F;<!-- Arabic/compat
+-->&#x2060;&#x2061;&#x2062;&#x2063;&#x2064;<!-- math
+-->xx<!--
+-->&#x200B;&#x200C;&#x200D;&#xFEFF;<!-- zwsp etc.
+-->&#x200E;&#x200F;&#x2066;&#x2067;&#x2068;&#x202A;&#x202B;&#x202C;&#x202D;&#x202E;&#x2069;&#x2069;<!-- bidi
+-->&#x206A;&#x206B;&#x206C;&#x206D;&#x206B;&#x206E;&#x206F;<!-- Arabic/compat
+-->&#x2060;&#x2061;&#x2062;&#x2063;&#x2064;<!-- math
+-->
+</div></div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-103.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-103.html
new file mode 100644
index 00000000000..42e78822d71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-103.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='match' href='reference/letter-spacing-103-ref.html'>
+<meta name="assert" content="Letter spacing between two characters is given by their closest mutual ancestor.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ .ls0 {
+ letter-spacing: 0;
+ }
+ .ls1 {
+ letter-spacing: 1em;
+ }
+ .ls3 {
+ letter-spacing: 3em;
+ }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ word-break: break-all;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in both blue boxes.</div>
+
+<div class="contain">
+ <!-- middle owned by containing block: simple -->
+ <p class="ls1"><span class="ls0">AAA</span><span class="ls0">BBB</span></p>
+ <p><span class="ls1">AAA</span><span class="ls1">BBB</span></p>
+ <!-- middle owned by containing block: double nesting -->
+ <p><span class="ls1"><span class="ls0">AAA</span></span><span class="ls1">BBB</span></p>
+ <p><span class="ls0"><span class="ls1">AAA</span></span><span class="ls1">BBB</span></p>
+ <!-- middle owned by inline: simple -->
+ <p><span class="ls1"><span class="ls0">AAA</span><span class="ls0">BBB</span></span></p>
+ <p><span><span class="ls1">AAA</span><span class="ls1">BBB</span></span></p>
+ <!-- middle owned by inline: double nesting -->
+ <p><span><span class="ls1"><span class="ls0">AAA</span></span><span class="ls1">BBB</span></span></p>
+ <p><span class="ls3"><span class="ls0"><span class="ls1">AAA</span></span><span class="ls1">BBB</span></span></p>
+ <!-- middle containing space -->
+ <p class="ls1"><span class="ls0">AAA</span> <span class="ls0">BBB</span></p>
+ <p><span class="ls3"><span class="ls1"><span class="ls0">AAA</span> </span><span class="ls1">BBB</span></span></p>
+</div>
+
+<div class="contain control">
+ <!-- middle owned by containing block: simple -->
+ <p>AAA BBB</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by containing block: double nesting -->
+ <p>AAAB B B</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by inline: simple -->
+ <p>AAA BBB</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by inline: double nesting -->
+ <p>AAAB B B</p>
+ <p>A A A B B B</p>
+ <!-- middle containing space -->
+ <p>AAA BBB</p>
+ <p>AAA B B B</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-104.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-104.html
new file mode 100644
index 00000000000..763c6666e23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-104.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='match' href='reference/letter-spacing-104-ref.html'>
+<meta name="assert" content="Letter spacing is not applied between atomic inlines, but is applied between a (run of) atomic inline(s) and an adjacent letter.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ .ls1 {
+ letter-spacing: 1em;
+ }
+ .block, .table, .flex, .grid {
+ display: inline-block;
+ width: 15px;
+ height: 15px;
+ background: orange;
+ }
+ .table {
+ display: inline-table;
+ }
+ .flex {
+ display: inline-flex;
+ }
+ .grid {
+ display: inline-grid;
+ }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ }
+ span:not([class]) {
+ padding-top: 1em;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all blue boxes.</div>
+
+<div class="contain">
+ <p class="ls1">A<img src="support/swatch-orange.png"><img src="support/swatch-orange.png">D</p>
+ <p class="ls1">A<img class="block" src="support/swatch-orange.png"><img class="block" src="support/swatch-orange.png">D</p>
+ <p class="ls1">A<span class="block"></span><span class="block"></span>D</p>
+ <p class="ls1">A<span class="table"></span><span class="block"></span>D</p>
+ <p class="ls1">A<span class="flex"></span><span class="block"></span>D</p>
+ <p class="ls1">A<span class="grid"></span><span class="block"></span>D</p>
+</div>
+
+<div class="contain">
+ <p class="ls1">A<span><img src="support/swatch-orange.png"></span><img src="support/swatch-orange.png">D</p>
+ <p class="ls1">A<span><img class="block" src="support/swatch-orange.png"></span><img class="block" src="support/swatch-orange.png">D</p>
+ <p class="ls1">A<span><span class="block"></span></span><span class="block"></span>D</p>
+ <p class="ls1">A<span><span class="table"></span></span><span class="block"></span>D</p>
+ <p class="ls1">A<span><span class="flex"></span></span><span class="block"></span>D</p>
+ <p class="ls1">A<span><span class="grid"></span></span><span class="block"></span>D</p>
+</div>
+
+<div class="contain">
+ <p class="ls1"><span>A</span><img src="support/swatch-orange.png"><span><img src="support/swatch-orange.png"></span>D</p>
+ <p class="ls1"><span>A</span><img class="block" src="support/swatch-orange.png"><span><img class="block" src="support/swatch-orange.png"></span>D</p>
+ <p class="ls1"><span>A</span><span class="block"></span><span><span class="block"></span></span>D</p>
+ <p class="ls1"><span>A</span><span class="table"></span><span><span class="block"></span></span>D</p>
+ <p class="ls1"><span>A</span><span class="flex"></span><span><span class="block"></span></span>D</p>
+ <p class="ls1"><span>A</span><span class="grid"></span><span><span class="block"></span></span>D</p>
+</div>
+
+<div class="contain control">
+ <p>A <img src="support/swatch-orange.png"><img src="support/swatch-orange.png"> D</p>
+ <p>A <img class="block" src="support/swatch-orange.png"><img class="block" src="support/swatch-orange.png"> D</p>
+ <p>A <span class="block"></span><span class="block"></span> D</p>
+ <p>A <span class="table"></span><span class="block"></span> D</p>
+ <p>A <span class="flex"></span><span class="block"></span> D</p>
+ <p>A <span class="grid"></span><span class="block"></span> D</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-105.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-105.html
new file mode 100644
index 00000000000..a94daa0aff2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-105.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='match' href='reference/letter-spacing-105-ref.html'>
+<meta name="assert" content="Letter spacing is applied after any intervening text-empty inlines.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ width: max-content; }
+ .ls1 {
+ letter-spacing: 1em;
+ }
+ span {
+ border: solid orange;
+ }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in both blue boxes.</div>
+
+<div class="contain">
+ <p class="ls1"><span></span>A<span></span><span></span>D<span></span></p>
+</div>
+
+<div class="contain control">
+ <p><span></span>A<span></span><span></span> D<span></span>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-106.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-106.html
new file mode 100644
index 00000000000..4ebf9a3d465
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-106.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='match' href='reference/letter-spacing-106-ref.html'>
+<meta name="assert" content="Letter spacing affects unwrapped min-content and max-content sizes.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ .ls0 {
+ letter-spacing: 0;
+ }
+ .ls1 {
+ letter-spacing: 1em;
+ }
+ .ls3 {
+ letter-spacing: 3em;
+ }
+ .control p {
+ white-space: pre;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ word-break: break-all;
+ float: left;
+ clear: left;
+ border-right: solid orange 1em;
+ background: yellow;
+ }
+ .squash {
+ width: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all three blue boxes.</div>
+
+<div class="contain">
+<p class="ls1">AAA<span>BBB</span></p>
+<!-- middle owned by containing block: simple -->
+<p class="ls1"><span class="ls0">AAA</span><span class="ls0">BBB</span></p>
+<p><span class="ls1">AAA</span><span class="ls1">BBB</span></p>
+<!-- middle owned by containing block: double nesting -->
+<p class="ls3"><span class="ls1"><span class="ls0">AAA</span></span><span class="ls1">BBB</span></p>
+<p class="ls3"><span class="ls0"><span class="ls1">AAA</span></span><span class="ls1">BBB</span></p>
+<!-- middle owned by inline: simple -->
+<p><span class="ls1"><span class="ls0">AAA</span><span class="ls0">BBB</span></span></p>
+<p><span><span class="ls1">AAA</span><span class="ls1">BBB</span></span></p>
+<!-- middle owned by inline: double nesting -->
+<p><span><span class="ls1"><span class="ls0">AAA</span></span><span class="ls1">BBB</span></span></p>
+<p><span class="ls3"><span class="ls0"><span class="ls1">AAA</span></span><span class="ls1">BBB</span></span></p>
+<!-- middle containing space -->
+<p class="ls1"><span class="ls0">AAA</span> <span class="ls0">BBB</span></p>
+<p><span class="ls3"><span class="ls1"><span class="ls0">AAA</span> </span><span class="ls1">BBB</span></span></p>
+</div>
+
+<div class="contain" style="white-space: nowrap; width: 14em;">
+<div class="squash">
+<p class="ls1"><span>AAA</span><span>BBB</span></p>
+<!-- middle owned by containing block: simple -->
+<p class="ls1"><span class="ls0">AAA</span><span class="ls0">BBB</span></p>
+<p><span class="ls1">AAA</span><span class="ls1">BBB</span></p>
+<!-- middle owned by containing block: double nesting -->
+<p class="ls3"><span class="ls1"><span class="ls0">AAA</span></span><span class="ls1">BBB</span></p>
+<p class="ls3"><span class="ls0"><span class="ls1">AAA</span></span><span class="ls1">BBB</span></p>
+<!-- middle owned by inline: simple -->
+<p><span class="ls1"><span class="ls0">AAA</span><span class="ls0">BBB</span></span></p>
+<p><span><span class="ls1">AAA</span><span class="ls1">BBB</span></span></p>
+<!-- middle owned by inline: double nesting -->
+<p><span><span class="ls1"><span class="ls0">AAA</span></span><span class="ls1">BBB</span></span></p>
+<p><span class="ls3"><span class="ls0"><span class="ls1">AAA</span></span><span class="ls1">BBB</span></span></p>
+<!-- middle containing space -->
+<p class="ls1"><span class="ls0">AAA</span> <span class="ls0">BBB</span></p>
+<p><span class="ls3"><span class="ls1"><span class="ls0">AAA</span> </span><span class="ls1">BBB</span></span></p>
+</div>
+</div>
+
+<div class="contain control">
+<p>A A A B B B</p>
+<!-- middle owned by containing block: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by containing block: double nesting -->
+<p>AAA B B B</p>
+<p>A A A B B B</p>
+<!-- middle owned by inline: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by inline: double nesting -->
+<p>AAAB B B</p>
+<p>A A A B B B</p>
+<!-- middle containing space -->
+<p>AAA BBB</p>
+<p>AAA B B B</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-111.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-111.html
new file mode 100644
index 00000000000..d143cf0713a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-111.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='help' href='https://www.w3.org/TR/css-text-decor-4/#emphasis-marks'>
+<link rel='match' href='reference/letter-spacing-111-ref.html'>
+<meta name="assert" content="Emphasis marks are centered on characters, not characters + spacing.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ margin: 1em;
+ }
+ .ls1 {
+ letter-spacing: 1em;
+ }
+ .control p {
+ white-space: pre-wrap;
+ color: blue;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ text-emphasis: dot;
+ }
+</style>
+
+<div id='instructions'>Test passes if the blue pattern is identical to the black one.</div>
+
+<div class="contain">
+ <p class="ls1">ABC</p>
+</div>
+
+<div class="contain control">
+ <p>A B C
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-112.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-112.html
new file mode 100644
index 00000000000..a998c4ffdec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/letter-spacing-112.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<link rel='help' href='https://www.w3.org/TR/css-text-3/#letter-spacing'>
+<link rel='help' href='https://www.w3.org/TR/css-ruby-1/'>
+<link rel='match' href='reference/letter-spacing-112-ref.html'>
+<meta name="assert" content="Ruby annotations are centered on bases, not bases + trailing letter-spacing.">
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ margin: 1em; }
+ .ls1 {
+ letter-spacing: 1em;
+ }
+ .control p {
+ white-space: pre-wrap;
+ color: blue;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the blue pattern is identical to the black one.</div>
+
+<div class="contain">
+ <p class="ls1"><ruby>A<rt>a</rt>BB<rt>b</rt></ruby></p>
+</div>
+
+<div class="contain control">
+ <p><ruby>A<rt>a</rt></ruby> <ruby>B B<rt>b</rt></ruby></p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-100-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-100-ref.html
new file mode 100644
index 00000000000..d6e87a56d92
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-100-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ width: 5em;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ .pre, .control p {
+ white-space: pre;
+ }
+ p { margin: 0; }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all four blue boxes.</div>
+
+<!-- Control -->
+<div class="contain control">
+ <p>x x</p>
+ <p>x x 水<br>x x x<br>水 x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+</div>
+
+<!-- Control -->
+<div class="contain control">
+ <p>x x</p>
+ <p>x x 水<br>x x x<br>水 x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+</div>
+
+<!-- Control -->
+<div class="contain control">
+ <p>x x</p>
+ <p>x x 水<br>x x x<br>水 x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+</div>
+
+<!-- Control -->
+<div class="contain control">
+ <p>x x</p>
+ <p>x x 水<br>x x x<br>水 x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+ <p>x x x<br>x x<br>x x x</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-101-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-101-ref.html
new file mode 100644
index 00000000000..6898da609d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-101-ref.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ width: 5em;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ p { margin: 0;
+ white-space: pre; }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all four blue boxes.</div>
+
+<!-- Control -->
+<div class="contain">
+ <p> x </p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+</div>
+
+<!-- Control -->
+<div class="contain">
+ <p> x </p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+</div>
+
+<!-- Control -->
+<div class="contain">
+ <p> x </p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+</div>
+
+<!-- Control -->
+<div class="contain">
+ <p> x </p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+ <p>x x <br> x <br> x x</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-102-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-102-ref.html
new file mode 100644
index 00000000000..08ea8e56e3d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-102-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .test { float: left; color: green; background: red; font: 20px/1 Ahem; }
+ .spacing { position: absolute; width: 1em; height: 2em; margin: 0 1em; background: green; }
+</style>
+
+<div id='instructions'>Test passes if there is a green rectangle below and no red.</div>
+
+<div class="test"><div class="spacing"></div>xx<br>xx</div></div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-103-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-103-ref.html
new file mode 100644
index 00000000000..3461347a28e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-103-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in both blue boxes.</div>
+
+<div class="contain control">
+ <!-- middle owned by containing block: simple -->
+ <p>AAA BBB</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by containing block: double nesting -->
+ <p>AAAB B B</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by inline: simple -->
+ <p>AAA BBB</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by inline: double nesting -->
+ <p>AAAB B B</p>
+ <p>A A A B B B</p>
+ <!-- middle containing space -->
+ <p>AAA BBB</p>
+ <p>AAA B B B</p>
+</div>
+
+<div class="contain control">
+ <!-- middle owned by containing block: simple -->
+ <p>AAA BBB</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by containing block: double nesting -->
+ <p>AAAB B B</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by inline: simple -->
+ <p>AAA BBB</p>
+ <p>A A AB B B</p>
+ <!-- middle owned by inline: double nesting -->
+ <p>AAAB B B</p>
+ <p>A A A B B B</p>
+ <!-- middle containing space -->
+ <p>AAA BBB</p>
+ <p>AAA B B B</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-104-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-104-ref.html
new file mode 100644
index 00000000000..078656c4631
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-104-ref.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+
+ .block, .table, .flex, .grid {
+ display: inline-block;
+ width: 15px;
+ height: 15px;
+ background: orange;
+ }
+ .table {
+ display: inline-table;
+ }
+ .flex {
+ display: inline-flex;
+ }
+ .grid {
+ display: inline-grid;
+ }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all blue boxes.</div>
+
+<div class="contain control">
+ <p>A <img src="../support/swatch-orange.png"><img src="../support/swatch-orange.png"> D</p>
+ <p>A <img class="block" src="../support/swatch-orange.png"><img class="block" src="../support/swatch-orange.png"> D</p>
+ <p>A <span class="block"></span><span class="block"></span> D</p>
+ <p>A <span class="table"></span><span class="block"></span> D</p>
+ <p>A <span class="flex"></span><span class="block"></span> D</p>
+ <p>A <span class="grid"></span><span class="block"></span> D</p>
+</div>
+
+<div class="contain control">
+ <p>A <img src="../support/swatch-orange.png"><img src="../support/swatch-orange.png"> D</p>
+ <p>A <img class="block" src="../support/swatch-orange.png"><img class="block" src="../support/swatch-orange.png"> D</p>
+ <p>A <span class="block"></span><span class="block"></span> D</p>
+ <p>A <span class="table"></span><span class="block"></span> D</p>
+ <p>A <span class="flex"></span><span class="block"></span> D</p>
+ <p>A <span class="grid"></span><span class="block"></span> D</p>
+</div>
+
+<div class="contain control">
+ <p>A <img src="../support/swatch-orange.png"><img src="../support/swatch-orange.png"> D</p>
+ <p>A <img class="block" src="../support/swatch-orange.png"><img class="block" src="../support/swatch-orange.png"> D</p>
+ <p>A <span class="block"></span><span class="block"></span> D</p>
+ <p>A <span class="table"></span><span class="block"></span> D</p>
+ <p>A <span class="flex"></span><span class="block"></span> D</p>
+ <p>A <span class="grid"></span><span class="block"></span> D</p>
+</div>
+
+<div class="contain control">
+ <p>A <img src="../support/swatch-orange.png"><img src="../support/swatch-orange.png"> D</p>
+ <p>A <img class="block" src="../support/swatch-orange.png"><img class="block" src="../support/swatch-orange.png"> D</p>
+ <p>A <span class="block"></span><span class="block"></span> D</p>
+ <p>A <span class="table"></span><span class="block"></span> D</p>
+ <p>A <span class="flex"></span><span class="block"></span> D</p>
+ <p>A <span class="grid"></span><span class="block"></span> D</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-105-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-105-ref.html
new file mode 100644
index 00000000000..3c6e2aa60e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-105-ref.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ width: max-content; }
+ .ls1 {
+ letter-spacing: 1em;
+ }
+ span {
+ border: solid orange;
+ }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in both blue boxes.</div>
+
+<div class="contain control">
+ <p><span></span>A<span></span><span></span> D<span></span>
+</div>
+
+<div class="contain control">
+ <p><span></span>A<span></span><span></span> D<span></span>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-106-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-106-ref.html
new file mode 100644
index 00000000000..36bad163f0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-106-ref.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ border: solid blue;
+ margin: 1em;
+ float: left; }
+ .control p {
+ white-space: pre;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ word-break: break-all;
+ float: left;
+ clear: left;
+ border-right: solid orange 1em;
+ background: yellow;
+ }
+</style>
+
+<div id='instructions'>Test passes if the pattern is identical in all three blue boxes.</div>
+
+<div class="contain control">
+<p>A A A B B B</p>
+<!-- middle owned by containing block: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by containing block: double nesting -->
+<p>AAA B B B</p>
+<p>A A A B B B</p>
+<!-- middle owned by inline: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by inline: double nesting -->
+<p>AAAB B B</p>
+<p>A A A B B B</p>
+<!-- middle containing space -->
+<p>AAA BBB</p>
+<p>AAA B B B</p>
+</div>
+
+<div class="contain control">
+<p>A A A B B B</p>
+<!-- middle owned by containing block: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by containing block: double nesting -->
+<p>AAA B B B</p>
+<p>A A A B B B</p>
+<!-- middle owned by inline: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by inline: double nesting -->
+<p>AAAB B B</p>
+<p>A A A B B B</p>
+<!-- middle containing space -->
+<p>AAA BBB</p>
+<p>AAA B B B</p>
+</div>
+
+<div class="contain control">
+<p>A A A B B B</p>
+<!-- middle owned by containing block: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by containing block: double nesting -->
+<p>AAA B B B</p>
+<p>A A A B B B</p>
+<!-- middle owned by inline: simple -->
+<p>AAA BBB</p>
+<p>A A AB B B</p>
+<!-- middle owned by inline: double nesting -->
+<p>AAAB B B</p>
+<p>A A A B B B</p>
+<!-- middle containing space -->
+<p>AAA BBB</p>
+<p>AAA B B B</p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-111-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-111-ref.html
new file mode 100644
index 00000000000..9b3499ed7c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-111-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>letter-spacing at element boundaries</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ margin: 1em; }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ text-emphasis: dot;
+ }
+</style>
+
+<div id='instructions'>Test passes if the blue pattern is identical to the black one.</div>
+
+<div class="contain control">
+ <p>A B C
+</div>
+
+<div class="contain control" style="color:blue">
+ <p>A B C
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-112-ref.html b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-112-ref.html
new file mode 100644
index 00000000000..889803699d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/reference/letter-spacing-112-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html lang="en" >
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel='author' title='Elika J. Etemad' href='http://fantasai.inkedblade.net/contact'>
+<style type='text/css'>
+ @import "/fonts/ahem.css";
+ .contain {
+ font: 20px/1 Ahem;
+ margin: 1em; }
+ .control p {
+ white-space: pre-wrap;
+ }
+ p {
+ letter-spacing: 0;
+ margin: 0;
+ }
+</style>
+
+<div id='instructions'>Test passes if the blue pattern is identical to the black one.</div>
+
+<div class="contain control">
+ <p><ruby>A<rt>a</rt></ruby> <ruby>B B<rt>b</rt></ruby></p>
+</div>
+
+<div class="contain control" style="color: blue">
+ <p><ruby>A<rt>a</rt></ruby> <ruby>B B<rt>b</rt></ruby></p>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text/letter-spacing/support/swatch-orange.png b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/support/swatch-orange.png
new file mode 100644
index 00000000000..d3cd498b52b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text/letter-spacing/support/swatch-orange.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-text/white-space/white-space-letter-spacing-001.html b/tests/wpt/web-platform-tests/css/css-text/white-space/white-space-letter-spacing-001.html
index 5d65c67c320..8d8ab401e83 100644
--- a/tests/wpt/web-platform-tests/css/css-text/white-space/white-space-letter-spacing-001.html
+++ b/tests/wpt/web-platform-tests/css/css-text/white-space/white-space-letter-spacing-001.html
@@ -6,7 +6,6 @@
<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"/>
<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property"/>
<link rel="match" href="reference/white-space-letter-spacing-001-ref.html"/>
-<meta name="assert" content="Letter-spacing must not be applied at the beginning or at the end of a line."/>
<style>
div {
font: 16px monospace;
diff --git a/tests/wpt/web-platform-tests/css/css-transitions/transition-duration-shorthand.html b/tests/wpt/web-platform-tests/css/css-transitions/transition-duration-shorthand.html
new file mode 100644
index 00000000000..181d52b3889
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transitions/transition-duration-shorthand.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<link rel="help" href="https://drafts.csswg.org/css-transitions/#transition-duration-property">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1650189">
+<link rel="author" href="http://mellthas.de" title="Till Berger">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<script src="/resources/testharness.js" type="text/javascript"></script>
+<script src="/resources/testharnessreport.js" type="text/javascript"></script>
+<title>transition-duration when looking at shorthand properties should be correct</title>
+<style>
+ div {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ transition: all 100s, height 0s;
+ }
+ div.trigger {
+ width: 200px;
+ height: 200px;
+ }
+</style>
+<div></div>
+<script>
+ promise_test(async function (t) {
+ let div = document.querySelector("div");
+ let cs = getComputedStyle(div);
+ assert_equals(cs.width, "100px", "Width should start off correct");
+ assert_equals(cs.height, "100px", "Height should start off correct");
+
+ div.classList.add("trigger");
+
+ await new Promise(resolve => {
+ requestAnimationFrame(() => requestAnimationFrame(resolve));
+ });
+
+ assert_not_equals(cs.width, "200px", "Width should not have advanced to the end of the transition right away");
+ assert_equals(cs.height, "200px", "Height should have advanced to the end of the transition right away");
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssTransformComponent-toMatrix.html b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssTransformComponent-toMatrix.html
index 14d819be40a..d3e510296bd 100644
--- a/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssTransformComponent-toMatrix.html
+++ b/tests/wpt/web-platform-tests/css/css-typed-om/stylevalue-subclasses/cssTransformComponent-toMatrix.html
@@ -51,7 +51,7 @@ test(() => {
test(() => {
const component = new CSSSkewX(
- new CSSUnitValue(10, 'rad'),
+ new CSSUnitValue(10, 'deg'),
);
const expectedMatrix = (new DOMMatrixReadOnly()).skewX(10);
assert_matrix_approx_equals(component.toMatrix(), expectedMatrix, gEpsilon);
@@ -59,7 +59,7 @@ test(() => {
test(() => {
const component = new CSSSkewY(
- new CSSUnitValue(10, 'rad'),
+ new CSSUnitValue(10, 'deg'),
);
const expectedMatrix = (new DOMMatrixReadOnly()).skewY(10);
assert_matrix_approx_equals(component.toMatrix(), expectedMatrix, gEpsilon);
diff --git a/tests/wpt/web-platform-tests/css/cssom-view/MediaQueryList-change-event-matches-value.html b/tests/wpt/web-platform-tests/css/cssom-view/MediaQueryList-change-event-matches-value.html
new file mode 100644
index 00000000000..d96c6bdff78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom-view/MediaQueryList-change-event-matches-value.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<title>MediaQueryList.changed is correct for all lists in the document even during a change event handler</title>
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1648839">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#evaluate-media-queries-and-report-changes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/matchMedia.js"></script>
+<body>
+<script>
+ promise_test(async t => {
+ // Create two identical media queries.
+ let mql = await createMQL(t);
+ let mql2 = getWindow(mql).matchMedia(mql.media);
+
+ let changeEvents = 0;
+
+ let check = t.step_func(function() {
+ changeEvents++;
+ assert_equals(mql.matches, mql2.matches, "Value of .matches should match"); // No pun intended
+ });
+
+ mql.addListener(check);
+ mql2.addListener(check);
+
+ triggerMQLEvent(mql);
+ await waitForChangesReported();
+
+ assert_equals(changeEvents, 2, "Should've fired the change event in both MediaQueryLists");
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/css/cssom/CSSStyleSheet-modify-after-removal.html b/tests/wpt/web-platform-tests/css/cssom/CSSStyleSheet-modify-after-removal.html
new file mode 100644
index 00000000000..010c0b93281
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/cssom/CSSStyleSheet-modify-after-removal.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<title>CSS Test: CSSStyleSheet modifications after removal</title>
+<link rel="help" href="https://drafts.csswg.org/cssom/#the-cssstylesheet-interface">
+<link rel="help" href="https://drafts.csswg.org/cssom/#the-cssrule-interface">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="frm"></iframe>
+<iframe id="frm2"></iframe>
+<script>
+ test(() => {
+ frm.contentDocument.body.innerHTML = "<style>div {color:red}</style>";
+ let sheet = frm.contentDocument.querySelector("style").sheet;
+ assert_equals(sheet.cssRules.length, 1);
+ frm.remove();
+ document.body.offsetTop;
+ sheet.insertRule("span {color: green}", 0);
+ assert_equals(sheet.cssRules.length, 2);
+ }, "Modify sheet from removed iframe");
+
+ test(() => {
+ frm2.contentWindow.eval("let sheet = new CSSStyleSheet(); document.adoptedStyleSheets = [ sheet ];");
+ let sheet = frm2.contentDocument.adoptedStyleSheets[0];
+ assert_equals(sheet.cssRules.length, 0);
+ frm2.remove();
+ document.body.offsetTop;
+ sheet.insertRule("span {color: green}", 0);
+ assert_equals(sheet.cssRules.length, 1);
+ }, "Modify constructed sheet from removed iframe");
+</script>
diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md b/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
index bd7d42be968..72263dbd4ea 100644
--- a/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
+++ b/tests/wpt/web-platform-tests/docs/writing-tests/testharness-api.md
@@ -528,6 +528,10 @@ with some existing test framework that has its own timeout mechanism).
`allow_uncaught_exception` - don't treat an uncaught exception as an error;
needed when e.g. testing the `window.onerror` handler.
+`hide_test_state` - hide the test state output while the test is
+running; This is helpful when the output of the test state may interfere
+the test results.
+
`timeout_multiplier` - Multiplier to apply to per-test timeouts.
`single_test` - Test authors may set this property to `true` to enable [the
diff --git a/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers b/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers
index fe839ef5bb6..a6c7386bda0 100644
--- a/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/echo-policy-nested.html.headers
@@ -1 +1 @@
-Document-Policy: unoptimized-lossless-images;bpp=0.0
+Document-Policy: unoptimized-lossless-images=0.0
diff --git a/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-tentative.html.headers b/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-tentative.html.headers
index bebb5d05482..745da550ee5 100644
--- a/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-tentative.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-tentative.html.headers
@@ -1 +1 @@
-Document-Policy: no-layout-animations
+Document-Policy: layout-animations=?0
diff --git a/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers b/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers
index bebb5d05482..745da550ee5 100644
--- a/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers
@@ -1 +1 @@
-Document-Policy: no-layout-animations
+Document-Policy: layout-animations=?0
diff --git a/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers b/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers
index bebb5d05482..745da550ee5 100644
--- a/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers
@@ -1 +1 @@
-Document-Policy: no-layout-animations
+Document-Policy: layout-animations=?0
diff --git a/tests/wpt/web-platform-tests/document-policy/experimental-features/unsized-media.tentative.https.sub.html.headers b/tests/wpt/web-platform-tests/document-policy/experimental-features/unsized-media.tentative.https.sub.html.headers
index d73d2520cb2..cf59933e8dd 100644
--- a/tests/wpt/web-platform-tests/document-policy/experimental-features/unsized-media.tentative.https.sub.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/experimental-features/unsized-media.tentative.https.sub.html.headers
@@ -1 +1 @@
-Document-Policy: no-unsized-media
+Document-Policy: unsized-media=?0
diff --git a/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-01.tentative.html.headers b/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-01.tentative.html.headers
index e1387f50dee..01b8bbccd44 100644
--- a/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-01.tentative.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-01.tentative.html.headers
@@ -1 +1 @@
-Document-Policy: no-font-display-late-swap
+Document-Policy: font-display-late-swap=?0
diff --git a/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers b/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers
index e090edd0da4..15091272777 100644
--- a/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-report-only.tentative.html.headers
@@ -1 +1 @@
-Document-Policy-Report-Only: no-font-display-late-swap \ No newline at end of file
+Document-Policy-Report-Only: font-display-late-swap=?0 \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers b/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers
index 84ad7cbf97b..273ca3564df 100644
--- a/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/font-display/font-display-document-policy-reporting.tentative.html.headers
@@ -1 +1 @@
-Document-Policy: no-font-display-late-swap \ No newline at end of file
+Document-Policy: font-display-late-swap=?0 \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/document-policy/reporting/oversized-images-reporting.html.headers b/tests/wpt/web-platform-tests/document-policy/reporting/oversized-images-reporting.html.headers
index 206db539c1e..10f5be1c334 100644
--- a/tests/wpt/web-platform-tests/document-policy/reporting/oversized-images-reporting.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/reporting/oversized-images-reporting.html.headers
@@ -1 +1 @@
-Document-Policy: oversized-images;scale=2.0
+Document-Policy: oversized-images=2.0
diff --git a/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting-onload.html.headers b/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting-onload.html.headers
index 261d5db13e3..3cad9badac3 100644
--- a/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting-onload.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting-onload.html.headers
@@ -1 +1 @@
-Document-Policy: unoptimized-lossy-images;bpp=0.5
+Document-Policy: unoptimized-lossy-images=0.5
diff --git a/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting.html.headers b/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting.html.headers
index 261d5db13e3..3cad9badac3 100644
--- a/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/reporting/unoptimized-lossy-images-reporting.html.headers
@@ -1 +1 @@
-Document-Policy: unoptimized-lossy-images;bpp=0.5
+Document-Policy: unoptimized-lossy-images=0.5
diff --git a/tests/wpt/web-platform-tests/document-policy/reporting/unsized-media-reporting.html.headers b/tests/wpt/web-platform-tests/document-policy/reporting/unsized-media-reporting.html.headers
index d73d2520cb2..cf59933e8dd 100644
--- a/tests/wpt/web-platform-tests/document-policy/reporting/unsized-media-reporting.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/reporting/unsized-media-reporting.html.headers
@@ -1 +1 @@
-Document-Policy: no-unsized-media
+Document-Policy: unsized-media=?0
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html
index 1935be3dd0a..b7fbceb2acd 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html
@@ -33,9 +33,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=2";
- iframe.policy = "no-font-display-late-swap";
+ iframe.policy = "font-display-late-swap=?0";
callbacks["2"] = t.step_func_done(result => {
- assert_equals(result, "no-font-display-late-swap");
+ assert_equals(result, "font-display-late-swap=?0");
});
document.body.appendChild(iframe);
}, "Child frame can have a required policy independent of the parent document.");
@@ -43,9 +43,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=3";
- iframe.policy = "unoptimized-lossless-images;bpp=4";
+ iframe.policy = "unoptimized-lossless-images=4";
callbacks["3"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=4.0");
+ assert_equals(result, "unoptimized-lossless-images=4.0");
});
document.body.appendChild(iframe);
}, "Child frame can have a required policy which is less strict than the parent document's policy.");
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers
index d321c265d15..8ea51b103f9 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/document-policy.html.headers
@@ -1 +1 @@
-Document-Policy: unoptimized-lossless-images;bpp=1.1
+Document-Policy: unoptimized-lossless-images=1.1
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html b/tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html
index 9af2e51c2ac..8a3624440f3 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/no-document-policy.html
@@ -33,9 +33,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=2";
- iframe.policy = "no-font-display-late-swap";
+ iframe.policy = "font-display-late-swap=?0";
callbacks["2"] = t.step_func_done(result => {
- assert_equals(result, "no-font-display-late-swap");
+ assert_equals(result, "font-display-late-swap=?0");
});
document.body.appendChild(iframe);
}, "Child frame can have an explicit required policy.");
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html
index 39e2a92f773..15281fcc287 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy-nested.html
@@ -34,29 +34,29 @@ async_test(t => {
// Frame tree should be:
// Top:
-// <iframe policy="unoptimized-lossless-images;bpp=1.1">
+// <iframe policy="unoptimized-lossless-images=1.1">
// <iframe>
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy-nested.html?id=2";
- iframe.policy = "unoptimized-lossless-images;bpp=1.1";
+ iframe.policy = "unoptimized-lossless-images=1.1";
callbacks["2"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=1.1");
+ assert_equals(result, "unoptimized-lossless-images=1.1");
});
document.body.appendChild(iframe);
}, "test nested required document policy when set by nested frame");
// Frame tree should be:
// Top:
-// <iframe policy="unoptimized-lossless-images;bpp=1.1">
+// <iframe policy="unoptimized-lossless-images=1.1">
// <iframe>
// <iframe>
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy-nested.html?id=3&level=1";
- iframe.policy = "unoptimized-lossless-images;bpp=1.1";
+ iframe.policy = "unoptimized-lossless-images=1.1";
callbacks["3"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=1.1");
+ assert_equals(result, "unoptimized-lossless-images=1.1");
});
document.body.appendChild(iframe);
}, "test nested required document policy when set by intermediate nested frame");
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html
index 12cebdd292a..99b64efab34 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html
@@ -26,7 +26,7 @@ async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=1";
callbacks["1"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=1.1");
+ assert_equals(result, "unoptimized-lossless-images=1.1");
});
document.body.appendChild(iframe);
}, "Child frame with no explicit policy should have the same required policy as its parent.");
@@ -34,9 +34,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=2";
- iframe.policy = "unoptimized-lossless-images;bpp=4";
+ iframe.policy = "unoptimized-lossless-images=4";
callbacks["2"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=1.1");
+ assert_equals(result, "unoptimized-lossless-images=1.1");
});
document.body.appendChild(iframe);
}, "Child frame with a less strict required policy should have the stricter value from the parent's policy applied.");
@@ -44,9 +44,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=3";
- iframe.policy = "unoptimized-lossless-images;bpp=1.0";
+ iframe.policy = "unoptimized-lossless-images=1.0";
callbacks["3"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=1.0");
+ assert_equals(result, "unoptimized-lossless-images=1.0");
});
document.body.appendChild(iframe);
}, "Child frame may have a stricter policy than the parent.");
@@ -54,9 +54,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=4";
- iframe.policy = "no-font-display-late-swap";
+ iframe.policy = "font-display-late-swap=?0";
callbacks["4"] = t.step_func_done(result => {
- assert_equals(result, "no-font-display-late-swap, unoptimized-lossless-images;bpp=1.1");
+ assert_equals(result, "font-display-late-swap=?0, unoptimized-lossless-images=1.1");
});
document.body.appendChild(iframe);
}, "Any unrelated policy directives should combine with the parent's required policy.");
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers
index 1b671dafe06..7f5cd92a482 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/required-document-policy.html.headers
@@ -1 +1 @@
-Require-Document-Policy: unoptimized-lossless-images;bpp=1.1
+Require-Document-Policy: unoptimized-lossless-images=1.1
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html b/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html
index c2611a5dcf2..347d0a9d92c 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html
@@ -25,7 +25,7 @@ async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=1";
callbacks["1"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=1.0");
+ assert_equals(result, "unoptimized-lossless-images=1.0");
});
document.body.appendChild(iframe);
}, "Child frame with no explicit policy should have the same required policy as its parent.");
@@ -33,9 +33,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=2";
- iframe.policy = "unoptimized-lossless-images;bpp=4";
+ iframe.policy = "unoptimized-lossless-images=4";
callbacks["2"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=1.0");
+ assert_equals(result, "unoptimized-lossless-images=1.0");
});
document.body.appendChild(iframe);
}, "Child frame with a less strict required policy should have the stricter value from the parent's policy applied.");
@@ -43,9 +43,9 @@ async_test(t => {
async_test(t => {
var iframe = document.createElement('iframe');
iframe.src = "/document-policy/echo-policy.py?id=3";
- iframe.policy = "unoptimized-lossless-images;bpp=0.9";
+ iframe.policy = "unoptimized-lossless-images=0.9";
callbacks["3"] = t.step_func_done(result => {
- assert_equals(result, "unoptimized-lossless-images;bpp=0.9");
+ assert_equals(result, "unoptimized-lossless-images=0.9");
});
document.body.appendChild(iframe);
}, "Child frame may have a stricter policy than the parent.");
@@ -55,7 +55,7 @@ async_test(t => {
iframe.src = "/document-policy/echo-policy.py?id=4";
iframe.policy = "no-font-display-late-swap";
callbacks["4"] = t.step_func_done(result => {
- assert_equals(result, "no-font-display-late-swap, unoptimized-lossless-images;bpp=1.0");
+ assert_equals(result, "no-font-display-late-swap, unoptimized-lossless-images=1.0");
});
document.body.appendChild(iframe);
}, "Any unrelated policy directives should combine with the parent's required policy.");
diff --git a/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html.headers b/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html.headers
index 0dcb2328ae7..c90842175d9 100644
--- a/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html.headers
+++ b/tests/wpt/web-platform-tests/document-policy/required-policy/separate-document-policies.html.headers
@@ -1,2 +1,2 @@
-Document-Policy: unoptimized-lossless-images;bpp=1.1
-Require-Document-Policy: unoptimized-lossless-images;bpp=1.0
+Document-Policy: unoptimized-lossless-images=1.1
+Require-Document-Policy: unoptimized-lossless-images=1.0
diff --git a/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-read.html b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-read.html
new file mode 100644
index 00000000000..10fc45fd933
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-read.html
@@ -0,0 +1,20 @@
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script>
+'use strict';
+
+(async () => {
+ try {
+ // TODO(https://crbug.com/1074482): Cross-origin focus is asynchronous and
+ // requires user gesture. Implement testing support for cross-origin focus.
+ window.focus(); // The Clipboard API requires focus.
+
+ await test_driver.set_permission({ name: 'clipboard-read' }, 'granted');
+ await navigator.clipboard.readText('test text');
+
+ window.parent.postMessage({ enabled: true }, "*");
+ } catch (e) {
+ window.parent.postMessage({ enabled: false }, "*");
+ }
+})();
+</script>
diff --git a/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-write.html b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-write.html
new file mode 100644
index 00000000000..7eb96e3db01
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-clipboard-write.html
@@ -0,0 +1,20 @@
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script>
+'use strict';
+
+(async () => {
+ try {
+ // TODO(https://crbug.com/1074482): Cross-origin focus is asynchronous and
+ // requires user gesture. Implement testing support for cross-origin focus.
+ window.focus(); // The Clipboard API requires focus.
+
+ await test_driver.set_permission({ name: 'clipboard-write' }, 'granted');
+ await navigator.clipboard.writeText('test text');
+
+ window.parent.postMessage({ enabled: true }, "*");
+ } catch (e) {
+ window.parent.postMessage({ enabled: false }, "*");
+ }
+})();
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/content-type/resources/content-type.py b/tests/wpt/web-platform-tests/fetch/content-type/resources/content-type.py
index 0b5e93b937c..91fcd97a7cb 100644
--- a/tests/wpt/web-platform-tests/fetch/content-type/resources/content-type.py
+++ b/tests/wpt/web-platform-tests/fetch/content-type/resources/content-type.py
@@ -1,15 +1,17 @@
+from wptserve.utils import isomorphic_encode
+
def main(request, response):
- values = request.GET.get_list("value")
- content = request.GET.first("content", "<b>hi</b>\n")
- output = "HTTP/1.1 200 OK\r\n"
- output += "X-Content-Type-Options: nosniff\r\n"
- if "single_header" in request.GET:
- output += "Content-Type: " + ",".join(values) + "\r\n"
+ values = request.GET.get_list(b"value")
+ content = request.GET.first(b"content", b"<b>hi</b>\n")
+ output = b"HTTP/1.1 200 OK\r\n"
+ output += b"X-Content-Type-Options: nosniff\r\n"
+ if b"single_header" in request.GET:
+ output += b"Content-Type: " + b",".join(values) + b"\r\n"
else:
for value in values:
- output += "Content-Type: " + value + "\r\n"
- output += "Content-Length: " + str(len(content)) + "\r\n"
- output += "\r\n"
+ output += b"Content-Type: " + value + b"\r\n"
+ output += b"Content-Length: " + isomorphic_encode(str(len(content))) + b"\r\n"
+ output += b"\r\n"
output += content
response.writer.write(output)
response.close_connection = True
diff --git a/tests/wpt/web-platform-tests/fetch/http-cache/resources/http-cache.py b/tests/wpt/web-platform-tests/fetch/http-cache/resources/http-cache.py
index 351b2eb3c9e..c176b255a3f 100755
--- a/tests/wpt/web-platform-tests/fetch/http-cache/resources/http-cache.py
+++ b/tests/wpt/web-platform-tests/fetch/http-cache/resources/http-cache.py
@@ -5,98 +5,100 @@ import json
import time
from base64 import b64decode
-NOTEHDRS = set(['content-type', 'access-control-allow-origin', 'last-modified', 'etag'])
+from wptserve.utils import isomorphic_decode, isomorphic_encode
+
+NOTEHDRS = set([u'content-type', u'access-control-allow-origin', u'last-modified', u'etag'])
NOBODYSTATUS = set([204, 304])
-LOCATIONHDRS = set(['location', 'content-location'])
-DATEHDRS = set(['date', 'expires', 'last-modified'])
+LOCATIONHDRS = set([u'location', u'content-location'])
+DATEHDRS = set([u'date', u'expires', u'last-modified'])
def main(request, response):
- dispatch = request.GET.first("dispatch", None)
- uuid = request.GET.first("uuid", None)
+ dispatch = request.GET.first(b"dispatch", None)
+ uuid = request.GET.first(b"uuid", None)
- if request.method == "OPTIONS":
+ if request.method == u"OPTIONS":
return handle_preflight(uuid, request, response)
if not uuid:
- response.status = (404, "Not Found")
- response.headers.set("Content-Type", "text/plain")
- return "UUID not found"
- if dispatch == 'test':
+ response.status = (404, b"Not Found")
+ response.headers.set(b"Content-Type", b"text/plain")
+ return b"UUID not found"
+ if dispatch == b'test':
return handle_test(uuid, request, response)
- elif dispatch == 'state':
+ elif dispatch == b'state':
return handle_state(uuid, request, response)
- response.status = (404, "Not Found")
- response.headers.set("Content-Type", "text/plain")
- return "Fallthrough"
+ response.status = (404, b"Not Found")
+ response.headers.set(b"Content-Type", b"text/plain")
+ return b"Fallthrough"
def handle_preflight(uuid, request, response):
- response.status = (200, "OK")
- response.headers.set("Access-Control-Allow-Origin", "*")
- response.headers.set("Access-Control-Allow-Methods", "GET")
- response.headers.set("Access-Control-Allow-Headers", "*")
- response.headers.set("Access-Control-Max-Age", "86400")
- return "Preflight request"
+ response.status = (200, b"OK")
+ response.headers.set(b"Access-Control-Allow-Origin", b"*")
+ response.headers.set(b"Access-Control-Allow-Methods", b"GET")
+ response.headers.set(b"Access-Control-Allow-Headers", b"*")
+ response.headers.set(b"Access-Control-Max-Age", b"86400")
+ return b"Preflight request"
def handle_state(uuid, request, response):
- response.headers.set("Content-Type", "text/plain")
+ response.headers.set(b"Content-Type", b"text/plain")
return json.dumps(request.server.stash.take(uuid))
def handle_test(uuid, request, response):
server_state = request.server.stash.take(uuid) or []
try:
- requests = json.loads(b64decode(request.headers.get('Test-Requests', "")))
+ requests = json.loads(b64decode(request.headers.get(b'Test-Requests', b"")))
except:
- response.status = (400, "Bad Request")
- response.headers.set("Content-Type", "text/plain")
- return "No or bad Test-Requests request header"
+ response.status = (400, b"Bad Request")
+ response.headers.set(b"Content-Type", b"text/plain")
+ return b"No or bad Test-Requests request header"
config = requests[len(server_state)]
if not config:
- response.status = (404, "Not Found")
- response.headers.set("Content-Type", "text/plain")
- return "Config not found"
+ response.status = (404, b"Not Found")
+ response.headers.set(b"Content-Type", b"text/plain")
+ return b"Config not found"
noted_headers = {}
now = time.time()
- for header in config.get('response_headers', []):
+ for header in config.get(u'response_headers', []):
if header[0].lower() in LOCATIONHDRS: # magic locations
if (len(header[1]) > 0):
- header[1] = "%s&target=%s" % (request.url, header[1])
+ header[1] = u"%s&target=%s" % (request.url, header[1])
else:
header[1] = request.url
if header[0].lower() in DATEHDRS and isinstance(header[1], int): # magic dates
header[1] = http_date(now, header[1])
- response.headers.set(header[0], header[1])
+ response.headers.set(isomorphic_encode(header[0]), isomorphic_encode(header[1]))
if header[0].lower() in NOTEHDRS:
noted_headers[header[0].lower()] = header[1]
state = {
- 'now': now,
- 'request_method': request.method,
- 'request_headers': dict([[h.lower(), request.headers[h]] for h in request.headers]),
- 'response_headers': noted_headers
+ u'now': now,
+ u'request_method': request.method,
+ u'request_headers': dict([[isomorphic_decode(h.lower()), isomorphic_decode(request.headers[h])] for h in request.headers]),
+ u'response_headers': noted_headers
}
server_state.append(state)
request.server.stash.put(uuid, server_state)
- if "access-control-allow-origin" not in noted_headers:
- response.headers.set("Access-Control-Allow-Origin", "*")
- if "content-type" not in noted_headers:
- response.headers.set("Content-Type", "text/plain")
- response.headers.set("Server-Request-Count", len(server_state))
+ if u"access-control-allow-origin" not in noted_headers:
+ response.headers.set(b"Access-Control-Allow-Origin", b"*")
+ if u"content-type" not in noted_headers:
+ response.headers.set(b"Content-Type", b"text/plain")
+ response.headers.set(b"Server-Request-Count", len(server_state))
- code, phrase = config.get("response_status", [200, "OK"])
- if config.get("expected_type", "").endswith('validated'):
- ref_hdrs = server_state[0]['response_headers']
- previous_lm = ref_hdrs.get('last-modified', False)
- if previous_lm and request.headers.get("If-Modified-Since", False) == previous_lm:
- code, phrase = [304, "Not Modified"]
- previous_etag = ref_hdrs.get('etag', False)
- if previous_etag and request.headers.get("If-None-Match", False) == previous_etag:
- code, phrase = [304, "Not Modified"]
+ code, phrase = config.get(u"response_status", [200, b"OK"])
+ if config.get(u"expected_type", u"").endswith(u'validated'):
+ ref_hdrs = server_state[0][u'response_headers']
+ previous_lm = ref_hdrs.get(u'last-modified', False)
+ if previous_lm and request.headers.get(b"If-Modified-Since", False) == isomorphic_encode(previous_lm):
+ code, phrase = [304, b"Not Modified"]
+ previous_etag = ref_hdrs.get(u'etag', False)
+ if previous_etag and request.headers.get(b"If-None-Match", False) == isomorphic_encode(previous_etag):
+ code, phrase = [304, b"Not Modified"]
if code != 304:
- code, phrase = [999, '304 Not Generated']
+ code, phrase = [999, b'304 Not Generated']
response.status = (code, phrase)
- content = config.get("response_body", uuid)
+ content = config.get(u"response_body", uuid)
if code in NOBODYSTATUS:
- return ""
+ return b""
return content
@@ -107,13 +109,13 @@ def get_header(headers, header_name):
result = header[1]
return result
-WEEKDAYS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-MONTHS = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
- 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+WEEKDAYS = [u'Mon', u'Tue', u'Wed', u'Thu', u'Fri', u'Sat', u'Sun']
+MONTHS = [None, u'Jan', u'Feb', u'Mar', u'Apr', u'May', u'Jun', u'Jul',
+ u'Aug', u'Sep', u'Oct', u'Nov', u'Dec']
def http_date(now, delta_secs=0):
date = datetime.datetime.utcfromtimestamp(now + delta_secs)
- return "%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT" % (
+ return u"%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT" % (
WEEKDAYS[date.weekday()],
date.day,
MONTHS[date.month],
diff --git a/tests/wpt/web-platform-tests/fetch/http-cache/resources/securedimage.py b/tests/wpt/web-platform-tests/fetch/http-cache/resources/securedimage.py
index 445b0bdd2ec..cac9cfedd27 100644
--- a/tests/wpt/web-platform-tests/fetch/http-cache/resources/securedimage.py
+++ b/tests/wpt/web-platform-tests/fetch/http-cache/resources/securedimage.py
@@ -1,17 +1,19 @@
# -*- coding: utf-8 -
+from wptserve.utils import isomorphic_decode, isomorphic_encode
+
def main(request, response):
- image_url = str.replace(request.url, "fetch/http-cache/resources/securedimage.py", "images/green.png")
+ image_url = str.replace(request.url, u"fetch/http-cache/resources/securedimage.py", u"images/green.png")
- if "authorization" not in request.headers:
+ if b"authorization" not in request.headers:
response.status = 401
- response.headers.set("WWW-Authenticate", "Basic")
+ response.headers.set(b"WWW-Authenticate", b"Basic")
return
else:
- auth = request.headers.get("Authorization")
- if auth != "Basic dGVzdHVzZXI6dGVzdHBhc3M=":
- response.set_error(403, "Invalid username or password - " + auth)
+ auth = request.headers.get(b"Authorization")
+ if auth != b"Basic dGVzdHVzZXI6dGVzdHBhc3M=":
+ response.set_error(403, u"Invalid username or password - " + isomorphic_decode(auth))
return
response.status = 301
- response.headers.set("Location", image_url)
+ response.headers.set(b"Location", isomorphic_encode(image_url))
diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-json.py b/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-json.py
index 7644a8507d9..44f68e8fe9e 100644
--- a/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-json.py
+++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-json.py
@@ -1,27 +1,29 @@
import json
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
- headers = [("Content-Type", "application/json"),
- ("Access-Control-Allow-Credentials", "true")]
+ headers = [(b"Content-Type", b"application/json"),
+ (b"Access-Control-Allow-Credentials", b"true")]
- if "origin" in request.headers:
- headers.append(("Access-Control-Allow-Origin", request.headers["origin"]))
+ if b"origin" in request.headers:
+ headers.append((b"Access-Control-Allow-Origin", request.headers[b"origin"]))
- body = ""
+ body = u""
# If we're in a preflight, verify that `Sec-Fetch-Mode` is `cors`.
- if request.method == 'OPTIONS':
- if request.headers.get("sec-fetch-mode") != "cors":
- return (403, "Failed"), [], body
+ if request.method == u'OPTIONS':
+ if request.headers.get(b"sec-fetch-mode") != b"cors":
+ return (403, b"Failed"), [], body
- headers.append(("Access-Control-Allow-Methods", "*"))
- headers.append(("Access-Control-Allow-Headers", "*"))
+ headers.append((b"Access-Control-Allow-Methods", b"*"))
+ headers.append((b"Access-Control-Allow-Headers", b"*"))
else:
body = json.dumps({
- "dest": request.headers.get("sec-fetch-dest", ""),
- "mode": request.headers.get("sec-fetch-mode", ""),
- "site": request.headers.get("sec-fetch-site", ""),
- "user": request.headers.get("sec-fetch-user", ""),
+ u"dest": isomorphic_decode(request.headers.get(b"sec-fetch-dest", b"")),
+ u"mode": isomorphic_decode(request.headers.get(b"sec-fetch-mode", b"")),
+ u"site": isomorphic_decode(request.headers.get(b"sec-fetch-site", b"")),
+ u"user": isomorphic_decode(request.headers.get(b"sec-fetch-user", b"")),
})
return headers, body
diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-script.py b/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-script.py
index 7884b096d99..1e7bc91184f 100644
--- a/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-script.py
+++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/echo-as-script.py
@@ -1,13 +1,14 @@
import json
-def main(request, response):
- headers = [("Content-Type", "text/javascript")]
+from wptserve.utils import isomorphic_decode
- body = "var header = %s;" % json.dumps({
- "dest": request.headers.get("sec-fetch-dest", ""),
- "mode": request.headers.get("sec-fetch-mode", ""),
- "site": request.headers.get("sec-fetch-site", ""),
- "user": request.headers.get("sec-fetch-user", ""),
- });
+def main(request, response):
+ headers = [(b"Content-Type", b"text/javascript")]
+ body = u"var header = %s;" % json.dumps({
+ u"dest": isomorphic_decode(request.headers.get(b"sec-fetch-dest", b"")),
+ u"mode": isomorphic_decode(request.headers.get(b"sec-fetch-mode", b"")),
+ u"site": isomorphic_decode(request.headers.get(b"sec-fetch-site", b"")),
+ u"user": isomorphic_decode(request.headers.get(b"sec-fetch-user", b"")),
+ })
return headers, body
diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/post-to-owner.py b/tests/wpt/web-platform-tests/fetch/metadata/resources/post-to-owner.py
index 096f33b04a2..c5ee11653ef 100644
--- a/tests/wpt/web-platform-tests/fetch/metadata/resources/post-to-owner.py
+++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/post-to-owner.py
@@ -1,12 +1,14 @@
import json
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
headers = [
- ("Content-Type", "text/html"),
- ("Cache-Control", "no-cache, no-store, must-revalidate")
+ (b"Content-Type", b"text/html"),
+ (b"Cache-Control", b"no-cache, no-store, must-revalidate")
]
- body = """
+ body = u"""
<!DOCTYPE html>
<script>
var data = %s;
@@ -18,9 +20,9 @@ def main(request, response):
window.portalHost.postMessage(data, "*");
</script>
""" % json.dumps({
- "dest": request.headers.get("sec-fetch-dest", ""),
- "mode": request.headers.get("sec-fetch-mode", ""),
- "site": request.headers.get("sec-fetch-site", ""),
- "user": request.headers.get("sec-fetch-user", ""),
+ u"dest": isomorphic_decode(request.headers.get(b"sec-fetch-dest", b"")),
+ u"mode": isomorphic_decode(request.headers.get(b"sec-fetch-mode", b"")),
+ u"site": isomorphic_decode(request.headers.get(b"sec-fetch-site", b"")),
+ u"user": isomorphic_decode(request.headers.get(b"sec-fetch-user", b"")),
})
return headers, body
diff --git a/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py b/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py
index 364c800a19c..05b60eba13b 100644
--- a/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py
+++ b/tests/wpt/web-platform-tests/fetch/metadata/resources/record-header.py
@@ -1,29 +1,29 @@
import os
-import uuid
import hashlib
-import time
import json
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
## Get the query parameter (key) from URL ##
## Tests will record POST requests (CSP Report) and GET (rest) ##
if request.GET:
- key = request.GET['file']
+ key = request.GET[b'file']
elif request.POST:
- key = request.POST['file']
+ key = request.POST[b'file']
## Convert the key from String to UUID valid String ##
testId = hashlib.md5(key).hexdigest()
## Handle the header retrieval request ##
- if 'retrieve' in request.GET:
+ if b'retrieve' in request.GET:
response.writer.write_status(200)
response.writer.end_headers()
try:
header_value = request.server.stash.take(testId)
response.writer.write(header_value)
except (KeyError, ValueError) as e:
- response.writer.write("No header has been recorded")
+ response.writer.write(u"No header has been recorded")
pass
response.close_connection = True
@@ -34,10 +34,10 @@ def main(request, response):
## Return a serialized JSON object with one member per header. If the ##
## header isn't present, the member will contain an empty string. ##
header = json.dumps({
- "dest": request.headers.get("sec-fetch-dest", ""),
- "mode": request.headers.get("sec-fetch-mode", ""),
- "site": request.headers.get("sec-fetch-site", ""),
- "user": request.headers.get("sec-fetch-user", ""),
+ u"dest": isomorphic_decode(request.headers.get(b"sec-fetch-dest", b"")),
+ u"mode": isomorphic_decode(request.headers.get(b"sec-fetch-mode", b"")),
+ u"site": isomorphic_decode(request.headers.get(b"sec-fetch-site", b"")),
+ u"user": isomorphic_decode(request.headers.get(b"sec-fetch-user", b"")),
})
request.server.stash.put(testId, header)
except KeyError:
@@ -45,101 +45,101 @@ def main(request, response):
pass
## Prevent the browser from caching returned responses and allow CORS ##
- response.headers.set("Access-Control-Allow-Origin", "*")
- response.headers.set("Cache-Control", "no-cache, no-store, must-revalidate")
- response.headers.set("Pragma", "no-cache")
- response.headers.set("Expires", "0")
+ response.headers.set(b"Access-Control-Allow-Origin", b"*")
+ response.headers.set(b"Cache-Control", b"no-cache, no-store, must-revalidate")
+ response.headers.set(b"Pragma", b"no-cache")
+ response.headers.set(b"Expires", b"0")
## Add a valid ServiceWorker Content-Type ##
- if key.startswith("serviceworker"):
- response.headers.set("Content-Type", "application/javascript")
+ if key.startswith(b"serviceworker"):
+ response.headers.set(b"Content-Type", b"application/javascript")
## Add a valid image Content-Type ##
- if key.startswith("image"):
- response.headers.set("Content-Type", "image/png")
- file = open(os.path.join(request.doc_root, "media", "1x1-green.png"), "r")
+ if key.startswith(b"image"):
+ response.headers.set(b"Content-Type", b"image/png")
+ file = open(os.path.join(request.doc_root, u"media", u"1x1-green.png"), u"rb")
image = file.read()
file.close()
return image
## Return a valid .vtt content for the <track> tag ##
- if key.startswith("track"):
- return "WEBVTT"
+ if key.startswith(b"track"):
+ return b"WEBVTT"
## Return a valid SharedWorker ##
- if key.startswith("sharedworker"):
- response.headers.set("Content-Type", "application/javascript")
- file = open(os.path.join(request.doc_root, "fetch", "metadata",
- "resources", "sharedWorker.js"), "r")
+ if key.startswith(b"sharedworker"):
+ response.headers.set(b"Content-Type", b"application/javascript")
+ file = open(os.path.join(request.doc_root, u"fetch", u"metadata",
+ u"resources", u"sharedWorker.js"), u"rb")
shared_worker = file.read()
file.close()
return shared_worker
## Return a valid font content and Content-Type ##
- if key.startswith("font"):
- response.headers.set("Content-Type", "application/x-font-ttf")
- file = open(os.path.join(request.doc_root, "fonts", "Ahem.ttf"), "r")
+ if key.startswith(b"font"):
+ response.headers.set(b"Content-Type", b"application/x-font-ttf")
+ file = open(os.path.join(request.doc_root, u"fonts", u"Ahem.ttf"), u"rb")
font = file.read()
file.close()
return font
## Return a valid audio content and Content-Type ##
- if key.startswith("audio"):
- response.headers.set("Content-Type", "audio/mpeg")
- file = open(os.path.join(request.doc_root, "media", "sound_5.mp3"), "r")
+ if key.startswith(b"audio"):
+ response.headers.set(b"Content-Type", b"audio/mpeg")
+ file = open(os.path.join(request.doc_root, u"media", u"sound_5.mp3"), u"rb")
audio = file.read()
file.close()
return audio
## Return a valid video content and Content-Type ##
- if key.startswith("video"):
- response.headers.set("Content-Type", "video/mp4")
- file = open(os.path.join(request.doc_root, "media", "A4.mp4"), "r")
+ if key.startswith(b"video"):
+ response.headers.set(b"Content-Type", b"video/mp4")
+ file = open(os.path.join(request.doc_root, u"media", u"A4.mp4"), u"rb")
video = file.read()
file.close()
return video
## Return valid style content and Content-Type ##
- if key.startswith("style"):
- response.headers.set("Content-Type", "text/css")
- return "div { }"
+ if key.startswith(b"style"):
+ response.headers.set(b"Content-Type", b"text/css")
+ return b"div { }"
## Return a valid embed/object content and Content-Type ##
- if key.startswith("embed") or key.startswith("object"):
- response.headers.set("Content-Type", "text/html")
- return "<html>EMBED!</html>"
+ if key.startswith(b"embed") or key.startswith(b"object"):
+ response.headers.set(b"Content-Type", b"text/html")
+ return b"<html>EMBED!</html>"
## Return a valid image content and Content-Type for redirect requests ##
- if key.startswith("redirect"):
- response.headers.set("Content-Type", "image/jpeg")
- file = open(os.path.join(request.doc_root, "media", "1x1-green.png"), "r")
+ if key.startswith(b"redirect"):
+ response.headers.set(b"Content-Type", b"image/jpeg")
+ file = open(os.path.join(request.doc_root, u"media", u"1x1-green.png"), u"rb")
image = file.read()
file.close()
return image
## Return a valid dedicated worker
- if key.startswith("worker"):
- response.headers.set("Content-Type", "application/javascript")
- return "self.postMessage('loaded');"
+ if key.startswith(b"worker"):
+ response.headers.set(b"Content-Type", b"application/javascript")
+ return b"self.postMessage('loaded');"
## Return an appcache manifest
- if key.startswith("appcache-manifest"):
- response.headers.set("Content-Type", "text/cache-manifest")
- return """CACHE MANIFEST
+ if key.startswith(b"appcache-manifest"):
+ response.headers.set(b"Content-Type", b"text/cache-manifest")
+ return b"""CACHE MANIFEST
/fetch/metadata/resources/record-header.py?file=appcache-resource%s
NETWORK:
*""" % key[17:]
## Return an appcache resource
- if key.startswith("appcache-resource"):
- response.headers.set("Content-Type", "text/html")
- return "<html>Appcache!</html>"
+ if key.startswith(b"appcache-resource"):
+ response.headers.set(b"Content-Type", b"text/html")
+ return b"<html>Appcache!</html>"
## Return a valid XSLT
- if key.startswith("xslt"):
- response.headers.set("Content-Type", "text/xsl")
- return """<?xml version="1.0" encoding="UTF-8"?>
+ if key.startswith(b"xslt"):
+ response.headers.set(b"Content-Type", b"text/xsl")
+ return b"""<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
diff --git a/tests/wpt/web-platform-tests/fetch/origin/resources/redirect-and-stash.py b/tests/wpt/web-platform-tests/fetch/origin/resources/redirect-and-stash.py
index aa9eb35db2b..9bf9e1f18c2 100644
--- a/tests/wpt/web-platform-tests/fetch/origin/resources/redirect-and-stash.py
+++ b/tests/wpt/web-platform-tests/fetch/origin/resources/redirect-and-stash.py
@@ -1,30 +1,32 @@
import json
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
- key = request.GET.first("stash")
- origin = request.headers.get("origin")
+ key = request.GET.first(b"stash")
+ origin = request.headers.get(b"origin")
if origin is None:
- origin = "no Origin header"
+ origin = b"no Origin header"
origin_list = request.server.stash.take(key)
- if "dump" in request.GET:
- response.headers.set("Content-Type", "application/json")
+ if b"dump" in request.GET:
+ response.headers.set(b"Content-Type", b"application/json")
response.content = json.dumps(origin_list)
return
if origin_list is None:
- origin_list = [origin]
+ origin_list = [isomorphic_decode(origin)]
else:
- origin_list.append(origin)
+ origin_list.append(isomorphic_decode(origin))
request.server.stash.put(key, origin_list)
- if "location" in request.GET:
+ if b"location" in request.GET:
response.status = 308
- response.headers.set("Location", request.GET.first("location"))
+ response.headers.set(b"Location", request.GET.first(b"location"))
return
- response.headers.set("Content-Type", "text/html")
- response.headers.set("Access-Control-Allow-Origin", "*")
- response.content = "<meta charset=utf-8>\n<body><script>parent.postMessage('loaded','*')</script></body>"
+ response.headers.set(b"Content-Type", b"text/html")
+ response.headers.set(b"Access-Control-Allow-Origin", b"*")
+ response.content = b"<meta charset=utf-8>\n<body><script>parent.postMessage('loaded','*')</script></body>"
diff --git a/tests/wpt/web-platform-tests/fetch/origin/resources/referrer-policy.py b/tests/wpt/web-platform-tests/fetch/origin/resources/referrer-policy.py
index 22b71e33b54..15716e068b9 100644
--- a/tests/wpt/web-platform-tests/fetch/origin/resources/referrer-policy.py
+++ b/tests/wpt/web-platform-tests/fetch/origin/resources/referrer-policy.py
@@ -1,7 +1,7 @@
def main(request, response):
- if "referrerPolicy" in request.GET:
- response.headers.set("Referrer-Policy",
- request.GET.first("referrerPolicy"))
+ if b"referrerPolicy" in request.GET:
+ response.headers.set(b"Referrer-Policy",
+ request.GET.first(b"referrerPolicy"))
response.status = 200
- response.headers.set("Content-Type", "text/html")
- response.content = "<meta charset=utf-8>\n<body><script>parent.postMessage('action','*')</script></body>"
+ response.headers.set(b"Content-Type", b"text/html")
+ response.content = b"<meta charset=utf-8>\n<body><script>parent.postMessage('action','*')</script></body>"
diff --git a/tests/wpt/web-platform-tests/html/canvas/element/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html b/tests/wpt/web-platform-tests/html/canvas/element/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html
index e3238520a61..44cff25d1af 100644
--- a/tests/wpt/web-platform-tests/html/canvas/element/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html
+++ b/tests/wpt/web-platform-tests/html/canvas/element/drawing-text-to-the-canvas/2d.text.measure.actualBoundingBox.html
@@ -43,6 +43,15 @@ document.fonts.ready.then(() => {
_assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35");
_assert(Math.abs(ctx.measureText('A').actualBoundingBoxDescent) <= 1, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent) <= 1");
+ _assert(ctx.measureText('D').actualBoundingBoxLeft >= 48, "ctx.measureText('D').actualBoundingBoxLeft >= 48");
+ _assert(ctx.measureText('D').actualBoundingBoxLeft <= 52, "ctx.measureText('D').actualBoundingBoxLeft <= 52");
+ _assert(ctx.measureText('D').actualBoundingBoxRight >= 75, "ctx.measureText('D').actualBoundingBoxRight >= 75");
+ _assert(ctx.measureText('D').actualBoundingBoxRight <= 80, "ctx.measureText('D').actualBoundingBoxRight <= 80");
+ _assert(ctx.measureText('D').actualBoundingBoxAscent >= 35, "ctx.measureText('D').actualBoundingBoxAscent >= 35");
+ _assert(ctx.measureText('D').actualBoundingBoxAscent <= 40, "ctx.measureText('D').actualBoundingBoxAscent <= 40");
+ _assert(ctx.measureText('D').actualBoundingBoxDescent >= 12, "ctx.measureText('D').actualBoundingBoxDescent >= 12");
+ _assert(ctx.measureText('D').actualBoundingBoxDescent <= 15, "ctx.measureText('D').actualBoundingBoxDescent <= 15");
+
_assert(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) <= 1, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) <= 1");
_assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200");
_assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85");
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.html
index 997b316033b..d454e1202b0 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.html
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.html
@@ -36,6 +36,15 @@ fonts.ready.then(function() {
_assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35");
_assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0");
+ _assert(ctx.measureText('D').actualBoundingBoxLeft >= 48, "ctx.measureText('D').actualBoundingBoxLeft >= 48");
+ _assert(ctx.measureText('D').actualBoundingBoxLeft <= 52, "ctx.measureText('D').actualBoundingBoxLeft <= 52");
+ _assert(ctx.measureText('D').actualBoundingBoxRight >= 75, "ctx.measureText('D').actualBoundingBoxRight >= 75");
+ _assert(ctx.measureText('D').actualBoundingBoxRight <= 80, "ctx.measureText('D').actualBoundingBoxRight <= 80");
+ _assert(ctx.measureText('D').actualBoundingBoxAscent >= 35, "ctx.measureText('D').actualBoundingBoxAscent >= 35");
+ _assert(ctx.measureText('D').actualBoundingBoxAscent <= 40, "ctx.measureText('D').actualBoundingBoxAscent <= 40");
+ _assert(ctx.measureText('D').actualBoundingBoxDescent >= 12, "ctx.measureText('D').actualBoundingBoxDescent >= 12");
+ _assert(ctx.measureText('D').actualBoundingBoxDescent <= 15, "ctx.measureText('D').actualBoundingBoxDescent <= 15");
+
_assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0");
_assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200");
_assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85");
diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.worker.js
index 6d2eed79b38..497c8f92b2c 100644
--- a/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.worker.js
+++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/text/2d.text.measure.actualBoundingBox.worker.js
@@ -32,6 +32,15 @@ fonts.ready.then(function() {
_assert(ctx.measureText('A').actualBoundingBoxAscent >= 35, "ctx.measureText('A').actualBoundingBoxAscent >= 35");
_assertSame(Math.abs(ctx.measureText('A').actualBoundingBoxDescent), 0, "Math.abs(ctx.measureText('A').actualBoundingBoxDescent)", "0");
+ _assert(ctx.measureText('D').actualBoundingBoxLeft >= 48, "ctx.measureText('D').actualBoundingBoxLeft >= 48");
+ _assert(ctx.measureText('D').actualBoundingBoxLeft <= 52, "ctx.measureText('D').actualBoundingBoxLeft <= 52");
+ _assert(ctx.measureText('D').actualBoundingBoxRight >= 75, "ctx.measureText('D').actualBoundingBoxRight >= 75");
+ _assert(ctx.measureText('D').actualBoundingBoxRight <= 80, "ctx.measureText('D').actualBoundingBoxRight <= 80");
+ _assert(ctx.measureText('D').actualBoundingBoxAscent >= 35, "ctx.measureText('D').actualBoundingBoxAscent >= 35");
+ _assert(ctx.measureText('D').actualBoundingBoxAscent <= 40, "ctx.measureText('D').actualBoundingBoxAscent <= 40");
+ _assert(ctx.measureText('D').actualBoundingBoxDescent >= 12, "ctx.measureText('D').actualBoundingBoxDescent >= 12");
+ _assert(ctx.measureText('D').actualBoundingBoxDescent <= 15, "ctx.measureText('D').actualBoundingBoxDescent <= 15");
+
_assertSame(Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft), 0, "Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft)", "0");
_assert(ctx.measureText('ABCD').actualBoundingBoxRight >= 200, "ctx.measureText('ABCD').actualBoundingBoxRight >= 200");
_assert(ctx.measureText('ABCD').actualBoundingBoxAscent >= 85, "ctx.measureText('ABCD').actualBoundingBoxAscent >= 85");
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/build.sh b/tests/wpt/web-platform-tests/html/canvas/tools/build.sh
index f69fa4ff17d..ae1563ad85d 100755
--- a/tests/wpt/web-platform-tests/html/canvas/tools/build.sh
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/build.sh
@@ -2,6 +2,6 @@
set -ex
cd "${0%/*}"
-virtualenv -p python .virtualenv
+virtualenv -p python2 .virtualenv
.virtualenv/bin/pip install pyyaml cairocffi
.virtualenv/bin/python gentest.py
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml/element/drawing-text-to-the-canvas.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml/element/drawing-text-to-the-canvas.yaml
index f5feb7b4c65..58fa119d32f 100644
--- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml/element/drawing-text-to-the-canvas.yaml
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml/element/drawing-text-to-the-canvas.yaml
@@ -626,6 +626,15 @@
@assert ctx.measureText('A').actualBoundingBoxAscent >= 35;
@assert Math.abs(ctx.measureText('A').actualBoundingBoxDescent) <= 1;
+ @assert ctx.measureText('D').actualBoundingBoxLeft >= 48;
+ @assert ctx.measureText('D').actualBoundingBoxLeft <= 52;
+ @assert ctx.measureText('D').actualBoundingBoxRight >= 75;
+ @assert ctx.measureText('D').actualBoundingBoxRight <= 80;
+ @assert ctx.measureText('D').actualBoundingBoxAscent >= 35;
+ @assert ctx.measureText('D').actualBoundingBoxAscent <= 40;
+ @assert ctx.measureText('D').actualBoundingBoxDescent >= 12;
+ @assert ctx.measureText('D').actualBoundingBoxDescent <= 15;
+
@assert Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) <= 1;
@assert ctx.measureText('ABCD').actualBoundingBoxRight >= 200;
@assert ctx.measureText('ABCD').actualBoundingBoxAscent >= 85;
diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml/offscreen/text.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml/offscreen/text.yaml
index f9c09baf484..7b815981047 100644
--- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml/offscreen/text.yaml
+++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml/offscreen/text.yaml
@@ -1151,6 +1151,15 @@
@assert ctx.measureText('A').actualBoundingBoxAscent >= 35;
@assert Math.abs(ctx.measureText('A').actualBoundingBoxDescent) === 0;
+ @assert ctx.measureText('D').actualBoundingBoxLeft >= 48;
+ @assert ctx.measureText('D').actualBoundingBoxLeft <= 52;
+ @assert ctx.measureText('D').actualBoundingBoxRight >= 75;
+ @assert ctx.measureText('D').actualBoundingBoxRight <= 80;
+ @assert ctx.measureText('D').actualBoundingBoxAscent >= 35;
+ @assert ctx.measureText('D').actualBoundingBoxAscent <= 40;
+ @assert ctx.measureText('D').actualBoundingBoxDescent >= 12;
+ @assert ctx.measureText('D').actualBoundingBoxDescent <= 15;
+
@assert Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) === 0;
@assert ctx.measureText('ABCD').actualBoundingBoxRight >= 200;
@assert ctx.measureText('ABCD').actualBoundingBoxAscent >= 85;
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py
index dd1a047c72a..2fe40526ea9 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py
+++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/report.py
@@ -1,42 +1,41 @@
import json
-
def main(request, response):
- response.headers.set('Access-Control-Allow-Origin', '*')
- response.headers.set('Access-Control-Allow-Methods', 'OPTIONS, GET, POST')
- response.headers.set('Access-Control-Allow-Headers', 'Content-Type')
- response.headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');
+ response.headers.set(b'Access-Control-Allow-Origin', b'*')
+ response.headers.set(b'Access-Control-Allow-Methods', b'OPTIONS, GET, POST')
+ response.headers.set(b'Access-Control-Allow-Headers', b'Content-Type')
+ response.headers.set(b'Cache-Control', b'no-cache, no-store, must-revalidate')
# CORS preflight
- if request.method == 'OPTIONS':
- return ''
+ if request.method == u'OPTIONS':
+ return u''
uuidMap = {
- 'endpoint': '01234567-0123-0123-0123-0123456789AB',
- 'report-only-endpoint': '01234567-0123-0123-0123-0123456789CD'
+ b'endpoint': b'01234567-0123-0123-0123-0123456789AB',
+ b'report-only-endpoint': b'01234567-0123-0123-0123-0123456789CD'
}
- key = 0;
- if 'endpoint' in request.GET:
- key = uuidMap[request.GET['endpoint']]
+ key = 0
+ if b'endpoint' in request.GET:
+ key = uuidMap[request.GET[b'endpoint']]
- if 'key' in request.GET:
- key = request.GET['key']
+ if b'key' in request.GET:
+ key = request.GET[b'key']
if key == 0:
response.status = 400
- return 'invalid endpoint'
+ return u'invalid endpoint'
- path = '/'.join(request.url_parts.path.split('/')[:-1]) + '/'
- if request.method == 'POST':
+ path = u'/'.join(request.url_parts.path.split(u'/')[:-1]) + u'/'
+ if request.method == u'POST':
reports = request.server.stash.take(key, path) or []
for report in json.loads(request.body):
reports.append(report)
request.server.stash.put(key, reports, path)
- return 'done'
+ return u'done'
- if request.method == 'GET':
- response.headers.set('Content-Type', 'application/json')
+ if request.method == u'GET':
+ response.headers.set(b'Content-Type', b'application/json')
return json.dumps(request.server.stash.take(key, path) or [])
response.status = 400
- return 'invalid method'
+ return u'invalid method'
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/dispatcher.py b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/dispatcher.py
index 67b8cc3d3dd..2617361b0b3 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/dispatcher.py
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/dispatcher.py
@@ -1,22 +1,20 @@
# A server used to store and retrieve arbitrary data.
# This is used by: ./dispatcher.js
-import json
-
def main(request, response):
- response.headers.set('Access-Control-Allow-Origin', '*')
- response.headers.set('Access-Control-Allow-Methods', 'OPTIONS, GET, POST')
- response.headers.set('Access-Control-Allow-Headers', 'Content-Type')
- response.headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');
- if request.method == 'OPTIONS': # CORS preflight
- return ''
+ response.headers.set(b'Access-Control-Allow-Origin', b'*')
+ response.headers.set(b'Access-Control-Allow-Methods', b'OPTIONS, GET, POST')
+ response.headers.set(b'Access-Control-Allow-Headers', b'Content-Type')
+ response.headers.set(b'Cache-Control', b'no-cache, no-store, must-revalidate')
+ if request.method == u'OPTIONS': # CORS preflight
+ return b''
- uuid = request.GET['uuid']
+ uuid = request.GET[b'uuid']
- if request.method == 'POST':
+ if request.method == u'POST':
return request.server.stash.put(uuid, request.body)
else:
body = request.server.stash.take(uuid)
if body is None:
- return 'not ready'
+ return b'not ready'
else:
return body
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/report.py b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/report.py
index f51d27f2991..8e5ec6d1b9b 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/report.py
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/report.py
@@ -1,31 +1,40 @@
import json, uuid
+from six import PY3
+
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
- response.headers.set('Access-Control-Allow-Origin', '*')
- response.headers.set('Access-Control-Allow-Methods', 'OPTIONS, GET, POST')
- response.headers.set('Access-Control-Allow-Headers', 'Content-Type')
- response.headers.set('Cache-Control', 'no-cache, no-store, must-revalidate');
- if request.method == 'OPTIONS': # CORS preflight
- return ''
+ response.headers.set(b'Access-Control-Allow-Origin', b'*')
+ response.headers.set(b'Access-Control-Allow-Methods', b'OPTIONS, GET, POST')
+ response.headers.set(b'Access-Control-Allow-Headers', b'Content-Type')
+ response.headers.set(b'Cache-Control', b'no-cache, no-store, must-revalidate');
+ if request.method == u'OPTIONS': # CORS preflight
+ return b''
- key = 0;
- if 'endpoint' in request.GET:
- key = uuid.uuid5(uuid.NAMESPACE_OID, request.GET['endpoint']).get_urn()
+ key = 0
+ if b'endpoint' in request.GET:
+ # Use Python version checking here due to the issue reported on uuid5 handling unicode
+ # type of name argument at https://bugs.python.org/issue34145
+ if PY3:
+ key = uuid.uuid5(uuid.NAMESPACE_OID, isomorphic_decode(request.GET[b'endpoint'])).urn
+ else:
+ key = uuid.uuid5(uuid.NAMESPACE_OID, request.GET[b'endpoint']).urn
if key == 0:
response.status = 400
- return 'invalid endpoint'
+ return b'invalid endpoint'
- if request.method == 'POST':
+ if request.method == u'POST':
reports = request.server.stash.take(key) or []
for report in json.loads(request.body):
reports.append(report)
request.server.stash.put(key, reports)
- return "done"
+ return b"done"
- if request.method == 'GET':
- response.headers.set('Content-Type', 'application/json')
+ if request.method == u'GET':
+ response.headers.set(b'Content-Type', b'application/json')
return json.dumps(request.server.stash.take(key) or [])
response.status = 400
- return 'invalid method'
+ return b'invalid method'
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/reporting-common.js b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/reporting-common.js
index 0a0553ae805..ea71f6ce863 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/reporting-common.js
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/reporting/resources/reporting-common.js
@@ -76,12 +76,14 @@ async function checkForExpectedReport(expectedReport) {
};
await wait(waitTime);
}
- reject("No report matched the expected report for endpoint: "
- + expectedReport.endpoint.name
- + ", expected report: " + JSON.stringify(expectedReport.report)
- + ", within available reports: "
- + JSON.stringify(expectedReport.endpoint.reports)
- );
+ reject(
+ replaceTokensInReceivedReport(
+ "No report matched the expected report for endpoint: "
+ + expectedReport.endpoint.name
+ + ", expected report: " + JSON.stringify(expectedReport.report)
+ + ", within available reports: "
+ + JSON.stringify(expectedReport.endpoint.reports)
+ ));
});
}
@@ -114,6 +116,10 @@ function replaceValuesInExpectedReport(expectedReport, executorUuid) {
return expectedReport;
}
+function replaceTokensInReceivedReport(str) {
+ return str.replace(/.{8}-.{4}-.{4}-.{4}-.{12}/g, `(uuid)`);
+}
+
// Run a test (such as coop_coep_test from ./common.js) then check that all
// expected reports are present.
async function reportingTest(testFunction, executorToken, expectedReports) {
diff --git a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/coop-coep.py b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/coop-coep.py
index 483f313faca..e0a3d90050a 100644
--- a/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/coop-coep.py
+++ b/tests/wpt/web-platform-tests/html/cross-origin-opener-policy/resources/coop-coep.py
@@ -1,28 +1,28 @@
def main(request, response):
- coop = request.GET.first("coop")
- coopReportOnly = request.GET.first("coop-report-only") if "coop-report-only" in request.GET else ""
- coep = request.GET.first("coep")
- coepReportOnly = request.GET.first("coep-report-only") if "coep-report-only" in request.GET else ""
- redirect = request.GET.first("redirect", None)
- if coop != "":
- response.headers.set("Cross-Origin-Opener-Policy", coop)
- if coop != "":
- response.headers.set("Cross-Origin-Opener-Policy-Report-Only", coopReportOnly)
- if coep != "":
- response.headers.set("Cross-Origin-Embedder-Policy", coep)
- if coep != "":
- response.headers.set("Cross-Origin-Embedder-Policy-Report-Only", coepReportOnly)
- if 'cache' in request.GET:
- response.headers.set('Cache-Control', 'max-age=3600')
+ coop = request.GET.first(b"coop")
+ coopReportOnly = request.GET.first(b"coop-report-only") if b"coop-report-only" in request.GET else b""
+ coep = request.GET.first(b"coep")
+ coepReportOnly = request.GET.first(b"coep-report-only") if b"coep-report-only" in request.GET else b""
+ redirect = request.GET.first(b"redirect", None)
+ if coop != b"":
+ response.headers.set(b"Cross-Origin-Opener-Policy", coop)
+ if coop != b"":
+ response.headers.set(b"Cross-Origin-Opener-Policy-Report-Only", coopReportOnly)
+ if coep != b"":
+ response.headers.set(b"Cross-Origin-Embedder-Policy", coep)
+ if coep != b"":
+ response.headers.set(b"Cross-Origin-Embedder-Policy-Report-Only", coepReportOnly)
+ if b'cache' in request.GET:
+ response.headers.set(b'Cache-Control', b'max-age=3600')
host = request.url_parts[1]
if redirect != None:
response.status = 302
- response.headers.set("Location", redirect)
+ response.headers.set(b"Location", redirect)
return
# This uses an <iframe> as BroadcastChannel is same-origin bound.
- response.content = """
+ response.content = b"""
<!doctype html>
<meta charset=utf-8>
<script src="/common/get-host-info.sub.js"></script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html
index 81d4c4214b2..ac7b844d2e1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html
@@ -3,7 +3,7 @@
<head>
<meta charset='utf-8'>
<title>HTML Test: drag DataTransfer protected status</title>
- <link rel='author' title='Michael Layzell' href='mailto:michael@thelayzells.com'>
+ <link rel='author' title='Nika Layzell' href='mailto:nika@thelayzells.com'>
<link rel='help' href='https://html.spec.whatwg.org/multipage/#the-datatransfer-interface'>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html
index bedfb462271..20bf9c7a9ab 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html
@@ -3,7 +3,7 @@
<head>
<meta charset='utf-8'>
<title>HTML Test: paste DataTransfer protected status</title>
- <link rel='author' title='Michael Layzell' href='mailto:michael@thelayzells.com'>
+ <link rel='author' title='Nika Layzell' href='mailto:nika@thelayzells.com'>
<link rel='help' href='https://html.spec.whatwg.org/multipage/#the-datatransfer-interface'>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/blank.py b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/blank.py
index 6274a4e3cbf..bbd269d1703 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/blank.py
+++ b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/blank.py
@@ -1,2 +1,2 @@
def main(request, response):
- return [("Content-Type", "text/html; charset=%s" % (request.GET['encoding']))], ""
+ return [(b"Content-Type", b"text/html; charset=%s" % (request.GET[b'encoding']))], u""
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/css-tmpl.py b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/css-tmpl.py
index d7c9bce2786..673b2fca324 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/css-tmpl.py
+++ b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/css-tmpl.py
@@ -1,5 +1,7 @@
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
- encoding = request.GET['encoding']
- tmpl = request.GET['tmpl']
- sheet = tmpl % u'\\0000E5'
- return [("Content-Type", "text/css; charset=%s" % encoding)], sheet.encode(encoding)
+ encoding = request.GET[b'encoding']
+ tmpl = request.GET[b'tmpl']
+ sheet = isomorphic_decode(tmpl) % u'\\0000E5'
+ return [(b"Content-Type", b"text/css; charset=%s" % encoding)], sheet.encode(isomorphic_decode(encoding))
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/manifest.py b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/manifest.py
index 05b47f8163f..92947d8d831 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/manifest.py
+++ b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/manifest.py
@@ -1,12 +1,14 @@
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
- id = request.GET['id']
- mode = request.GET['mode']
- fallback_url = ""
- if mode == "FALLBACK":
- fallback_url = "fallback-namespace/"
+ id = request.GET[b'id']
+ mode = request.GET[b'mode']
+ fallback_url = u""
+ if mode == b"FALLBACK":
+ fallback_url = u"fallback-namespace/"
manifest = u"""CACHE MANIFEST
%s:
%s stash.py?q=\u00E5&id=%s&action=put
-""" % (mode, fallback_url, id)
- return [("Content-Type", "text/cache-manifest; charset=%s" % request.GET['encoding'])], manifest.encode('utf-8') # charset should be ignored for cache manifests
+""" % (isomorphic_decode(mode), fallback_url, isomorphic_decode(id))
+ return [(b"Content-Type", b"text/cache-manifest; charset=%s" % request.GET[b'encoding'])], manifest.encode('utf-8') # charset should be ignored for cache manifests
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/page-using-manifest.py b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/page-using-manifest.py
index 401d741a4bc..9e6836c183e 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/page-using-manifest.py
+++ b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/page-using-manifest.py
@@ -1,12 +1,14 @@
+from wptserve.utils import isomorphic_decode
+
def main(request, response):
- id = request.GET['id']
- encoding = request.GET['encoding']
- mode = request.GET['mode']
- iframe = ""
- if mode == 'NETWORK':
- iframe = "<iframe src='stash.py?q=%%C3%%A5&id=%s&action=put'></iframe>" % id
- doc = """<!doctype html>
+ id = request.GET[b'id']
+ encoding = request.GET[b'encoding']
+ mode = request.GET[b'mode']
+ iframe = u""
+ if mode == b'NETWORK':
+ iframe = u"<iframe src='stash.py?q=%%C3%%A5&id=%s&action=put'></iframe>" % isomorphic_decode(id)
+ doc = u"""<!doctype html>
<html manifest="manifest.py?id=%s&encoding=%s&mode=%s">
%s
-""" % (id, encoding, mode, iframe)
- return [("Content-Type", "text/html; charset=%s" % encoding)], doc.encode(encoding)
+""" % (isomorphic_decode(id), isomorphic_decode(encoding), isomorphic_decode(mode), iframe)
+ return [(b"Content-Type", b"text/html; charset=%s" % encoding)], doc.encode(isomorphic_decode(encoding))
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/resource.py b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/resource.py
index a1736f0d700..60eb4a15a06 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/resource.py
+++ b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/resource.py
@@ -1,24 +1,26 @@
import os
import re
+from wptserve.utils import isomorphic_decode, isomorphic_encode
+
def main(request, response):
- type = request.GET['type']
- encoding = request.GET['encoding']
+ type = request.GET[b'type']
+ encoding = request.GET[b'encoding']
# We want the raw input for 'q'
q = re.search(r'q=([^&]+)', request.url_parts.query).groups()[0]
- if type == 'html':
- return [("Content-Type", "text/html; charset=utf-8")], q
- elif type == 'css':
- return [("Content-Type", "text/css; charset=utf-8")], "#test::before { content:'%s' }" % q
- elif type == 'js':
- return [("Content-Type", "text/javascript; charset=utf-8")], "%s = '%s';" % (request.GET['var'], q)
- elif type == 'worker':
- return [("Content-Type", "text/javascript")], "postMessage('%s'); close();" % q
- elif type == 'sharedworker':
- return [("Content-Type", "text/javascript")], "onconnect = function(e) { e.source.postMessage('%s'); close(); };" % q
- elif type == 'worker_importScripts':
- return ([("Content-Type", "text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
- """try {
+ if type == b'html':
+ return [(b"Content-Type", b"text/html; charset=utf-8")], isomorphic_encode(q)
+ elif type == b'css':
+ return [(b"Content-Type", b"text/css; charset=utf-8")], b"#test::before { content:'%s' }" % isomorphic_encode(q)
+ elif type == b'js':
+ return [(b"Content-Type", b"text/javascript; charset=utf-8")], b"%s = '%s';" % (request.GET[b'var'], isomorphic_encode(q))
+ elif type == b'worker':
+ return [(b"Content-Type", b"text/javascript")], b"postMessage('%s'); close();" % isomorphic_encode(q)
+ elif type == b'sharedworker':
+ return [(b"Content-Type", b"text/javascript")], b"onconnect = function(e) { e.source.postMessage('%s'); close(); };" % isomorphic_encode(q)
+ elif type == b'worker_importScripts':
+ return ([(b"Content-Type", b"text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
+ b"""try {
var x = 'importScripts failed to run';
importScripts('?q=\\u00E5&type=js&var=x&encoding=%s');
postMessage(x);
@@ -26,9 +28,9 @@ def main(request, response):
} catch(ex) {
postMessage(String(ex));
}""" % encoding)
- elif type == 'worker_worker':
- return ([("Content-Type", "text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
- """try {
+ elif type == b'worker_worker':
+ return ([(b"Content-Type", b"text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
+ b"""try {
var worker = new Worker('?q=\\u00E5&type=worker&encoding=%s');
worker.onmessage = function(e) {
postMessage(e.data);
@@ -37,9 +39,9 @@ def main(request, response):
} catch(ex) {
postMessage(String(ex));
}""" % encoding)
- elif type =='worker_sharedworker':
- return ([("Content-Type", "text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
- """try {
+ elif type == b'worker_sharedworker':
+ return ([(b"Content-Type", b"text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
+ b"""try {
var worker = new SharedWorker('?q=\\u00E5&type=sharedworker&encoding=%s');
worker.port.onmessage = function(e) {
postMessage(e.data);
@@ -48,9 +50,9 @@ def main(request, response):
} catch(ex) {
postMessage(String(ex));
}""" % encoding)
- elif type == 'sharedworker_importScripts':
- return ([("Content-Type", "text/javascript; charset=%s" % request.GET['encoding'])], # charset should be ignored for workers
- """onconnect = function(e) {
+ elif type == b'sharedworker_importScripts':
+ return ([(b"Content-Type", b"text/javascript; charset=%s" % request.GET[b'encoding'])], # charset should be ignored for workers
+ b"""onconnect = function(e) {
var connect_port = e.source;
try {
var x = 'importScripts failed to run';
@@ -61,9 +63,9 @@ def main(request, response):
connect_port.postMessage(String(ex));
}
};""" % encoding)
- elif type == 'sharedworker_worker':
- return ([("Content-Type", "text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
- """onconnect = function(e) {
+ elif type == b'sharedworker_worker':
+ return ([(b"Content-Type", b"text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
+ b"""onconnect = function(e) {
var connect_port = e.source;
try {
var worker = new Worker('?q=\\u00E5&type=worker&encoding=%s');
@@ -75,9 +77,9 @@ def main(request, response):
connect_port.postMessage(String(ex));
}
};""" % encoding)
- elif type == 'sharedworker_sharedworker':
- return ([("Content-Type", "text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
- """onconnect = function(e) {
+ elif type == b'sharedworker_sharedworker':
+ return ([(b"Content-Type", b"text/javascript; charset=%s" % encoding)], # charset should be ignored for workers
+ b"""onconnect = function(e) {
var connect_port = e.source;
try {
onerror = function(msg) {
@@ -94,38 +96,38 @@ def main(request, response):
connect_port.postMessage(String(ex));
}
};""" % encoding)
- elif type == 'eventstream':
- return [("Content-Type", "text/event-stream")], "data: %s\n\n" % q
- elif type == 'svg':
- return [("Content-Type", "image/svg+xml")], "<svg xmlns='http://www.w3.org/2000/svg'>%s</svg>" % q
- elif type == 'xmlstylesheet_css':
- return ([("Content-Type", "application/xhtml+xml; charset=%s" % encoding)],
- (u"""<?xml-stylesheet href="?q=&#x00E5;&amp;type=css&amp;encoding=%s"?><html xmlns="http://www.w3.org/1999/xhtml"/>""" % encoding)
- .encode(encoding))
- elif type == 'png':
- if q == '%E5':
- image = 'green-1x1.png'
- elif q == '%C3%A5':
- image = 'green-2x2.png'
- elif q == '%3F':
- image = 'green-16x16.png'
+ elif type == b'eventstream':
+ return [(b"Content-Type", b"text/event-stream")], b"data: %s\n\n" % isomorphic_encode(q)
+ elif type == b'svg':
+ return [(b"Content-Type", b"image/svg+xml")], b"<svg xmlns='http://www.w3.org/2000/svg'>%s</svg>" % isomorphic_encode(q)
+ elif type == b'xmlstylesheet_css':
+ return ([(b"Content-Type", b"application/xhtml+xml; charset=%s" % encoding)],
+ (u"""<?xml-stylesheet href="?q=&#x00E5;&amp;type=css&amp;encoding=%s"?><html xmlns="http://www.w3.org/1999/xhtml"/>""" % isomorphic_decode(encoding))
+ .encode(isomorphic_decode(encoding)))
+ elif type == b'png':
+ if q == u'%E5':
+ image = u'green-1x1.png'
+ elif q == u'%C3%A5':
+ image = u'green-2x2.png'
+ elif q == u'%3F':
+ image = u'green-16x16.png'
else:
- image = 'green-256x256.png'
- rv = open(os.path.join(request.doc_root, "images", image), "rb").read()
- return [("Content-Type", "image/png")], rv
- elif type == 'video':
- ext = request.GET['ext']
- if q == '%E5':
- video = 'A4' # duration: 3
- elif q == '%C3%A5':
- video = 'movie_5' # duration: 5
- elif q == '%3F':
- video = 'green-at-15' # duration: 30
+ image = u'green-256x256.png'
+ rv = open(os.path.join(request.doc_root, u"images", image), "rb").read()
+ return [(b"Content-Type", b"image/png")], rv
+ elif type == b'video':
+ ext = request.GET[b'ext']
+ if q == u'%E5':
+ video = u'A4' # duration: 3
+ elif q == u'%C3%A5':
+ video = u'movie_5' # duration: 5
+ elif q == u'%3F':
+ video = u'green-at-15' # duration: 30
else:
- video = 'movie_300' # duration: 300
- rv = open(os.path.join(request.doc_root, "media", "%s.%s" % (video, ext)), "rb").read()
- if ext == 'ogv':
- ext = 'ogg'
- return [("Content-Type", "video/%s" % ext)], rv
- elif type == 'webvtt':
- return [("Content-Type", "text/vtt")], "WEBVTT\n\n00:00:00.000 --> 00:00:01.000\n%s" % q
+ video = u'movie_300' # duration: 300
+ rv = open(os.path.join(request.doc_root, u"media", u"%s.%s" % (video, isomorphic_decode(ext))), "rb").read()
+ if ext == b'ogv':
+ ext = b'ogg'
+ return [(b"Content-Type", b"video/%s" % ext)], rv
+ elif type == b'webvtt':
+ return [(b"Content-Type", b"text/vtt")], b"WEBVTT\n\n00:00:00.000 --> 00:00:01.000\n%s" % isomorphic_encode(q)
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/stash.py b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/stash.py
index d6e3dd5ea50..a6b589d2acf 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/stash.py
+++ b/tests/wpt/web-platform-tests/html/infrastructure/urls/resolving-urls/query-encoding/resources/stash.py
@@ -1,16 +1,15 @@
-import time
import re
def main(request, response):
- key = request.GET['id']
- action = request.GET['action']
- if action == 'put':
+ key = request.GET[b'id']
+ action = request.GET[b'action']
+ if action == b'put':
# We want the raw input for 'q'
q = re.search(r'q=([^&]+)', request.url_parts.query).groups()[0]
request.server.stash.put(key, q)
- return [("Content-Type", "text/html")], 'Put %s' % q
+ return [(b"Content-Type", b"text/html")], u'Put %s' % q
else:
q = request.server.stash.take(key)
if q != None:
- return [("Content-Type", "text/html")], q
- return [], ""
+ return [(b"Content-Type", b"text/html")], q
+ return [], u""
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/aqua-yellow-32x32.png b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/aqua-yellow-32x32.png
new file mode 100644
index 00000000000..42f8a2100b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/aqua-yellow-32x32.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/blue-16x20-green-16x20.png b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/blue-16x20-green-16x20.png
new file mode 100644
index 00000000000..9bf59ebdf1a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/blue-16x20-green-16x20.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/fuchsia-32x32.png b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/fuchsia-32x32.png
new file mode 100644
index 00000000000..7902bc31e09
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/fuchsia-32x32.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/red-32x32.png b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/red-32x32.png
new file mode 100644
index 00000000000..191e13ea11d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/red-32x32.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/yellow-32x32.png b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/yellow-32x32.png
new file mode 100644
index 00000000000..a45f8111b44
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/resources/yellow-32x32.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print-ref.html
new file mode 100644
index 00000000000..3aa0abd3207
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<body>
+<table style="background-image: url('resources/aqua-yellow-32x32.png')">
+ <thead style="background-image: url('resources/blue-16x20-green-16x20.png')">
+ <tr>
+ <td>
+ Foo
+ </td>
+ <td style="background-image: url('resources/yellow-32x32.png')">
+ Bar
+ </td>
+ </tr>
+ </thead>
+ <tbody style="background-image: url('resources/red-32x32.png')">
+ <tr>
+ <th style="background-image: url('resources/fuchsia-32x32.png')">
+ Foo
+ </th>
+ <th>
+ Bar
+ </th>
+ </tr>
+ <tr style="background-image: url('resources/fuchsia-32x32.png')">
+ <td>
+ Foo
+ </td>
+ <td style="background-image: url('resources/yellow-32x32.png')">
+ Bar
+ </td>
+ </tr>
+ </tbody>
+ <tfoot style="background-image: url('resources/yellow-32x32.png')">
+ <tr>
+ <td>
+ Baz
+ </td>
+ </tr>
+ </tfoot>
+</table>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print.html
new file mode 100644
index 00000000000..0cbaca60192
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-background-print.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+<link rel="match" href="table-background-print-ref.html">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#tables-2">
+<link rel="help" href="https://drafts.csswg.org/css-break/">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=816498">
+<body>
+<table background="resources/aqua-yellow-32x32.png">
+ <thead background="resources/blue-16x20-green-16x20.png">
+ <tr>
+ <td>
+ Foo
+ </td>
+ <td background="resources/yellow-32x32.png">
+ Bar
+ </td>
+ </tr>
+ </thead>
+ <tbody background="resources/red-32x32.png">
+ <tr>
+ <th background="resources/fuchsia-32x32.png">
+ Foo
+ </th>
+ <th>
+ Bar
+ </th>
+ </tr>
+ <tr background="resources/fuchsia-32x32.png">
+ <td>
+ Foo
+ </td>
+ <td background="resources/yellow-32x32.png">
+ Bar
+ </td>
+ </tr>
+ </tbody>
+ <tfoot background="resources/yellow-32x32.png">
+ <tr>
+ <td>
+ Baz
+ </td>
+ </tr>
+ </tfoot>
+</table>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox-toggle-in-inactive-document-crash.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox-toggle-in-inactive-document-crash.html
new file mode 100644
index 00000000000..654542f6a8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox-toggle-in-inactive-document-crash.html
@@ -0,0 +1,9 @@
+<body>
+<iframe id="i"></iframe>
+<script>
+var saved_i = i;
+var saved_i_doc = i.contentDocument;
+i.remove();
+saved_i_doc.adoptNode(saved_i);
+saved_i.sandbox.toggle("1");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/number-input-lang-validationMessage-crash.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/number-input-lang-validationMessage-crash.html
new file mode 100644
index 00000000000..7affb1d65bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/number-input-lang-validationMessage-crash.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<title>Should not assert or crash</title>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1649569">
+<script>
+window.onload = () => {
+ var a = document.getElementById("a")
+ var c = document.createElement("m")
+ a.valueAsNumber = 0.165
+ c.insertBefore(b, c.childNodes[0])
+ a.validationMessage
+}
+</script>
+<pre lang="nb">
+<form id="b">
+<input id="a" type="number">
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action-in-inactive-document-crash.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action-in-inactive-document-crash.html
new file mode 100644
index 00000000000..8a3543fcbcf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action-in-inactive-document-crash.html
@@ -0,0 +1,6 @@
+<iframe id="i"></iframe>
+<script>
+var form = i.contentDocument.createElement("form");
+i.remove();
+form.action = "GET";
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-classic.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-classic-manual.html
index b01f595c03e..b01f595c03e 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-classic.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-classic-manual.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-module.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-module-manual.html
index 359b71d821c..359b71d821c 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-manual-module.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/no-active-script-module-manual.html
diff --git a/tests/wpt/web-platform-tests/html/tools/build.sh b/tests/wpt/web-platform-tests/html/tools/build.sh
index 21403090b8e..a416d05dd4d 100755
--- a/tests/wpt/web-platform-tests/html/tools/build.sh
+++ b/tests/wpt/web-platform-tests/html/tools/build.sh
@@ -2,7 +2,7 @@
set -ex
cd "${0%/*}"
-virtualenv -p python .virtualenv
+virtualenv -p python2 .virtualenv
.virtualenv/bin/pip install genshi
git clone https://github.com/html5lib/html5lib-python.git .virtualenv/html5lib && cd .virtualenv/html5lib || cd .virtualenv/html5lib && git pull
# Pinned commit, to avoid html5lib from changing underneath us.
diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py
index d323f967b21..161a34b6b50 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py
+++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/http-refresh.py
@@ -1,3 +1,5 @@
+from wptserve.utils import isomorphic_encode
+
def main(request, response):
- time = request.url_parts.query if request.url_parts.query else '0'
- return 200, [('Refresh', time), ('Content-Type', "text/html")], ''
+ time = isomorphic_encode(request.url_parts.query) if request.url_parts.query else b'0'
+ return 200, [(b'Refresh', time), (b'Content-Type', b"text/html")], b''
diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py
index dd3cef44b44..2dfbab6e760 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py
+++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/resources/meta-refresh.py
@@ -1,5 +1,3 @@
-import time
-
def main(request, response):
- time = request.url_parts.query if request.url_parts.query else '0'
- return 200, [['Content-Type', 'text/html']], '<meta http-equiv=refresh content=%s>' % time
+ time = request.url_parts.query if request.url_parts.query else u'0'
+ return 200, [[b'Content-Type', b'text/html']], u'<meta http-equiv=refresh content=%s>' % time
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/support/promise-access-control.py b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/support/promise-access-control.py
index be74a36034e..cf8ed5e4924 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/support/promise-access-control.py
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/support/promise-access-control.py
@@ -1,11 +1,11 @@
def main(request, response):
- allow = request.GET.first("allow", "false")
+ allow = request.GET.first(b"allow", b"false")
- headers = [("Content-Type", "application/javascript")]
- if allow != "false":
- headers.append(("Access-Control-Allow-Origin", "*"))
+ headers = [(b"Content-Type", b"application/javascript")]
+ if allow != b"false":
+ headers.append((b"Access-Control-Allow-Origin", b"*"))
- body = """
+ body = b"""
function handleRejectedPromise(promise) {
promise.catch(() => {});
}
diff --git a/tests/wpt/web-platform-tests/images/blue-png-cachable.py b/tests/wpt/web-platform-tests/images/blue-png-cachable.py
index e87975343f6..6d8556542ab 100644
--- a/tests/wpt/web-platform-tests/images/blue-png-cachable.py
+++ b/tests/wpt/web-platform-tests/images/blue-png-cachable.py
@@ -1,5 +1,5 @@
import os
-import time
+from wptserve.utils import isomorphic_decode
def main(request, response):
"""Serves the contents in blue.png but with a Cache-Control header.
@@ -7,7 +7,7 @@ def main(request, response):
Emits a Cache-Control header with max-age set to 1h to allow the browser
cache the image. Used for testing behaviors involving caching logics.
"""
- image_path = os.path.join(os.path.dirname(__file__), "blue.png")
- response.headers.set("Cache-Control", "max-age=3600")
- response.headers.set("Content-Type", "image/png")
+ image_path = os.path.join(os.path.dirname(isomorphic_decode(__file__)), u"blue.png")
+ response.headers.set(b"Cache-Control", b"max-age=3600")
+ response.headers.set(b"Content-Type", b"image/png")
response.content = open(image_path, mode='rb').read()
diff --git a/tests/wpt/web-platform-tests/infrastructure/testdriver/file_upload.py b/tests/wpt/web-platform-tests/infrastructure/testdriver/file_upload.py
index 89ed67a79ef..9c4dd754384 100644
--- a/tests/wpt/web-platform-tests/infrastructure/testdriver/file_upload.py
+++ b/tests/wpt/web-platform-tests/infrastructure/testdriver/file_upload.py
@@ -1,2 +1,2 @@
def main(request, response):
- return "PASS" if request.POST[b"file_input"].file.read() == b"File to upload\n" else "FAIL"
+ return b"PASS" if request.POST[b"file_input"].file.read() == b"File to upload\n" else b"FAIL"
diff --git a/tests/wpt/web-platform-tests/interfaces/ambient-light.idl b/tests/wpt/web-platform-tests/interfaces/ambient-light.idl
index ce335161a25..06d6eec690b 100644
--- a/tests/wpt/web-platform-tests/interfaces/ambient-light.idl
+++ b/tests/wpt/web-platform-tests/interfaces/ambient-light.idl
@@ -3,8 +3,9 @@
// (https://github.com/tidoust/reffy-reports)
// Source: Ambient Light Sensor (https://w3c.github.io/ambient-light/)
-[Constructor(optional SensorOptions sensorOptions = {}), SecureContext, Exposed=Window]
+[SecureContext, Exposed=Window]
interface AmbientLightSensor : Sensor {
+ constructor(optional SensorOptions sensorOptions = {});
readonly attribute double? illuminance;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/intervention-reporting.idl b/tests/wpt/web-platform-tests/interfaces/intervention-reporting.idl
new file mode 100644
index 00000000000..95905fe3b58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/intervention-reporting.idl
@@ -0,0 +1,14 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into reffy-reports
+// (https://github.com/tidoust/reffy-reports)
+// Source: Intervention Reporting (https://wicg.github.io/intervention-reporting/)
+
+[Exposed=(Window,Worker)]
+interface InterventionReportBody : ReportBody {
+ [Default] object toJSON();
+ readonly attribute DOMString id;
+ readonly attribute DOMString message;
+ readonly attribute DOMString? sourceFile;
+ readonly attribute unsigned long? lineNumber;
+ readonly attribute unsigned long? columnNumber;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/native-file-system.idl b/tests/wpt/web-platform-tests/interfaces/native-file-system.idl
index 92d05fe4659..1fd2cb8b3a1 100644
--- a/tests/wpt/web-platform-tests/interfaces/native-file-system.idl
+++ b/tests/wpt/web-platform-tests/interfaces/native-file-system.idl
@@ -7,10 +7,14 @@ dictionary FileSystemHandlePermissionDescriptor {
boolean writable = false;
};
+enum FileSystemHandleKind {
+ "file",
+ "directory",
+};
+
[Exposed=(Window,Worker), SecureContext, Serializable]
interface FileSystemHandle {
- readonly attribute boolean isFile;
- readonly attribute boolean isDirectory;
+ readonly attribute FileSystemHandleKind kind;
readonly attribute USVString name;
Promise<boolean> isSameEntry(FileSystemHandle other);
@@ -45,8 +49,8 @@ dictionary FileSystemRemoveOptions {
interface FileSystemDirectoryHandle : FileSystemHandle {
async iterable<USVString, FileSystemHandle>;
- Promise<FileSystemFileHandle> getFile(USVString name, optional FileSystemGetFileOptions options = {});
- Promise<FileSystemDirectoryHandle> getDirectory(USVString name, optional FileSystemGetDirectoryOptions options = {});
+ Promise<FileSystemFileHandle> getFileHandle(USVString name, optional FileSystemGetFileOptions options = {});
+ Promise<FileSystemDirectoryHandle> getDirectoryHandle(USVString name, optional FileSystemGetDirectoryOptions options = {});
Promise<void> removeEntry(USVString name, optional FileSystemRemoveOptions options = {});
diff --git a/tests/wpt/web-platform-tests/interfaces/payment-handler.idl b/tests/wpt/web-platform-tests/interfaces/payment-handler.idl
index 824210a5c18..66732945ca6 100644
--- a/tests/wpt/web-platform-tests/interfaces/payment-handler.idl
+++ b/tests/wpt/web-platform-tests/interfaces/payment-handler.idl
@@ -11,7 +11,7 @@ partial interface ServiceWorkerRegistration {
interface PaymentManager {
[SameObject] readonly attribute PaymentInstruments instruments;
attribute DOMString userHint;
- Promise<void> enableDelegations(FrozenArray<PaymentDelegation> delegations);
+ Promise<void> enableDelegations(sequence<PaymentDelegation> delegations);
};
enum PaymentDelegation {
@@ -70,8 +70,8 @@ partial interface ServiceWorkerGlobalScope {
dictionary PaymentRequestDetailsUpdate {
DOMString error;
PaymentCurrencyAmount total;
- FrozenArray<PaymentDetailsModifier> modifiers;
- FrozenArray<PaymentShippingOption> shippingOptions;
+ sequence<PaymentDetailsModifier> modifiers;
+ sequence<PaymentShippingOption> shippingOptions;
object paymentMethodErrors;
AddressErrors shippingAddressErrors;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/webauthn.idl b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
index 9de7f64919d..607c4765485 100644
--- a/tests/wpt/web-platform-tests/interfaces/webauthn.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webauthn.idl
@@ -167,6 +167,10 @@ partial dictionary AuthenticationExtensionsClientInputs {
USVString appidExclude;
};
+partial dictionary AuthenticationExtensionsClientOutputs {
+ boolean appidExclude;
+};
+
partial dictionary AuthenticationExtensionsClientInputs {
boolean uvm;
};
diff --git a/tests/wpt/web-platform-tests/intervention-reporting/idlharness.any.js b/tests/wpt/web-platform-tests/intervention-reporting/idlharness.any.js
new file mode 100644
index 00000000000..c7a4d6095f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intervention-reporting/idlharness.any.js
@@ -0,0 +1,14 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+idl_test(
+ ['intervention-reporting'],
+ ['reporting'],
+ idl_array => {
+ idl_array.add_objects({
+ // TODO: objects
+ });
+ }
+);
diff --git a/tests/wpt/web-platform-tests/layout-instability/resources/slow-image.py b/tests/wpt/web-platform-tests/layout-instability/resources/slow-image.py
index ee7988c551f..d9f09b8bca7 100644
--- a/tests/wpt/web-platform-tests/layout-instability/resources/slow-image.py
+++ b/tests/wpt/web-platform-tests/layout-instability/resources/slow-image.py
@@ -3,4 +3,4 @@ import time
def main(request, response):
# Sleep for 3s to delay onload.
time.sleep(3)
- return [], "" \ No newline at end of file
+ return [], b""
diff --git a/tests/wpt/web-platform-tests/lint.ignore b/tests/wpt/web-platform-tests/lint.ignore
index 8d0ac45b8c8..23cf8609bf2 100644
--- a/tests/wpt/web-platform-tests/lint.ignore
+++ b/tests/wpt/web-platform-tests/lint.ignore
@@ -688,6 +688,7 @@ MISSING-LINK: css/filter-effects/*.any.js
# Tests that use WebKit/Blink testing APIs
LAYOUTTESTS APIS: import-maps/common/resources/common-test-helper.js
+LAYOUTTESTS APIS: resources/test-only-api.js
LAYOUTTESTS APIS: resources/chromium/enable-hyperlink-auditing.js
LAYOUTTESTS APIS: resources/chromium/generic_sensor_mocks.js
LAYOUTTESTS APIS: resources/chromium/nfc-mock.js
@@ -709,6 +710,7 @@ WEB-PLATFORM.TEST:web-bundle/resources/wbn/*.wbn
# Tests that depend on resources in /gen/ in Chromium:
# https://github.com/web-platform-tests/wpt/issues/16455
# Please consult with ecosystem-infra@chromium.org before adding more.
+MISSING DEPENDENCY: resources/test-only-api.js
MISSING DEPENDENCY: idle-detection/interceptor.https.html
MISSING DEPENDENCY: credential-management/support/otpcredential-helper.js
MISSING DEPENDENCY: web-nfc/resources/nfc-helpers.js
diff --git a/tests/wpt/web-platform-tests/longtask-timing/containerNames.html b/tests/wpt/web-platform-tests/longtask-timing/containerNames.html
new file mode 100644
index 00000000000..cfde4a30433
--- /dev/null
+++ b/tests/wpt/web-platform-tests/longtask-timing/containerNames.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>LongTask Timing: long tasks in long-name iframe containers</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<h1>Longtasks in iframe</h1>
+<div id="log"></div>
+<script>
+const longContainerName = 'iframeWithLongNameMoreThan100CharactersSpaceHolderSpaceHolderSpaceHolderSpaceHolderSpaceHolderSpaceHolder';
+
+promise_test(async t => {
+assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.');
+const initialTime = performance.now();
+return new Promise(resolve => {
+ const observer = new PerformanceObserver(t.step_func(entryList => {
+ const entries = entryList.getEntries();
+ assert_equals(entries.length, 1,
+ 'Exactly one entry is expected.');
+ const longtask = entries[0];
+ assert_equals(longtask.entryType, 'longtask');
+ if (longtask.name == 'self' ||
+ longtask.name == 'multiple-contexts' ||
+ longtask.name == 'unknown')
+ return;
+ assert_equals(longtask.name, 'same-origin-descendant');
+ assert_greater_than(longtask.duration, 50);
+ assert_greater_than_equal(longtask.startTime, initialTime);
+ const currentTime = performance.now();
+ assert_less_than_equal(longtask.startTime, currentTime);
+ // Assert the TaskAttributionTiming entry in attribution.
+ assert_equals(longtask.attribution.length, 1,
+ 'Exactly one attribution entry is expected');
+ const attribution = longtask.attribution[0];
+ assert_equals(attribution.entryType, 'taskattribution');
+ assert_equals(attribution.name, 'unknown');
+ assert_equals(attribution.duration, 0);
+ assert_equals(attribution.startTime, 0);
+ assert_equals(attribution.containerId, longContainerName + '-id');
+ assert_equals(attribution.containerName, longContainerName + '-name');
+ assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html');
+ observer.disconnect();
+ resolve();
+ }));
+ observer.observe({entryTypes: ['longtask']});
+ const iframe = document.createElement('iframe');
+ iframe.id = longContainerName + '-id';
+ iframe.name = longContainerName + '-name';
+ iframe.src = 'resources/subframe-with-longtask.html';
+ document.body.appendChild(iframe);
+});
+}, `Performance longtask entries in ${longContainerName} are observable in parent.`);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
index 1bc1f9b5740..d94b43c9cf9 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
@@ -197,4 +197,23 @@
"resizeMode should exist and it should be a string.");
assert_in_array(settings.resizeMode, ['none', 'crop-and-scale']);
}, 'resizeMode is reported by getSettings() for getUserMedia() video tracks');
+
+ promise_test(async t => {
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video : true});
+ const audioTrack = stream.getAudioTracks()[0];
+ const videoTrack = stream.getVideoTracks()[0];
+
+ const audioDeviceId = audioTrack.getSettings().deviceId;
+ const videoDeviceId = videoTrack.getSettings().deviceId;
+ const audioGroupId = audioTrack.getSettings().groupId;
+ const videoGroupId = videoTrack.getSettings().groupId;
+
+ audioTrack.stop();
+ videoTrack.stop();
+
+ assert_equals(audioTrack.getSettings().deviceId, audioDeviceId, "audio track deviceId");
+ assert_equals(videoTrack.getSettings().deviceId, videoDeviceId, "video track deviceId");
+ assert_equals(audioTrack.getSettings().groupId, audioGroupId, "audio track groupId");
+ assert_equals(videoTrack.getSettings().groupId, videoGroupId, "video track groupId");
+ }, 'Stopped tracks should expose deviceId/groupId');
</script>
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-IndexedDB-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-IndexedDB-manual.https.html
index c68df06de9a..c68df06de9a 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-IndexedDB-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-IndexedDB-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-isSameEntry-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-isSameEntry-manual.https.html
index 1d13d8bab66..1d13d8bab66 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-isSameEntry-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-isSameEntry-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.html
index 07f8d9620d8..07f8d9620d8 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-Error-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-Error-manual.https.html
index 19fcb3ea716..19fcb3ea716 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-Error-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-Error-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.html
index 81e545c5190..81e545c5190 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.html
index 1b583d0c395..1b583d0c395 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.html
index 22d0bf5a723..22d0bf5a723 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-frames-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-frames-manual.https.html
index 6d5c5ab78ab..6d5c5ab78ab 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-frames-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-frames-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-windows-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-windows-manual.https.html
index ad1e8e7bcf3..ad1e8e7bcf3 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-windows-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-windows-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-workers-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-workers-manual.https.html
index bc1fc5087a6..bc1fc5087a6 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-workers-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemBaseHandle-postMessage-workers-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getDirectory-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getDirectoryHandle-manual.https.html
index afd95af99d3..03672321e2d 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getDirectory-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getDirectoryHandle-manual.https.html
@@ -7,4 +7,4 @@
<script src="/resources/testdriver-vendor.js"></script>
<script src="resources/test-helpers.js"></script>
<script src="resources/native-fs-test-helpers.js"></script>
-<script src="script-tests/FileSystemDirectoryHandle-getDirectory.js"></script>
+<script src="script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js"></script>
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getEntries-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getEntries-manual.https.html
index 858bf02f1fa..858bf02f1fa 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getEntries-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getEntries-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getFile-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getFileHandle-manual.https.html
index 085d4371c48..94b31226f8d 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getFile-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-getFileHandle-manual.https.html
@@ -7,4 +7,4 @@
<script src="/resources/testdriver-vendor.js"></script>
<script src="resources/test-helpers.js"></script>
<script src="resources/native-fs-test-helpers.js"></script>
-<script src="script-tests/FileSystemDirectoryHandle-getFile.js"></script>
+<script src="script-tests/FileSystemDirectoryHandle-getFileHandle.js"></script>
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-removeEntry-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-removeEntry-manual.https.html
index cedb87587ce..cedb87587ce 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-removeEntry-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-removeEntry-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-resolve-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-resolve-manual.https.html
index 9c001b366b9..9c001b366b9 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-resolve-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemDirectoryHandle-resolve-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemFileHandle-getFile-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemFileHandle-getFile-manual.https.html
index 5a0b1d97b05..5a0b1d97b05 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemFileHandle-getFile-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemFileHandle-getFile-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-manual.https.html
index 56ff51cd05a..56ff51cd05a 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped-manual.https.html
index f6c6e6009aa..f6c6e6009aa 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-piped-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write-manual.https.tentative.html b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write-manual.https.html
index 280edc27e5a..280edc27e5a 100644
--- a/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write-manual.https.tentative.html
+++ b/tests/wpt/web-platform-tests/native-file-system/native_FileSystemWritableFileStream-write-manual.https.html
diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/message-target.js b/tests/wpt/web-platform-tests/native-file-system/resources/message-target.js
index 423bcf42e16..ab8012dfca5 100644
--- a/tests/wpt/web-platform-tests/native-file-system/resources/message-target.js
+++ b/tests/wpt/web-platform-tests/native-file-system/resources/message-target.js
@@ -87,7 +87,7 @@ function add_message_event_handlers(receiver, target, target_origin) {
const directory =
await self.getOriginPrivateDirectory();
const file_handle =
- await directory.getFile('temp-file', { create: true });
+ await directory.getFileHandle('temp-file', { create: true });
message_source.postMessage(
{ type: 'receive-file', file_handle },
{ targetOrigin: target_origin });
@@ -98,7 +98,7 @@ function add_message_event_handlers(receiver, target, target_origin) {
const parent_directory =
await self.getOriginPrivateDirectory();
const directory_handle =
- await parent_directory.getDirectory('temp-directory',
+ await parent_directory.getDirectoryHandle('temp-directory',
{ create: true });
message_source.postMessage(
{ type: 'receive-directory', directory_handle },
@@ -140,4 +140,4 @@ function add_message_event_handlers(receiver, target, target_origin) {
{ targetOrigin: target_origin });
}
});
-} \ No newline at end of file
+}
diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/messaging-serialize-helpers.js b/tests/wpt/web-platform-tests/native-file-system/resources/messaging-serialize-helpers.js
index ff7e59cf45a..b4d41aa91c0 100644
--- a/tests/wpt/web-platform-tests/native-file-system/resources/messaging-serialize-helpers.js
+++ b/tests/wpt/web-platform-tests/native-file-system/resources/messaging-serialize-helpers.js
@@ -15,16 +15,15 @@ async function serialize_handles(handle_array) {
// Serializes either a FileSystemFileHandle or FileSystemDirectoryHandle.
async function serialize_handle(handle) {
- let serialized;
- if (handle.isDirectory) {
- serialized = await serialize_file_system_directory_handle(handle);
- } else if (handle.isFile) {
- serialized = await serialize_file_system_file_handle(handle);
- } else {
- throw 'Object is not a FileSystemFileHandle or ' +
- `FileSystemDirectoryHandle ${handle}`;
+ switch (handle.kind) {
+ case 'directory':
+ return await serialize_file_system_directory_handle(handle);
+ case 'file':
+ return await serialize_file_system_file_handle(handle);
+ default:
+ throw 'Object is not a FileSystemFileHandle or ' +
+ `FileSystemDirectoryHandle ${handle}`;
}
- return serialized;
}
// Creates a dictionary for a FileSystemHandle base, which contains
@@ -38,8 +37,7 @@ async function serialize_file_system_handle(handle) {
await handle.queryPermission({ writable: true })
return {
- is_file: handle.isFile,
- is_directory: handle.isDirectory,
+ kind: handle.kind,
name: handle.name,
read_permission,
write_permission
@@ -50,8 +48,7 @@ async function serialize_file_system_handle(handle) {
// Also, reads the contents of the file to include with the returned
// dictionary. Example output:
// {
-// is_file: true,
-// is_directory: false,
+// kind: "file",
// name: "example-file-name"
// read_permission: "granted",
// write_permission: "granted",
@@ -69,8 +66,7 @@ async function serialize_file_system_file_handle(file_handle) {
// Create a dictionary with each property value in FileSystemDirectoryHandle.
// Example output:
// {
-// is_file: false,
-// is_directory: true,
+// kind: "directory",
// name: "example-directory-name"
// read_permission: "granted",
// write_permission: "granted",
@@ -83,7 +79,7 @@ async function serialize_file_system_directory_handle(directory_handle) {
const serialized_directories = [];
for await (const child_handle of directory_handle.getEntries()) {
const serialized_child_handle = await serialize_handle(child_handle);
- if (child_handle.isDirectory) {
+ if (child_handle.kind === "directory") {
serialized_directories.push(serialized_child_handle);
} else {
serialized_files.push(serialized_child_handle);
@@ -138,24 +134,24 @@ function assert_equals_serialized_handles(left_array, right_array) {
// Verifies each property of a serialized FileSystemFileHandle or
// FileSystemDirectoryHandle.
function assert_equals_serialized_handle(left, right) {
- if (left.is_directory) {
- assert_equals_serialized_file_system_directory_handle(left, right);
- } else if (left.is_file) {
- assert_equals_serialized_file_system_file_handle(left, right);
- } else {
- throw 'Object is not a FileSystemFileHandle or ' +
- `FileSystemDirectoryHandle ${left}`;
+ switch (left.kind) {
+ case 'directory':
+ assert_equals_serialized_file_system_directory_handle(left, right);
+ break;
+ case 'file':
+ assert_equals_serialized_file_system_file_handle(left, right);
+ break;
+ default:
+ throw 'Object is not a FileSystemFileHandle or ' +
+ `FileSystemDirectoryHandle ${left}`;
}
}
// Compares the output of serialize_file_system_handle() for
// two FileSystemHandles.
function assert_equals_serialized_file_system_handle(left, right) {
- assert_equals(left.is_file, right.is_file,
- 'Each FileSystemHandle instance must use the expected "isFile".');
-
- assert_equals(left.is_directory, right.is_directory,
- 'Each FileSystemHandle instance must use the expected "isDirectory".');
+ assert_equals(left.kind, right.kind,
+ 'Each FileSystemHandle instance must use the expected "kind".');
assert_equals(left.name, right.name,
'Each FileSystemHandle instance must use the expected "name" ' +
diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js b/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js
index cf9f39a9a87..231bc067532 100644
--- a/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js
+++ b/tests/wpt/web-platform-tests/native-file-system/resources/native-fs-test-helpers.js
@@ -33,7 +33,8 @@ function directory_test(func, description) {
// To be resilient against tests not cleaning up properly, cleanup before
// every test.
for await (let entry of directory.getEntries()) {
- await directory.removeEntry(entry.name, {recursive: entry.isDirectory});
+ await directory.removeEntry(
+ entry.name, {recursive: entry.kind === 'directory'});
}
await func(t, directory);
}, description);
diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/sandboxed-fs-test-helpers.js b/tests/wpt/web-platform-tests/native-file-system/resources/sandboxed-fs-test-helpers.js
index 3ec31436a03..1b27445e951 100644
--- a/tests/wpt/web-platform-tests/native-file-system/resources/sandboxed-fs-test-helpers.js
+++ b/tests/wpt/web-platform-tests/native-file-system/resources/sandboxed-fs-test-helpers.js
@@ -10,7 +10,7 @@ async function cleanupSandboxedFileSystem() {
const dir =
await self.getOriginPrivateDirectory();
for await (let entry of dir.getEntries())
- await dir.removeEntry(entry.name, {recursive: entry.isDirectory});
+ await dir.removeEntry(entry.name, {recursive: entry.kind === 'directory'});
}
function directory_test(func, description) {
diff --git a/tests/wpt/web-platform-tests/native-file-system/resources/test-helpers.js b/tests/wpt/web-platform-tests/native-file-system/resources/test-helpers.js
index eb123bf6da6..0d8bdfde8d7 100644
--- a/tests/wpt/web-platform-tests/native-file-system/resources/test-helpers.js
+++ b/tests/wpt/web-platform-tests/native-file-system/resources/test-helpers.js
@@ -34,7 +34,7 @@ async function getDirectoryEntryCount(handle) {
async function getSortedDirectoryEntries(handle) {
let result = [];
for await (let entry of handle.getEntries()) {
- if (entry.isDirectory)
+ if (entry.kind === 'directory')
result.push(entry.name + '/');
else
result.push(entry.name);
@@ -44,7 +44,7 @@ async function getSortedDirectoryEntries(handle) {
}
async function createDirectory(test, name, parent) {
- const new_dir_handle = await parent.getDirectory(name, {create: true});
+ const new_dir_handle = await parent.getDirectoryHandle(name, {create: true});
test.add_cleanup(async () => {
try {
await parent.removeEntry(name, {recursive: true});
@@ -57,7 +57,7 @@ async function createDirectory(test, name, parent) {
}
async function createEmptyFile(test, name, parent) {
- const handle = await parent.getFile(name, {create: true});
+ const handle = await parent.getFileHandle(name, {create: true});
test.add_cleanup(async () => {
try {
await parent.removeEntry(name);
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.js
index 7f0fc4a7212..7f0fc4a7212 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.js
index 67d36dfae8a..67d36dfae8a 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.js
index ca25b548cbb..ca25b548cbb 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.js
index 16a7002a2ad..16a7002a2ad 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.js
index 612c823295b..612c823295b 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.js
index 28cec810ee3..28cec810ee3 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.js
index 1599ba969d8..1599ba969d8 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.js
index a0e41c51b18..a0e41c51b18 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.js
index 1e3de1ea399..1e3de1ea399 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.js
index e690682b6ff..e690682b6ff 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.tentative.https.window.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectory.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.js
index 6fcf566e31f..69ca2bf3677 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectory.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.js
@@ -1,3 +1,3 @@
// META: script=resources/test-helpers.js
// META: script=resources/sandboxed-fs-test-helpers.js
-// META: script=script-tests/FileSystemDirectoryHandle-getDirectory.js
+// META: script=script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.https.any.js
index da620e2a3b1..da620e2a3b1 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getEntries.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.js
index 65ae891cd44..afe362e757c 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getFile.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.js
@@ -1,3 +1,3 @@
// META: script=resources/test-helpers.js
// META: script=resources/sandboxed-fs-test-helpers.js
-// META: script=script-tests/FileSystemDirectoryHandle-getFile.js
+// META: script=script-tests/FileSystemDirectoryHandle-getFileHandle.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.js
index a4be8bd267e..a4be8bd267e 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.js
index 6ee32709307..6ee32709307 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemFileHandle-getFile.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.js
index fb93858fe79..fb93858fe79 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemFileHandle-getFile.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.js
index eed6a561dc4..eed6a561dc4 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.js
index 7ef0ea0ef82..7ef0ea0ef82 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.https.any.js
index 16dbbe6a808..16dbbe6a808 100644
--- a/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-file-system/sandboxed_FileSystemWritableFileStream.https.any.js
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemBaseHandle-isSameEntry.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemBaseHandle-isSameEntry.js
index e8a8725b95e..8c0b3521c3f 100644
--- a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemBaseHandle-isSameEntry.js
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemBaseHandle-isSameEntry.js
@@ -16,7 +16,7 @@ directory_test(async (t, root_dir) => {
directory_test(async (t, root_dir) => {
const subdir = await createDirectory(t, 'subdir-name', root_dir);
- const subdir2 = await root_dir.getDirectory('subdir-name');
+ const subdir2 = await root_dir.getDirectoryHandle('subdir-name');
assert_true(await subdir.isSameEntry(subdir2));
assert_true(await subdir2.isSameEntry(subdir));
@@ -38,7 +38,7 @@ directory_test(async (t, root_dir) => {
directory_test(async (t, root_dir) => {
const handle1 = await createEmptyFile(t, 'mtime.txt', root_dir);
- const handle2 = await root_dir.getFile('mtime.txt');
+ const handle2 = await root_dir.getFileHandle('mtime.txt');
assert_true(await handle1.isSameEntry(handle2));
assert_true(await handle2.isSameEntry(handle1));
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getDirectory.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js
index cd910fd361f..48a4ce4ce69 100644
--- a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getDirectory.js
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js
@@ -1,82 +1,85 @@
directory_test(async (t, root) => {
await promise_rejects_dom(
- t, 'NotFoundError', root.getDirectory('non-existing-dir'));
-}, 'getDirectory(create=false) rejects for non-existing directories');
+ t, 'NotFoundError', root.getDirectoryHandle('non-existing-dir'));
+}, 'getDirectoryHandle(create=false) rejects for non-existing directories');
directory_test(async (t, root) => {
- const handle = await root.getDirectory('non-existing-dir', {create: true});
+ const handle =
+ await root.getDirectoryHandle('non-existing-dir', {create: true});
t.add_cleanup(() => root.removeEntry('non-existing-dir', {recursive: true}));
- assert_false(handle.isFile);
- assert_true(handle.isDirectory);
+ assert_equals(handle.kind, 'directory');
assert_equals(handle.name, 'non-existing-dir');
assert_equals(await getDirectoryEntryCount(handle), 0);
assert_array_equals(
await getSortedDirectoryEntries(root), ['non-existing-dir/']);
-}, 'getDirectory(create=true) creates an empty directory');
+}, 'getDirectoryHandle(create=true) creates an empty directory');
directory_test(async (t, root) => {
const existing_handle =
- await root.getDirectory('dir-with-contents', {create: true});
+ await root.getDirectoryHandle('dir-with-contents', {create: true});
t.add_cleanup(() => root.removeEntry('dir-with-contents', {recursive: true}));
const file_handle = await createEmptyFile(t, 'test-file', existing_handle);
- const handle = await root.getDirectory('dir-with-contents', {create: false});
+ const handle =
+ await root.getDirectoryHandle('dir-with-contents', {create: false});
- assert_false(handle.isFile);
- assert_true(handle.isDirectory);
+ assert_equals(handle.kind, 'directory');
assert_equals(handle.name, 'dir-with-contents');
assert_array_equals(await getSortedDirectoryEntries(handle), ['test-file']);
-}, 'getDirectory(create=false) returns existing directories');
+}, 'getDirectoryHandle(create=false) returns existing directories');
directory_test(async (t, root) => {
const existing_handle =
- await root.getDirectory('dir-with-contents', {create: true});
+ await root.getDirectoryHandle('dir-with-contents', {create: true});
t.add_cleanup(() => root.removeEntry('dir-with-contents', {recursive: true}));
const file_handle =
- await existing_handle.getFile('test-file', {create: true});
+ await existing_handle.getFileHandle('test-file', {create: true});
- const handle = await root.getDirectory('dir-with-contents', {create: true});
+ const handle =
+ await root.getDirectoryHandle('dir-with-contents', {create: true});
- assert_false(handle.isFile);
- assert_true(handle.isDirectory);
+ assert_equals(handle.kind, 'directory');
assert_equals(handle.name, 'dir-with-contents');
assert_array_equals(await getSortedDirectoryEntries(handle), ['test-file']);
-}, 'getDirectory(create=true) returns existing directories without erasing');
+}, 'getDirectoryHandle(create=true) returns existing directories without erasing');
directory_test(async (t, root) => {
await createEmptyFile(t, 'file-name', root);
- await promise_rejects_dom(t, 'TypeMismatchError', root.getDirectory('file-name'));
await promise_rejects_dom(
- t, 'TypeMismatchError', root.getDirectory('file-name', {create: false}));
+ t, 'TypeMismatchError', root.getDirectoryHandle('file-name'));
await promise_rejects_dom(
- t, 'TypeMismatchError', root.getDirectory('file-name', {create: true}));
-}, 'getDirectory() when a file already exists with the same name');
+ t, 'TypeMismatchError',
+ root.getDirectoryHandle('file-name', {create: false}));
+ await promise_rejects_dom(
+ t, 'TypeMismatchError',
+ root.getDirectoryHandle('file-name', {create: true}));
+}, 'getDirectoryHandle() when a file already exists with the same name');
directory_test(async (t, dir) => {
await promise_rejects_js(
- t, TypeError, dir.getDirectory('', {create: true}));
+ t, TypeError, dir.getDirectoryHandle('', {create: true}));
await promise_rejects_js(
- t, TypeError, dir.getDirectory('', {create: false}));
-}, 'getDirectory() with empty name');
+ t, TypeError, dir.getDirectoryHandle('', {create: false}));
+}, 'getDirectoryHandle() with empty name');
directory_test(async (t, dir) => {
await promise_rejects_js(
- t, TypeError, dir.getDirectory(kCurrentDirectory));
+ t, TypeError, dir.getDirectoryHandle(kCurrentDirectory));
await promise_rejects_js(
- t, TypeError, dir.getDirectory(kCurrentDirectory, {create: true}));
-}, `getDirectory() with "${kCurrentDirectory}" name`);
+ t, TypeError, dir.getDirectoryHandle(kCurrentDirectory, {create: true}));
+}, `getDirectoryHandle() with "${kCurrentDirectory}" name`);
directory_test(async (t, dir) => {
const subdir = await createDirectory(t, 'subdir-name', /*parent=*/ dir);
await promise_rejects_js(
- t, TypeError, subdir.getDirectory(kParentDirectory));
+ t, TypeError, subdir.getDirectoryHandle(kParentDirectory));
await promise_rejects_js(
t, TypeError,
- subdir.getDirectory(kParentDirectory, {create: true}));
-}, `getDirectory() with "${kParentDirectory}" name`);
+ subdir.getDirectoryHandle(kParentDirectory, {create: true}));
+}, `getDirectoryHandle() with "${kParentDirectory}" name`);
directory_test(async (t, dir) => {
const first_subdir_name = 'first-subdir-name';
@@ -91,10 +94,11 @@ directory_test(async (t, dir) => {
const path_with_separator =
`${first_subdir_name}${kPathSeparators[i]}${second_subdir_name}`;
await promise_rejects_js(
- t, TypeError, dir.getDirectory(path_with_separator),
- `getDirectory() must reject names containing "${kPathSeparators[i]}"`);
+ t, TypeError, dir.getDirectoryHandle(path_with_separator),
+ `getDirectoryHandle() must reject names containing "${
+ kPathSeparators[i]}"`);
}
-}, 'getDirectory(create=false) with a path separator when the directory exists');
+}, 'getDirectoryHandle(create=false) with a path separator when the directory exists');
directory_test(async (t, dir) => {
const subdir_name = 'subdir-name';
@@ -104,8 +108,8 @@ directory_test(async (t, dir) => {
const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`;
await promise_rejects_js(
t, TypeError,
- dir.getDirectory(path_with_separator, {create: true}),
- `getDirectory(true) must reject names containing "${
+ dir.getDirectoryHandle(path_with_separator, {create: true}),
+ `getDirectoryHandle(true) must reject names containing "${
kPathSeparators[i]}"`);
}
-}, 'getDirectory(create=true) with a path separator');
+}, 'getDirectoryHandle(create=true) with a path separator');
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFile.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFile.js
deleted file mode 100644
index 383f19a4b2b..00000000000
--- a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFile.js
+++ /dev/null
@@ -1,100 +0,0 @@
-directory_test(async (t, dir) => {
- await promise_rejects_dom(t, 'NotFoundError', dir.getFile('non-existing-file'));
-}, 'getFile(create=false) rejects for non-existing files');
-
-directory_test(async (t, dir) => {
- const handle = await dir.getFile('non-existing-file', {create: true});
- t.add_cleanup(() => dir.removeEntry('non-existing-file'));
-
- assert_true(handle.isFile);
- assert_false(handle.isDirectory);
- assert_equals(handle.name, 'non-existing-file');
- assert_equals(await getFileSize(handle), 0);
- assert_equals(await getFileContents(handle), '');
-}, 'getFile(create=true) creates an empty file for non-existing files');
-
-directory_test(async (t, dir) => {
- const existing_handle = await createFileWithContents(
- t, 'existing-file', '1234567890', /*parent=*/ dir);
- const handle = await dir.getFile('existing-file');
-
- assert_true(handle.isFile);
- assert_false(handle.isDirectory);
- assert_equals(handle.name, 'existing-file');
- assert_equals(await getFileSize(handle), 10);
- assert_equals(await getFileContents(handle), '1234567890');
-}, 'getFile(create=false) returns existing files');
-
-directory_test(async (t, dir) => {
- const existing_handle = await createFileWithContents(
- t, 'file-with-contents', '1234567890', /*parent=*/ dir);
- const handle = await dir.getFile('file-with-contents', {create: true});
-
- assert_true(handle.isFile);
- assert_false(handle.isDirectory);
- assert_equals(handle.name, 'file-with-contents');
- assert_equals(await getFileSize(handle), 10);
- assert_equals(await getFileContents(handle), '1234567890');
-}, 'getFile(create=true) returns existing files without erasing');
-
-directory_test(async (t, dir) => {
- const dir_handle = await dir.getDirectory('dir-name', {create: true});
- t.add_cleanup(() => dir.removeEntry('dir-name', {recursive: true}));
-
- await promise_rejects_dom(t, 'TypeMismatchError', dir.getFile('dir-name'));
-}, 'getFile(create=false) when a directory already exists with the same name');
-
-directory_test(async (t, dir) => {
- const dir_handle = await dir.getDirectory('dir-name', {create: true});
- t.add_cleanup(() => dir.removeEntry('dir-name', {recursive: true}));
-
- await promise_rejects_dom(
- t, 'TypeMismatchError', dir.getFile('dir-name', {create: true}));
-}, 'getFile(create=true) when a directory already exists with the same name');
-
-directory_test(async (t, dir) => {
- await promise_rejects_js(t, TypeError, dir.getFile('', {create: true}));
- await promise_rejects_js(t, TypeError, dir.getFile('', {create: false}));
-}, 'getFile() with empty name');
-
-directory_test(async (t, dir) => {
- await promise_rejects_js(t, TypeError, dir.getFile(kCurrentDirectory));
- await promise_rejects_js(
- t, TypeError, dir.getFile(kCurrentDirectory, {create: true}));
-}, `getFile() with "${kCurrentDirectory}" name`);
-
-directory_test(async (t, dir) => {
- const subdir = await createDirectory(t, 'subdir-name', /*parent=*/ dir);
-
- await promise_rejects_js(t, TypeError, subdir.getFile(kParentDirectory));
- await promise_rejects_js(
- t, TypeError, subdir.getFile(kParentDirectory, {create: true}));
-}, `getFile() with "${kParentDirectory}" name`);
-
-directory_test(async (t, dir) => {
- const subdir_name = 'subdir-name';
- const subdir = await createDirectory(t, subdir_name, /*parent=*/ dir);
-
- const file_name = 'file-name';
- await createEmptyFile(t, file_name, /*parent=*/ subdir);
-
- for (let i = 0; i < kPathSeparators.length; ++i) {
- const path_with_separator =
- `${subdir_name}${kPathSeparators[i]}${file_name}`;
- await promise_rejects_js(
- t, TypeError, dir.getFile(path_with_separator),
- `getFile() must reject names containing "${kPathSeparators[i]}"`);
- }
-}, 'getFile(create=false) with a path separator when the file exists.');
-
-directory_test(async (t, dir) => {
- const subdir_name = 'subdir-name';
- const subdir = await createDirectory(t, subdir_name, /*parent=*/ dir);
-
- for (let i = 0; i < kPathSeparators.length; ++i) {
- const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`;
- await promise_rejects_js(
- t, TypeError, dir.getFile(path_with_separator, {create: true}),
- `getFile(true) must reject names containing "${kPathSeparators[i]}"`);
- }
-}, 'getFile(create=true) with a path separator');
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFileHandle.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFileHandle.js
new file mode 100644
index 00000000000..dddd67a7058
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-getFileHandle.js
@@ -0,0 +1,102 @@
+directory_test(async (t, dir) => {
+ await promise_rejects_dom(
+ t, 'NotFoundError', dir.getFileHandle('non-existing-file'));
+}, 'getFileHandle(create=false) rejects for non-existing files');
+
+directory_test(async (t, dir) => {
+ const handle = await dir.getFileHandle('non-existing-file', {create: true});
+ t.add_cleanup(() => dir.removeEntry('non-existing-file'));
+
+ assert_equals(handle.kind, 'file');
+ assert_equals(handle.name, 'non-existing-file');
+ assert_equals(await getFileSize(handle), 0);
+ assert_equals(await getFileContents(handle), '');
+}, 'getFileHandle(create=true) creates an empty file for non-existing files');
+
+directory_test(async (t, dir) => {
+ const existing_handle = await createFileWithContents(
+ t, 'existing-file', '1234567890', /*parent=*/ dir);
+ const handle = await dir.getFileHandle('existing-file');
+
+ assert_equals(handle.kind, 'file');
+ assert_equals(handle.name, 'existing-file');
+ assert_equals(await getFileSize(handle), 10);
+ assert_equals(await getFileContents(handle), '1234567890');
+}, 'getFileHandle(create=false) returns existing files');
+
+directory_test(async (t, dir) => {
+ const existing_handle = await createFileWithContents(
+ t, 'file-with-contents', '1234567890', /*parent=*/ dir);
+ const handle = await dir.getFileHandle('file-with-contents', {create: true});
+
+ assert_equals(handle.kind, 'file');
+ assert_equals(handle.name, 'file-with-contents');
+ assert_equals(await getFileSize(handle), 10);
+ assert_equals(await getFileContents(handle), '1234567890');
+}, 'getFileHandle(create=true) returns existing files without erasing');
+
+directory_test(async (t, dir) => {
+ const dir_handle = await dir.getDirectoryHandle('dir-name', {create: true});
+ t.add_cleanup(() => dir.removeEntry('dir-name', {recursive: true}));
+
+ await promise_rejects_dom(
+ t, 'TypeMismatchError', dir.getFileHandle('dir-name'));
+}, 'getFileHandle(create=false) when a directory already exists with the same name');
+
+directory_test(async (t, dir) => {
+ const dir_handle = await dir.getDirectoryHandle('dir-name', {create: true});
+ t.add_cleanup(() => dir.removeEntry('dir-name', {recursive: true}));
+
+ await promise_rejects_dom(
+ t, 'TypeMismatchError', dir.getFileHandle('dir-name', {create: true}));
+}, 'getFileHandle(create=true) when a directory already exists with the same name');
+
+directory_test(async (t, dir) => {
+ await promise_rejects_js(t, TypeError, dir.getFileHandle('', {create: true}));
+ await promise_rejects_js(
+ t, TypeError, dir.getFileHandle('', {create: false}));
+}, 'getFileHandle() with empty name');
+
+directory_test(async (t, dir) => {
+ await promise_rejects_js(t, TypeError, dir.getFileHandle(kCurrentDirectory));
+ await promise_rejects_js(
+ t, TypeError, dir.getFileHandle(kCurrentDirectory, {create: true}));
+}, `getFileHandle() with "${kCurrentDirectory}" name`);
+
+directory_test(async (t, dir) => {
+ const subdir = await createDirectory(t, 'subdir-name', /*parent=*/ dir);
+
+ await promise_rejects_js(
+ t, TypeError, subdir.getFileHandle(kParentDirectory));
+ await promise_rejects_js(
+ t, TypeError, subdir.getFileHandle(kParentDirectory, {create: true}));
+}, `getFileHandle() with "${kParentDirectory}" name`);
+
+directory_test(async (t, dir) => {
+ const subdir_name = 'subdir-name';
+ const subdir = await createDirectory(t, subdir_name, /*parent=*/ dir);
+
+ const file_name = 'file-name';
+ await createEmptyFile(t, file_name, /*parent=*/ subdir);
+
+ for (let i = 0; i < kPathSeparators.length; ++i) {
+ const path_with_separator =
+ `${subdir_name}${kPathSeparators[i]}${file_name}`;
+ await promise_rejects_js(
+ t, TypeError, dir.getFileHandle(path_with_separator),
+ `getFileHandle() must reject names containing "${kPathSeparators[i]}"`);
+ }
+}, 'getFileHandle(create=false) with a path separator when the file exists.');
+
+directory_test(async (t, dir) => {
+ const subdir_name = 'subdir-name';
+ const subdir = await createDirectory(t, subdir_name, /*parent=*/ dir);
+
+ for (let i = 0; i < kPathSeparators.length; ++i) {
+ const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`;
+ await promise_rejects_js(
+ t, TypeError, dir.getFileHandle(path_with_separator, {create: true}),
+ `getFileHandle(create=true) must reject names containing "${
+ kPathSeparators[i]}"`);
+ }
+}, 'getFileHandle(create=true) with a path separator');
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-removeEntry.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-removeEntry.js
index ffd24a5eb7b..5b25ed6874f 100644
--- a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-removeEntry.js
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemDirectoryHandle-removeEntry.js
@@ -18,7 +18,7 @@ directory_test(async (t, root) => {
}, 'removeEntry() on an already removed file should fail');
directory_test(async (t, root) => {
- const dir = await root.getDirectory('dir-to-remove', {create: true});
+ const dir = await root.getDirectoryHandle('dir-to-remove', {create: true});
await createFileWithContents(t, 'file-to-keep', 'abc', root);
await root.removeEntry('dir-to-remove');
@@ -27,7 +27,7 @@ directory_test(async (t, root) => {
}, 'removeEntry() to remove an empty directory');
directory_test(async (t, root) => {
- const dir = await root.getDirectory('dir-to-remove', {create: true});
+ const dir = await root.getDirectoryHandle('dir-to-remove', {create: true});
t.add_cleanup(() => root.removeEntry('dir-to-remove', {recursive: true}));
await createEmptyFile(t, 'file-in-dir', dir);
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js
index 516894bcf95..c49f0f62848 100644
--- a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream-write.js
@@ -295,7 +295,9 @@ directory_test(async (t, root) => {
directory_test(async (t, root) => {
const handle = await createEmptyFile(t, 'writer_written', root);
const stream = await handle.createWritable();
+ assert_false(stream.locked);
const writer = stream.getWriter();
+ assert_true(stream.locked);
await writer.write('foo');
await writer.write(new Blob(['bar']));
diff --git a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js
index 778437e2a59..1cebb993556 100644
--- a/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js
+++ b/tests/wpt/web-platform-tests/native-file-system/script-tests/FileSystemWritableFileStream.js
@@ -104,14 +104,20 @@ directory_test(async (t, root) => {
directory_test(async (t, root) => {
const handle = await createEmptyFile(t, 'contents', root);
const stream = await handle.createWritable();
+ assert_false(stream.locked);
stream.write('abc');
+ assert_false(stream.locked);
stream.write('def');
+ assert_false(stream.locked);
stream.truncate(9);
+ assert_false(stream.locked);
stream.seek(0);
+ assert_false(stream.locked);
stream.write('xyz');
+ assert_false(stream.locked);
await stream.close();
assert_equals(await getFileContents(handle), 'xyzdef\0\0\0');
assert_equals(await getFileSize(handle), 9);
-}, 'commands are queued');
+}, 'commands are queued, stream is unlocked after each operation');
diff --git a/tests/wpt/web-platform-tests/native-file-system/showDirectoryPicker-manual.https.html b/tests/wpt/web-platform-tests/native-file-system/showDirectoryPicker-manual.https.html
index b19287877f7..5dadbe1a9d5 100644
--- a/tests/wpt/web-platform-tests/native-file-system/showDirectoryPicker-manual.https.html
+++ b/tests/wpt/web-platform-tests/native-file-system/showDirectoryPicker-manual.https.html
@@ -22,8 +22,7 @@
const dir = await self.showDirectoryPicker();
assert_true(dir instanceof FileSystemHandle);
assert_true(dir instanceof FileSystemDirectoryHandle);
- assert_false(dir.isFile);
- assert_true(dir.isDirectory);
+ assert_equals(dir.kind, "directory");
assert_equals(dir.name, 'data');
assert_array_equals(await getSortedDirectoryEntries(dir), ['testfile.txt']);
diff --git a/tests/wpt/web-platform-tests/native-file-system/showOpenFilePicker-manual.https.html b/tests/wpt/web-platform-tests/native-file-system/showOpenFilePicker-manual.https.html
index b55157ad20f..2289b8f8d8b 100644
--- a/tests/wpt/web-platform-tests/native-file-system/showOpenFilePicker-manual.https.html
+++ b/tests/wpt/web-platform-tests/native-file-system/showOpenFilePicker-manual.https.html
@@ -29,8 +29,7 @@
assert_equals(files.length, 1);
assert_true(files[0] instanceof FileSystemHandle);
assert_true(files[0] instanceof FileSystemFileHandle);
- assert_true(files[0].isFile);
- assert_false(files[0].isDirectory);
+ assert_equals(files[0].kind, "file");
assert_equals(files[0].name, 'testfile.txt');
assert_equals(await (await files[0].getFile()).text(), 'Hello World!\n');
diff --git a/tests/wpt/web-platform-tests/native-file-system/showSaveFilePicker-manual.https.html b/tests/wpt/web-platform-tests/native-file-system/showSaveFilePicker-manual.https.html
index f8280d29ff5..022f67771d7 100644
--- a/tests/wpt/web-platform-tests/native-file-system/showSaveFilePicker-manual.https.html
+++ b/tests/wpt/web-platform-tests/native-file-system/showSaveFilePicker-manual.https.html
@@ -19,8 +19,7 @@
});
assert_true(file instanceof FileSystemHandle);
assert_true(file instanceof FileSystemFileHandle);
- assert_true(file.isFile);
- assert_false(file.isDirectory);
+ assert_equals(file.kind, "file");
assert_equals(file.name, 'testfile.txt');
assert_equals(await (await file.getFile()).text(), '',
'showSaveFilePicker should clear contents of file');
diff --git a/tests/wpt/web-platform-tests/native-io/close_async.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/close_async.tentative.https.any.js
index 6ad27ffb447..a2b692e2950 100644
--- a/tests/wpt/web-platform-tests/native-io/close_async.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-io/close_async.tentative.https.any.js
@@ -80,3 +80,18 @@ promise_test(async testCase => {
file.write(writtenBytes, 4));
assert_equals(await closePromise, undefined);
}, 'NativeIOFile.write fails immediately after calling NativeIOFile.close');
+
+promise_test(async testCase => {
+ const file = await createFile(testCase, 'file_name');
+ assert_equals(await file.close(), undefined);
+
+ await promise_rejects_dom(testCase, 'InvalidStateError', file.getLength());
+}, 'NativeIOFile.getLength fails after NativeIOFile.close settles');
+
+promise_test(async testCase => {
+ const file = await createFile(testCase, 'file_name');
+ const closePromise = file.close();
+
+ await promise_rejects_dom(testCase, 'InvalidStateError', file.getLength());
+ assert_equals(await closePromise, undefined);
+}, 'NativeIOFile.getLength fails immediately after calling NativeIOFile.close');
diff --git a/tests/wpt/web-platform-tests/native-io/close_sync.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/close_sync.tentative.https.any.js
index e4f5871a65e..b5fb2880919 100644
--- a/tests/wpt/web-platform-tests/native-io/close_sync.tentative.https.any.js
+++ b/tests/wpt/web-platform-tests/native-io/close_sync.tentative.https.any.js
@@ -25,7 +25,7 @@ test(testCase => {
assert_equals(undefined, file.close());
assert_equals(undefined, file.close());
-}, 'nativeIO.close is idempotent');
+}, 'NativeIOFileSync.close is idempotent');
test(testCase => {
const file = createFileSync(testCase, 'file_name');
@@ -33,7 +33,7 @@ test(testCase => {
const readBytes = new Uint8Array(4);
assert_throws_dom('InvalidStateError', () => file.read(readBytes, 4));
-}, 'nativeIO.read fails after nativeIO.close settles');
+}, 'NativeIOFileSync.read fails after NativeIOFileSync.close');
test(testCase => {
const file = createFileSync(testCase, 'file_name');
@@ -42,3 +42,10 @@ test(testCase => {
const writtenBytes = Uint8Array.from([96, 97, 98, 99]);
assert_throws_dom('InvalidStateError', () => file.write(writtenBytes, 4));
}, 'NativeIOFile.write fails after NativeIOFile.close');
+
+test(testCase => {
+ const file = createFileSync(testCase, 'file_name');
+ assert_equals(undefined, file.close());
+
+ assert_throws_dom('InvalidStateError', () => file.getLength());
+}, 'NativeIOFileSync.getLength fails after NativeIOFileSync.close');
diff --git a/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.js
new file mode 100644
index 00000000000..d542188738e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.js
@@ -0,0 +1,31 @@
+// META: title=NativeIO API: Concurrent IO while getLength is resolving.
+// META: global=window,worker
+// META: script=operation_helpers.js
+// META: script=../resources/support.js
+
+'use strict';
+
+// See documentation in operation_helpers.js
+
+for (let op of kOperations) {
+ promise_test(async testCase => {
+ const file = await createFile(testCase, 'getlength_file');
+
+ const res = op.prepare();
+
+ const getLengthPromise = file.getLength();
+ await op.assertRejection(testCase, file, res);
+
+ assert_equals(await getLengthPromise, 4);
+
+ const readSharedArrayBuffer = new SharedArrayBuffer(4);
+ const readBytes = new Uint8Array(readSharedArrayBuffer);
+ assert_equals(await file.read(readBytes, 0), 4,
+ `NativeIOFile.read() should not fail after a rejected ` +
+ `${op.name} during getLength()`);
+ assert_array_equals(readBytes, [64, 65, 66, 67],
+ `Rejecting ${op.name} during getLength() should not ` +
+ `change the file.`);
+ op.assertUnchanged(res);
+ }, `${op.name}() rejects while getLength() is resolving.`);
+};
diff --git a/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.js
new file mode 100644
index 00000000000..0cc4ad3e930
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.js
@@ -0,0 +1,33 @@
+// META: title=NativeIO API: Concurrent IO while read is resolving.
+// META: global=window,worker
+// META: script=operation_helpers.js
+// META: script=../resources/support.js
+
+'use strict';
+
+// See documentation in operation_helpers.js
+
+for (let op of kOperations) {
+ promise_test(async testCase => {
+ const file = await createFile(testCase, 'read_file');
+
+ const readSharedArrayBuffer = new SharedArrayBuffer(4);
+ const readBytes = new Uint8Array(readSharedArrayBuffer);
+ const res = op.prepare();
+
+ const readPromise = file.read(readBytes, 0);
+ await op.assertRejection(testCase, file, res);
+
+ assert_equals(await readPromise, 4);
+ assert_array_equals(readBytes, [64, 65, 66, 67]);
+
+ readBytes.fill(0);
+ assert_equals(await file.read(readBytes, 0), 4,
+ 'NativeIOFile.read() should not fail after a rejected ' +
+ `${op.name} during read()`);
+ assert_array_equals(readBytes, [64, 65, 66, 67],
+ `Rejecting ${op.name} during read() should not ` +
+ 'change the file.');
+ op.assertUnchanged(res);
+ }, `${op.name}() rejects while read() is resolving.`);
+};
diff --git a/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.js
new file mode 100644
index 00000000000..0deb7652ee7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.js
@@ -0,0 +1,34 @@
+// META: title=NativeIO API: Concurrent IO while write is resolving.
+// META: global=window,worker
+// META: script=operation_helpers.js
+// META: script=../resources/support.js
+
+'use strict';
+
+// See documentation in operation_helpers.js
+
+for (let op of kOperations) {
+ promise_test(async testCase => {
+ const file = await createFile(testCase, 'write_file');
+
+ const writeSharedArrayBuffer = new SharedArrayBuffer(4);
+ const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
+ writtenBytes.set([96, 97, 98, 99]);
+ const res = op.prepare();
+
+ const writePromise = file.write(writtenBytes, 0);
+ await op.assertRejection(testCase, file, res);
+
+ assert_equals(await writePromise, 4);
+
+ const readSharedArrayBuffer = new SharedArrayBuffer(4);
+ const readBytes = new Uint8Array(readSharedArrayBuffer);
+ assert_equals(await file.read(readBytes, 0), 4,
+ `NativeIOFile.read() should not fail after a rejected ` +
+ `${op.name} during write()`);
+ assert_array_equals(readBytes, writtenBytes,
+ `Rejecting ${op.name} during write() should still ` +
+ `complete the write.`);
+ op.assertUnchanged(res);
+ }, `${op.name}() rejects while write() is resolving.`);
+};
diff --git a/tests/wpt/web-platform-tests/native-io/concurrent_io/operation_helpers.js b/tests/wpt/web-platform-tests/native-io/concurrent_io/operation_helpers.js
new file mode 100644
index 00000000000..71cbc29efa0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-io/concurrent_io/operation_helpers.js
@@ -0,0 +1,67 @@
+// The concurrency tests assert that no pair of asynchronous I/O operations is
+// run concurrently. For any operation A, there is one file containing the tests
+// asserting that while A is running, any other operation B rejects. In order to
+// avoid constructing a quadratic number of tests, the rejecting operations are
+// abstracted here.
+//
+// For any rejecting operation B, define the following.
+// name: The operation's name
+// prepare: Code needed before performing the operation, e.g., buffer
+// allocation. Returns an object to be passed to assertRejection
+// and assertUnchanged. May be empty.
+// assertRejection: A promise_rejects_dom(...) statement that calls
+// operation B. Takes the object returned by prepare as
+// third parameter.
+// assertUnchanged: An assertion that rejecting the promise did not change
+// the buffers in unexpected ways. The assertion does not
+// check if the file itself was not changed. This will be
+// after performing operation A in its file. Takes the
+// object returned by prepare as parameter. May be empty.
+//
+// The array kOperations contains all abstractions.
+
+const kOperations = [];
+
+(() => {
+ const kOpRead = {
+ name: 'read',
+ prepare: () => {
+ const readSharedArrayBuffer = new SharedArrayBuffer(4);
+ const readBytes = new Uint8Array(readSharedArrayBuffer);
+ return readBytes;
+ },
+ assertRejection: (testCase, file, readBytes) => {
+ return promise_rejects_dom(testCase, 'InvalidStateError',
+ file.read(readBytes, 4));
+ },
+ assertUnchanged: (readBytes) => {
+ assert_array_equals(readBytes, [0, 0, 0, 0]);
+ },
+ };
+ kOperations.push(kOpRead);
+ const kOpWrite = {
+ name: 'write',
+ prepare: () => {
+ const writeSharedArrayBuffer = new SharedArrayBuffer(4);
+ const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
+ writtenBytes.set([96, 97, 98, 99]);
+ return writtenBytes;
+ },
+ assertRejection: (testCase, file, writtenBytes) => {
+ return promise_rejects_dom(testCase, 'InvalidStateError',
+ file.write(writtenBytes, 4));
+ },
+ assertUnchanged: () => {},
+ };
+ kOperations.push(kOpWrite);
+ const kOpGetLength = {
+ name: 'getLength',
+ prepare: () => {},
+ assertRejection: (testCase, file) => {
+ return promise_rejects_dom(testCase, 'InvalidStateError',
+ file.getLength());
+ },
+ assertUnchanged: () => {},
+ };
+ kOperations.push(kOpGetLength);
+})();
diff --git a/tests/wpt/web-platform-tests/native-io/concurrent_io_async.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/concurrent_io_async.tentative.https.any.js
deleted file mode 100644
index d7752004678..00000000000
--- a/tests/wpt/web-platform-tests/native-io/concurrent_io_async.tentative.https.any.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// META: title=NativeIO API: close().
-// META: global=window,worker
-
-'use strict';
-
-// Returns a handle to a newly created file that holds some data.
-//
-// The file will be closed and deleted when the test ends.
-async function createFile(testCase, fileName) {
- const file = await nativeIO.open(fileName);
- testCase.add_cleanup(async () => {
- await file.close();
- await nativeIO.delete(fileName);
- });
-
- const writeSharedArrayBuffer = new SharedArrayBuffer(4);
- const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
- writtenBytes.set([64, 65, 66, 67]);
- const writeCount = await file.write(writtenBytes, 0);
- assert_equals(writeCount, 4);
-
- return file;
-}
-
-promise_test(async testCase => {
- const file = await createFile(testCase, 'file_name');
-
- const readSharedArrayBuffer = new SharedArrayBuffer(4);
- const readBytes = new Uint8Array(readSharedArrayBuffer);
- const readSharedArrayBuffer2 = new SharedArrayBuffer(4);
- const readBytes2 = new Uint8Array(readSharedArrayBuffer2);
-
- const readPromise = file.read(readBytes, 0);
- await promise_rejects_dom(testCase, 'InvalidStateError',
- file.read(readBytes2, 4));
-
- assert_equals(await readPromise, 4);
- assert_array_equals(readBytes, [64, 65, 66, 67]);
- assert_array_equals(readBytes2, [0, 0, 0, 0]);
-}, 'read() rejects wrile read() is resolving');
-
-promise_test(async testCase => {
- const file = await createFile(testCase, 'file_name');
-
- const writeSharedArrayBuffer = new SharedArrayBuffer(4);
- const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
- writtenBytes.set([96, 97, 98, 99]);
- const readSharedArrayBuffer = new SharedArrayBuffer(4);
- const readBytes = new Uint8Array(readSharedArrayBuffer);
-
- const writePromise = file.write(writtenBytes, 0);
- await promise_rejects_dom(testCase, 'InvalidStateError',
- file.read(readBytes, 4));
-
- assert_equals(await writePromise, 4);
- assert_array_equals(readBytes, [0, 0, 0, 0]);
-}, 'read() rejects wrile write() is resolving');
-
-promise_test(async testCase => {
- const file = await createFile(testCase, 'file_name');
-
- const readSharedArrayBuffer = new SharedArrayBuffer(4);
- const readBytes = new Uint8Array(readSharedArrayBuffer);
- const writeSharedArrayBuffer = new SharedArrayBuffer(4);
- const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
- writtenBytes.set([96, 97, 98, 99]);
-
- const readPromise = file.read(readBytes, 0);
- await promise_rejects_dom(testCase, 'InvalidStateError',
- file.write(writtenBytes, 4));
-
- assert_equals(await readPromise, 4);
- assert_array_equals(readBytes, [64, 65, 66, 67]);
-
- readBytes.fill(0);
- assert_equals(await file.read(readBytes, 0), 4,
- 'NativeIOFile.read() should not fail after a rejected write');
- assert_array_equals(readBytes, [64, 65, 66, 67],
- 'The rejected write should not change the file');
-}, 'write() rejects wrile read() is resolving');
-
-promise_test(async testCase => {
- const file = await createFile(testCase, 'file_name');
-
- const writeSharedArrayBuffer = new SharedArrayBuffer(4);
- const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
- writtenBytes.set([96, 97, 98, 99]);
-
- const writeSharedArrayBuffer2 = new SharedArrayBuffer(4);
- const writtenBytes2 = new Uint8Array(writeSharedArrayBuffer2);
- writtenBytes2.set([48, 49, 50, 51]);
-
- const writePromise = file.write(writtenBytes, 0);
- await promise_rejects_dom(testCase, 'InvalidStateError',
- file.write(writtenBytes2, 4));
-
- assert_equals(await writePromise, 4);
-
- const readSharedArrayBuffer = new SharedArrayBuffer(4);
- const readBytes = new Uint8Array(readSharedArrayBuffer);
- assert_equals(await file.read(readBytes, 0), 4,
- 'NativeIOFile.read() should not fail after a rejected write');
- assert_array_equals(readBytes, writtenBytes,
- 'The rejected write should not change the file');
-}, 'write() rejects wrile write() is resolving');
diff --git a/tests/wpt/web-platform-tests/native-io/resources/support.js b/tests/wpt/web-platform-tests/native-io/resources/support.js
index adbfbc45d19..90bb9120bc5 100644
--- a/tests/wpt/web-platform-tests/native-io/resources/support.js
+++ b/tests/wpt/web-platform-tests/native-io/resources/support.js
@@ -5,3 +5,22 @@ const kBadNativeIoNames = [
"has.dot",
"has/slash",
];
+
+// Returns a handle to a newly created file that holds some data.
+//
+// The file will be closed and deleted when the test ends.
+async function createFile(testCase, fileName) {
+ const file = await nativeIO.open(fileName);
+ testCase.add_cleanup(async () => {
+ await file.close();
+ await nativeIO.delete(fileName);
+ });
+
+ const writeSharedArrayBuffer = new SharedArrayBuffer(4);
+ const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
+ writtenBytes.set([64, 65, 66, 67]);
+ const writeCount = await file.write(writtenBytes, 0);
+ assert_equals(writeCount, 4);
+
+ return file;
+}
diff --git a/tests/wpt/web-platform-tests/native-io/write_getLength_async_basic.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/write_getLength_async_basic.tentative.https.any.js
new file mode 100644
index 00000000000..bf886cca397
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-io/write_getLength_async_basic.tentative.https.any.js
@@ -0,0 +1,26 @@
+// META: title=Synchronous NativeIO API: getLength reports written bytes.
+// META: global=window,worker
+
+'use strict';
+
+promise_test(async testCase => {
+ const file = await nativeIO.open('test_file');
+ testCase.add_cleanup(async () => {
+ await file.close();
+ await nativeIO.delete('test_file');
+ });
+
+ const writeSharedArrayBuffer = new SharedArrayBuffer(4);
+ const writtenBytes = new Uint8Array(writeSharedArrayBuffer);
+ writtenBytes.set([64, 65, 66, 67]);
+ const writeCount = await file.write(writtenBytes, 0);
+ assert_equals(
+ writeCount, 4,
+ 'NativeIOFile.write() should resolve with the number of bytes written');
+
+ const length = await file.getLength();
+ assert_equals(length, 4,
+ 'NativeIOFile.getLength() should return the number of' +
+ ' bytes in the file');
+}, 'NativeIOFile.getLength returns number of bytes written by' +
+ 'NativeIOFile.write');
diff --git a/tests/wpt/web-platform-tests/native-io/write_getLength_sync_basic.tentative.https.any.js b/tests/wpt/web-platform-tests/native-io/write_getLength_sync_basic.tentative.https.any.js
new file mode 100644
index 00000000000..e0fead326a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/native-io/write_getLength_sync_basic.tentative.https.any.js
@@ -0,0 +1,25 @@
+// META: title=Synchronous NativeIO API: getLength reports written bytes.
+// META: global=dedicatedworker
+
+'use strict';
+
+test(testCase => {
+ const file = nativeIO.openSync('test_file');
+ testCase.add_cleanup(() => {
+ file.close();
+ nativeIO.deleteSync('test_file');
+ });
+
+ const writtenBytes = Uint8Array.from([64, 65, 66, 67]);
+ const writeCount = file.write(writtenBytes, 0);
+ assert_equals(
+ writeCount, 4,
+ 'NativeIOFileSync.write() should resolve with the number of bytes' +
+ 'written.');
+
+ const length = file.getLength();
+ assert_equals(length, 4,
+ 'NativeIOFileSync.getLength() should return the number of' +
+ ' bytes in the file.');
+}, 'NativeIOFileSync.getLength returns the number bytes written by' +
+ ' NativeIOFileSync.write');
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-ports-yes.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-ports-yes.sub.https.html
new file mode 100644
index 00000000000..dc449e22509
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-ports-yes.sub.https.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, navigate a frame from same-origin non-isolated to different-origin (different-port) isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][]}}");
+});
+
+// Nobody requested isolation yet.
+
+testSameAgentCluster([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, false, "before parent");
+testOriginIsolationRestricted(0, false, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][]}}:{{ports[https][1]}}", "?1");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Since the new page is different-origin, it should be isolated.
+
+testDifferentAgentClusters([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, false, "after parent");
+testOriginIsolationRestricted(0, true, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-subdomain-yes.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-subdomain-yes.sub.https.html
new file mode 100644
index 00000000000..6815aa97a65
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-same-no-2-subdomain-yes.sub.https.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, navigate a frame from same-origin non-isolated to different-origin (subdomain) isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][]}}");
+});
+
+// Nobody requested isolation yet.
+
+testSameAgentCluster([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, false, "before parent");
+testOriginIsolationRestricted(0, false, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][www]}}", "?1");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Since the new page is different-origin, it should be isolated.
+
+testDifferentAgentClusters([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, false, "after parent");
+testOriginIsolationRestricted(0, true, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain-yes.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain-yes.sub.https.html
new file mode 100644
index 00000000000..2887ea85f60
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain-yes.sub.https.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, navigate a frame from a subdomain non-isolated to the same subdomain isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testSameAgentCluster,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][www]}}");
+});
+
+// Nobody requested isolation yet.
+
+testSameAgentCluster([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, false, "before parent");
+testOriginIsolationRestricted(0, false, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][www]}}", "?1");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Because this subdomain was previously non-isolated, the second load's
+// isolation request is ignored; instead we continue isolating.
+
+testSameAgentCluster([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, false, "after parent");
+testOriginIsolationRestricted(0, false, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain2-yes.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain2-yes.sub.https.html
new file mode 100644
index 00000000000..cd01f969d4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-no-2-subdomain2-yes.sub.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, navigate a frame from a subdomain non-isolated to a second-subdomain isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][www]}}");
+});
+
+// Nobody requested isolation yet.
+
+testSameAgentCluster([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, false, "before parent");
+testOriginIsolationRestricted(0, false, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][www1]}}", "?1");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Because we're going to a different subdomain (and thus different origin), the
+// isolation request is respected.
+
+testDifferentAgentClusters([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, false, "after parent");
+testOriginIsolationRestricted(0, true, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain-no.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain-no.sub.https.html
new file mode 100644
index 00000000000..245a833192e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain-no.sub.https.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, navigate a frame from a subdomain isolated to the same subdomain non-isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][www]}}", "?1");
+});
+
+// Since they are different-origin, the child's isolation request is respected.
+
+testDifferentAgentClusters([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, false, "before parent");
+testOriginIsolationRestricted(0, true, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][www]}}");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Because this subdomain was previously isolated, the second load's
+// non-isolation request is ignored; instead we continue isolating.
+
+testDifferentAgentClusters([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, false, "after parent");
+testOriginIsolationRestricted(0, true, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html
new file mode 100644
index 00000000000..a4ee8e1f927
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, navigate a frame from a subdomain isolated to a second-subdomain non-isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][www]}}", "?1");
+});
+
+// Since they are different-origin, the child's isolation request is respected.
+
+testDifferentAgentClusters([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, false, "before parent");
+testOriginIsolationRestricted(0, true, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][www1]}}");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Make sure that the different-subdomain page (which doesn't request isolation)
+// doesn't somehow get isolated just because its predecessor was.
+
+testSameAgentCluster([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, false, "after parent");
+testOriginIsolationRestricted(0, false, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html
new file mode 100644
index 00000000000..9b554c3cecf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is isolated, navigate a frame from same-origin non-isolated to different-origin (different-port) isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][]}}");
+});
+
+// Since the parent is isolated, the same-origin child's non-request is ignored,
+// so it gets isolated too.
+
+testSameAgentCluster([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, true, "before parent");
+testOriginIsolationRestricted(0, true, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][]}}:{{ports[https][1]}}");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Since the new page is different-origin, its non-request should be respected.
+
+testDifferentAgentClusters([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, true, "after parent");
+testOriginIsolationRestricted(0, false, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html.headers b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html.headers
new file mode 100644
index 00000000000..ea3f6b335c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-ports-no.sub.https.html.headers
@@ -0,0 +1 @@
+Origin-Isolation: ?1
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html
new file mode 100644
index 00000000000..07a6b01d9f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is isolated, navigate a frame from same-origin non-isolated to different-origin (subdomain) isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ navigateIframe,
+ setBothDocumentDomains,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+let frame1;
+promise_setup(async () => {
+ frame1 = await insertIframe("{{hosts[][]}}");
+});
+
+// Since the parent is isolated, the same-origin child's non-request is ignored,
+// so it gets isolated too.
+
+testSameAgentCluster([self, 0], "Before: parent to child");
+testOriginIsolationRestricted(self, true, "before parent");
+testOriginIsolationRestricted(0, true, "before child");
+
+promise_test(async () => {
+ await navigateIframe(frame1, "{{hosts[][www]}}");
+ await setBothDocumentDomains(frames[0]);
+}, "Navigation");
+
+// Since the new page is different-origin, its non-request should be respected.
+
+testDifferentAgentClusters([self, 0], "After: parent to child");
+testOriginIsolationRestricted(self, true, "after parent");
+testOriginIsolationRestricted(0, false, "after child");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html.headers b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html.headers
new file mode 100644
index 00000000000..ea3f6b335c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/navigation-parent-yes-1-same-no-2-subdomain-no.sub.https.html.headers
@@ -0,0 +1 @@
+Origin-Isolation: ?1
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-no-child-yes-ports.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-no-child-yes-ports.sub.https.html
new file mode 100644
index 00000000000..e203d0c3c67
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-no-child-yes-ports.sub.https.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, child is isolated, child is different-origin to the parent because of a port mismatch</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testDifferentAgentClusters
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ await insertIframe("{{hosts[][]}}:{{ports[https][1]}}", "?1");
+});
+
+// Since they're different-origin, the child's isolation request is respected,
+// so the parent ends up in the site-keyed agent cluster and the child in the
+// origin-keyed one.
+
+testDifferentAgentClusters([self, 0]);
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-no-child2-yes-children-ports.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-no-child2-yes-children-ports.sub.https.html
new file mode 100644
index 00000000000..f5de8877f67
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-no-child2-yes-children-ports.sub.https.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, subdomain child 1 is not isolated, different-port-same-subdomain child 2 is isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ // Order of loading should not matter, but we make it sequential to ensure the
+ // tests are deterministic.
+ await insertIframe("{{hosts[][www]}}");
+ await insertIframe("{{hosts[][www]}}:{{ports[https][1]}}", "?1");
+});
+
+// Since everybody is different-origin, everyone's requests/non-requests get
+// respected.
+//
+// So, the parent and child 1 end up in the site-keyed agent cluster, and child
+// 2 ends up in its own origin-keyed agent cluster.
+testSameAgentCluster([self, 0], "Parent to child1");
+testDifferentAgentClusters([self, 1], "Parent to child2");
+testDifferentAgentClusters([0, 1], "child1 to child2");
+testDifferentAgentClusters([1, 0], "child2 to child1");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-yes-child2-no-not-subdomain.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-yes-child2-no-not-subdomain.sub.https.html
new file mode 100644
index 00000000000..7b7b2a2f191
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-no-child1-yes-child2-no-not-subdomain.sub.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is not isolated, subdomain child 1 is isolated, non-subdomain but different-port child 2 is not isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testSameAgentCluster,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ // Order of loading should not matter, but we make it sequential to ensure the
+ // tests are deterministic.
+ await insertIframe("{{hosts[][www]}}", "?1");
+ await insertIframe("{{hosts[][]}}:{{ports[https][1]}}");
+});
+
+// Everyone is different-origin, so everyone's request/non-request is
+// respected.
+//
+// So, the parent and child2 end up in the site-keyed agent cluster, and child1
+// ends up in an origin-keyed agent cluster.
+testDifferentAgentClusters([self, 0], "Parent to child1");
+testSameAgentCluster([self, 1], "Parent to child2");
+testDifferentAgentClusters([0, 1], "child1 to child2");
+testDifferentAgentClusters([1, 0], "child2 to child1");
+
+testOriginIsolationRestricted(self, false, "parent");
+testOriginIsolationRestricted(0, true, "child1");
+testOriginIsolationRestricted(1, false, "child2");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html
new file mode 100644
index 00000000000..a33dcd25ee3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is isolated, child is not isolated, child is is different-origin to the parent because of a port mismatch</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testDifferentAgentClusters
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ await insertIframe("{{hosts[][]}}:{{ports[https][1]}}");
+});
+
+// Since they're different-origin, the parent's isolation request is respected,
+// as is the child's non-request. So the parent ends up in the origin-keyed
+// agent cluster and the child ends up in the site-keyed one.
+testDifferentAgentClusters([self, 0]);
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html.headers b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html.headers
new file mode 100644
index 00000000000..ea3f6b335c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-no-ports.sub.https.html.headers
@@ -0,0 +1 @@
+Origin-Isolation: ?1
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html
new file mode 100644
index 00000000000..d20bd347a51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is isolated, child is not isolated, child is different-origin to the parent because of a port mismatch</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testDifferentAgentClusters
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ await insertIframe("{{hosts[][]}}:{{ports[https][1]}}", "?1");
+});
+
+// Both request isolation, so the parent ends up in one origin-keyed agent
+// cluster (the default port's origin), and the child ends up in a different
+// origin-keyed agent cluster (the other port's origin).
+testDifferentAgentClusters([self, 0]);
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html.headers b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html.headers
new file mode 100644
index 00000000000..ea3f6b335c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child-yes-ports.sub.https.html.headers
@@ -0,0 +1 @@
+Origin-Isolation: ?1
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html
new file mode 100644
index 00000000000..230162471cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is isolated, subdomain child 1 is not isolated, different-port-same-subdomain child 2 is isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testDifferentAgentClusters,
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ // Order of loading should not matter, but we make it sequential to ensure the
+ // tests are deterministic.
+ await insertIframe("{{hosts[][www]}}");
+ await insertIframe("{{hosts[][www]}}:{{ports[https][1]}}", "?1");
+});
+
+
+// Since everybody is different-origin, everyone's requests/non-requests get
+// respected.
+//
+// So, the parent ends up in its origin-keyed agent cluster, child 1 ends up in
+// the site-keyed agent cluster, and child 2 ends up in a different origin-keyed
+// agent cluster.
+testDifferentAgentClusters([self, 0], "Parent to child1");
+testDifferentAgentClusters([self, 1], "Parent to child2");
+testDifferentAgentClusters([0, 1], "child1 to child2");
+testDifferentAgentClusters([1, 0], "child2 to child1");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html.headers b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html.headers
new file mode 100644
index 00000000000..ea3f6b335c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-no-child2-yes-children-ports.sub.https.html.headers
@@ -0,0 +1 @@
+Origin-Isolation: ?1
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html
new file mode 100644
index 00000000000..784e100f617
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is isolated, subdomain child 1 is isolated, non-subdomain but different-port child 2 is not isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testDifferentAgentClusters,
+ testOriginIsolationRestricted
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ // Order of loading should not matter, but we make it sequential to ensure the
+ // tests are deterministic.
+ await insertIframe("{{hosts[][www]}}", "?1");
+ await insertIframe("{{hosts[][]}}:{{ports[https][1]}}");
+});
+
+// Everyone is different-origin, so everyone's request/non-request is
+// respected.
+//
+// So, child2 ends up in the site-keyed agent cluster, and the parent and child1
+// end up in two separate origin-keyed agent clusters.
+testDifferentAgentClusters([self, 0], "Parent to child1");
+testDifferentAgentClusters([self, 1], "Parent to child2");
+testDifferentAgentClusters([0, 1], "child1 to child2");
+testDifferentAgentClusters([1, 0], "child2 to child1");
+
+testOriginIsolationRestricted(self, true, "parent");
+testOriginIsolationRestricted(0, true, "child1");
+testOriginIsolationRestricted(1, false, "child2");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html.headers b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html.headers
new file mode 100644
index 00000000000..ea3f6b335c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-no-not-subdomain.sub.https.html.headers
@@ -0,0 +1 @@
+Origin-Isolation: ?1
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html
new file mode 100644
index 00000000000..bf8731663be
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Parent is isolated, subdomain child 1 is isolated, different-port-same-subdomain child 2 is isolated</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<script type="module">
+import {
+ insertIframe,
+ testDifferentAgentClusters,
+} from "./resources/helpers.mjs";
+
+promise_setup(async () => {
+ // Order of loading should not matter, but we make it sequential to ensure the
+ // tests are deterministic.
+ await insertIframe("{{hosts[][www]}}", "?1");
+ await insertIframe("{{hosts[][www]}}:{{ports[https][1]}}", "?1");
+});
+
+
+// Since everybody is different-origin, everyone's requests get
+// respected.
+//
+// So, the parent ends up in its origin-keyed agent cluster, child 1 ends up in
+// a second origin-keyed agent cluster, and child 2 ends up in a third
+// origin-keyed agent cluster.
+testDifferentAgentClusters([self, 0], "Parent to child1");
+testDifferentAgentClusters([self, 1], "Parent to child2");
+testDifferentAgentClusters([0, 1], "child1 to child2");
+testDifferentAgentClusters([1, 0], "child2 to child1");
+</script>
diff --git a/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html.headers b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html.headers
new file mode 100644
index 00000000000..ea3f6b335c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/origin-isolation/parent-yes-child1-yes-child2-yes-children-ports.sub.https.html.headers
@@ -0,0 +1 @@
+Origin-Isolation: ?1
diff --git a/tests/wpt/web-platform-tests/origin-isolation/resources/helpers.mjs b/tests/wpt/web-platform-tests/origin-isolation/resources/helpers.mjs
index 50ca1ab4874..e8425c240b5 100644
--- a/tests/wpt/web-platform-tests/origin-isolation/resources/helpers.mjs
+++ b/tests/wpt/web-platform-tests/origin-isolation/resources/helpers.mjs
@@ -2,15 +2,15 @@
* Inserts an iframe usable for origin isolation testing, and returns a promise
* fulfilled when the iframe is loaded and its document.domain is set. The
* iframe will point to the send-origin-isolation-header.py file, on the
- * designated hostname
- * @param {string} hostname - The hostname used to calculate the iframe's src=""
+ * designated host
+ * @param {string} host - The host used to calculate the iframe's src=""
* @param {string=} header - The value of the Origin-Isolation header that the
* iframe will set. Omit this to set no header.
* @returns {HTMLIFrameElement} The created iframe element
*/
-export async function insertIframe(hostname, header) {
+export async function insertIframe(host, header) {
const iframe = document.createElement("iframe");
- const navigatePromise = navigateIframe(iframe, hostname, header);
+ const navigatePromise = navigateIframe(iframe, host, header);
document.body.append(iframe);
await navigatePromise;
await setBothDocumentDomains(iframe.contentWindow);
@@ -21,15 +21,14 @@ export async function insertIframe(hostname, header) {
* Navigates an iframe to a page for origin isolation testing, similar to
* insertIframe but operating on an existing iframe.
* @param {HTMLIFrameElement} iframeEl - The <iframe> element to navigate
- * @param {string} hostname - The hostname used to calculate the iframe's new
- * src=""
+ * @param {string} host - The host to calculate the iframe's new src=""
* @param {string=} header - The value of the Origin-Isolation header that the
* newly-navigated-to page will set. Omit this to set no header.
* @returns {Promise} a promise fulfilled when the load event fires, or rejected
* if the error event fires
*/
-export function navigateIframe(iframeEl, hostname, header) {
- const url = getIframeURL(hostname, header);
+export function navigateIframe(iframeEl, host, header) {
+ const url = getIframeURL(host, header);
const waitPromise = waitForIframe(iframeEl, url);
iframeEl.src = url;
@@ -230,9 +229,9 @@ async function getOriginIsolationRestricted(frameWindow) {
return waitForMessage(frameWindow);
}
-function getIframeURL(hostname, header) {
+function getIframeURL(host, header) {
const url = new URL("send-origin-isolation-header.py", import.meta.url);
- url.hostname = hostname;
+ url.host = host;
if (header !== undefined) {
url.searchParams.set("header", header);
}
diff --git a/tests/wpt/web-platform-tests/paint-timing/basetest.html b/tests/wpt/web-platform-tests/paint-timing/basetest.html
index 1c875984598..759dfaa97a5 100644
--- a/tests/wpt/web-platform-tests/paint-timing/basetest.html
+++ b/tests/wpt/web-platform-tests/paint-timing/basetest.html
@@ -8,6 +8,7 @@
<div id="main"></div>
<script>
+setup({"hide_test_state": true});
async_test(function(t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
t.step(function() {
diff --git a/tests/wpt/web-platform-tests/paint-timing/border-image.html b/tests/wpt/web-platform-tests/paint-timing/border-image.html
index 63687481767..4614fecd210 100644
--- a/tests/wpt/web-platform-tests/paint-timing/border-image.html
+++ b/tests/wpt/web-platform-tests/paint-timing/border-image.html
@@ -14,6 +14,7 @@
</style>
<div id='bordered'></div>
<script>
+setup({"hide_test_state": true});
promise_test(async t => {
const onload = new Promise(r => window.addEventListener('load', r));
await onload;
diff --git a/tests/wpt/web-platform-tests/paint-timing/buffered-flag.window.js b/tests/wpt/web-platform-tests/paint-timing/buffered-flag.window.js
index b3a6a6374c7..0b7c8bea2e4 100644
--- a/tests/wpt/web-platform-tests/paint-timing/buffered-flag.window.js
+++ b/tests/wpt/web-platform-tests/paint-timing/buffered-flag.window.js
@@ -1,3 +1,4 @@
+setup({"hide_test_state": true});
async_test(t => {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
// First observer creates second in callback to ensure the entry has been dispatched by the time
diff --git a/tests/wpt/web-platform-tests/paint-timing/child-painting-first-image.html b/tests/wpt/web-platform-tests/paint-timing/child-painting-first-image.html
index a7ed2c6f101..38cf499ccaf 100644
--- a/tests/wpt/web-platform-tests/paint-timing/child-painting-first-image.html
+++ b/tests/wpt/web-platform-tests/paint-timing/child-painting-first-image.html
@@ -4,6 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
window.addEventListener('message', t.step_func(e => {
diff --git a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-canvas-context.html b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-canvas-context.html
index 077c1aa3ddc..726e4516ee7 100644
--- a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-canvas-context.html
+++ b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-canvas-context.html
@@ -8,6 +8,7 @@
<script src="/resources/testharnessreport.js"></script>
<canvas id="canvas" width="50" height="50"></canvas>
<script>
+ setup({"hide_test_state": true});
promise_test(async t => {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
await new Promise(r => window.addEventListener('load', r));
diff --git a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-gradient.html b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-gradient.html
index b9f86d8dd73..c1e147472ff 100644
--- a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-gradient.html
+++ b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-gradient.html
@@ -15,6 +15,7 @@
<script src="../resources/utils.js"></script>
<div id="main"></div>
<script>
+ setup({"hide_test_state": true});
promise_test(async t => {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
await new Promise(r => window.addEventListener('load', r));
diff --git a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-text-input.html b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-text-input.html
index 0b7e568359f..e50449abbe9 100644
--- a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-text-input.html
+++ b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-text-input.html
@@ -8,6 +8,7 @@
<script src="/resources/testharnessreport.js"></script>
<input id="input" type="text" />
<script>
+ setup({"hide_test_state": true});
promise_test(async t => {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
await new Promise(r => window.addEventListener('load', r));
diff --git a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-frame.html b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-frame.html
index 9089883cdfb..c54648f0010 100644
--- a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-frame.html
+++ b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-frame.html
@@ -9,6 +9,7 @@
<script src="/common/media.js"></script>
<video id="video" autoplay></video>
<script>
+ setup({"hide_test_state": true});
promise_test(async t => {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
await new Promise(r => window.addEventListener('load', r));
diff --git a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-poster.html b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-poster.html
index eb9b1399b52..e7eeee3f12f 100644
--- a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-poster.html
+++ b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-video-poster.html
@@ -8,6 +8,7 @@
<script src="/resources/testharnessreport.js"></script>
<video id="video" width="50" height="50"></video>
<script>
+ setup({"hide_test_state": true});
promise_test(async t => {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
await new Promise(r => window.addEventListener('load', r));
diff --git a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-with-rtl.html b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-with-rtl.html
index e9fc2857832..5541fcbc723 100644
--- a/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-with-rtl.html
+++ b/tests/wpt/web-platform-tests/paint-timing/fcp-only/fcp-with-rtl.html
@@ -18,6 +18,7 @@
<script src="/resources/testharnessreport.js"></script>
<div id="text">TEXT</div>
<script>
+ setup({"hide_test_state": true});
promise_test(async t => {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
await new Promise(r => window.addEventListener('load', r));
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html
index 3da3d2553ee..00224b33ec9 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html
@@ -10,6 +10,7 @@
<footer>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
const body = document.getElementsByTagName('body')[0];
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html
index 667591cfe36..e6a4365b760 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html
@@ -8,6 +8,7 @@
<canvas id="canvas" width="200" height="200" ></canvas>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
const canvas = document.getElementById("canvas");
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html
index 5c29bfe070f..18abfe731d6 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html
@@ -8,6 +8,7 @@
<div id="image"></div>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
const img = document.createElement("IMG");
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html
index de2ac035232..a93f1b73263 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html
@@ -9,6 +9,7 @@
<div id="image"></div>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
const bufferedEntries = performance.getEntriesByType('paint');
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html
index 9909ec659ef..c68e72c0106 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html
@@ -8,6 +8,7 @@
<div id="svg"></div>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
const img = document.createElement("IMG");
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-image-child.html b/tests/wpt/web-platform-tests/paint-timing/first-image-child.html
index 9b48ff89056..d707d437b61 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-image-child.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-image-child.html
@@ -9,6 +9,7 @@
<iframe src='resources/subframe-sending-paint.html' id='child-iframe'></iframe>
<img src='resources/circles.png'/>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html b/tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html
index 21271da4cef..a4f799045f1 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html
@@ -10,6 +10,7 @@
<footer>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
document.body.style.backgroundColor = "#AA0000";
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-paint-only.html b/tests/wpt/web-platform-tests/paint-timing/first-paint-only.html
index 99f41f97b17..473b1aa121d 100644
--- a/tests/wpt/web-platform-tests/paint-timing/first-paint-only.html
+++ b/tests/wpt/web-platform-tests/paint-timing/first-paint-only.html
@@ -8,6 +8,7 @@
<div id="main"></div>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
const div = document.createElement("div");
diff --git a/tests/wpt/web-platform-tests/paint-timing/input-text.html b/tests/wpt/web-platform-tests/paint-timing/input-text.html
index e55c8d2d474..da1e0e83767 100644
--- a/tests/wpt/web-platform-tests/paint-timing/input-text.html
+++ b/tests/wpt/web-platform-tests/paint-timing/input-text.html
@@ -7,6 +7,7 @@
<input type="text" id='myInput'>
</form>
<script>
+setup({"hide_test_state": true});
promise_test(async t => {
const onload = new Promise(r => window.addEventListener('load', r));
await onload;
diff --git a/tests/wpt/web-platform-tests/paint-timing/mask-image.html b/tests/wpt/web-platform-tests/paint-timing/mask-image.html
index 35a6213f6ff..d022f43039f 100644
--- a/tests/wpt/web-platform-tests/paint-timing/mask-image.html
+++ b/tests/wpt/web-platform-tests/paint-timing/mask-image.html
@@ -13,6 +13,7 @@
</style>
<div id='masked'></div>
<script>
+setup({"hide_test_state": true});
promise_test(async t => {
const onload = new Promise(r => window.addEventListener('load', r));
await onload;
diff --git a/tests/wpt/web-platform-tests/paint-timing/paint-visited.html b/tests/wpt/web-platform-tests/paint-timing/paint-visited.html
index d611197b288..c02ea240525 100644
--- a/tests/wpt/web-platform-tests/paint-timing/paint-visited.html
+++ b/tests/wpt/web-platform-tests/paint-timing/paint-visited.html
@@ -20,6 +20,7 @@ window.onload = function() {
history.replaceState({}, "", "./");
history.replaceState({}, "", current_url);
}
+setup({"hide_test_state": true});
async_test(function(t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
function testPaintEntries() {
diff --git a/tests/wpt/web-platform-tests/paint-timing/replaced-content-image.html b/tests/wpt/web-platform-tests/paint-timing/replaced-content-image.html
index 244833ffdd0..b3199aa0f6d 100644
--- a/tests/wpt/web-platform-tests/paint-timing/replaced-content-image.html
+++ b/tests/wpt/web-platform-tests/paint-timing/replaced-content-image.html
@@ -10,6 +10,7 @@
</style>
<img></img>
<script>
+setup({"hide_test_state": true});
promise_test(async t => {
const onload = new Promise(r => window.addEventListener('load', r));
await onload;
diff --git a/tests/wpt/web-platform-tests/paint-timing/resources/utils.js b/tests/wpt/web-platform-tests/paint-timing/resources/utils.js
index 2ee0e3d0626..975e84dadd4 100644
--- a/tests/wpt/web-platform-tests/paint-timing/resources/utils.js
+++ b/tests/wpt/web-platform-tests/paint-timing/resources/utils.js
@@ -33,6 +33,7 @@ async function assertFirstContentfulPaint(t) {
}
async function test_fcp(label) {
+ setup({"hide_test_state": true});
const style = document.createElement('style');
document.head.appendChild(style);
await promise_test(async t => {
diff --git a/tests/wpt/web-platform-tests/paint-timing/sibling-painting-first-image.html b/tests/wpt/web-platform-tests/paint-timing/sibling-painting-first-image.html
index d8fec53047f..266d5d7af32 100644
--- a/tests/wpt/web-platform-tests/paint-timing/sibling-painting-first-image.html
+++ b/tests/wpt/web-platform-tests/paint-timing/sibling-painting-first-image.html
@@ -5,6 +5,7 @@
<!-- This iframe will have a sibling that paints, we want to ensure it does not detect that paint. -->
<iframe id="listening-iframe" src="resources/subframe-sending-paint.html"></iframe>
<script>
+setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
let paintingIframeHasDispatchedEntries = false;
diff --git a/tests/wpt/web-platform-tests/picture-in-picture/idlharness.window.js b/tests/wpt/web-platform-tests/picture-in-picture/idlharness.window.js
index c74894a45f4..89775884788 100644
--- a/tests/wpt/web-platform-tests/picture-in-picture/idlharness.window.js
+++ b/tests/wpt/web-platform-tests/picture-in-picture/idlharness.window.js
@@ -19,6 +19,7 @@ idl_test(
DocumentOrShadowRoot: ['document'],
HTMLVideoElement: ['video'],
PictureInPictureWindow: ['pipw'],
+ PictureInPictureEvent: ['new PictureInPictureEvent("type", { pictureInPictureWindow: pipw })'],
});
self.video = await loadVideo();
diff --git a/tests/wpt/web-platform-tests/portals/portal-activate-default.html b/tests/wpt/web-platform-tests/portals/portal-activate-default.html
new file mode 100644
index 00000000000..b1a8feb1f4d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/portals/portal-activate-default.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/open-blank-host.js"></script>
+<script>
+promise_test(async t => {
+ assert_implements("HTMLPortalElement" in self);
+ const w = await openBlankPortalHost();
+ try {
+ const bc = new BroadcastChannel('click-activate');
+ const portal = w.document.createElement('portal');
+ portal.src = new URL(`resources/portal-activate-broadcastchannel.html?bc=${bc.name}`, location.href);
+ w.document.body.appendChild(portal);
+ await new Promise(resolve => portal.onload = resolve);
+ let activated = new Promise(resolve => bc.onmessage = e => resolve(e.data));
+ portal.click();
+ let {event, data} = await activated;
+ assert_equals(event, 'portalactivate');
+ assert_equals(data, undefined);
+ } finally {
+ w.close();
+ }
+}, "Clicking should activate with undefined data.");
+
+promise_test(async t => {
+ assert_implements("HTMLPortalElement" in self);
+ const w = await openBlankPortalHost();
+ try {
+ const bc = new BroadcastChannel('prevent-no-activate');
+ const portal = w.document.createElement('portal');
+ portal.src = new URL(`resources/portal-activate-broadcastchannel.html?bc=${bc.name}`, location.href);
+ portal.onclick = e => e.preventDefault();
+ w.document.body.appendChild(portal);
+ await new Promise(resolve => portal.onload = resolve);
+ bc.onmessage = t.unreached_func('activation should not occur');
+ portal.click();
+ await new Promise(resolve => t.step_timeout(resolve, 3000));
+ } finally {
+ w.close();
+ }
+}, "Clicking shouldn't activate if prevented.");
+
+// Script didn't create the promise so it shouldn't observe one.
+// This forecloses a naive implementation of this behavior that simply calls the WebIDL operation.
+promise_test(async t => {
+ assert_implements("HTMLPortalElement" in self);
+ const w = await openBlankPortalHost();
+ try {
+ const portal = w.document.createElement('portal');
+ w.onunhandledrejection = t.unreached_func('unhandledrejection event should not fire');
+ portal.click();
+ await new Promise(resolve => t.step_timeout(resolve, 3000));
+ } finally {
+ w.close();
+ }
+}, "Failed activation should not surface as an unhandled promise rejection.");
+</script>
diff --git a/tests/wpt/web-platform-tests/portals/portals-focus.sub.html b/tests/wpt/web-platform-tests/portals/portals-focus.sub.html
index ccbac7db906..168e74aa9c8 100644
--- a/tests/wpt/web-platform-tests/portals/portals-focus.sub.html
+++ b/tests/wpt/web-platform-tests/portals/portals-focus.sub.html
@@ -121,7 +121,9 @@
try {
portal.focus();
for (let key of [SPACE, RETURN]) {
- let clickPromise = new Promise(r => portal.onclick = r);
+ let clickPromise = new Promise((resolve) => {
+ portal.onclick = e => { e.preventDefault(); resolve(); };
+ });
await test_driver.send_keys(document.body, key);
await clickPromise;
}
diff --git a/tests/wpt/web-platform-tests/portals/resources/portal-activate-broadcastchannel.html b/tests/wpt/web-platform-tests/portals/resources/portal-activate-broadcastchannel.html
new file mode 100644
index 00000000000..b922afaec26
--- /dev/null
+++ b/tests/wpt/web-platform-tests/portals/resources/portal-activate-broadcastchannel.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<script>
+onportalactivate = e => {
+ let bc = new BroadcastChannel(new URL(location).searchParams.get('bc'));
+ bc.postMessage({event: 'portalactivate', data: e.data});
+ bc.close();
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/resize-observer/svg.html b/tests/wpt/web-platform-tests/resize-observer/svg.html
index b05a10c82e8..8a6def18964 100644
--- a/tests/wpt/web-platform-tests/resize-observer/svg.html
+++ b/tests/wpt/web-platform-tests/resize-observer/svg.html
@@ -398,7 +398,7 @@ function test12() {
function test13() {
let target = document.querySelector('rect');
let helper = new ResizeTestHelper(
- "test13: observe svg:circle border box",
+ "test13: observe svg:rect border box",
[
{
setup: observer => {
@@ -508,7 +508,6 @@ function test16() {
document.body.style.zoom = 0.1;
},
notify: (entries, observer) => {
- // Ensure zoom does not impact the sizes
assert_equals(entries.length, 1);
assert_equals(entries[0].contentRect.width, 50);
assert_equals(entries[0].contentRect.height, 20);
@@ -516,8 +515,26 @@ function test16() {
assert_equals(entries[0].contentBoxSize[0].blockSize, 20);
assert_equals(entries[0].borderBoxSize[0].inlineSize, 50);
assert_equals(entries[0].borderBoxSize[0].blockSize, 20);
- assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 50);
- assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 20);
+ assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 5);
+ assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 2);
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ observer.observe(target, {box: "device-pixel-content-box"});
+ target.setAttribute('height', 30);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 50);
+ assert_equals(entries[0].contentRect.height, 30);
+ assert_equals(entries[0].contentBoxSize[0].inlineSize, 50);
+ assert_equals(entries[0].contentBoxSize[0].blockSize, 30);
+ assert_equals(entries[0].borderBoxSize[0].inlineSize, 50);
+ assert_equals(entries[0].borderBoxSize[0].blockSize, 30);
+ assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 5);
+ assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 3);
return true; // Delay next step
}
},
@@ -526,11 +543,16 @@ function test16() {
document.body.style.zoom = 10;
},
notify: (entries, observer) => {
-
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 50);
+ assert_equals(entries[0].contentRect.height, 30);
+ assert_equals(entries[0].contentBoxSize[0].inlineSize, 50);
+ assert_equals(entries[0].contentBoxSize[0].blockSize, 30);
+ assert_equals(entries[0].borderBoxSize[0].inlineSize, 50);
+ assert_equals(entries[0].borderBoxSize[0].blockSize, 30);
+ assert_equals(entries[0].devicePixelContentBoxSize[0].inlineSize, 500);
+ assert_equals(entries[0].devicePixelContentBoxSize[0].blockSize, 300);
},
- timeout: () => {
- // SVG computed size is always bounding box inline and block lengths
- }
}
]);
return helper.start();
diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
index 7854b4f85ff..3ecb18e5556 100644
--- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
+++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js
@@ -3,14 +3,13 @@
// This polyfill library implements the WebXR Test API as specified here:
// https://github.com/immersive-web/webxr-test-api
-// The standingTransform is floor_from_mojo and represented as such here.
-const default_standing = new gfx.mojom.Transform();
-default_standing.matrix = [1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 1.65, 0, 1];
+const defaultMojoFromFloor = new gfx.mojom.Transform();
+defaultMojoFromFloor.matrix = [1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, -1.65, 0, 1];
const default_stage_parameters = {
- standingTransform: default_standing,
+ mojoFromFloor: defaultMojoFromFloor,
bounds: null
};
@@ -267,6 +266,10 @@ class FakeXRAnchorController {
return this.dirty_;
}
+ get paused() {
+ return this.paused_;
+ }
+
markProcessed() {
this.dirty_ = false;
}
@@ -490,12 +493,11 @@ class MockRuntime {
this.stageParameters_.bounds = this.bounds_;
}
- this.stageParameters_.standingTransform = new gfx.mojom.Transform();
+ this.stageParameters_.mojoFromFloor = new gfx.mojom.Transform();
- // floorOrigin is passed in as mojoFromFloor; however, standingTransform is
- // floorFromMojo so we need to invert the result of |getMatrixFromTransform|
- this.stageParameters_.standingTransform.matrix =
- XRMathHelper.inverse(getMatrixFromTransform(floorOrigin));
+ // floorOrigin is passed in as mojoFromFloor.
+ this.stageParameters_.mojoFromFloor.matrix =
+ getMatrixFromTransform(floorOrigin);
this.onStageParametersUpdated();
}
@@ -982,7 +984,7 @@ class MockRuntime {
const anchorData = new device.mojom.XRAnchorData();
anchorData.id = id;
if(!controller.paused) {
- anchorData.pose = XRMathHelper.decomposeRigidTransform(
+ anchorData.mojoFromAnchor = XRMathHelper.decomposeRigidTransform(
controller.getAnchorOrigin());
}
@@ -1261,12 +1263,11 @@ class MockRuntime {
case device.mojom.XRReferenceSpaceType.kLocal:
return XRMathHelper.identity();
case device.mojom.XRReferenceSpaceType.kLocalFloor:
- if (this.stageParameters_ == null || this.stageParameters_.standingTransform == null) {
+ if (this.stageParameters_ == null || this.stageParameters_.mojoFromFloor == null) {
console.warn("Standing transform not available.");
return null;
}
- // this.stageParameters_.standingTransform = floor_from_mojo aka native_origin_from_mojo
- return XRMathHelper.inverse(this.stageParameters_.standingTransform.matrix);
+ return this.stageParameters_.mojoFromFloor.matrix;
case device.mojom.XRReferenceSpaceType.kViewer:
return mojo_from_viewer;
case device.mojom.XRReferenceSpaceType.kBoundedFlor:
diff --git a/tests/wpt/web-platform-tests/resources/test-only-api.js b/tests/wpt/web-platform-tests/resources/test-only-api.js
new file mode 100644
index 00000000000..53891d21bd4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test-only-api.js
@@ -0,0 +1,68 @@
+'use strict';
+
+/* Whether the browser is Chromium-based with MojoJS enabled */
+const isChromiumBased = 'MojoInterfaceInterceptor' in self;
+/* Whether the browser is WebKit-based with internal test-only API enabled */
+const isWebKitBased = !isChromiumBased && 'internals' in self;
+
+/**
+ * Loads a script in a window or worker.
+ *
+ * @param {string} path - A script path
+ * @returns {Promise}
+ */
+function loadScript(path) {
+ if (typeof document === 'undefined') {
+ // Workers (importScripts is synchronous and may throw.)
+ importScripts(path);
+ return Promise.resolve();
+ } else {
+ // Window
+ const script = document.createElement('script');
+ script.src = path;
+ script.async = false;
+ const p = new Promise((resolve, reject) => {
+ script.onload = () => { resolve(); };
+ script.onerror = e => { reject(e); };
+ })
+ document.head.appendChild(script);
+ return p;
+ }
+}
+
+/**
+ * A helper for Chromium-based browsers to load Mojo JS bindingds
+ *
+ * This is an async function that works in both workers and windows. It first
+ * loads mojo_bindings.js, disables automatic dependency loading, and loads all
+ * resources sequentially. The promise resolves if everything loads
+ * successfully, or rejects if any exception is raised. If testharness.js is
+ * used, an uncaught exception will terminate the test with a harness error
+ * (unless `allow_uncaught_exception` is true), which is usually the desired
+ * behaviour. Only call this function if isChromiumBased === true.
+ *
+ * @param {Array.<string>} resources - A list of scripts to load: Mojo JS
+ * bindings should be of the form '/gen/../*.mojom.js', the ordering of which
+ * does not matter. Do not include mojo_bindings.js in this list. You may
+ * include other non-mojom.js scripts for convenience.
+ * @returns {Promise}
+ */
+async function loadMojoResources(resources) {
+ if (!isChromiumBased) {
+ throw new Error('MojoJS not enabled; start Chrome with --enable-blink-features=MojoJS,MojoJSTest');
+ }
+ if (resources.length == 0) {
+ return;
+ }
+
+ // We want to load mojo_bindings.js separately to set mojo.config.
+ if (resources.some(p => p.endsWith('/mojo_bindings.js'))) {
+ throw new Error('Do not load mojo_bindings.js explicitly.');
+ }
+ await loadScript('/gen/layout_test_data/mojo/public/js/mojo_bindings.js');
+ mojo.config.autoLoadMojomDeps = false;
+
+ for (const path of resources) {
+ await loadScript(path);
+ }
+}
diff --git a/tests/wpt/web-platform-tests/resources/test-only-api.js.headers b/tests/wpt/web-platform-tests/resources/test-only-api.js.headers
new file mode 100644
index 00000000000..5e8f640c665
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test-only-api.js.headers
@@ -0,0 +1,2 @@
+Content-Type: text/javascript; charset=utf-8
+Cache-Control: max-age=3600
diff --git a/tests/wpt/web-platform-tests/resources/testharness.js b/tests/wpt/web-platform-tests/resources/testharness.js
index 7e2d4600f0f..274dc9d7d89 100644
--- a/tests/wpt/web-platform-tests/resources/testharness.js
+++ b/tests/wpt/web-platform-tests/resources/testharness.js
@@ -2609,6 +2609,7 @@ policies and contribution forms [3].
this.test_done_callbacks = [];
this.all_done_callbacks = [];
+ this.hide_test_state = false;
this.pending_remotes = [];
this.status = new TestsStatus();
@@ -2656,6 +2657,8 @@ policies and contribution forms [3].
if (this.timeout_length) {
this.timeout_length *= this.timeout_multiplier;
}
+ } else if (p == "hide_test_state") {
+ this.hide_test_state = value;
}
}
}
@@ -3162,7 +3165,7 @@ policies and contribution forms [3].
this.phase = this.HAVE_RESULTS;
}
var done_count = tests.tests.length - tests.num_pending;
- if (this.output_node) {
+ if (this.output_node && !tests.hide_test_state) {
if (done_count < 100 ||
(done_count < 1000 && done_count % 100 === 0) ||
done_count % 1000 === 0) {
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-before-phase.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-before-phase.html
new file mode 100644
index 00000000000..878f9def212
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-before-phase.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#phase-algorithm">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #contents {
+ height: 200px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ #element {
+ width: 0px;
+ }
+ /* Ensure stable expectations if feature is not supported */
+ @supports not (animation-timeline:foo) {
+ #element { animation-play-state: paused; }
+ }
+</style>
+<div id=scroller>
+ <div id=contents></div>
+</div>
+<div id=container></div>
+<script>
+ promise_test(async (t) => {
+ try {
+ // Make sure scroller has a layout box.
+ await waitForNextFrame();
+
+ container.innerHTML = `
+ <div id=element></div>
+ <style>
+ @scroll-timeline timeline {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 50px;
+ end: 100px;
+ }
+ #element {
+ animation: expand 10s linear;
+ animation-timeline: timeline;
+ }
+ </style>
+ `;
+ // Animation should not apply in before phase.
+ assert_equals(getComputedStyle(element).width, '0px');
+ await waitForNextFrame();
+ // Animation should still not apply.
+ assert_equals(getComputedStyle(element).width, '0px');
+ } finally {
+ container.innerHTML = '';
+ }
+ }, 'Animation does not apply when timeline phase is before');
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-cascade.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-cascade.html
new file mode 100644
index 00000000000..7103491c0d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-cascade.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #contents {
+ height: 200px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ @scroll-timeline timeline {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline {
+ source: selector(#scroller);
+ time-range: 1s;
+ start: 0px;
+ end: 50px;
+ }
+ #element {
+ animation: expand 10s linear;
+ animation-timeline: timeline;
+ }
+ /* Ensure stable expectations if feature is not supported */
+ @supports not (animation-timeline:foo) {
+ #element { animation-play-state: paused; }
+ }
+</style>
+<div id=scroller>
+ <div id=contents></div>
+</div>
+<div id=element></div>
+<script>
+ promise_test(async (t) => {
+ scroller.scrollTop = 25;
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element).width, '105px');
+ }, 'Latest @scroll-timeline rule wins');
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-inactive-phase.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-inactive-phase.html
new file mode 100644
index 00000000000..a8db8e63238
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-inactive-phase.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#phase-algorithm">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#avoiding-cycles">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #contents {
+ height: 200px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ #element {
+ width: 0px;
+ animation: expand 10s linear paused;
+ animation-timeline: timeline;
+ }
+</style>
+<div id="container"></div>
+<div id=element></div>
+<script>
+
+promise_test(async (t) => {
+ try {
+ container.innerHTML = `
+ <div id=scroller>
+ <div id=contents></div>
+ </div>
+ <style>
+ @scroll-timeline timeline {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ </style>
+ `;
+
+ // The source has no layout box at the time the scroll timeline is created.
+ assert_equals(getComputedStyle(element).width, '0px');
+ scroller.offsetTop; // Ensure a layout box for the scroller.
+ // Wait for an update to the timeline state:
+ await waitForNextFrame();
+ // The timeline should now be active, and the animation should apply:
+ assert_equals(getComputedStyle(element).width, '100px');
+ } finally {
+ container.innerHTML = '';
+ }
+}, 'Animation does not apply when timeline is initially inactive');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-orientation.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-orientation.html
new file mode 100644
index 00000000000..2c76f7a1117
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-orientation.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#descdef-scroll-timeline-orientation">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #contents {
+ height: 300px;
+ width: 300px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ @scroll-timeline timeline_auto {
+ source: selector(#scroller);
+ orientation: auto;
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_vertical {
+ source: selector(#scroller);
+ orientation: vertical;
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_horizontal {
+ source: selector(#scroller);
+ orientation: horizontal;
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_block {
+ source: selector(#scroller);
+ orientation: block;
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_inline {
+ source: selector(#scroller);
+ orientation: inline;
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ #container > div {
+ width: 0px;
+ animation: expand 10s linear;
+ }
+ /* Ensure stable expectations if feature is not supported */
+ @supports not (animation-timeline:foo) {
+ #container > div { animation-play-state: paused; }
+ }
+ .horizontal { writing-mode: horizontal-tb; }
+ .vertical { writing-mode: vertical-lr; }
+ #element_auto { animation-timeline: timeline_auto; }
+ #element_vertical { animation-timeline: timeline_vertical; }
+ #element_horizontal { animation-timeline: timeline_horizontal; }
+ #element_block_in_horizontal { animation-timeline: timeline_block; }
+ #element_inline_in_horizontal { animation-timeline: timeline_inline; }
+ #element_block_in_vertical { animation-timeline: timeline_block; }
+ #element_inline_in_vertical { animation-timeline: timeline_inline; }
+</style>
+<div id=scroller>
+ <div id=contents></div>
+</div>
+<div id=container>
+ <div id=element_auto></div>
+ <div id=element_vertical></div>
+ <div id=element_horizontal></div>
+ <div id=element_block_in_horizontal class="horizontal"></div>
+ <div id=element_inline_in_horizontal class="horizontal"></div>
+ <div id=element_block_in_vertical class="vertical"></div>
+ <div id=element_inline_in_vertical class="vertical"></div>
+</div>
+<script>
+ // Animations linked to a vertical scroll-timelines are at 75% progress.
+ scroller.scrollTop = 75;
+ // Animations linked to a horizontal scroll-timelines are at 25% progress.
+ scroller.scrollLeft = 25;
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_auto).width, '175px');
+ }, 'Orientation auto behaves as expected');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_vertical).width, '175px');
+ }, 'Orientation vertical behaves as expected');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_horizontal).width, '125px');
+ }, 'Orientation horizontal behaves as expected');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_block_in_horizontal).width, '175px');
+ }, 'Orientation block behaves as expected in horizontal writing-mode');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_inline_in_horizontal).width, '125px');
+ }, 'Orientation inline behaves as expected in horizontal writing-mode');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_block_in_vertical).writingMode, 'vertical-lr');
+ assert_equals(getComputedStyle(element_block_in_vertical).width, '125px');
+ }, 'Orientation block behaves as expected in vertical writing-mode');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_inline_in_vertical).writingMode, 'vertical-lr');
+ assert_equals(getComputedStyle(element_inline_in_vertical).width, '175px');
+ }, 'Orientation inline behaves as expected in vertical writing-mode');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-sampling.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-sampling.html
new file mode 100644
index 00000000000..474364f38fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-sampling.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#avoiding-cycles">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #contents {
+ height: 200px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ @scroll-timeline timeline {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ #element {
+ width: 0px;
+ animation: expand 10s linear;
+ animation-timeline: timeline;
+ }
+ /* Ensure stable expectations if feature is not supported */
+ @supports not (animation-timeline:foo) {
+ #element { animation-play-state: paused; }
+ }
+</style>
+<div id=scroller>
+ <div id=contents></div>
+</div>
+<div id=element></div>
+<script>
+ promise_test(async (t) => {
+ // The scroll timeline is initially inactive until the first frame.
+ assert_equals(getComputedStyle(element).width, '0px');
+ await waitForNextFrame();
+ scroller.scrollTop = 50;
+ // Scrolling position should not yet be reflected in the animation,
+ // since the new scroll position has not yet been sampled.
+ assert_equals(getComputedStyle(element).width, '100px');
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element).width, '150px');
+ }, 'Scroll position is sampled once per frame');
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-source.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-source.html
new file mode 100644
index 00000000000..f2c50a1cd38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-source.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#descdef-scroll-timeline-source">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ :root {
+ height: 100vh;
+ overflow: scroll;
+ }
+ body {
+ height: 200vh;
+ }
+ .scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #boxless {
+ display: none;
+ }
+ .contents {
+ height: 300px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ @scroll-timeline timeline_source_none {
+ source: none;
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_source_auto {
+ source: auto;
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_source_selector {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_source_unspecified {
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_source_nonexistent_id {
+ source: selector(#doesnotexist);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_source_no_layout_box {
+ source: selector(#boxless);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ #container > div {
+ width: 0px;
+ animation: expand 10s linear;
+ }
+ /* Ensure stable expectations if feature is not supported */
+ @supports not (animation-timeline:foo) {
+ #container > div { animation-play-state: paused; }
+ }
+ #element_source_none { animation-timeline: timeline_source_none; }
+ #element_source_auto { animation-timeline: timeline_source_auto; }
+ #element_source_unspecified { animation-timeline: timeline_source_unspecified; }
+ #element_source_selector { animation-timeline: timeline_source_selector; }
+ #element_source_nonexistent_id { animation-timeline: timeline_source_nonexistent_id; }
+ #element_source_no_layout_box { animation-timeline: timeline_source_no_layout_box; }
+</style>
+<body>
+ <div class=scroller id=scroller>
+ <div class=contents></div>
+ </div>
+ <div class=scroller id=boxless>
+ <div class=contents></div>
+ </div>
+ <div id=container>
+ <div id=element_source_none></div>
+ <div id=element_source_auto></div>
+ <div id=element_source_unspecified></div>
+ <div id=element_source_selector></div>
+ <div id=element_source_nonexistent_id></div>
+ <div id=element_source_no_layout_box></div>
+ </div>
+ <script>
+ // Set progress of animations linked to #scroller to 75%.
+ scroller.scrollTop = 75;
+ // Set progress of animations linked to document.scrollingElement to 25%.
+ document.scrollingElement.scrollTop = 25;
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_source_none).width, '0px');
+ }, 'Source none causes inactive timeline');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_source_auto).width, '125px');
+ }, 'Source auto selects scrollingElement of the document');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_source_unspecified).width, '125px');
+ }, 'Unspecified source behaves like auto');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_source_selector).width, '175px');
+ }, 'Source selector(<id-selector>) selects an element');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_source_nonexistent_id).width, '0px');
+ }, 'Unknown source causes inactive timeline');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_source_no_layout_box).width, '0px');
+ }, 'Source with no layout box causes inactive timeline');
+
+ // TODO(https://github.com/w3c/csswg-drafts/issues/5289): Add tests for
+ // sources that change when behavior is clarified.
+
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-start-end.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-start-end.html
new file mode 100644
index 00000000000..fbe53d0fc0c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-start-end.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-offset-section">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #contents {
+ height: 300px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ @scroll-timeline timeline_0px_100px {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_50px_100px {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 50px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_auto_auto {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: auto;
+ end: auto;
+ }
+ @scroll-timeline timeline_50px_auto {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 50px;
+ end: auto;
+ }
+ @scroll-timeline timeline_auto_100px {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: auto;
+ end: 100px;
+ }
+ @scroll-timeline timeline_25p_75p {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 25%;
+ end: 75%;
+ }
+ @scroll-timeline timeline_calc_calc {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: calc(25% + 10px);
+ end: calc(75% + 10px);
+ }
+ #container > div {
+ width: 0px;
+ animation: expand 10s linear;
+ }
+ /* Ensure stable expectations if feature is not supported */
+ @supports not (animation-timeline:foo) {
+ #container > div { animation-play-state: paused; }
+ }
+ #element_0px_100px { animation-timeline: timeline_0px_100px; }
+ #element_50px_100px { animation-timeline: timeline_50px_100px; }
+ #element_auto_auto { animation-timeline: timeline_auto_auto; }
+ #element_50px_auto { animation-timeline: timeline_50px_auto; }
+ #element_auto_100px { animation-timeline: timeline_auto_100px; }
+ #element_25p_75p { animation-timeline: timeline_25p_75p; }
+ #element_calc_calc { animation-timeline: timeline_calc_calc; }
+</style>
+<div id=scroller>
+ <div id=contents></div>
+</div>
+<div id=container>
+ <div id=element_0px_100px></div>
+ <div id=element_50px_100px></div>
+ <div id=element_auto_auto></div>
+ <div id=element_50px_auto></div>
+ <div id=element_auto_100px></div>
+ <div id=element_25p_75p></div>
+ <div id=element_calc_calc></div>
+</div>
+<script>
+
+ // Scrolls top to 'offset', waits for a frame, then call the provided
+ // assertions function.
+ function test_scroll(element, offset, assertions, description) {
+ promise_test(async (t) => {
+ scroller.scrollTop = offset;
+ await waitForNextFrame();
+ assertions();
+ }, `${description} [${element.id}]`);
+ }
+
+ // Tests that the computed value of 'width' on element is the expected value
+ // after scrolling top to the specifed offset.
+ function test_width_at_scroll_top(element, offset, expected) {
+ test_scroll(element, offset, () => {
+ assert_equals(getComputedStyle(element).width, expected);
+ }, `Scroll at offset ${offset} updates animation correctly`);
+ }
+
+ // Tests that the computed value of 'width' on element is (approximately)
+ // the expected value after scrolling top to the offset specified by
+ // 'fraction'. The 'fraction' parameter is either a number which maps [0, 1]
+ // to the full scroll range, or a function which accepts the maximum scroll,
+ // and returns a specific offset.
+ function test_approximate_width_at_fraction(element, fraction, expected) {
+ const max = scroller.scrollHeight - scroller.clientHeight;
+ const offsetFunction = (typeof fraction == 'function') ? fraction : () => max * fraction;
+ const resolvedOffset = Math.floor(offsetFunction(max));
+ test_scroll(element, resolvedOffset, () => {
+ assert_approx_equals(parseInt(getComputedStyle(element).width), parseInt(expected), 5);
+ }, `Scroll at offset ${resolvedOffset} updates animation correctly`);
+ }
+
+ // [0px, 100px]
+ test_width_at_scroll_top(element_0px_100px, 0, '100px');
+ test_width_at_scroll_top(element_0px_100px, 1, '101px');
+ test_width_at_scroll_top(element_0px_100px, 50, '150px');
+ test_width_at_scroll_top(element_0px_100px, 99, '199px');
+ test_width_at_scroll_top(element_0px_100px, 100, '0px');
+ test_width_at_scroll_top(element_0px_100px, 101, '0px');
+
+ // [50px, 100px]
+ test_width_at_scroll_top(element_50px_100px, 0, '0px');
+ test_width_at_scroll_top(element_50px_100px, 1, '0px');
+ test_width_at_scroll_top(element_50px_100px, 49, '0px');
+ test_width_at_scroll_top(element_50px_100px, 50, '100px');
+ test_width_at_scroll_top(element_50px_100px, 51, '102px');
+ test_width_at_scroll_top(element_50px_100px, 99, '198px');
+ test_width_at_scroll_top(element_50px_100px, 100, '0px');
+ test_width_at_scroll_top(element_50px_100px, 101, '0px');
+
+ // [auto, auto]
+ test_approximate_width_at_fraction(element_auto_auto, 0, '100px');
+ test_approximate_width_at_fraction(element_auto_auto, 0.1, '110px');
+ test_approximate_width_at_fraction(element_auto_auto, 0.5, '150px');
+ test_approximate_width_at_fraction(element_auto_auto, 0.9, '190px');
+
+ // TODO: Effects for scroll linked animations are not inclusive at max scroll
+ // https://github.com/w3c/csswg-drafts/issues/5223
+ test_approximate_width_at_fraction(element_auto_auto, 1, '0px');
+
+ // [50px, auto]
+ {
+ let offset = (t) => (max => 50 * (1 - t) + max * t);
+ test_width_at_scroll_top(element_50px_auto, 0, '0px');
+ test_width_at_scroll_top(element_50px_auto, 49, '0px');
+ test_width_at_scroll_top(element_50px_auto, 50, '100px');
+ test_approximate_width_at_fraction(element_50px_auto, offset(0.5), '150px');
+ test_approximate_width_at_fraction(element_50px_auto, offset(0.9), '190px');
+ test_approximate_width_at_fraction(element_50px_auto, 1, '0px');
+ }
+
+ // [auto, 100px]
+ test_width_at_scroll_top(element_auto_100px, 0, '100px');
+ test_width_at_scroll_top(element_auto_100px, 1, '101px');
+ test_width_at_scroll_top(element_auto_100px, 50, '150px');
+ test_width_at_scroll_top(element_auto_100px, 99, '199px');
+ test_width_at_scroll_top(element_auto_100px, 100, '0px');
+
+ // [25%, 75%]
+ test_approximate_width_at_fraction(element_25p_75p, 0, '0px');
+ test_approximate_width_at_fraction(element_25p_75p, 0.1, '0px');
+ test_approximate_width_at_fraction(element_25p_75p, 0.2, '0px');
+ test_approximate_width_at_fraction(element_25p_75p, 0.35, '120px');
+ test_approximate_width_at_fraction(element_25p_75p, 0.55, '160px');
+ test_approximate_width_at_fraction(element_25p_75p, 0.8, '0px');
+ test_approximate_width_at_fraction(element_25p_75p, 1, '0px');
+
+ // [calc(25% + 10px), calc(75% + 10px)]
+ {
+ let offset = (t) => (max => (max * 0.25 + 10) * (1 - t) + (max * 0.75 + 10) * t);
+ test_approximate_width_at_fraction(element_calc_calc, offset(0), '0px');
+ test_approximate_width_at_fraction(element_calc_calc, offset(0.5), '150px');
+ test_approximate_width_at_fraction(element_calc_calc, offset(1.1), '0px');
+ }
+
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-time-range.html b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-time-range.html
new file mode 100644
index 00000000000..407e17f0748
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/at-scroll-timeline-time-range.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#scroll-timeline-at-rule">
+<link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#descdef-scroll-timeline-time-range">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<style>
+ #scroller {
+ overflow: scroll;
+ width: 100px;
+ height: 100px;
+ }
+ #contents {
+ height: 200px;
+ }
+ @keyframes expand {
+ from { width: 100px; }
+ to { width: 200px; }
+ }
+ @scroll-timeline timeline_10s {
+ source: selector(#scroller);
+ time-range: 10s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_1s {
+ source: selector(#scroller);
+ time-range: 1s;
+ start: 0px;
+ end: 100px;
+ }
+ @scroll-timeline timeline_1000ms {
+ source: selector(#scroller);
+ time-range: 1000ms;
+ start: 0px;
+ end: 100px;
+ }
+ #container > div {
+ width: 0px;
+ animation: expand 10s linear;
+ }
+ /* Ensure stable expectations if feature is not supported */
+ @supports not (animation-timeline:foo) {
+ #container > div { animation-play-state: paused; }
+ }
+ #element_10s { animation-timeline: timeline_10s; }
+ #element_1s { animation-timeline: timeline_1s; }
+ #element_1000ms { animation-timeline: timeline_1000ms; }
+</style>
+<div id=scroller>
+ <div id=contents></div>
+</div>
+<div id=container>
+ <div id=element_10s></div>
+ <div id=element_1s></div>
+ <div id=element_1000ms></div>
+</div>
+<script>
+ scroller.scrollTop = 50;
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_10s).width, '150px');
+ }, 'Timerange mapped correctly (10s)');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_1s).width, '105px');
+ }, 'Timerange mapped correctly (1s)');
+
+ promise_test(async (t) => {
+ await waitForNextFrame();
+ assert_equals(getComputedStyle(element_1s).width, '105px');
+ }, 'Timerange mapped correctly (1000ms)');
+</script>
diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-cssom.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-cssom.tentative.html
index 36fcbf704bd..09ec90a0449 100644
--- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-cssom.tentative.html
+++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-cssom.tentative.html
@@ -112,6 +112,7 @@ test_source(' selector(#foo) ', 'selector(#foo)');
test_source('none');
test_source(' none ', 'none');
test_source('selector(#a\\9 b)');
+test_source('auto');
test_source('#foo', 'none');
test_source('', 'none');
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py
index 9e376bc0928..ab7b84e3e34 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-get.py
@@ -1,6 +1,6 @@
def main(req, res):
return ([
- ('Cache-Control', 'no-cache, must-revalidate'),
- ('Pragma', 'no-cache'),
- ('Content-Type', 'application/javascript')],
- '%s = "%s";\n' % (req.GET['output'], req.GET['msg']))
+ (b'Cache-Control', b'no-cache, must-revalidate'),
+ (b'Pragma', b'no-cache'),
+ (b'Content-Type', b'application/javascript')],
+ b'%s = "%s";\n' % (req.GET[b'output'], req.GET[b'msg']))
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-version.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-version.py
index 91caa1a41ed..cde28544e60 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-version.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-version.py
@@ -11,7 +11,7 @@ def main(req, res):
now = (datetime.datetime.now() - epoch).total_seconds()
return ([
- ('Cache-Control', 'no-cache, must-revalidate'),
- ('Pragma', 'no-cache'),
- ('Content-Type', 'application/javascript')],
- 'version = "%s";\n' % now)
+ (b'Cache-Control', b'no-cache, must-revalidate'),
+ (b'Pragma', b'no-cache'),
+ (b'Content-Type', b'application/javascript')],
+ u'version = "%s";\n' % now)
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding-with-flush.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding-with-flush.py
index c91250a9d1f..22a696508f4 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding-with-flush.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding-with-flush.py
@@ -1,11 +1,11 @@
import time
def main(request, response):
- response.headers.set("Content-Type", "application/javascript")
- response.headers.set("Transfer-encoding", "chunked")
+ response.headers.set(b"Content-Type", b"application/javascript")
+ response.headers.set(b"Transfer-encoding", b"chunked")
response.write_status_headers()
time.sleep(1)
response.explicit_flush = True
- response.writer.write("XX\r\n\r\n")
+ response.writer.write(b"XX\r\n\r\n")
response.writer.flush()
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding.py
index ae2c1f21b2e..a8edd06b8dc 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/invalid-chunked-encoding.py
@@ -1,2 +1,2 @@
def main(request, response):
- return [("Content-Type", "application/javascript"), ("Transfer-encoding", "chunked")], "XX\r\n\r\n"
+ return [(b"Content-Type", b"application/javascript"), (b"Transfer-encoding", b"chunked")], b"XX\r\n\r\n"
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/malformed-worker.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/malformed-worker.py
index 501521ff3e3..562c44eddc1 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/malformed-worker.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/malformed-worker.py
@@ -1,10 +1,10 @@
def main(request, response):
- headers = [("Content-Type", "application/javascript")]
+ headers = [(b"Content-Type", b"application/javascript")]
- body = {'parse-error': 'var foo = function() {;',
- 'undefined-error': 'foo.bar = 42;',
- 'uncaught-exception': 'throw new DOMException("AbortError");',
- 'caught-exception': 'try { throw new Error; } catch(e) {}',
- 'import-malformed-script': 'importScripts("malformed-worker.py?parse-error");',
- 'import-no-such-script': 'importScripts("no-such-script.js");'}[request.url_parts.query]
+ body = {u'parse-error': u'var foo = function() {;',
+ u'undefined-error': u'foo.bar = 42;',
+ u'uncaught-exception': u'throw new DOMException("AbortError");',
+ u'caught-exception': u'try { throw new Error; } catch(e) {}',
+ u'import-malformed-script': u'importScripts("malformed-worker.py?parse-error");',
+ u'import-no-such-script': u'importScripts("no-such-script.js");'}[request.url_parts.query]
return headers, body
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-type-worker.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-type-worker.py
index a16684de5cb..92a602e634c 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-type-worker.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-type-worker.py
@@ -1,4 +1,4 @@
def main(request, response):
- if 'mime' in request.GET:
- return [('Content-Type', request.GET['mime'])], ""
- return [], ""
+ if b'mime' in request.GET:
+ return [(b'Content-Type', request.GET[b'mime'])], b""
+ return [], b""
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mint-new-worker.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mint-new-worker.py
index cbe70304d89..ebee4ff8e8d 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mint-new-worker.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mint-new-worker.py
@@ -1,6 +1,8 @@
+import random
+
import time
-body = '''
+body = u'''
onactivate = (e) => e.waitUntil(clients.claim());
var resolve_wait_until;
var wait_until = new Promise(resolve => {
@@ -14,12 +16,12 @@ onmessage = (e) => {
};'''
def main(request, response):
- headers = [('Cache-Control', 'no-cache, must-revalidate'),
- ('Pragma', 'no-cache'),
- ('Content-Type', 'application/javascript')]
+ headers = [(b'Cache-Control', b'no-cache, must-revalidate'),
+ (b'Pragma', b'no-cache'),
+ (b'Content-Type', b'application/javascript')]
- skipWaiting = ''
- if 'skip-waiting' in request.GET:
- skipWaiting = 'skipWaiting();'
+ skipWaiting = u''
+ if b'skip-waiting' in request.GET:
+ skipWaiting = u'skipWaiting();'
- return headers, '/* %s %s */ %s %s' % (time.time(), time.clock(), skipWaiting, body)
+ return headers, u'/* %s %s */ %s %s' % (time.time(), random.random(), skipWaiting, body)
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/multipart-image.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/multipart-image.py
index f94ee1c64fd..9a3c035f492 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/multipart-image.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/multipart-image.py
@@ -3,21 +3,21 @@
import os
-BOUNDARY = 'cutHere'
+BOUNDARY = b'cutHere'
def create_part(path):
- with open(path, 'rb') as f:
- return 'Content-Type: image/png\r\n\r\n' + f.read() + '--%s' % BOUNDARY
+ with open(path, u'rb') as f:
+ return b'Content-Type: image/png\r\n\r\n' + f.read() + b'--%s' % BOUNDARY
def main(request, response):
- content_type = 'multipart/x-mixed-replace; boundary=%s' % BOUNDARY
- headers = [('Content-Type', content_type)]
- if 'approvecors' in request.GET:
- headers.append(('Access-Control-Allow-Origin', '*'))
-
- image_path = os.path.join(request.doc_root, 'images')
- body = create_part(os.path.join(image_path, 'red.png'))
- body = body + create_part(os.path.join(image_path, 'red-16x16.png'))
+ content_type = b'multipart/x-mixed-replace; boundary=%s' % BOUNDARY
+ headers = [(b'Content-Type', content_type)]
+ if b'approvecors' in request.GET:
+ headers.append((b'Access-Control-Allow-Origin', b'*'))
+
+ image_path = os.path.join(request.doc_root, u'images')
+ body = create_part(os.path.join(image_path, u'red.png'))
+ body = body + create_part(os.path.join(image_path, u'red-16x16.png'))
return headers, body
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-body.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-body.py
index 601f818cff6..d10329e7836 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-body.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-body.py
@@ -1,9 +1,11 @@
import os
-filename = os.path.basename(__file__)
+from wptserve.utils import isomorphic_encode
+
+filename = os.path.basename(isomorphic_encode(__file__))
def main(request, response):
- if request.method == 'POST':
- return 302, [('Location', './%s?redirect' % filename)], ''
+ if request.method == u'POST':
+ return 302, [(b'Location', b'./%s?redirect' % filename)], b''
- return [('Content-Type', 'text/plain')], request.request_path
+ return [(b'Content-Type', b'text/plain')], request.request_path
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py
index 16850723f96..9b90b146955 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py
@@ -1,14 +1,14 @@
def main(request, response):
- if "url" in request.GET:
- headers = [("Location", request.GET["url"])]
- return 302, headers, ''
+ if b"url" in request.GET:
+ headers = [(b"Location", request.GET[b"url"])]
+ return 302, headers, b''
status = 200
- if "noLocationRedirect" in request.GET:
+ if b"noLocationRedirect" in request.GET:
status = 302
- return status, [("content-type", "text/html")], '''
+ return status, [(b"content-type", b"text/html")], b'''
<!DOCTYPE html>
<script>
onmessage = event => {
diff --git a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html
index 33997b09ab7..1e1ac7a0561 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html
+++ b/tests/wpt/web-platform-tests/shadow-dom/declarative/declarative-shadow-dom-attachment.tentative.html
@@ -38,6 +38,7 @@ function testElementType(allowed, nochildren, elementType, mode, delegatesFocus)
// TODO(masonfreed): Add a check for ElementInternals.shadowRoot once that exists.
assert_true(!!element.shadowRoot, 'Shadow root should be present');
assert_equals(element.shadowRoot.innerHTML, shadowContent, 'Correct shadow content');
+ assert_equals(element.shadowRoot.delegatesFocus,delegatesFocus,'Correct delegatesFocus')
originalShadowRoot = element.shadowRoot;
}
diff --git a/tests/wpt/web-platform-tests/shadow-dom/declarative/getinnerhtml.tentative.html b/tests/wpt/web-platform-tests/shadow-dom/declarative/getinnerhtml.tentative.html
index a1ac08ee1ba..2f8ecad418b 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/declarative/getinnerhtml.tentative.html
+++ b/tests/wpt/web-platform-tests/shadow-dom/declarative/getinnerhtml.tentative.html
@@ -20,7 +20,8 @@ function testElementType(allowsShadowDom, elementType, mode, delegatesFocus) {
const isOpen = mode === 'open';
if (allowsShadowDom) {
- const correctShadowHtml = `<template shadowroot="${mode}"><slot></slot></template>`;
+ const delegatesAttr = delegatesFocus ? ' shadowrootdelegatesfocus=""' : '';
+ const correctShadowHtml = `<template shadowroot="${mode}"${delegatesAttr}><slot></slot></template>`;
const correctHtml = `<${elementType}>${correctShadowHtml}</${elementType}>`;
const shadowRoot = element.attachShadow({mode: mode, delegatesFocus: delegatesFocus});
shadowRoot.appendChild(document.createElement('slot'));
diff --git a/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html-ref.html b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html-ref.html
new file mode 100644
index 00000000000..91ccd6165ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; background: lime; mix-blend-mode: difference"></div> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html.html b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html.html
new file mode 100644
index 00000000000..df9f64824b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-html.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>foreignObject should create an isolated group for html descendants</title>
+<meta name="assert" content="ForeignObject creates a stacking context which is an isolated group, so mix-blend-mode should not be affected by content outside the isolated group." />
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#render-EstablishingStackingContex" />
+<link rel="help" href="https://drafts.fxtf.org/compositing-2/#csscompositingrules_CSS" />
+<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org" />
+<link rel="match" href="isolation-with-html-ref.html" />
+<svg xmlns="http://www.w3.org/2000/svg" width="200px" height="200px">
+ <rect x="0" y="0" width="200" height="200" style="fill: yellow" />
+ <foreignObject width="200" height="200">
+ <div style="width: 200px; height: 200px; background: lime; mix-blend-mode: difference"></div>
+ </foreignObject>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg-ref.html b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg-ref.html
new file mode 100644
index 00000000000..91ccd6165ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style="width: 200px; height: 200px; background: lime; mix-blend-mode: difference"></div> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg.html b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg.html
new file mode 100644
index 00000000000..df5b37c8a69
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/extensibility/foreignObject/isolation-with-svg.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>foreignObject should create an isolated group for svg descendants</title>
+<meta name="assert" content="ForeignObject creates a stacking context which is an isolated group, so mix-blend-mode should not be affected by content outside the isolated group." />
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#render-EstablishingStackingContex" />
+<link rel="help" href="https://drafts.fxtf.org/compositing-2/#csscompositingrules_CSS" />
+<link rel="author" title="Philip Rogers" href="mailto:pdr@chromium.org" />
+<link rel="match" href="isolation-with-svg-ref.html" />
+<svg xmlns="http://www.w3.org/2000/svg" width="200px" height="200px">
+ <rect x="0" y="0" width="200" height="200" style="fill: yellow" />
+ <foreignObject width="200" height="200">
+ <svg xmlns="http://www.w3.org/2000/svg" width="200px" height="200px">
+ <rect x="0" y="0" width="200" height="200" style="fill: lime; mix-blend-mode: difference" />
+ </svg>
+ </foreignObject>
+</svg>
diff --git a/tests/wpt/web-platform-tests/tools/.coveragerc b/tests/wpt/web-platform-tests/tools/.coveragerc
index 26452caf458..3da14ad3b73 100644
--- a/tests/wpt/web-platform-tests/tools/.coveragerc
+++ b/tests/wpt/web-platform-tests/tools/.coveragerc
@@ -13,6 +13,7 @@ omit =
wpt/*
wptrunner/*
*/tests/*
+ quic/*
[paths]
html5lib =
diff --git a/tests/wpt/web-platform-tests/tools/ci/commands.json b/tests/wpt/web-platform-tests/tools/ci/commands.json
index c9cd7c45898..929d2c09145 100644
--- a/tests/wpt/web-platform-tests/tools/ci/commands.json
+++ b/tests/wpt/web-platform-tests/tools/ci/commands.json
@@ -46,5 +46,15 @@
"pyyaml",
"taskcluster"
]
+ },
+ "tc-sink-task": {
+ "path": "tc/sink_task.py",
+ "parser": "get_parser",
+ "script": "run",
+ "help": "Run the sink task",
+ "virtualenv": true,
+ "install": [
+ "taskcluster"
+ ]
}
}
diff --git a/tests/wpt/web-platform-tests/tools/ci/manifest_build.py b/tests/wpt/web-platform-tests/tools/ci/manifest_build.py
index 20f96d9a3ee..0ea13627538 100644
--- a/tests/wpt/web-platform-tests/tools/ci/manifest_build.py
+++ b/tests/wpt/web-platform-tests/tools/ci/manifest_build.py
@@ -107,6 +107,7 @@ def get_pr(owner, repo, sha):
def create_release(manifest_path, owner, repo, sha, tag, body):
+ logger.info("Creating a release for tag='%s', target_commitish='%s'" % (tag, sha))
create_url = "https://api.github.com/repos/%s/%s/releases" % (owner, repo)
create_data = {"tag_name": tag,
"target_commitish": sha,
@@ -173,7 +174,7 @@ def main():
owner, repo = os.environ["GITHUB_REPOSITORY"].split("/", 1)
git = get_git_cmd(wpt_root)
- head_rev = git("rev-parse", "HEAD")
+ head_rev = git("rev-parse", "HEAD").strip()
body = git("show", "--no-patch", "--format=%B", "HEAD")
if dry_run:
diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/decision.py b/tests/wpt/web-platform-tests/tools/ci/tc/decision.py
index f8f186f744d..070ae5f1903 100644
--- a/tests/wpt/web-platform-tests/tools/ci/tc/decision.py
+++ b/tests/wpt/web-platform-tests/tools/ci/tc/decision.py
@@ -47,7 +47,7 @@ def fetch_event_data(queue):
def filter_triggers(event, all_tasks):
is_pr, branch = get_triggers(event)
- triggered = {}
+ triggered = OrderedDict()
for name, task in iteritems(all_tasks):
if "trigger" in task:
if is_pr and "pull-request" in task["trigger"]:
@@ -102,7 +102,7 @@ def get_extra_jobs(event):
def filter_schedule_if(event, tasks):
- scheduled = {}
+ scheduled = OrderedDict()
run_jobs = None
for name, task in iteritems(tasks):
if "schedule-if" in task:
@@ -239,13 +239,14 @@ def create_tc_task(event, task, taskgroup_id, depends_on_ids, env_extra=None):
},
"extra": {
"github_event": json.dumps(event)
- }
+ },
+ "routes": ["checks"]
}
if env_extra:
task_data["payload"]["env"].update(env_extra)
if depends_on_ids:
task_data["dependencies"] = depends_on_ids
- task_data["requires"] = "all-completed"
+ task_data["requires"] = task.get("requires", "all-completed")
return task_id, task_data
@@ -282,8 +283,27 @@ def build_task_graph(event, all_tasks, tasks):
task_id_map[task_name] = (task_id, task_data)
for task_name, task in iteritems(tasks):
+ if task_name == "sink-task":
+ # sink-task will be created below at the end of the ordered dict,
+ # so that it can depend on all other tasks.
+ continue
add_task(task_name, task)
+ # GitHub branch protection for pull requests needs us to name explicit
+ # required tasks - which doesn't suffice when using a dynamic task graph.
+ # To work around this we declare a sink task that depends on all the other
+ # tasks completing, and checks if they have succeeded. We can then
+ # make the sink task the sole required task for pull requests.
+ sink_task = tasks.get("sink-task")
+ if sink_task:
+ logger.info("Scheduling sink-task")
+ depends_on_ids = [x[0] for x in task_id_map.values()]
+ sink_task["command"] += " {0}".format(" ".join(depends_on_ids))
+ task_id_map["sink-task"] = create_tc_task(
+ event, sink_task, taskgroup_id, depends_on_ids)
+ else:
+ logger.info("sink-task is not scheduled")
+
return task_id_map
diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/sink_task.py b/tests/wpt/web-platform-tests/tools/ci/tc/sink_task.py
new file mode 100644
index 00000000000..ba76d27640c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/tc/sink_task.py
@@ -0,0 +1,41 @@
+import argparse
+import logging
+import os
+
+import taskcluster
+
+
+logging.basicConfig()
+logger = logging.getLogger()
+
+
+def check_task_statuses(task_ids):
+ """Verifies whether a set of Taskcluster tasks completed successfully or not.
+
+ Returns 0 if all tasks passed completed successfully, 1 otherwise."""
+
+ queue = taskcluster.Queue({'rootUrl': os.environ['TASKCLUSTER_ROOT_URL']})
+ success = True
+ for task in task_ids:
+ status = queue.status(task)
+ state = status['status']['state']
+ if state == 'failed' or state == 'exception':
+ logger.error('Task {0} failed with state "{1}"'.format(task, state))
+ success = False
+ elif state != 'completed':
+ logger.error('Task {0} had unexpected state "{1}"'.format(task, state))
+ success = False
+ if success:
+ logger.info('All tasks completed successfully')
+ return 0 if success else 1
+
+
+def get_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("tasks", nargs="+",
+ help="A set of Taskcluster task ids to verify the state of.")
+ return parser
+
+
+def run(venv, **kwargs):
+ return check_task_statuses(kwargs['tasks'])
diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py b/tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py
index 6a6cb497f2d..8c78f7b5dbe 100644
--- a/tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py
+++ b/tests/wpt/web-platform-tests/tools/ci/tc/taskgraph.py
@@ -1,6 +1,7 @@
import json
import os
import re
+from collections import OrderedDict
from copy import deepcopy
import six
@@ -137,7 +138,7 @@ def expand_maps(task):
def load_tasks(tasks_data):
- map_resolved_tasks = {}
+ map_resolved_tasks = OrderedDict()
tasks = []
for task in tasks_data["tasks"]:
@@ -159,7 +160,7 @@ def load_tasks(tasks_data):
tasks.extend(resolve_chunks(task))
tasks = [substitute_variables(task_data) for task_data in tasks]
- return {task["name"]: task for task in tasks}
+ return OrderedDict([(t["name"], t) for t in tasks])
def load_tasks_from_path(path):
diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml b/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml
index 7943e671282..9396ce02afa 100644
--- a/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml
+++ b/tests/wpt/web-platform-tests/tools/ci/tc/tasks/test.yml
@@ -4,7 +4,7 @@ components:
workerType: ci
schedulerId: taskcluster-github
deadline: "24 hours"
- image: webplatformtests/wpt:0.37
+ image: webplatformtests/wpt:0.41
maxRunTime: 7200
artifacts:
public/results:
@@ -128,6 +128,9 @@ components:
- affected_tests
tasks:
+ # The scheduling order of tasks is NOT determined by the order in which they
+ # are defined, but by their dependencies (depends-on).
+
# Run full suites on push
- $map:
for:
@@ -487,3 +490,14 @@ tasks:
schedule-if:
run-job:
- wptrunner_infrastructure
+
+ # Note: even though sink-task does not have `depends-on`, it depends on all
+ # other tasks (dynamically added by tools/ci/tc/decision.py).
+ - sink-task:
+ description: >-
+ Sink task for all other tasks; indicates success
+ use:
+ - wpt-base
+ - trigger-pr
+ command: "./wpt tc-sink-task"
+ requires: all-resolved
diff --git a/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py
index a116ca89310..6ac76f484e1 100644
--- a/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py
+++ b/tests/wpt/web-platform-tests/tools/ci/tc/tests/test_valid.py
@@ -1,5 +1,6 @@
import json
import os
+import sys
from io import open
import jsone
@@ -8,6 +9,7 @@ import pytest
import requests
import yaml
from jsonschema import validate
+from six import PY3
from tools.ci.tc import decision
@@ -19,6 +21,8 @@ def data_path(filename):
return os.path.join(here, "..", "testdata", filename)
+@pytest.mark.xfail(sys.platform == "win32" and PY3,
+ reason="https://github.com/web-platform-tests/wpt/issues/24561")
def test_verify_taskcluster_yml():
"""Verify that the json-e in the .taskcluster.yml is valid"""
with open(os.path.join(root, ".taskcluster.yml"), encoding="utf8") as f:
@@ -46,11 +50,7 @@ def test_verify_payload():
r.raise_for_status()
create_task_schema = r.json()
- # TODO(Hexcles): Change it to https://community-tc.services.mozilla.com/references/schemas/docker-worker/v1/payload.json
- # after the next Community-TC release (see https://bugzilla.mozilla.org/show_bug.cgi?id=1639732)..
- r = requests.get(
- "https://raw.githubusercontent.com/taskcluster/taskcluster/"
- "3ed511ef9119da54fc093e976b7b5955874c9b54/workers/docker-worker/schemas/v1/payload.json")
+ r = requests.get("https://community-tc.services.mozilla.com/references/schemas/docker-worker/v1/payload.json")
r.raise_for_status()
payload_schema = r.json()
@@ -80,7 +80,7 @@ def test_verify_payload():
@pytest.mark.parametrize("event_path,is_pr,files_changed,expected", [
("master_push_event.json", False, None,
- {'download-firefox-nightly',
+ ['download-firefox-nightly',
'wpt-firefox-nightly-testharness-1',
'wpt-firefox-nightly-testharness-2',
'wpt-firefox-nightly-testharness-3',
@@ -123,18 +123,17 @@ def test_verify_payload():
'wpt-chrome-dev-reftest-3',
'wpt-chrome-dev-reftest-4',
'wpt-chrome-dev-reftest-5',
+ 'wpt-firefox-nightly-print-reftest-1',
+ 'wpt-chrome-dev-print-reftest-1',
'wpt-firefox-nightly-wdspec-1',
'wpt-firefox-nightly-wdspec-2',
'wpt-chrome-dev-wdspec-1',
'wpt-chrome-dev-wdspec-2',
'wpt-firefox-nightly-crashtest-1',
'wpt-chrome-dev-crashtest-1',
- 'wpt-firefox-nightly-print-reftest-1',
- 'wpt-chrome-dev-print-reftest-1',
- 'lint'}),
+ 'lint']),
("pr_event.json", True, {".taskcluster.yml",".travis.yml","tools/ci/start.sh"},
- {'download-firefox-nightly',
- 'lint',
+ ['lint',
'tools/ unittests (Python 2)',
'tools/ unittests (Python 3.6)',
'tools/ unittests (Python 3.8)',
@@ -142,60 +141,25 @@ def test_verify_payload():
'tools/ integration tests (Python 3.6)',
'tools/ integration tests (Python 3.8)',
'resources/ tests',
+ 'download-firefox-nightly',
'infrastructure/ tests',
- 'infrastructure/ tests (Python 3)'}),
+ 'infrastructure/ tests (Python 3)',
+ 'sink-task']),
# More tests are affected in the actual PR but it shouldn't affect the scheduled tasks
("pr_event_tests_affected.json", True, {"layout-instability/clip-negative-bottom-margin.html",
"layout-instability/composited-element-movement.html"},
- {'download-firefox-nightly',
+ ['download-firefox-nightly',
'wpt-firefox-nightly-stability',
'wpt-firefox-nightly-results',
'wpt-firefox-nightly-results-without-changes',
'wpt-chrome-dev-stability',
'wpt-chrome-dev-results',
'wpt-chrome-dev-results-without-changes',
- 'lint'}),
+ 'lint',
+ 'sink-task']),
("epochs_daily_push_event.json", False, None,
- {'download-firefox-stable',
- 'wpt-chrome-stable-reftest-1',
- 'wpt-chrome-stable-reftest-2',
- 'wpt-chrome-stable-reftest-3',
- 'wpt-chrome-stable-reftest-4',
- 'wpt-chrome-stable-reftest-5',
- 'wpt-chrome-stable-print-reftest-1',
- 'wpt-chrome-stable-testharness-1',
- 'wpt-chrome-stable-testharness-10',
- 'wpt-chrome-stable-testharness-11',
- 'wpt-chrome-stable-testharness-12',
- 'wpt-chrome-stable-testharness-13',
- 'wpt-chrome-stable-testharness-14',
- 'wpt-chrome-stable-testharness-15',
- 'wpt-chrome-stable-testharness-16',
- 'wpt-chrome-stable-testharness-2',
- 'wpt-chrome-stable-testharness-3',
- 'wpt-chrome-stable-testharness-4',
- 'wpt-chrome-stable-testharness-5',
- 'wpt-chrome-stable-testharness-6',
- 'wpt-chrome-stable-testharness-7',
- 'wpt-chrome-stable-testharness-8',
- 'wpt-chrome-stable-testharness-9',
- 'wpt-chrome-stable-wdspec-1',
- 'wpt-chrome-stable-wdspec-2',
- 'wpt-chrome-stable-crashtest-1',
- 'wpt-firefox-stable-reftest-1',
- 'wpt-firefox-stable-reftest-2',
- 'wpt-firefox-stable-reftest-3',
- 'wpt-firefox-stable-reftest-4',
- 'wpt-firefox-stable-reftest-5',
- 'wpt-firefox-stable-print-reftest-1',
+ ['download-firefox-stable',
'wpt-firefox-stable-testharness-1',
- 'wpt-firefox-stable-testharness-10',
- 'wpt-firefox-stable-testharness-11',
- 'wpt-firefox-stable-testharness-12',
- 'wpt-firefox-stable-testharness-13',
- 'wpt-firefox-stable-testharness-14',
- 'wpt-firefox-stable-testharness-15',
- 'wpt-firefox-stable-testharness-16',
'wpt-firefox-stable-testharness-2',
'wpt-firefox-stable-testharness-3',
'wpt-firefox-stable-testharness-4',
@@ -204,23 +168,30 @@ def test_verify_payload():
'wpt-firefox-stable-testharness-7',
'wpt-firefox-stable-testharness-8',
'wpt-firefox-stable-testharness-9',
- 'wpt-firefox-stable-wdspec-1',
- 'wpt-firefox-stable-wdspec-2',
- 'wpt-firefox-stable-crashtest-1',
- 'wpt-webkitgtk_minibrowser-nightly-reftest-1',
- 'wpt-webkitgtk_minibrowser-nightly-reftest-2',
- 'wpt-webkitgtk_minibrowser-nightly-reftest-3',
- 'wpt-webkitgtk_minibrowser-nightly-reftest-4',
- 'wpt-webkitgtk_minibrowser-nightly-reftest-5',
- 'wpt-webkitgtk_minibrowser-nightly-print-reftest-1',
+ 'wpt-firefox-stable-testharness-10',
+ 'wpt-firefox-stable-testharness-11',
+ 'wpt-firefox-stable-testharness-12',
+ 'wpt-firefox-stable-testharness-13',
+ 'wpt-firefox-stable-testharness-14',
+ 'wpt-firefox-stable-testharness-15',
+ 'wpt-firefox-stable-testharness-16',
+ 'wpt-chrome-stable-testharness-1',
+ 'wpt-chrome-stable-testharness-2',
+ 'wpt-chrome-stable-testharness-3',
+ 'wpt-chrome-stable-testharness-4',
+ 'wpt-chrome-stable-testharness-5',
+ 'wpt-chrome-stable-testharness-6',
+ 'wpt-chrome-stable-testharness-7',
+ 'wpt-chrome-stable-testharness-8',
+ 'wpt-chrome-stable-testharness-9',
+ 'wpt-chrome-stable-testharness-10',
+ 'wpt-chrome-stable-testharness-11',
+ 'wpt-chrome-stable-testharness-12',
+ 'wpt-chrome-stable-testharness-13',
+ 'wpt-chrome-stable-testharness-14',
+ 'wpt-chrome-stable-testharness-15',
+ 'wpt-chrome-stable-testharness-16',
'wpt-webkitgtk_minibrowser-nightly-testharness-1',
- 'wpt-webkitgtk_minibrowser-nightly-testharness-10',
- 'wpt-webkitgtk_minibrowser-nightly-testharness-11',
- 'wpt-webkitgtk_minibrowser-nightly-testharness-12',
- 'wpt-webkitgtk_minibrowser-nightly-testharness-13',
- 'wpt-webkitgtk_minibrowser-nightly-testharness-14',
- 'wpt-webkitgtk_minibrowser-nightly-testharness-15',
- 'wpt-webkitgtk_minibrowser-nightly-testharness-16',
'wpt-webkitgtk_minibrowser-nightly-testharness-2',
'wpt-webkitgtk_minibrowser-nightly-testharness-3',
'wpt-webkitgtk_minibrowser-nightly-testharness-4',
@@ -229,23 +200,14 @@ def test_verify_payload():
'wpt-webkitgtk_minibrowser-nightly-testharness-7',
'wpt-webkitgtk_minibrowser-nightly-testharness-8',
'wpt-webkitgtk_minibrowser-nightly-testharness-9',
- 'wpt-webkitgtk_minibrowser-nightly-wdspec-1',
- 'wpt-webkitgtk_minibrowser-nightly-wdspec-2',
- 'wpt-webkitgtk_minibrowser-nightly-crashtest-1',
- 'wpt-servo-nightly-reftest-1',
- 'wpt-servo-nightly-reftest-2',
- 'wpt-servo-nightly-reftest-3',
- 'wpt-servo-nightly-reftest-4',
- 'wpt-servo-nightly-reftest-5',
- 'wpt-servo-nightly-print-reftest-1',
+ 'wpt-webkitgtk_minibrowser-nightly-testharness-10',
+ 'wpt-webkitgtk_minibrowser-nightly-testharness-11',
+ 'wpt-webkitgtk_minibrowser-nightly-testharness-12',
+ 'wpt-webkitgtk_minibrowser-nightly-testharness-13',
+ 'wpt-webkitgtk_minibrowser-nightly-testharness-14',
+ 'wpt-webkitgtk_minibrowser-nightly-testharness-15',
+ 'wpt-webkitgtk_minibrowser-nightly-testharness-16',
'wpt-servo-nightly-testharness-1',
- 'wpt-servo-nightly-testharness-10',
- 'wpt-servo-nightly-testharness-11',
- 'wpt-servo-nightly-testharness-12',
- 'wpt-servo-nightly-testharness-13',
- 'wpt-servo-nightly-testharness-14',
- 'wpt-servo-nightly-testharness-15',
- 'wpt-servo-nightly-testharness-16',
'wpt-servo-nightly-testharness-2',
'wpt-servo-nightly-testharness-3',
'wpt-servo-nightly-testharness-4',
@@ -254,9 +216,49 @@ def test_verify_payload():
'wpt-servo-nightly-testharness-7',
'wpt-servo-nightly-testharness-8',
'wpt-servo-nightly-testharness-9',
+ 'wpt-servo-nightly-testharness-10',
+ 'wpt-servo-nightly-testharness-11',
+ 'wpt-servo-nightly-testharness-12',
+ 'wpt-servo-nightly-testharness-13',
+ 'wpt-servo-nightly-testharness-14',
+ 'wpt-servo-nightly-testharness-15',
+ 'wpt-servo-nightly-testharness-16',
+ 'wpt-firefox-stable-reftest-1',
+ 'wpt-firefox-stable-reftest-2',
+ 'wpt-firefox-stable-reftest-3',
+ 'wpt-firefox-stable-reftest-4',
+ 'wpt-firefox-stable-reftest-5',
+ 'wpt-chrome-stable-reftest-1',
+ 'wpt-chrome-stable-reftest-2',
+ 'wpt-chrome-stable-reftest-3',
+ 'wpt-chrome-stable-reftest-4',
+ 'wpt-chrome-stable-reftest-5',
+ 'wpt-webkitgtk_minibrowser-nightly-reftest-1',
+ 'wpt-webkitgtk_minibrowser-nightly-reftest-2',
+ 'wpt-webkitgtk_minibrowser-nightly-reftest-3',
+ 'wpt-webkitgtk_minibrowser-nightly-reftest-4',
+ 'wpt-webkitgtk_minibrowser-nightly-reftest-5',
+ 'wpt-servo-nightly-reftest-1',
+ 'wpt-servo-nightly-reftest-2',
+ 'wpt-servo-nightly-reftest-3',
+ 'wpt-servo-nightly-reftest-4',
+ 'wpt-servo-nightly-reftest-5',
+ 'wpt-firefox-stable-print-reftest-1',
+ 'wpt-chrome-stable-print-reftest-1',
+ 'wpt-webkitgtk_minibrowser-nightly-print-reftest-1',
+ 'wpt-servo-nightly-print-reftest-1',
+ 'wpt-firefox-stable-wdspec-1',
+ 'wpt-firefox-stable-wdspec-2',
+ 'wpt-chrome-stable-wdspec-1',
+ 'wpt-chrome-stable-wdspec-2',
+ 'wpt-webkitgtk_minibrowser-nightly-wdspec-1',
+ 'wpt-webkitgtk_minibrowser-nightly-wdspec-2',
'wpt-servo-nightly-wdspec-1',
'wpt-servo-nightly-wdspec-2',
- 'wpt-servo-nightly-crashtest-1',})
+ 'wpt-firefox-stable-crashtest-1',
+ 'wpt-chrome-stable-crashtest-1',
+ 'wpt-webkitgtk_minibrowser-nightly-crashtest-1',
+ 'wpt-servo-nightly-crashtest-1'])
])
def test_schedule_tasks(event_path, is_pr, files_changed, expected):
with mock.patch("tools.ci.tc.decision.get_fetch_rev", return_value=(None, None, None)):
@@ -265,4 +267,4 @@ def test_schedule_tasks(event_path, is_pr, files_changed, expected):
with open(data_path(event_path), encoding="utf8") as event_file:
event = json.load(event_file)
scheduled = decision.decide(event)
- assert set(scheduled.keys()) == expected
+ assert list(scheduled.keys()) == expected
diff --git a/tests/wpt/web-platform-tests/tools/docker/Dockerfile b/tests/wpt/web-platform-tests/tools/docker/Dockerfile
index f3927fd0d71..cf44e13cb1d 100644
--- a/tests/wpt/web-platform-tests/tools/docker/Dockerfile
+++ b/tests/wpt/web-platform-tests/tools/docker/Dockerfile
@@ -51,8 +51,11 @@ RUN apt-get -qqy install \
RUN apt-get -y autoremove
-RUN pip install --upgrade pip
-RUN pip install virtualenv
+RUN pip2 install --upgrade pip
+RUN pip2 install virtualenv
+
+RUN pip3 install --upgrade pip
+RUN pip3 install virtualenv
ENV TZ "UTC"
RUN echo "${TZ}" > /etc/timezone \
diff --git a/tests/wpt/web-platform-tests/tools/gitignore/gitignore.py b/tests/wpt/web-platform-tests/tools/gitignore/gitignore.py
index 0f3d9450d12..2a276151866 100644
--- a/tests/wpt/web-platform-tests/tools/gitignore/gitignore.py
+++ b/tests/wpt/web-platform-tests/tools/gitignore/gitignore.py
@@ -1,7 +1,7 @@
import re
import os
import itertools
-from six import itervalues, iteritems
+from six import ensure_binary, itervalues, iteritems
from collections import defaultdict
MYPY = False
@@ -26,70 +26,72 @@ end_space = re.compile(r"([^\\]\s)*$")
def fnmatch_translate(pat):
- # type: (str) -> Tuple[bool, Pattern[str]]
+ # type: (bytes) -> Tuple[bool, Pattern[bytes]]
parts = []
seq = None
i = 0
- any_char = "[^/]"
- if pat[0] == "/":
- parts.append("^")
+ any_char = b"[^/]"
+ if pat[0:1] == b"/":
+ parts.append(b"^")
pat = pat[1:]
else:
# By default match the entire path up to a /
# but if / doesn't appear in the pattern we will mark is as
# a name pattern and just produce a pattern that matches against
# the filename
- parts.append("^(?:.*/)?")
+ parts.append(b"^(?:.*/)?")
name_pattern = True
- if pat[-1] == "/":
+ if pat[-1:] == b"/":
# If the last character is / match this directory or any subdirectory
pat = pat[:-1]
- suffix = "(?:/|$)"
+ suffix = b"(?:/|$)"
else:
- suffix = "$"
+ suffix = b"$"
while i < len(pat):
- c = pat[i]
- if c == "\\":
+ c = pat[i:i+1]
+ if c == b"\\":
if i < len(pat) - 1:
i += 1
- c = pat[i]
+ c = pat[i:i+1]
parts.append(re.escape(c))
else:
raise ValueError
elif seq is not None:
# TODO: this doesn't really handle invalid sequences in the right way
- if c == "]":
+ if c == b"]":
seq = None
- if parts[-1] == "[":
+ if parts[-1:] == b"[":
parts = parts[:-1]
- elif parts[-1] == "^" and parts[-2] == "[":
+ elif parts[-1:] == b"^" and parts[-2:-1] == b"[":
parts = parts[:-2]
else:
parts.append(c)
- elif c == "-":
+ elif c == b"-":
parts.append(c)
+ elif c == b"[":
+ raise ValueError
else:
- parts += re.escape(c)
- elif c == "[":
- parts.append("[")
- if i < len(pat) - 1 and pat[i+1] in ("!", "^"):
- parts.append("^")
+ parts.append(re.escape(c))
+ elif c == b"[":
+ parts.append(b"[")
+ if i < len(pat) - 1 and pat[i+1:i+2] in (b"!", b"^"):
+ parts.append(b"^")
i += 1
seq = i
- elif c == "*":
- if i < len(pat) - 1 and pat[i+1] == "*":
- if i > 0 and pat[i-1] != "/":
+ elif c == b"*":
+ if i < len(pat) - 1 and pat[i+1:i+2] == b"*":
+ if i > 0 and pat[i-1:i] != b"/":
raise ValueError
- parts.append(".*")
+ parts.append(b".*")
i += 1
- if i < len(pat) - 1 and pat[i+1] != "/":
+ if i < len(pat) - 1 and pat[i+1:i+2] != b"/":
raise ValueError
else:
- parts.append(any_char + "*")
- elif c == "?":
+ parts.append(any_char + b"*")
+ elif c == b"?":
parts.append(any_char)
- elif c == "/" and not seq:
+ elif c == b"/" and not seq:
name_pattern = False
parts.append(c)
else:
@@ -97,31 +99,31 @@ def fnmatch_translate(pat):
i += 1
if name_pattern:
- parts[0] = "^"
+ parts[0] = b"^"
if seq is not None:
raise ValueError
parts.append(suffix)
try:
- return name_pattern, re.compile("".join(parts))
+ return name_pattern, re.compile(b"".join(parts))
except Exception:
raise ValueError
# Regexp matching rules that have to be converted to patterns
-pattern_re = re.compile(r".*[\*\[\?]")
+pattern_re = re.compile(br".*[\*\[\?]")
def parse_line(line):
- # type: (str) -> Optional[Tuple[bool, bool, bool, Union[Tuple[str, ...], Tuple[bool, Pattern[str]]]]]
+ # type: (bytes) -> Optional[Tuple[bool, bool, bool, Union[Tuple[bytes, ...], Tuple[bool, Pattern[bytes]]]]]
line = line.rstrip()
- if not line or line[0] == "#":
+ if not line or line[0:1] == b"#":
return None
- invert = line[0] == "!"
+ invert = line[0:1] == b"!"
if invert:
line = line[1:]
- dir_only = line[-1] == "/"
+ dir_only = line[-1:] == b"/"
if dir_only:
line = line[:-1]
@@ -129,7 +131,7 @@ def parse_line(line):
# Could make a special case for **/foo, but we don't have any patterns like that
if not invert and not pattern_re.match(line):
literal = True
- pattern = tuple(line.rsplit("/", 1)) # type: Union[Tuple[str, ...], Tuple[bool, Pattern[str]]]
+ pattern = tuple(line.rsplit(b"/", 1)) # type: Union[Tuple[bytes, ...], Tuple[bool, Pattern[bytes]]]
else:
pattern = fnmatch_translate(line)
literal = False
@@ -139,9 +141,9 @@ def parse_line(line):
class PathFilter(object):
def __init__(self, root, extras=None, cache=None):
- # type: (str, Optional[List[str]], Optional[MutableMapping[str, bool]]) -> None
+ # type: (bytes, Optional[List[bytes]], Optional[MutableMapping[bytes, bool]]) -> None
if root:
- ignore_path = os.path.join(root, ".gitignore") # type: Optional[str]
+ ignore_path = os.path.join(root, b".gitignore") # type: Optional[bytes]
else:
ignore_path = None
if not ignore_path and not extras:
@@ -149,32 +151,32 @@ class PathFilter(object):
return
self.trivial = False
- self.literals_file = defaultdict(dict) # type: Dict[Optional[str], Dict[str, List[Tuple[bool, Pattern[str]]]]]
- self.literals_dir = defaultdict(dict) # type: Dict[Optional[str], Dict[str, List[Tuple[bool, Pattern[str]]]]]
- self.patterns_file = [] # type: List[Tuple[Tuple[bool, Pattern[str]], List[Tuple[bool, Pattern[str]]]]]
- self.patterns_dir = [] # type: List[Tuple[Tuple[bool, Pattern[str]], List[Tuple[bool, Pattern[str]]]]]
- self.cache = cache or {} # type: MutableMapping[str, bool]
+ self.literals_file = defaultdict(dict) # type: Dict[Optional[bytes], Dict[bytes, List[Tuple[bool, Pattern[bytes]]]]]
+ self.literals_dir = defaultdict(dict) # type: Dict[Optional[bytes], Dict[bytes, List[Tuple[bool, Pattern[bytes]]]]]
+ self.patterns_file = [] # type: List[Tuple[Tuple[bool, Pattern[bytes]], List[Tuple[bool, Pattern[bytes]]]]]
+ self.patterns_dir = [] # type: List[Tuple[Tuple[bool, Pattern[bytes]], List[Tuple[bool, Pattern[bytes]]]]]
+ self.cache = cache or {} # type: MutableMapping[bytes, bool]
if extras is None:
extras = []
if ignore_path and os.path.exists(ignore_path):
- args = ignore_path, extras # type: Tuple[Optional[str], List[str]]
+ args = ignore_path, extras # type: Tuple[Optional[bytes], List[bytes]]
else:
args = None, extras
self._read_ignore(*args)
def _read_ignore(self, ignore_path, extras):
- # type: (Optional[str], List[str]) -> None
+ # type: (Optional[bytes], List[bytes]) -> None
if ignore_path is not None:
- with open(ignore_path) as f:
+ with open(ignore_path, "rb") as f:
for line in f:
self._read_line(line)
for line in extras:
self._read_line(line)
def _read_line(self, line):
- # type: (str) -> None
+ # type: (bytes) -> None
parsed = parse_line(line)
if not parsed:
return
@@ -186,13 +188,13 @@ class PathFilter(object):
# overriden by an exclude rule
assert not literal
if MYPY:
- rule = cast(Tuple[bool, Pattern[str]], rule)
+ rule = cast(Tuple[bool, Pattern[bytes]], rule)
if not dir_only:
rules_iter = itertools.chain(
itertools.chain(*(iteritems(item) for item in itervalues(self.literals_dir))),
itertools.chain(*(iteritems(item) for item in itervalues(self.literals_file))),
self.patterns_dir,
- self.patterns_file) # type: Iterable[Tuple[Any, List[Tuple[bool, Pattern[str]]]]]
+ self.patterns_file) # type: Iterable[Tuple[Any, List[Tuple[bool, Pattern[bytes]]]]]
else:
rules_iter = itertools.chain(
itertools.chain(*(iteritems(item) for item in itervalues(self.literals_dir))),
@@ -203,9 +205,9 @@ class PathFilter(object):
else:
if literal:
if MYPY:
- rule = cast(Tuple[str, ...], rule)
+ rule = cast(Tuple[bytes, ...], rule)
if len(rule) == 1:
- dir_name, pattern = None, rule[0] # type: Tuple[Optional[str], str]
+ dir_name, pattern = None, rule[0] # type: Tuple[Optional[bytes], bytes]
else:
dir_name, pattern = rule
self.literals_dir[dir_name][pattern] = []
@@ -213,31 +215,31 @@ class PathFilter(object):
self.literals_file[dir_name][pattern] = []
else:
if MYPY:
- rule = cast(Tuple[bool, Pattern[str]], rule)
+ rule = cast(Tuple[bool, Pattern[bytes]], rule)
self.patterns_dir.append((rule, []))
if not dir_only:
self.patterns_file.append((rule, []))
def filter(self,
- iterator # type: Iterable[Tuple[str, List[Tuple[str, T]], List[Tuple[str, T]]]]
+ iterator # type: Iterable[Tuple[bytes, List[Tuple[bytes, T]], List[Tuple[bytes, T]]]]
):
- # type: (...) -> Iterable[Tuple[str, List[Tuple[str, T]], List[Tuple[str, T]]]]
+ # type: (...) -> Iterable[Tuple[bytes, List[Tuple[bytes, T]], List[Tuple[bytes, T]]]]
empty = {} # type: Dict[Any, Any]
for dirpath, dirnames, filenames in iterator:
orig_dirpath = dirpath
- if os.path.sep != "/":
- dirpath = dirpath.replace(os.path.sep, "/")
+ if ensure_binary(os.path.sep) != b"/":
+ dirpath = dirpath.replace(ensure_binary(os.path.sep), b"/")
- keep_dirs = [] # type: List[Tuple[str, T]]
- keep_files = [] # type: List[Tuple[str, T]]
+ keep_dirs = [] # type: List[Tuple[bytes, T]]
+ keep_files = [] # type: List[Tuple[bytes, T]]
for iter_items, literals, patterns, target, suffix in [
- (dirnames, self.literals_dir, self.patterns_dir, keep_dirs, "/"),
- (filenames, self.literals_file, self.patterns_file, keep_files, "")]:
+ (dirnames, self.literals_dir, self.patterns_dir, keep_dirs, b"/"),
+ (filenames, self.literals_file, self.patterns_file, keep_files, b"")]:
for item in iter_items:
name = item[0]
if dirpath:
- path = "%s/%s" % (dirpath, name) + suffix
+ path = b"%s/%s" % (dirpath, name) + suffix
else:
path = name + suffix
if path in self.cache:
@@ -269,13 +271,13 @@ class PathFilter(object):
target.append(item)
dirnames[:] = keep_dirs
- assert not any(".git" == name for name, _ in dirnames)
+ assert not any(b".git" == name for name, _ in dirnames)
yield orig_dirpath, dirnames, keep_files
def __call__(self,
- iterator # type: Iterable[Tuple[str, List[Tuple[str, T]], List[Tuple[str, T]]]]
+ iterator # type: Iterable[Tuple[bytes, List[Tuple[bytes, T]], List[Tuple[bytes, T]]]]
):
- # type: (...) -> Iterable[Tuple[str, List[Tuple[str, T]], List[Tuple[str, T]]]]
+ # type: (...) -> Iterable[Tuple[bytes, List[Tuple[bytes, T]], List[Tuple[bytes, T]]]]
if self.trivial:
return iterator
@@ -283,5 +285,5 @@ class PathFilter(object):
def has_ignore(dirpath):
- # type: (str) -> bool
- return os.path.exists(os.path.join(dirpath, ".gitignore"))
+ # type: (bytes) -> bool
+ return os.path.exists(os.path.join(dirpath, b".gitignore"))
diff --git a/tests/wpt/web-platform-tests/tools/gitignore/tests/test_gitignore.py b/tests/wpt/web-platform-tests/tools/gitignore/tests/test_gitignore.py
index 8131a71875b..317f3799b62 100644
--- a/tests/wpt/web-platform-tests/tools/gitignore/tests/test_gitignore.py
+++ b/tests/wpt/web-platform-tests/tools/gitignore/tests/test_gitignore.py
@@ -10,62 +10,61 @@ if MYPY:
from typing import Sequence
match_data = [
- ("foo", True, ["a/foo", "foo"]),
- ("*.a", True, ["foo.a", "a/foo.a", "a/b/foo.a", "a.a/foo.a"]),
- ("*.py[co]", True, ["a.pyc", "a.pyo", "a/b/c.pyc"]),
- ("\\#*", True, ["#a", "a/#b"]),
- ("*#", True, ["a#", "a/b#", "#a#"]),
- ("/*.c", True, ["a.c", ".c"]),
- ("**/b", False, ["a/b", "a/c/b"]),
- ("*b", True, ["ab"]),
- ("*b", True, ["a/b"]),
- ("**/b", False, ["a/b"]),
- ("a/", True, ["a"]),
- ("a[/]b", True, []),
- ("**/b", False, ["a/c/b"]),
- ("a?c", True, ["abc"]),
- ("a[^b]c", True, ["acc"]),
- ("a[b-c]c", True, ["abc", "acc"]),
- ("a[^]c", True, ["ac"]), # This is probably wrong
- ("a[^]c", True, ["ac"]), # This is probably wrong
-] # type: Sequence[Tuple[str, bool, Iterable[str]]]
+ (b"foo", True, [b"a/foo", b"foo"]),
+ (b"*.a", True, [b"foo.a", b"a/foo.a", b"a/b/foo.a", b"a.a/foo.a"]),
+ (b"*.py[co]", True, [b"a.pyc", b"a.pyo", b"a/b/c.pyc"]),
+ (b"\\#*", True, [b"#a", b"a/#b"]),
+ (b"*#", True, [b"a#", b"a/b#", b"#a#"]),
+ (b"/*.c", True, [b"a.c", b".c"]),
+ (b"**/b", False, [b"a/b", b"a/c/b"]),
+ (b"*b", True, [b"ab"]),
+ (b"*b", True, [b"a/b"]),
+ (b"**/b", False, [b"a/b"]),
+ (b"a/", True, [b"a"]),
+ (b"a[/]b", True, []),
+ (b"**/b", False, [b"a/c/b"]),
+ (b"a?c", True, [b"abc"]),
+ (b"a[^b]c", True, [b"acc"]),
+ (b"a[b-c]c", True, [b"abc", b"acc"]),
+] # type: Sequence[Tuple[bytes, bool, Iterable[bytes]]]
mismatch_data = [
- ("foo", True, ["foob", "afoo"]),
- ("*.a", True, ["a", "foo:a", "a.a/foo"]),
- ("*.py[co]", True, ["a.pyd", "pyo", "a.py"]),
- ("a", True, ["ab"]),
- ("a?c", True, ["ac", "abbc"]),
- ("a[^b]c", True, ["abc"]),
- ("a[b-c]c", True, ["adc"]),
-] # type: Sequence[Tuple[str, bool, Iterable[str]]]
+ (b"foo", True, [b"foob", b"afoo"]),
+ (b"*.a", True, [b"a", b"foo:a", b"a.a/foo"]),
+ (b"*.py[co]", True, [b"a.pyd", b"pyo", b"a.py"]),
+ (b"a", True, [b"ab"]),
+ (b"a?c", True, [b"ac", b"abbc"]),
+ (b"a[^b]c", True, [b"abc"]),
+ (b"a[b-c]c", True, [b"adc"]),
+] # type: Sequence[Tuple[bytes, bool, Iterable[bytes]]]
invalid_data = [
- "[a",
- "***/foo",
- "a\\",
- "**b",
- "b**/",
- "[[]"
+ b"[a",
+ b"***/foo",
+ b"a\\",
+ b"**b",
+ b"b**/",
+ b"[[]",
+ b"a[^]c",
]
filter_data = [
- (["foo", "bar/", "/a", "*.py"],
- [("", ["foo", "bar", "baz"], ["a"]),
- ("baz", ["a"], ["foo", "bar"])],
- [(["baz"], []),
- (["a"], ["bar"])]),
- (["#foo", "", "a*", "!a.py"],
- [("", ["foo"], ["a", "a.foo", "a.py"])],
- [(["foo"], ["a.py"])]),
- (["a.foo", "!a.py"],
- [("", ["foo"], ["a", "a.foo", "a.py"])],
- [(["foo"], ["a", "a.py"])]),
+ ([b"foo", b"bar/", b"/a", b"*.py"],
+ [(b"", [b"foo", b"bar", b"baz"], [b"a"]),
+ (b"baz", [b"a"], [b"foo", b"bar"])],
+ [([b"baz"], []),
+ ([b"a"], [b"bar"])]),
+ ([b"#foo", b"", b"a*", b"!a.py"],
+ [(b"", [b"foo"], [b"a", b"a.foo", b"a.py"])],
+ [([b"foo"], [b"a.py"])]),
+ ([b"a.foo", b"!a.py"],
+ [(b"", [b"foo"], [b"a", b"a.foo", b"a.py"])],
+ [([b"foo"], [b"a", b"a.py"])]),
]
def expand_data(compact_data):
- # type: (Sequence[Tuple[str, bool, Iterable[str]]]) -> Iterable[Tuple[str, bool, str]]
+ # type: (Sequence[Tuple[bytes, bool, Iterable[bytes]]]) -> Iterable[Tuple[bytes, bool, bytes]]
for pattern, name_only, inputs in compact_data:
for input in inputs:
yield pattern, name_only, input
@@ -76,7 +75,7 @@ def tests_match(pattern, name_only, input):
name_only_result, regexp = fnmatch_translate(pattern)
assert name_only_result == name_only
if name_only:
- input = input.rsplit("/", 1)[-1]
+ input = input.rsplit(b"/", 1)[-1]
assert regexp.match(input) is not None
@@ -85,7 +84,7 @@ def tests_no_match(pattern, name_only, input):
name_only_result, regexp = fnmatch_translate(pattern)
assert name_only_result == name_only
if name_only:
- input = input.rsplit("/", 1)[-1]
+ input = input.rsplit(b"/", 1)[-1]
assert regexp.match(input) is None
diff --git a/tests/wpt/web-platform-tests/tools/lint/fnmatch.py b/tests/wpt/web-platform-tests/tools/lint/fnmatch.py
index 3d9ee23c97e..0c45029b239 100644
--- a/tests/wpt/web-platform-tests/tools/lint/fnmatch.py
+++ b/tests/wpt/web-platform-tests/tools/lint/fnmatch.py
@@ -6,23 +6,23 @@ import os
MYPY = False
if MYPY:
# MYPY is set to True when run under Mypy.
- from typing import AnyStr
from typing import Iterable
from typing import List
+ from typing import Text
__all__ = ["fnmatch", "fnmatchcase", "filter", "translate"]
def fnmatch(name, pat):
- # type: (AnyStr, AnyStr) -> bool
+ # type: (Text, Text) -> bool
name = os.path.normcase(name)
pat = os.path.normcase(pat)
return fnmatchcase(name, pat)
def fnmatchcase(name, pat):
- # type: (AnyStr, AnyStr) -> bool
+ # type: (Text, Text) -> bool
if '?' not in pat and '[' not in pat:
wildcards = pat.count("*")
if wildcards == 0:
@@ -35,7 +35,7 @@ def fnmatchcase(name, pat):
def filter(names, pat):
- # type: (Iterable[AnyStr], AnyStr) -> List[AnyStr]
+ # type: (Iterable[Text], Text) -> List[Text]
return [n for n in names if fnmatch(n, pat)]
diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py
index fc1a816f8ab..75fac67dc8d 100644
--- a/tests/wpt/web-platform-tests/tools/lint/lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/lint.py
@@ -3,6 +3,7 @@ from __future__ import print_function, unicode_literals
import abc
import argparse
import ast
+import io
import json
import logging
import os
@@ -21,7 +22,7 @@ from ..wpt import testfiles
from ..manifest.vcs import walk
from ..manifest.sourcefile import SourceFile, js_meta_re, python_meta_re, space_chars, get_any_variants
-from six import binary_type, iteritems, itervalues, with_metaclass
+from six import binary_type, ensure_binary, ensure_text, iteritems, itervalues, with_metaclass
from six.moves import range
from six.moves.urllib.parse import urlsplit, urljoin
@@ -39,7 +40,6 @@ if MYPY:
from typing import Text
from typing import Tuple
from typing import Type
- from typing import Union
# The Ignorelist is a two level dictionary. The top level is indexed by
# error names (e.g. 'TRAILING WHITESPACE'). Each of those then has a map of
@@ -51,6 +51,7 @@ if MYPY:
logger = None # type: Optional[logging.Logger]
+
def setup_logging(prefix=False):
# type: (bool) -> None
global logger
@@ -89,24 +90,27 @@ you could add the following line to the lint.ignore file.
%s: %s"""
+
def all_filesystem_paths(repo_root, subdir=None):
- # type: (str, Optional[str]) -> Iterable[str]
- path_filter = PathFilter(repo_root, extras=[str(".git/")])
+ # type: (Text, Optional[Text]) -> Iterable[Text]
+ path_filter = PathFilter(repo_root.encode("utf8"),
+ extras=[ensure_binary(".git/")])
if subdir:
- expanded_path = subdir
+ expanded_path = subdir.encode("utf8")
+ subdir_str = expanded_path
else:
- expanded_path = repo_root
+ expanded_path = repo_root.encode("utf8")
for dirpath, dirnames, filenames in path_filter(walk(expanded_path)):
for filename, _ in filenames:
path = os.path.join(dirpath, filename)
if subdir:
- path = os.path.join(subdir, path)
+ path = os.path.join(subdir_str, path)
assert not os.path.isabs(path), path
- yield path
+ yield ensure_text(path)
def _all_files_equal(paths):
- # type: (Iterable[str]) -> bool
+ # type: (Iterable[Text]) -> bool
"""
Checks all the paths are files that are byte-for-byte identical
@@ -145,21 +149,21 @@ def _all_files_equal(paths):
def check_path_length(repo_root, path):
- # type: (str, str) -> List[rules.Error]
+ # type: (Text, Text) -> List[rules.Error]
if len(path) + 1 > 150:
return [rules.PathLength.error(path, (path, len(path) + 1))]
return []
def check_file_type(repo_root, path):
- # type: (str, str) -> List[rules.Error]
+ # type: (Text, Text) -> List[rules.Error]
if os.path.islink(path):
return [rules.FileType.error(path, (path, "symlink"))]
return []
def check_worker_collision(repo_root, path):
- # type: (str, str) -> List[rules.Error]
+ # type: (Text, Text) -> List[rules.Error]
endings = [(".any.html", ".any.js"),
(".any.worker.html", ".any.js"),
(".worker.html", ".worker.js")]
@@ -170,7 +174,7 @@ def check_worker_collision(repo_root, path):
def check_gitignore_file(repo_root, path):
- # type: (str, str) -> List[rules.Error]
+ # type: (Text, Text) -> List[rules.Error]
if not path.endswith(".gitignore"):
return []
@@ -190,7 +194,7 @@ def check_gitignore_file(repo_root, path):
def check_ahem_copy(repo_root, path):
- # type: (str, str) -> List[rules.Error]
+ # type: (Text, Text) -> List[rules.Error]
lpath = path.lower()
if "ahem" in lpath and lpath.endswith(".ttf"):
return [rules.AhemCopy.error(path)]
@@ -198,7 +202,7 @@ def check_ahem_copy(repo_root, path):
def check_git_ignore(repo_root, paths):
- # type: (str, List[str]) -> List[rules.Error]
+ # type: (Text, List[Text]) -> List[rules.Error]
errors = []
with tempfile.TemporaryFile('w+') as f:
f.write('\n'.join(paths))
@@ -206,12 +210,13 @@ def check_git_ignore(repo_root, paths):
try:
matches = subprocess.check_output(
["git", "check-ignore", "--verbose", "--no-index", "--stdin"], stdin=f)
- for match in matches.strip().split('\n'):
- match_filter, path = match.split()
- _, _, filter_string = match_filter.split(':')
+ for match in matches.strip().split(b'\n'):
+ match_filter, path_bytes = match.split()
+ _, _, filter_string = match_filter.split(b':')
# If the matching filter reported by check-ignore is a special-case exception,
# that's fine. Otherwise, it requires a new special-case exception.
- if filter_string[0] != '!':
+ if filter_string[0:1] != b'!':
+ path = path_bytes.decode("utf8")
errors.append(rules.IgnoredPath.error(path, (path,)))
except subprocess.CalledProcessError:
# Nonzero return code means that no match exists.
@@ -225,7 +230,7 @@ w3c_dev_re = re.compile(r"https?\:\/\/dev\.w3c?\.org\/[^/?#]+\/([^/?#]+)")
def check_css_globally_unique(repo_root, paths):
- # type: (str, List[str]) -> List[rules.Error]
+ # type: (Text, List[Text]) -> List[rules.Error]
"""
Checks that CSS filenames are sufficiently unique
@@ -243,32 +248,29 @@ def check_css_globally_unique(repo_root, paths):
:returns: a list of errors found in ``paths``
"""
- test_files = defaultdict(set) # type: Dict[Union[bytes, Text], Set[str]]
- ref_files = defaultdict(set) # type: Dict[Union[bytes, Text], Set[str]]
- support_files = defaultdict(set) # type: Dict[Union[bytes, Text], Set[str]]
+ test_files = defaultdict(set) # type: Dict[Text, Set[Text]]
+ ref_files = defaultdict(set) # type: Dict[Text, Set[Text]]
+ support_files = defaultdict(set) # type: Dict[Text, Set[Text]]
for path in paths:
if os.name == "nt":
- if isinstance(path, binary_type):
- path = path.replace(b"\\", b"/")
- else:
- path = path.replace(u"\\", u"/")
+ path = path.replace(u"\\", u"/")
- if not path.startswith("css/"):
+ if not path.startswith(u"css/"):
continue
- source_file = SourceFile(repo_root, path, "/")
+ source_file = SourceFile(repo_root, path, u"/")
if source_file.name_is_non_test:
# If we're name_is_non_test for a reason apart from support, ignore it.
# We care about support because of the requirement all support files in css/ to be in
# a support directory; see the start of check_parsed.
- offset = path.find("/support/")
+ offset = path.find(u"/support/")
if offset == -1:
continue
parts = source_file.dir_path.split(os.path.sep)
if (parts[0] in source_file.root_dir_non_test or
- any(item in source_file.dir_non_test - {"support"} for item in parts) or
+ any(item in source_file.dir_non_test - {u"support"} for item in parts) or
any(parts[:len(non_test_path)] == list(non_test_path) for non_test_path in source_file.dir_path_non_test)):
continue
@@ -277,11 +279,8 @@ def check_css_globally_unique(repo_root, paths):
elif source_file.name_is_reference:
ref_files[source_file.name].add(path)
else:
- test_name = source_file.name # type: Union[bytes, Text]
- if isinstance(test_name, bytes):
- test_name = test_name.replace(b'-manual', b'')
- else:
- test_name = test_name.replace(u'-manual', u'')
+ test_name = source_file.name # type: Text
+ test_name = test_name.replace(u'-manual', u'')
test_files[test_name].add(path)
errors = []
@@ -290,9 +289,9 @@ def check_css_globally_unique(repo_root, paths):
if len(colliding) > 1:
if not _all_files_equal([os.path.join(repo_root, x) for x in colliding]):
# Only compute by_spec if there are prima-facie collisions because of cost
- by_spec = defaultdict(set) # type: Dict[Text, Set[str]]
+ by_spec = defaultdict(set) # type: Dict[Text, Set[Text]]
for path in colliding:
- source_file = SourceFile(repo_root, path, "/")
+ source_file = SourceFile(repo_root, path, u"/")
for link in source_file.spec_links:
for r in (drafts_csswg_re, w3c_tr_re, w3c_dev_re):
m = r.match(link)
@@ -324,7 +323,7 @@ def check_css_globally_unique(repo_root, paths):
def check_unique_testharness_basenames(repo_root, paths):
- # type: (str, List[str]) -> List[rules.Error]
+ # type: (Text, List[Text]) -> List[rules.Error]
"""
Checks that all testharness files have unique basename paths.
@@ -359,7 +358,7 @@ def check_unique_testharness_basenames(repo_root, paths):
def parse_ignorelist(f):
- # type: (IO[bytes]) -> Tuple[Ignorelist, Set[Text]]
+ # type: (IO[Text]) -> Tuple[Ignorelist, Set[Text]]
"""
Parse the ignorelist file given by `f`, and return the parsed structure.
@@ -440,7 +439,7 @@ regexps = [item() for item in # type: ignore
def check_regexp_line(repo_root, path, f):
- # type: (str, str, IO[bytes]) -> List[rules.Error]
+ # type: (Text, Text, IO[bytes]) -> List[rules.Error]
errors = [] # type: List[rules.Error]
applicable_regexps = [regexp for regexp in regexps if regexp.applies(path)]
@@ -454,7 +453,7 @@ def check_regexp_line(repo_root, path, f):
def check_parsed(repo_root, path, f):
- # type: (str, str, IO[bytes]) -> List[rules.Error]
+ # type: (Text, Text, IO[bytes]) -> List[rules.Error]
source_file = SourceFile(repo_root, path, "/", contents=f.read())
errors = [] # type: List[rules.Error]
@@ -630,7 +629,7 @@ class OpenModeCheck(ASTCheck):
ast_checkers = [item() for item in [OpenModeCheck]]
def check_python_ast(repo_root, path, f):
- # type: (str, str, IO[bytes]) -> List[rules.Error]
+ # type: (Text, Text, IO[bytes]) -> List[rules.Error]
# *.quic.py are Python 3 only and cannot be parsed by Python 2.
if not path.endswith(".py") or path.endswith(".quic.py"):
return []
@@ -652,7 +651,7 @@ broken_python_metadata = re.compile(br"#\s*META:")
def check_global_metadata(value):
- # type: (str) -> Iterable[Tuple[Type[rules.Rule], Tuple[Any, ...]]]
+ # type: (bytes) -> Iterable[Tuple[Type[rules.Rule], Tuple[Any, ...]]]
global_values = {item.strip().decode("utf8") for item in value.split(b",") if item.strip()}
# TODO: this could check for duplicates and such
@@ -662,7 +661,7 @@ def check_global_metadata(value):
def check_script_metadata(repo_root, path, f):
- # type: (str, str, IO[bytes]) -> List[rules.Error]
+ # type: (Text, Text, IO[bytes]) -> List[rules.Error]
if path.endswith((".worker.js", ".any.js")):
meta_re = js_meta_re
broken_metadata = broken_js_metadata
@@ -713,7 +712,7 @@ ahem_stylesheet_re = re.compile(b"\/fonts\/ahem\.css|support\/ahem.css",
def check_ahem_system_font(repo_root, path, f):
- # type: (str, str, IO[bytes]) -> List[rules.Error]
+ # type: (Text, Text, IO[bytes]) -> List[rules.Error]
if not path.endswith((".html", ".htm", ".xht", ".xhtml")):
return []
contents = f.read()
@@ -724,7 +723,7 @@ def check_ahem_system_font(repo_root, path, f):
def check_path(repo_root, path):
- # type: (str, str) -> List[rules.Error]
+ # type: (Text, Text) -> List[rules.Error]
"""
Runs lints that check the file path.
@@ -740,7 +739,7 @@ def check_path(repo_root, path):
def check_all_paths(repo_root, paths):
- # type: (str, List[str]) -> List[rules.Error]
+ # type: (Text, List[Text]) -> List[rules.Error]
"""
Runs lints that check all paths globally.
@@ -756,7 +755,7 @@ def check_all_paths(repo_root, paths):
def check_file_contents(repo_root, path, f):
- # type: (str, str, IO[bytes]) -> List[rules.Error]
+ # type: (Text, Text, IO[bytes]) -> List[rules.Error]
"""
Runs lints that check the file contents.
@@ -824,25 +823,23 @@ def output_error_count(error_count):
def changed_files(wpt_root):
- # type: (str) -> List[Text]
+ # type: (Text) -> List[Text]
revish = testfiles.get_revish(revish=None)
changed, _ = testfiles.files_changed(revish, None, include_uncommitted=True, include_new=True)
return [os.path.relpath(item, wpt_root) for item in changed]
def lint_paths(kwargs, wpt_root):
- # type: (Dict[str, Any], str) -> List[str]
- if kwargs.get(str("paths")):
+ # type: (Dict[Text, Any], Text) -> List[Text]
+ if kwargs.get("paths"):
paths = []
- for path in kwargs.get(str("paths"), []):
+ for path in kwargs.get("paths", []):
if os.path.isdir(path):
path_dir = list(all_filesystem_paths(wpt_root, path))
paths.extend(path_dir)
elif os.path.isfile(path):
paths.append(os.path.relpath(os.path.abspath(path), wpt_root))
-
-
- elif kwargs[str("all")]:
+ elif kwargs["all"]:
paths = list(all_filesystem_paths(wpt_root))
else:
changed_paths = changed_files(wpt_root)
@@ -852,7 +849,7 @@ def lint_paths(kwargs, wpt_root):
if path == "lint.ignore" or path.startswith("tools/lint/"):
force_all = True
break
- paths = (list(changed_paths) if not force_all # type: ignore
+ paths = (list(changed_paths) if not force_all
else list(all_filesystem_paths(wpt_root)))
return paths
@@ -867,47 +864,51 @@ def create_parser():
help="Output machine-readable JSON format")
parser.add_argument("--markdown", action="store_true",
help="Output markdown")
- parser.add_argument("--repo-root", help="The WPT directory. Use this "
+ parser.add_argument("--repo-root", type=ensure_text,
+ help="The WPT directory. Use this "
"option if the lint script exists outside the repository")
- parser.add_argument("--ignore-glob", help="Additional file glob to ignore.")
+ parser.add_argument("--ignore-glob", type=ensure_text, action="append",
+ help="Additional file glob to ignore (repeat to add more)")
parser.add_argument("--all", action="store_true", help="If no paths are passed, try to lint the whole "
"working directory, not just files that changed")
return parser
-def main(**kwargs):
+def main(**kwargs_str):
# type: (**Any) -> int
+ kwargs = {ensure_text(key): value for key, value in iteritems(kwargs_str)}
+
assert logger is not None
- if kwargs.get(str("json")) and kwargs.get(str("markdown")):
+ if kwargs.get("json") and kwargs.get("markdown"):
logger.critical("Cannot specify --json and --markdown")
sys.exit(2)
- repo_root = kwargs.get(str('repo_root')) or localpaths.repo_root
- output_format = {(True, False): str("json"),
- (False, True): str("markdown"),
- (False, False): str("normal")}[(kwargs.get(str("json"), False),
- kwargs.get(str("markdown"), False))]
+ repo_root = kwargs.get('repo_root') or localpaths.repo_root
+ output_format = {(True, False): "json",
+ (False, True): "markdown",
+ (False, False): "normal"}[(kwargs.get("json", False),
+ kwargs.get("markdown", False))]
if output_format == "markdown":
setup_logging(True)
paths = lint_paths(kwargs, repo_root)
- ignore_glob = kwargs.get(str("ignore_glob")) or str()
+ ignore_glob = kwargs.get("ignore_glob", [])
- return lint(repo_root, paths, output_format, str(ignore_glob))
+ return lint(repo_root, paths, output_format, ignore_glob)
-def lint(repo_root, paths, output_format, ignore_glob=str()):
- # type: (str, List[str], str, str) -> int
+def lint(repo_root, paths, output_format, ignore_glob=None):
+ # type: (Text, List[Text], Text, Optional[List[Text]]) -> int
error_count = defaultdict(int) # type: Dict[Text, int]
last = None
- with open(os.path.join(repo_root, "lint.ignore")) as f:
+ with io.open(os.path.join(repo_root, "lint.ignore"), "r") as f:
ignorelist, skipped_files = parse_ignorelist(f)
if ignore_glob:
- skipped_files.add(ignore_glob)
+ skipped_files |= set(ignore_glob)
output_errors = {"json": output_errors_json,
"markdown": output_errors_markdown,
@@ -948,8 +949,8 @@ def lint(repo_root, paths, output_format, ignore_glob=str()):
last = process_errors(errors) or last
if not os.path.isdir(abs_path):
- with open(abs_path, 'rb') as f:
- errors = check_file_contents(repo_root, path, f)
+ with io.open(abs_path, 'rb') as test_file:
+ errors = check_file_contents(repo_root, path, test_file)
last = process_errors(errors) or last
errors = check_all_paths(repo_root, paths)
diff --git a/tests/wpt/web-platform-tests/tools/lint/rules.py b/tests/wpt/web-platform-tests/tools/lint/rules.py
index 695f6cd4e53..6ffd749b9ad 100644
--- a/tests/wpt/web-platform-tests/tools/lint/rules.py
+++ b/tests/wpt/web-platform-tests/tools/lint/rules.py
@@ -354,7 +354,7 @@ class Regexp(six.with_metaclass(abc.ABCMeta)):
self._re = re.compile(self.pattern) # type: Pattern[bytes]
def applies(self, path):
- # type: (str) -> bool
+ # type: (Text) -> bool
return (self.file_extensions is None or
os.path.splitext(path)[1] in self.file_extensions)
diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py b/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py
index 10d9728b405..5857f02b6fa 100644
--- a/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py
@@ -464,7 +464,10 @@ def test_ignore_glob(caplog):
# clean.
with _mock_lint("check_path") as mocked_check_path:
with _mock_lint("check_file_contents") as mocked_check_file_contents:
- rv = lint(_dummy_repo, ["ref/absolute.html", "ref/existent_relative.html"], "normal", "*solu*")
+ rv = lint(_dummy_repo,
+ ["broken.html", "ref/absolute.html", "ref/existent_relative.html"],
+ "normal",
+ ["broken*", "*solu*"])
assert rv == 0
# Also confirm that only one file is checked
assert mocked_check_path.call_count == 1
@@ -473,22 +476,23 @@ def test_ignore_glob(caplog):
# However, linting the same two files without ignore_glob yields lint errors.
with _mock_lint("check_path") as mocked_check_path:
with _mock_lint("check_file_contents") as mocked_check_file_contents:
- rv = lint(_dummy_repo, ["ref/absolute.html", "ref/existent_relative.html"], "normal")
- assert rv == 1
- assert mocked_check_path.call_count == 2
- assert mocked_check_file_contents.call_count == 2
+ rv = lint(_dummy_repo, ["broken.html", "ref/absolute.html", "ref/existent_relative.html"], "normal")
+ assert rv == 2
+ assert mocked_check_path.call_count == 3
+ assert mocked_check_file_contents.call_count == 3
+ assert "TRAILING WHITESPACE" in caplog.text
assert "ABSOLUTE-URL-REF" in caplog.text
def test_all_filesystem_paths():
with mock.patch(
'tools.lint.lint.walk',
- return_value=[('',
- [('dir_a', None), ('dir_b', None)],
- [('file_a', None), ('file_b', None)]),
- ('dir_a',
+ return_value=[(b'',
+ [(b'dir_a', None), (b'dir_b', None)],
+ [(b'file_a', None), (b'file_b', None)]),
+ (b'dir_a',
[],
- [('file_c', None), ('file_d', None)])]
+ [(b'file_c', None), (b'file_d', None)])]
):
got = list(lint_mod.all_filesystem_paths('.'))
assert got == ['file_a',
@@ -500,12 +504,12 @@ def test_all_filesystem_paths():
def test_filesystem_paths_subdir():
with mock.patch(
'tools.lint.lint.walk',
- return_value=[('',
- [('dir_a', None), ('dir_b', None)],
- [('file_a', None), ('file_b', None)]),
- ('dir_a',
+ return_value=[(b'',
+ [(b'dir_a', None), (b'dir_b', None)],
+ [(b'file_a', None), (b'file_b', None)]),
+ (b'dir_a',
[],
- [('file_c', None), ('file_d', None)])]
+ [(b'file_c', None), (b'file_d', None)])]
):
got = list(lint_mod.all_filesystem_paths('.', 'dir'))
assert got == [os.path.join('dir', 'file_a'),
@@ -526,7 +530,7 @@ def test_main_with_args():
[os.path.relpath(os.path.join(os.getcwd(), x), repo_root)
for x in ['a', 'b', 'c']],
"normal",
- str())
+ None)
finally:
sys.argv = orig_argv
@@ -538,7 +542,7 @@ def test_main_no_args():
with _mock_lint('lint', return_value=True) as m:
with _mock_lint('changed_files', return_value=['foo', 'bar']):
lint_mod.main(**vars(create_parser().parse_args()))
- m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", str())
+ m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", None)
finally:
sys.argv = orig_argv
@@ -550,6 +554,6 @@ def test_main_all():
with _mock_lint('lint', return_value=True) as m:
with _mock_lint('all_filesystem_paths', return_value=['foo', 'bar']):
lint_mod.main(**vars(create_parser().parse_args()))
- m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", str())
+ m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", None)
finally:
sys.argv = orig_argv
diff --git a/tests/wpt/web-platform-tests/tools/localpaths.py b/tests/wpt/web-platform-tests/tools/localpaths.py
index ce3b41e300c..93cff2b8e08 100644
--- a/tests/wpt/web-platform-tests/tools/localpaths.py
+++ b/tests/wpt/web-platform-tests/tools/localpaths.py
@@ -2,7 +2,6 @@ import os
import sys
here = os.path.abspath(os.path.split(__file__)[0])
-repo_root = os.path.abspath(os.path.join(here, os.pardir))
sys.path.insert(0, os.path.join(here))
sys.path.insert(0, os.path.join(here, "wptserve"))
@@ -28,3 +27,7 @@ sys.path.insert(0, os.path.join(here, "wptrunner"))
if sys.version_info[0] == 2:
sys.path.insert(0, os.path.join(here, "third_party", "enum"))
+
+# We can't import six until we've set the path above.
+from six import ensure_text
+repo_root = ensure_text(os.path.abspath(os.path.join(here, os.pardir)))
diff --git a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
index 6f5ff4d35da..80aa3b5b920 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py
@@ -6,6 +6,8 @@ from collections import OrderedDict
from xml.parsers import expat
import xml.etree.ElementTree as etree # noqa: N813
+from six import text_type
+
MYPY = False
if MYPY:
# MYPY is set to True when run under Mypy.
@@ -24,9 +26,9 @@ def _wrap_error(e):
err.position = e.lineno, e.offset
raise err
-_names = {} # type: Dict[str, str]
+_names = {} # type: Dict[Text, Text]
def _fixname(key):
- # type: (str) -> str
+ # type: (Text) -> Text
try:
name = _names[key]
except KeyError:
@@ -54,7 +56,7 @@ class XMLParser(object):
Python does, rather than just those supported by expat.
"""
def __init__(self, encoding=None):
- # type: (Optional[str]) -> None
+ # type: (Optional[Text]) -> None
self._parser = expat.ParserCreate(encoding, "}")
self._target = etree.TreeBuilder()
# parser settings
@@ -63,6 +65,9 @@ class XMLParser(object):
self._parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
# parser callbacks
self._parser.XmlDeclHandler = self._xml_decl
+ # mypy generates a type error in py2 because it wants
+ # StartElementHandler to take str, List[str]. But the code
+ # seems to always pass in Text to this function
self._parser.StartElementHandler = self._start
self._parser.EndElementHandler = self._end
self._parser.CharacterDataHandler = self._data
@@ -70,32 +75,33 @@ class XMLParser(object):
self._parser.SkippedEntityHandler = self._skipped # type: ignore
# used for our horrible re-encoding hack
self._fed_data = [] # type: Optional[List[bytes]]
- self._read_encoding = None # type: Optional[str]
+ self._read_encoding = None # type: Optional[Text]
def _xml_decl(self, version, encoding, standalone):
- # type: (str, Optional[str], int) -> None
+ # type: (Text, Optional[Text], int) -> None
self._read_encoding = encoding
def _start(self, tag, attrib_in):
- # type: (str, List[str]) -> etree.Element
+ # type: (Text, List[str]) -> etree.Element
+ assert isinstance(tag, text_type)
self._fed_data = None
tag = _fixname(tag)
- attrib = OrderedDict() # type: Dict[Union[str, Text], Union[str, Text]]
+ attrib = OrderedDict() # type: Dict[Union[bytes, Text], Union[bytes, Text]]
if attrib_in:
for i in range(0, len(attrib_in), 2):
attrib[_fixname(attrib_in[i])] = attrib_in[i+1]
return self._target.start(tag, attrib)
def _data(self, text):
- # type: (str) -> None
+ # type: (Text) -> None
self._target.data(text)
def _end(self, tag):
- # type: (str) -> etree.Element
+ # type: (Text) -> etree.Element
return self._target.end(_fixname(tag))
def _external(self, context, base, system_id, public_id):
- # type: (str, Optional[str], Optional[str], Optional[str]) -> bool
+ # type: (Text, Optional[Text], Optional[Text], Optional[Text]) -> bool
if public_id in {
"-//W3C//DTD XHTML 1.0 Transitional//EN",
"-//W3C//DTD XHTML 1.1//EN",
@@ -117,7 +123,7 @@ class XMLParser(object):
return True
def _skipped(self, name, is_parameter_entity):
- # type: (str, bool) -> None
+ # type: (Text, bool) -> None
err = expat.error("undefined entity %s: line %d, column %d" %
(name, self._parser.ErrorLineNumber,
self._parser.ErrorColumnNumber))
@@ -127,7 +133,7 @@ class XMLParser(object):
raise err
def feed(self, data):
- # type: (str) -> None
+ # type: (bytes) -> None
if self._fed_data is not None:
self._fed_data.append(data)
try:
diff --git a/tests/wpt/web-platform-tests/tools/manifest/download.py b/tests/wpt/web-platform-tests/tools/manifest/download.py
index f8be03efb27..9d763181d82 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/download.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/download.py
@@ -35,12 +35,12 @@ logger = log.get_logger()
def abs_path(path):
- # type: (str) -> str
+ # type: (Text) -> Text
return os.path.abspath(os.path.expanduser(path))
def should_download(manifest_path, rebuild_time=timedelta(days=5)):
- # type: (str, timedelta) -> bool
+ # type: (Text, timedelta) -> bool
if not os.path.exists(manifest_path):
return True
mtime = datetime.fromtimestamp(os.path.getmtime(manifest_path))
@@ -51,7 +51,7 @@ def should_download(manifest_path, rebuild_time=timedelta(days=5)):
def merge_pr_tags(repo_root, max_count=50):
- # type: (str, int) -> List[Text]
+ # type: (Text, int) -> List[Text]
gitfunc = git(repo_root)
tags = [] # type: List[Text]
if gitfunc is None:
@@ -64,7 +64,7 @@ def merge_pr_tags(repo_root, max_count=50):
def score_name(name):
- # type: (str) -> Optional[int]
+ # type: (Text) -> Optional[int]
"""Score how much we like each filename, lower wins, None rejects"""
# Accept both ways of naming the manifest asset, even though
@@ -111,7 +111,7 @@ def github_url(tags):
def download_manifest(
- manifest_path, # type: str
+ manifest_path, # type: Text
tags_func, # type: Callable[[], List[Text]]
url_func, # type: Callable[[List[Text]], Optional[List[Text]]]
force=False # type: bool
@@ -159,7 +159,8 @@ def download_manifest(
fileobj = io.BytesIO(resp.read())
try:
with gzip.GzipFile(fileobj=fileobj) as gzf:
- decompressed = gzf.read() # type: ignore
+ data = read_gzf(gzf) # type: ignore
+ decompressed = data
except IOError:
logger.warning("Failed to decompress downloaded file")
continue
@@ -180,6 +181,12 @@ def download_manifest(
return True
+def read_gzf(gzf): # type: ignore
+ # This is working around a mypy problem in Python 2:
+ # "Call to untyped function "read" in typed context"
+ return gzf.read()
+
+
def create_parser():
# type: () -> argparse.ArgumentParser
parser = argparse.ArgumentParser()
@@ -194,7 +201,7 @@ def create_parser():
def download_from_github(path, tests_root, force=False):
- # type: (str, str, bool) -> bool
+ # type: (Text, Text, bool) -> bool
return download_manifest(path, lambda: merge_pr_tags(tests_root), github_url,
force=force)
diff --git a/tests/wpt/web-platform-tests/tools/manifest/item.py b/tests/wpt/web-platform-tests/tools/manifest/item.py
index e232925ed63..efb49d7f4ec 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/item.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/item.py
@@ -198,7 +198,7 @@ class TestharnessTest(URLManifestItem):
@property
def script_metadata(self):
- # type: () -> Optional[Text]
+ # type: () -> Optional[List[Tuple[Text, Text]]]
return self._extras.get("script_metadata")
def to_json(self):
diff --git a/tests/wpt/web-platform-tests/tools/manifest/manifest.py b/tests/wpt/web-platform-tests/tools/manifest/manifest.py
index c0832d74751..449cd245acb 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/manifest.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/manifest.py
@@ -7,12 +7,10 @@ from copy import deepcopy
from multiprocessing import Pool, cpu_count
from six import (
PY3,
- binary_type,
ensure_text,
iteritems,
itervalues,
string_types,
- text_type,
)
from . import vcs
@@ -64,15 +62,19 @@ class ManifestVersionMismatch(ManifestError):
pass
-item_classes = {"testharness": TestharnessTest,
- "reftest": RefTest,
- "print-reftest": PrintRefTest,
- "crashtest": CrashTest,
- "manual": ManualTest,
- "wdspec": WebDriverSpecTest,
- "conformancechecker": ConformanceCheckerTest,
- "visual": VisualTest,
- "support": SupportFile} # type: Dict[str, Type[ManifestItem]]
+class InvalidCacheError(Exception):
+ pass
+
+
+item_classes = {u"testharness": TestharnessTest,
+ u"reftest": RefTest,
+ u"print-reftest": PrintRefTest,
+ u"crashtest": CrashTest,
+ u"manual": ManualTest,
+ u"wdspec": WebDriverSpecTest,
+ u"conformancechecker": ConformanceCheckerTest,
+ u"visual": VisualTest,
+ u"support": SupportFile} # type: Dict[Text, Type[ManifestItem]]
def compute_manifest_items(source_file):
@@ -82,11 +84,13 @@ def compute_manifest_items(source_file):
file_hash = source_file.hash
return rel_path_parts, new_type, set(manifest_items), file_hash
+
if MYPY:
ManifestDataType = Dict[Any, TypeData]
else:
ManifestDataType = dict
+
class ManifestData(ManifestDataType):
def __init__(self, manifest):
# type: (Manifest) -> None
@@ -99,7 +103,7 @@ class ManifestData(ManifestDataType):
self.json_obj = None # type: None
def __setitem__(self, key, value):
- # type: (str, TypeData) -> None
+ # type: (Text, TypeData) -> None
if self.initialized:
raise AttributeError
dict.__setitem__(self, key, value)
@@ -115,7 +119,7 @@ class ManifestData(ManifestDataType):
return rv
def type_by_path(self):
- # type: () -> Dict[Tuple[Text, ...], str]
+ # type: () -> Dict[Tuple[Text, ...], Text]
rv = {}
for item_type, item_data in iteritems(self):
for item in item_data:
@@ -123,26 +127,25 @@ class ManifestData(ManifestDataType):
return rv
-
class Manifest(object):
- def __init__(self, tests_root=None, url_base="/"):
- # type: (Optional[str], Text) -> None
+ def __init__(self, tests_root, url_base="/"):
+ # type: (Text, Text) -> None
assert url_base is not None
self._data = ManifestData(self) # type: ManifestData
- self.tests_root = tests_root # type: Optional[str]
+ self.tests_root = tests_root # type: Text
self.url_base = url_base # type: Text
def __iter__(self):
- # type: () -> Iterator[Tuple[str, Text, Set[ManifestItem]]]
+ # type: () -> Iterator[Tuple[Text, Text, Set[ManifestItem]]]
return self.itertypes()
def itertypes(self, *types):
- # type: (*str) -> Iterator[Tuple[str, Text, Set[ManifestItem]]]
+ # type: (*Text) -> Iterator[Tuple[Text, Text, Set[ManifestItem]]]
for item_type in (types or sorted(self._data.keys())):
for path in self._data[item_type]:
- str_path = os.sep.join(path)
+ rel_path = os.sep.join(path)
tests = self._data[item_type][path]
- yield item_type, str_path, tests
+ yield item_type, rel_path, tests
def iterpath(self, path):
# type: (Text) -> Iterable[ManifestItem]
@@ -166,7 +169,7 @@ class Manifest(object):
yield test
def update(self, tree, parallel=True):
- # type: (Iterable[Tuple[Union[SourceFile, bytes], bool]], bool) -> bool
+ # type: (Iterable[Tuple[Text, Optional[Text], bool]], bool) -> bool
"""Update the manifest given an iterable of items that make up the updated manifest.
The iterable must either generate tuples of the form (SourceFile, True) for paths
@@ -182,32 +185,42 @@ class Manifest(object):
data = self._data
types = data.type_by_path()
- deleted = set(types)
+ remaining_manifest_paths = set(types)
to_update = []
- for source_file_or_path, update in tree:
- if not update:
- assert isinstance(source_file_or_path, (binary_type, text_type))
- path = ensure_text(source_file_or_path)
- deleted.remove(tuple(path.split(os.path.sep)))
+ for path, file_hash, updated in tree:
+ path_parts = tuple(path.split(os.path.sep))
+ is_new = path_parts not in remaining_manifest_paths
+
+ if not updated and is_new:
+ # This is kind of a bandaid; if we ended up here the cache
+ # was invalid but we've been using it anyway. That's obviously
+ # bad; we should fix the underlying issue that we sometimes
+ # use an invalid cache. But at least this fixes the immediate
+ # problem
+ raise InvalidCacheError
+
+ if not updated:
+ remaining_manifest_paths.remove(path_parts)
else:
- assert not isinstance(source_file_or_path, (binary_type, text_type))
- source_file = source_file_or_path
- rel_path_parts = source_file.rel_path_parts
- assert isinstance(rel_path_parts, tuple)
+ assert self.tests_root is not None
+ source_file = SourceFile(self.tests_root,
+ path,
+ self.url_base,
+ file_hash)
- is_new = rel_path_parts not in deleted # type: bool
hash_changed = False # type: bool
if not is_new:
- deleted.remove(rel_path_parts)
- old_type = types[rel_path_parts]
- old_hash = data[old_type].hashes[rel_path_parts]
- file_hash = source_file.hash # type: Text
+ if file_hash is None:
+ file_hash = source_file.hash
+ remaining_manifest_paths.remove(path_parts)
+ old_type = types[path_parts]
+ old_hash = data[old_type].hashes[path_parts]
if old_hash != file_hash:
hash_changed = True
- del data[old_type][rel_path_parts]
+ del data[old_type][path_parts]
if is_new or hash_changed:
to_update.append(source_file)
@@ -238,9 +251,9 @@ class Manifest(object):
data[new_type][rel_path_parts] = manifest_items
data[new_type].hashes[rel_path_parts] = file_hash
- if deleted:
+ if remaining_manifest_paths:
changed = True
- for rel_path_parts in deleted:
+ for rel_path_parts in remaining_manifest_paths:
for test_data in itervalues(data):
if rel_path_parts in test_data:
del test_data[rel_path_parts]
@@ -274,7 +287,7 @@ class Manifest(object):
@classmethod
def from_json(cls, tests_root, obj, types=None, callee_owns_obj=False):
- # type: (str, Dict[Text, Any], Optional[Container[Text]], bool) -> Manifest
+ # type: (Text, Dict[Text, Any], Optional[Container[Text]], bool) -> Manifest
"""Load a manifest from a JSON object
This loads a manifest for a given local test_root path from an
@@ -311,19 +324,19 @@ class Manifest(object):
def load(tests_root, manifest, types=None):
- # type: (str, Union[IO[bytes], str], Optional[Container[Text]]) -> Optional[Manifest]
+ # type: (Text, Union[IO[bytes], Text], Optional[Container[Text]]) -> Optional[Manifest]
logger = get_logger()
logger.warning("Prefer load_and_update instead")
return _load(logger, tests_root, manifest, types)
-__load_cache = {} # type: Dict[str, Manifest]
+__load_cache = {} # type: Dict[Text, Manifest]
def _load(logger, # type: Logger
- tests_root, # type: str
- manifest, # type: Union[IO[bytes], str]
+ tests_root, # type: Text
+ manifest, # type: Union[IO[bytes], Text]
types=None, # type: Optional[Container[Text]]
allow_cached=True # type: bool
):
@@ -360,13 +373,13 @@ def _load(logger, # type: Logger
return rv
-def load_and_update(tests_root, # type: bytes
- manifest_path, # type: bytes
+def load_and_update(tests_root, # type: Union[Text, bytes]
+ manifest_path, # type: Union[Text, bytes]
url_base, # type: Text
update=True, # type: bool
rebuild=False, # type: bool
- metadata_path=None, # type: Optional[bytes]
- cache_root=None, # type: Optional[bytes]
+ metadata_path=None, # type: Optional[Union[Text, bytes]]
+ cache_root=None, # type: Optional[Union[Text, bytes]]
working_copy=True, # type: bool
types=None, # type: Optional[Container[Text]]
write_manifest=True, # type: bool
@@ -374,6 +387,43 @@ def load_and_update(tests_root, # type: bytes
parallel=True # type: bool
):
# type: (...) -> Manifest
+
+ # This function is now a facade for the purposes of type conversion, so that
+ # the external API can accept paths as text or (utf8) bytes, but internal
+ # functions always use Text.
+
+ metadata_path_text = ensure_text(metadata_path) if metadata_path is not None else None
+ cache_root_text = ensure_text(cache_root) if cache_root is not None else None
+
+ return _load_and_update(ensure_text(tests_root),
+ ensure_text(manifest_path),
+ url_base,
+ update=update,
+ rebuild=rebuild,
+ metadata_path=metadata_path_text,
+ cache_root=cache_root_text,
+ working_copy=working_copy,
+ types=types,
+ write_manifest=write_manifest,
+ allow_cached=allow_cached,
+ parallel=parallel)
+
+
+def _load_and_update(tests_root, # type: Text
+ manifest_path, # type: Text
+ url_base, # type: Text
+ update=True, # type: bool
+ rebuild=False, # type: bool
+ metadata_path=None, # type: Optional[Text]
+ cache_root=None, # type: Optional[Text]
+ working_copy=True, # type: bool
+ types=None, # type: Optional[Container[Text]]
+ write_manifest=True, # type: bool
+ allow_cached=True, # type: bool
+ parallel=True # type: bool
+ ):
+ # type: (...) -> Manifest
+
logger = get_logger()
manifest = None
@@ -399,9 +449,18 @@ def load_and_update(tests_root, # type: bytes
update = True
if rebuild or update:
- tree = vcs.get_tree(tests_root, manifest, manifest_path, cache_root,
- working_copy, rebuild)
- changed = manifest.update(tree, parallel)
+ for retry in range(2):
+ try:
+ tree = vcs.get_tree(tests_root, manifest, manifest_path, cache_root,
+ working_copy, rebuild)
+ changed = manifest.update(tree, parallel)
+ break
+ except InvalidCacheError:
+ logger.warning("Manifest cache was invalid, doing a complete rebuild")
+ rebuild = True
+ else:
+ # If we didn't break there was an error
+ raise
if write_manifest and changed:
write(manifest, manifest_path)
tree.dump_caches()
@@ -410,7 +469,7 @@ def load_and_update(tests_root, # type: bytes
def write(manifest, manifest_path):
- # type: (Manifest, bytes) -> None
+ # type: (Manifest, Text) -> None
dir_name = os.path.dirname(manifest_path)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
diff --git a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
index 524eb0bddb2..09316bd052c 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
@@ -2,7 +2,8 @@ import hashlib
import re
import os
from collections import deque
-from six import binary_type, ensure_text, iteritems, text_type
+from io import BytesIO
+from six import binary_type, iteritems, text_type
from six.moves.urllib.parse import urljoin
from fnmatch import fnmatch
@@ -10,7 +11,6 @@ MYPY = False
if MYPY:
# MYPY is set to True when run under Mypy.
from typing import Any
- from typing import AnyStr
from typing import BinaryIO
from typing import Callable
from typing import Deque
@@ -43,7 +43,7 @@ from .item import (ConformanceCheckerTest,
TestharnessTest,
VisualTest,
WebDriverSpecTest)
-from .utils import ContextManagerBytesIO, cached_property
+from .utils import cached_property
wd_pattern = "*.py"
js_meta_re = re.compile(br"//\s*META:\s*(\w*)=(.*)$")
@@ -185,22 +185,22 @@ def _parse_xml(f):
class SourceFile(object):
- parsers = {"html":_parse_html,
- "xhtml":_parse_xml,
- "svg":_parse_xml} # type: Dict[Text, Callable[[BinaryIO], ElementTree.ElementTree]]
+ parsers = {u"html":_parse_html,
+ u"xhtml":_parse_xml,
+ u"svg":_parse_xml} # type: Dict[Text, Callable[[BinaryIO], ElementTree.ElementTree]]
- root_dir_non_test = {"common"}
+ root_dir_non_test = {u"common"}
- dir_non_test = {"resources",
- "support",
- "tools"}
+ dir_non_test = {u"resources",
+ u"support",
+ u"tools"}
- dir_path_non_test = {("css21", "archive"),
- ("css", "CSS2", "archive"),
- ("css", "common")} # type: Set[Tuple[bytes, ...]]
+ dir_path_non_test = {(u"css21", u"archive"),
+ (u"css", u"CSS2", u"archive"),
+ (u"css", u"common")} # type: Set[Tuple[Text, ...]]
- def __init__(self, tests_root, rel_path_str, url_base, hash=None, contents=None):
- # type: (AnyStr, AnyStr, Text, Optional[Text], Optional[bytes]) -> None
+ def __init__(self, tests_root, rel_path, url_base, hash=None, contents=None):
+ # type: (Text, Text, Text, Optional[Text], Optional[bytes]) -> None
"""Object representing a file in a source tree.
:param tests_root: Path to the root of the source tree
@@ -209,7 +209,6 @@ class SourceFile(object):
:param contents: Byte array of the contents of the file or ``None``.
"""
- rel_path = ensure_text(rel_path_str)
assert not os.path.isabs(rel_path), rel_path
if os.name == "nt":
# do slash normalization on Windows
@@ -224,7 +223,7 @@ class SourceFile(object):
meta_flags = name.split(".")[1:]
- self.tests_root = ensure_text(tests_root) # type: Text
+ self.tests_root = tests_root # type: Text
self.rel_path = rel_path # type: Text
self.dir_path = dir_path # type: Text
self.filename = filename # type: Text
@@ -249,7 +248,7 @@ class SourceFile(object):
return rv
def name_prefix(self, prefix):
- # type: (bytes) -> bool
+ # type: (Text) -> bool
"""Check if the filename starts with a given prefix
:param prefix: The prefix to check"""
@@ -270,13 +269,8 @@ class SourceFile(object):
* the contents specified in the constructor, if any;
* a File object opened for reading the file contents.
"""
-
if self.contents is not None:
- wrapped = ContextManagerBytesIO(self.contents)
- if MYPY:
- file_obj = cast(BinaryIO, wrapped)
- else:
- file_obj = wrapped
+ file_obj = BytesIO(self.contents) # type: BinaryIO
else:
file_obj = open(self.path, 'rb')
return file_obj
@@ -337,11 +331,11 @@ class SourceFile(object):
"""Check if the file name matches the conditions for the file to
be a non-test file"""
return (self.is_dir() or
- self.name_prefix("MANIFEST") or
- self.filename == "META.yml" or
- self.filename.startswith(".") or
- self.filename.endswith(".headers") or
- self.filename.endswith(".ini") or
+ self.name_prefix(u"MANIFEST") or
+ self.filename == u"META.yml" or
+ self.filename.startswith(u".") or
+ self.filename.endswith(u".headers") or
+ self.filename.endswith(u".ini") or
self.in_non_test_dir())
@property
@@ -441,14 +435,14 @@ class SourceFile(object):
if not ext:
return None
- if ext[0] == ".":
+ if ext[0] == u".":
ext = ext[1:]
- if ext in ["html", "htm"]:
- return "html"
- if ext in ["xhtml", "xht", "xml"]:
- return "xhtml"
- if ext == "svg":
- return "svg"
+ if ext in [u"html", u"htm"]:
+ return u"html"
+ if ext in [u"xhtml", u"xht", u"xml"]:
+ return u"xhtml"
+ if ext == u"svg":
+ return u"svg"
return None
@cached_property
diff --git a/tests/wpt/web-platform-tests/tools/manifest/tests/test_manifest.py b/tests/wpt/web-platform-tests/tools/manifest/tests/test_manifest.py
index 2b42c023a58..26a8fdc1763 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/tests/test_manifest.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/tests/test_manifest.py
@@ -30,6 +30,7 @@ def SourceFileWithTest(path, hash, cls, **kwargs):
s.manifest_items = mock.Mock(return_value=(cls.item_type, [test]))
return s # type: ignore
+
def SourceFileWithTests(path, hash, cls, variants):
# type: (str, str, Type[item.URLManifestItem], **Any) -> sourcefile.SourceFile
rel_path_parts = tuple(path.split(os.path.sep))
@@ -41,6 +42,19 @@ def SourceFileWithTests(path, hash, cls, variants):
return s # type: ignore
+def tree_and_sourcefile_mocks(source_files):
+ paths_dict = {}
+ tree = []
+ for source_file, file_hash, updated in source_files:
+ paths_dict[source_file.rel_path] = source_file
+ tree.append([source_file.rel_path, file_hash, updated])
+
+ def MockSourceFile(tests_root, path, url_base, file_hash):
+ return paths_dict[path]
+
+ return tree, MockSourceFile
+
+
@hs.composite
def sourcefile_strategy(draw):
item_classes = [item.TestharnessTest, item.RefTest, item.PrintRefTest,
@@ -111,9 +125,11 @@ def manifest_tree(draw):
@h.settings(suppress_health_check=(h.HealthCheck.too_slow,))
@h.example([SourceFileWithTest("a", "0"*40, item.ConformanceCheckerTest)])
def test_manifest_to_json(s):
- m = manifest.Manifest()
+ m = manifest.Manifest("")
- assert m.update((item, True) for item in s) is True
+ tree, sourcefile_mock = tree_and_sourcefile_mocks((item, None, True) for item in s)
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ assert m.update(tree) is True
json_str = m.to_json()
loaded = manifest.Manifest.from_json("/", json_str)
@@ -129,23 +145,28 @@ def test_manifest_to_json(s):
@h.example([SourceFileWithTest("a", "0"*40, item.TestharnessTest)])
@h.example([SourceFileWithTest("a", "0"*40, item.RefTest, references=[("/aa", "==")])])
def test_manifest_idempotent(s):
- m = manifest.Manifest()
+ m = manifest.Manifest("")
- assert m.update((item, True) for item in s) is True
+ tree, sourcefile_mock = tree_and_sourcefile_mocks((item, None, True) for item in s)
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ assert m.update(tree) is True
m1 = list(m)
- assert m.update((item, True) for item in s) is False
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ assert m.update(tree) is False
assert list(m) == m1
def test_manifest_to_json_forwardslash():
- m = manifest.Manifest()
+ m = manifest.Manifest("")
s = SourceFileWithTest("a" + os.path.sep + "b", "0"*40, item.TestharnessTest)
- assert m.update([(s, True)]) is True
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s, None, True)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ assert m.update(tree) is True
assert m.to_json() == {
'version': 8,
@@ -159,14 +180,15 @@ def test_manifest_to_json_forwardslash():
}
-
def test_reftest_computation_chain():
- m = manifest.Manifest()
+ m = manifest.Manifest("")
s1 = SourceFileWithTest("test1", "0"*40, item.RefTest, references=[("/test2", "==")])
s2 = SourceFileWithTest("test2", "0"*40, item.RefTest, references=[("/test3", "==")])
- m.update([(s1, True), (s2, True)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s1, None, True), (s2, None, True)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
test1 = s1.manifest_items()[1][0]
test2 = s2.manifest_items()[1][0]
@@ -176,13 +198,16 @@ def test_reftest_computation_chain():
def test_iterpath():
- m = manifest.Manifest()
+ m = manifest.Manifest("")
sources = [SourceFileWithTest("test1", "0"*40, item.RefTest, references=[("/test1-ref", "==")]),
SourceFileWithTests("test2", "1"*40, item.TestharnessTest, [("test2-1.html", {}),
("test2-2.html", {})]),
SourceFileWithTest("test3", "0"*40, item.TestharnessTest)]
- m.update([(s, True) for s in sources])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks((item, None, True) for item in sources)
+ assert len(tree) == len(sources)
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
assert {item.url for item in m.iterpath("test2")} == {"/test2-1.html",
"/test2-2.html"}
@@ -190,12 +215,14 @@ def test_iterpath():
def test_no_update():
- m = manifest.Manifest()
+ m = manifest.Manifest("")
s1 = SourceFileWithTest("test1", "0"*40, item.TestharnessTest)
s2 = SourceFileWithTest("test2", "0"*40, item.TestharnessTest)
- m.update([(s1, True), (s2, True)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks((item, None, True) for item in [s1, s2])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
test1 = s1.manifest_items()[1][0]
test2 = s2.manifest_items()[1][0]
@@ -205,7 +232,9 @@ def test_no_update():
s1_1 = SourceFileWithTest("test1", "1"*40, item.ManualTest)
- m.update([(s1_1, True), (s2.rel_path, False)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s1_1, None, True), (s2, None, False)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
test1_1 = s1_1.manifest_items()[1][0]
@@ -214,32 +243,40 @@ def test_no_update():
def test_no_update_delete():
- m = manifest.Manifest()
+ m = manifest.Manifest("")
s1 = SourceFileWithTest("test1", "0"*40, item.TestharnessTest)
s2 = SourceFileWithTest("test2", "0"*40, item.TestharnessTest)
- m.update([(s1, True), (s2, True)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s1, None, True), (s2, None, True)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
test1 = s1.manifest_items()[1][0]
- m.update([(s1.rel_path, False)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s1, None, False)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
assert list(m) == [("testharness", test1.path, {test1})]
def test_update_from_json():
- m = manifest.Manifest()
+ m = manifest.Manifest("")
s1 = SourceFileWithTest("test1", "0"*40, item.TestharnessTest)
s2 = SourceFileWithTest("test2", "0"*40, item.TestharnessTest)
- m.update([(s1, True), (s2, True)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s1, None, True), (s2, None, True)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
json_str = m.to_json()
m = manifest.Manifest.from_json("/", json_str)
- m.update([(s1, True)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s1, None, True)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
test1 = s1.manifest_items()[1][0]
@@ -248,9 +285,11 @@ def test_update_from_json():
def test_update_from_json_modified():
# Create the original manifest
- m = manifest.Manifest()
+ m = manifest.Manifest("")
s1 = SourceFileWithTest("test1", "0"*40, item.TestharnessTest)
- m.update([(s1, True)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s1, None, True)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
json_str = m.to_json()
# Reload it from JSON
@@ -258,7 +297,9 @@ def test_update_from_json_modified():
# Update it with timeout="long"
s2 = SourceFileWithTest("test1", "1"*40, item.TestharnessTest, timeout="long")
- m.update([(s2, True)])
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s2, None, True)])
+ with mock.patch("tools.manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
json_str = m.to_json()
assert json_str == {
'items': {'testharness': {'test1': [
diff --git a/tests/wpt/web-platform-tests/tools/manifest/utils.py b/tests/wpt/web-platform-tests/tools/manifest/utils.py
index aefc2c94f40..36c1a983101 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/utils.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/utils.py
@@ -2,16 +2,12 @@ import os
import platform
import subprocess
-from six import BytesIO
-
MYPY = False
if MYPY:
# MYPY is set to True when run under Mypy.
from typing import Text
from typing import Callable
- from typing import AnyStr
from typing import Any
- from typing import BinaryIO
from typing import Generic
from typing import TypeVar
from typing import Optional
@@ -22,72 +18,62 @@ else:
T = object()
Generic[T] = object
+
def rel_path_to_url(rel_path, url_base="/"):
- # type: (bytes, Text) -> Text
+ # type: (Text, Text) -> Text
assert not os.path.isabs(rel_path), rel_path
- if url_base[0] != "/":
- url_base = "/" + url_base
- if url_base[-1] != "/":
- url_base += "/"
- return url_base + rel_path.replace(os.sep, "/")
+ if url_base[0] != u"/":
+ url_base = u"/" + url_base
+ if url_base[-1] != u"/":
+ url_base += u"/"
+ return url_base + rel_path.replace(os.sep, u"/")
def from_os_path(path):
- # type: (AnyStr) -> AnyStr
- assert os.path.sep == "/" or platform.system() == "Windows"
- if "/" == os.path.sep:
+ # type: (Text) -> Text
+ assert os.path.sep == u"/" or platform.system() == "Windows"
+ if u"/" == os.path.sep:
rv = path
else:
- rv = path.replace(os.path.sep, "/")
- if "\\" in rv:
+ rv = path.replace(os.path.sep, u"/")
+ if u"\\" in rv:
raise ValueError("path contains \\ when separator is %s" % os.path.sep)
return rv
def to_os_path(path):
- # type: (AnyStr) -> AnyStr
- assert os.path.sep == "/" or platform.system() == "Windows"
- if "\\" in path:
+ # type: (Text) -> Text
+ assert os.path.sep == u"/" or platform.system() == "Windows"
+ if u"\\" in path:
raise ValueError("normalised path contains \\")
- if "/" == os.path.sep:
+ if u"/" == os.path.sep:
return path
- return path.replace("/", os.path.sep)
+ return path.replace(u"/", os.path.sep)
def git(path):
- # type: (bytes) -> Optional[Callable[..., Text]]
+ # type: (Text) -> Optional[Callable[..., Text]]
def gitfunc(cmd, *args):
- # type: (bytes, *bytes) -> Text
- full_cmd = ["git", cmd] + list(args)
+ # type: (Text, *Text) -> Text
+ full_cmd = [u"git", cmd] + list(args)
try:
return subprocess.check_output(full_cmd, cwd=path, stderr=subprocess.STDOUT).decode('utf8')
except Exception as e:
if platform.uname()[0] == "Windows" and isinstance(e, WindowsError):
- full_cmd[0] = "git.bat"
+ full_cmd[0] = u"git.bat"
return subprocess.check_output(full_cmd, cwd=path, stderr=subprocess.STDOUT).decode('utf8')
else:
raise
try:
# this needs to be a command that fails if we aren't in a git repo
- gitfunc("rev-parse", "--show-toplevel")
+ gitfunc(u"rev-parse", u"--show-toplevel")
except (subprocess.CalledProcessError, OSError):
return None
else:
return gitfunc
-class ContextManagerBytesIO(BytesIO): # type: ignore
- def __enter__(self):
- # type: () -> BinaryIO
- return self # type: ignore
-
- def __exit__(self, *args, **kwargs):
- # type: (*Any, **Any) -> bool
- self.close()
- return True
-
-
class cached_property(Generic[T]):
def __init__(self, func):
# type: (Callable[[Any], T]) -> None
diff --git a/tests/wpt/web-platform-tests/tools/manifest/vcs.py b/tests/wpt/web-platform-tests/tools/manifest/vcs.py
index 7c0feeb8164..80c0512807a 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/vcs.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/vcs.py
@@ -7,7 +7,6 @@ from collections import MutableMapping
from six import with_metaclass, PY2
-from .sourcefile import SourceFile
from .utils import git
try:
@@ -20,7 +19,7 @@ except ValueError:
MYPY = False
if MYPY:
# MYPY is set to True when run under Mypy.
- from typing import Dict, Optional, List, Set, Text, Iterable, Any, Tuple, Union, Iterator
+ from typing import Dict, Optional, List, Set, Text, Iterable, Any, Tuple, Iterator
from .manifest import Manifest # cyclic import under MYPY guard
if PY2:
stat_result = Any
@@ -30,10 +29,10 @@ if MYPY:
def get_tree(tests_root, manifest, manifest_path, cache_root,
working_copy=True, rebuild=False):
- # type: (bytes, Manifest, Optional[bytes], Optional[bytes], bool, bool) -> FileSystem
+ # type: (Text, Manifest, Optional[Text], Optional[Text], bool, bool) -> FileSystem
tree = None
if cache_root is None:
- cache_root = os.path.join(tests_root, ".wptcache")
+ cache_root = os.path.join(tests_root, u".wptcache")
if not os.path.exists(cache_root):
try:
os.makedirs(cache_root)
@@ -54,7 +53,7 @@ def get_tree(tests_root, manifest, manifest_path, cache_root,
class GitHasher(object):
def __init__(self, path):
- # type: (bytes) -> None
+ # type: (Text) -> None
self.git = git(path)
def _local_changes(self):
@@ -90,37 +89,39 @@ class GitHasher(object):
class FileSystem(object):
- def __init__(self, root, url_base, cache_path, manifest_path=None, rebuild=False):
- # type: (bytes, Text, Optional[bytes], Optional[bytes], bool) -> None
- self.root = os.path.abspath(root)
+ def __init__(self, tests_root, url_base, cache_path, manifest_path=None, rebuild=False):
+ # type: (Text, Text, Optional[Text], Optional[Text], bool) -> None
+ self.tests_root = tests_root
self.url_base = url_base
self.ignore_cache = None
self.mtime_cache = None
+ tests_root_bytes = tests_root.encode("utf8")
if cache_path is not None:
if manifest_path is not None:
- self.mtime_cache = MtimeCache(cache_path, root, manifest_path, rebuild)
- if gitignore.has_ignore(root):
- self.ignore_cache = GitIgnoreCache(cache_path, root, rebuild)
- self.path_filter = gitignore.PathFilter(self.root,
- extras=[".git/"],
+ self.mtime_cache = MtimeCache(cache_path, tests_root, manifest_path, rebuild)
+ if gitignore.has_ignore(tests_root_bytes):
+ self.ignore_cache = GitIgnoreCache(cache_path, tests_root, rebuild)
+ self.path_filter = gitignore.PathFilter(tests_root_bytes,
+ extras=[b".git/"],
cache=self.ignore_cache)
- git = GitHasher(root)
+ git = GitHasher(tests_root)
if git is not None:
self.hash_cache = git.hash_cache()
else:
self.hash_cache = {}
def __iter__(self):
- # type: () -> Iterator[Tuple[Union[bytes, SourceFile], bool]]
+ # type: () -> Iterator[Tuple[Text, Optional[Text], bool]]
mtime_cache = self.mtime_cache
- for dirpath, dirnames, filenames in self.path_filter(walk(self.root)):
+ for dirpath, dirnames, filenames in self.path_filter(
+ walk(self.tests_root.encode("utf8"))):
for filename, path_stat in filenames:
- path = os.path.join(dirpath, filename)
+ path = os.path.join(dirpath, filename).decode("utf8")
if mtime_cache is None or mtime_cache.updated(path, path_stat):
- hash = self.hash_cache.get(path, None)
- yield SourceFile(self.root, path, self.url_base, hash), True
+ file_hash = self.hash_cache.get(path, None)
+ yield path, file_hash, True
else:
- yield path, False
+ yield path, None, False
def dump_caches(self):
# type: () -> None
@@ -131,7 +132,7 @@ class FileSystem(object):
class CacheFile(with_metaclass(abc.ABCMeta)):
def __init__(self, cache_root, tests_root, rebuild=False):
- # type: (bytes, bytes, bool) -> None
+ # type: (Text, Text, bool) -> None
self.tests_root = tests_root
if not os.path.exists(cache_root):
os.makedirs(cache_root)
@@ -141,7 +142,7 @@ class CacheFile(with_metaclass(abc.ABCMeta)):
@abc.abstractproperty
def file_name(self):
- # type: () -> bytes
+ # type: () -> Text
pass
def dump(self):
@@ -152,8 +153,8 @@ class CacheFile(with_metaclass(abc.ABCMeta)):
json.dump(self.data, f, indent=1)
def load(self, rebuild=False):
- # type: (bool) -> Dict[Any, Any]
- data = {} # type: Dict[Any, Any]
+ # type: (bool) -> Dict[Text, Any]
+ data = {} # type: Dict[Text, Any]
try:
if not rebuild:
with open(self.path, 'r') as f:
@@ -167,22 +168,22 @@ class CacheFile(with_metaclass(abc.ABCMeta)):
return data
def check_valid(self, data):
- # type: (Dict[Any, Any]) -> Dict[Any, Any]
+ # type: (Dict[Text, Any]) -> Dict[Text, Any]
"""Check if the cached data is valid and return an updated copy of the
cache containing only data that can be used."""
return data
class MtimeCache(CacheFile):
- file_name = "mtime.json"
+ file_name = u"mtime.json"
def __init__(self, cache_root, tests_root, manifest_path, rebuild=False):
- # type: (bytes, bytes, bytes, bool) -> None
+ # type: (Text, Text, Text, bool) -> None
self.manifest_path = manifest_path
super(MtimeCache, self).__init__(cache_root, tests_root, rebuild)
def updated(self, rel_path, stat):
- # type: (bytes, stat_result) -> bool
+ # type: (Text, stat_result) -> bool
"""Return a boolean indicating whether the file changed since the cache was last updated.
This implicitly updates the cache with the new mtime data."""
@@ -195,12 +196,12 @@ class MtimeCache(CacheFile):
def check_valid(self, data):
# type: (Dict[Any, Any]) -> Dict[Any, Any]
- if data.get("/tests_root") != self.tests_root:
+ if data.get(u"/tests_root") != self.tests_root:
self.modified = True
else:
if self.manifest_path is not None and os.path.exists(self.manifest_path):
mtime = os.path.getmtime(self.manifest_path)
- if data.get("/manifest_path") != [self.manifest_path, mtime]:
+ if data.get(u"/manifest_path") != [self.manifest_path, mtime]:
self.modified = True
else:
self.modified = True
@@ -228,10 +229,10 @@ class GitIgnoreCache(CacheFile, MutableMapping): # type: ignore
# type: (Dict[Any, Any]) -> Dict[Any, Any]
ignore_path = os.path.join(self.tests_root, ".gitignore")
mtime = os.path.getmtime(ignore_path)
- if data.get("/gitignore_file") != [ignore_path, mtime]:
+ if data.get(u"/gitignore_file") != [ignore_path, mtime]:
self.modified = True
data = {}
- data["/gitignore_file"] = [ignore_path, mtime]
+ data[u"/gitignore_file"] = [ignore_path, mtime]
return data
def __contains__(self, key):
@@ -239,23 +240,23 @@ class GitIgnoreCache(CacheFile, MutableMapping): # type: ignore
return key in self.data
def __getitem__(self, key):
- # type: (bytes) -> bool
+ # type: (Text) -> bool
v = self.data[key]
assert isinstance(v, bool)
return v
def __setitem__(self, key, value):
- # type: (bytes, bool) -> None
+ # type: (Text, bool) -> None
if self.data.get(key) != value:
self.modified = True
self.data[key] = value
def __delitem__(self, key):
- # type: (bytes) -> None
+ # type: (Text) -> None
del self.data[key]
def __iter__(self):
- # type: () -> Iterator[bytes]
+ # type: () -> Iterator[Text]
return iter(self.data)
def __len__(self):
@@ -286,7 +287,7 @@ def walk(root):
relpath = os.path.relpath
root = os.path.abspath(root)
- stack = deque([(root, "")])
+ stack = deque([(root, b"")])
while stack:
dir_path, rel_path = stack.popleft()
diff --git a/tests/wpt/web-platform-tests/tools/pytest.ini b/tests/wpt/web-platform-tests/tools/pytest.ini
index 140ce236ffd..c1e428d0717 100644
--- a/tests/wpt/web-platform-tests/tools/pytest.ini
+++ b/tests/wpt/web-platform-tests/tools/pytest.ini
@@ -1,5 +1,7 @@
[pytest]
-norecursedirs = .* {arch} *.egg html5lib third_party pywebsocket six wave wpt wptrunner
+# Directories with their own tox.ini: wave, wpt, wptrunner
+# Python 3 only: quic (it should have its own tox.ini eventually)
+norecursedirs = .* {arch} *.egg third_party wave wpt wptrunner quic
xfail_strict = true
addopts = --strict-markers
markers =
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/RECORD b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/RECORD
deleted file mode 100644
index e57665c9964..00000000000
--- a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/RECORD
+++ /dev/null
@@ -1,8 +0,0 @@
-six-1.13.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-six-1.13.0.dist-info/LICENSE,sha256=t1KbjAcXGniow2wyg5BVKOSBKUXZd9El65JujMvyRbY,1066
-six-1.13.0.dist-info/METADATA,sha256=hxS4rSPRfO8ewbcLS30anoFi6LFgUQ3mk_xknZ8RV4w,1940
-six-1.13.0.dist-info/RECORD,,
-six-1.13.0.dist-info/WHEEL,sha256=8T8fxefr_r-A79qbOJ9d_AaEgkpCGmEPHc-gpCq5BRg,110
-six-1.13.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4
-six.py,sha256=o9WHO8utWGayNhNqDmNqPdQsQair5RaRWjL_8IYf1qw,33051
-six.pyc,,
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/INSTALLER b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/INSTALLER
index a1b589e38a3..a1b589e38a3 100644
--- a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/INSTALLER
+++ b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/INSTALLER
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/LICENSE b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/LICENSE
index 4b05a545261..de6633112c1 100644
--- a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/LICENSE
+++ b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2019 Benjamin Peterson
+Copyright (c) 2010-2020 Benjamin Peterson
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/METADATA b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/METADATA
index b0c8f51e1f3..869bf25a884 100644
--- a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/METADATA
+++ b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: six
-Version: 1.13.0
+Version: 1.15.0
Summary: Python 2 and 3 compatibility utilities
Home-page: https://github.com/benjaminp/six
Author: Benjamin Peterson
@@ -14,7 +14,7 @@ Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Utilities
-Requires-Python: >=2.6, !=3.0.*, !=3.1.*
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
.. image:: https://img.shields.io/pypi/v/six.svg
:target: https://pypi.org/project/six/
@@ -37,7 +37,7 @@ for smoothing over the differences between the Python versions with the goal of
writing Python code that is compatible on both Python versions. See the
documentation for more information on what is provided.
-Six supports every Python version since 2.6. It is contained in only one Python
+Six supports Python 2.7 and 3.3+. It is contained in only one Python
file, so it can be easily copied into your project. (The copyright and license
notice must be retained.)
@@ -46,7 +46,4 @@ Online documentation is at https://six.readthedocs.io/.
Bugs can be reported to https://github.com/benjaminp/six. The code can also
be found there.
-For questions about six or porting in general, email the python-porting mailing
-list: https://mail.python.org/mailman/listinfo/python-porting
-
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/RECORD b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/RECORD
new file mode 100644
index 00000000000..d9754c61c4d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/RECORD
@@ -0,0 +1,8 @@
+six-1.15.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+six-1.15.0.dist-info/LICENSE,sha256=i7hQxWWqOJ_cFvOkaWWtI9gq3_YPI5P8J2K2MYXo5sk,1066
+six-1.15.0.dist-info/METADATA,sha256=W6rlyoeMZHXh6srP9NXNsm0rjAf_660re8WdH5TBT8E,1795
+six-1.15.0.dist-info/RECORD,,
+six-1.15.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
+six-1.15.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4
+six.py,sha256=U4Z_yv534W5CNyjY9i8V1OXY2SjAny8y2L5vDLhhThM,34159
+six.pyc,,
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/WHEEL b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/WHEEL
index 10012355333..ef99c6cf328 100644
--- a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/WHEEL
+++ b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/WHEEL
@@ -1,5 +1,5 @@
Wheel-Version: 1.0
-Generator: bdist_wheel (0.32.1)
+Generator: bdist_wheel (0.34.2)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/top_level.txt b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/top_level.txt
index ffe2fce4989..ffe2fce4989 100644
--- a/tests/wpt/web-platform-tests/tools/third_party/six/six-1.13.0.dist-info/top_level.txt
+++ b/tests/wpt/web-platform-tests/tools/third_party/six/six-1.15.0.dist-info/top_level.txt
diff --git a/tests/wpt/web-platform-tests/tools/third_party/six/six.py b/tests/wpt/web-platform-tests/tools/third_party/six/six.py
index d0aece89fa4..83f69783d1a 100644
--- a/tests/wpt/web-platform-tests/tools/third_party/six/six.py
+++ b/tests/wpt/web-platform-tests/tools/third_party/six/six.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2010-2019 Benjamin Peterson
+# Copyright (c) 2010-2020 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -29,7 +29,7 @@ import sys
import types
__author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.13.0"
+__version__ = "1.15.0"
# Useful for very coarse version differentiation.
@@ -259,7 +259,7 @@ _moved_attributes = [
MovedModule("copyreg", "copy_reg"),
MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
- MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+ MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"),
MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
MovedModule("http_cookies", "Cookie", "http.cookies"),
MovedModule("html_entities", "htmlentitydefs", "html.entities"),
@@ -644,9 +644,11 @@ if PY3:
if sys.version_info[1] <= 1:
_assertRaisesRegex = "assertRaisesRegexp"
_assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
else:
_assertRaisesRegex = "assertRaisesRegex"
_assertRegex = "assertRegex"
+ _assertNotRegex = "assertNotRegex"
else:
def b(s):
return s
@@ -668,6 +670,7 @@ else:
_assertCountEqual = "assertItemsEqual"
_assertRaisesRegex = "assertRaisesRegexp"
_assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")
@@ -684,6 +687,10 @@ def assertRegex(self, *args, **kwargs):
return getattr(self, _assertRegex)(*args, **kwargs)
+def assertNotRegex(self, *args, **kwargs):
+ return getattr(self, _assertNotRegex)(*args, **kwargs)
+
+
if PY3:
exec_ = getattr(moves.builtins, "exec")
@@ -719,16 +726,7 @@ else:
""")
-if sys.version_info[:2] == (3, 2):
- exec_("""def raise_from(value, from_value):
- try:
- if from_value is None:
- raise value
- raise value from from_value
- finally:
- value = None
-""")
-elif sys.version_info[:2] > (3, 2):
+if sys.version_info[:2] > (3,):
exec_("""def raise_from(value, from_value):
try:
raise value from from_value
@@ -808,13 +806,33 @@ if sys.version_info[:2] < (3, 3):
_add_doc(reraise, """Reraise an exception.""")
if sys.version_info[0:2] < (3, 4):
+ # This does exactly the same what the :func:`py3:functools.update_wrapper`
+ # function does on Python versions after 3.2. It sets the ``__wrapped__``
+ # attribute on ``wrapper`` object and it doesn't raise an error if any of
+ # the attributes mentioned in ``assigned`` and ``updated`` are missing on
+ # ``wrapped`` object.
+ def _update_wrapper(wrapper, wrapped,
+ assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ for attr in assigned:
+ try:
+ value = getattr(wrapped, attr)
+ except AttributeError:
+ continue
+ else:
+ setattr(wrapper, attr, value)
+ for attr in updated:
+ getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+ wrapper.__wrapped__ = wrapped
+ return wrapper
+ _update_wrapper.__doc__ = functools.update_wrapper.__doc__
+
def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
updated=functools.WRAPPER_UPDATES):
- def wrapper(f):
- f = functools.wraps(wrapped, assigned, updated)(f)
- f.__wrapped__ = wrapped
- return f
- return wrapper
+ return functools.partial(_update_wrapper, wrapped=wrapped,
+ assigned=assigned, updated=updated)
+ wraps.__doc__ = functools.wraps.__doc__
+
else:
wraps = functools.wraps
@@ -872,12 +890,11 @@ def ensure_binary(s, encoding='utf-8', errors='strict'):
- `str` -> encoded to `bytes`
- `bytes` -> `bytes`
"""
+ if isinstance(s, binary_type):
+ return s
if isinstance(s, text_type):
return s.encode(encoding, errors)
- elif isinstance(s, binary_type):
- return s
- else:
- raise TypeError("not expecting type '%s'" % type(s))
+ raise TypeError("not expecting type '%s'" % type(s))
def ensure_str(s, encoding='utf-8', errors='strict'):
@@ -891,12 +908,15 @@ def ensure_str(s, encoding='utf-8', errors='strict'):
- `str` -> `str`
- `bytes` -> decoded to `str`
"""
- if not isinstance(s, (text_type, binary_type)):
- raise TypeError("not expecting type '%s'" % type(s))
+ # Optimization: Fast return for the common case.
+ if type(s) is str:
+ return s
if PY2 and isinstance(s, text_type):
- s = s.encode(encoding, errors)
+ return s.encode(encoding, errors)
elif PY3 and isinstance(s, binary_type):
- s = s.decode(encoding, errors)
+ return s.decode(encoding, errors)
+ elif not isinstance(s, (text_type, binary_type)):
+ raise TypeError("not expecting type '%s'" % type(s))
return s
@@ -919,7 +939,6 @@ def ensure_text(s, encoding='utf-8', errors='strict'):
raise TypeError("not expecting type '%s'" % type(s))
-
def python_2_unicode_compatible(klass):
"""
A class decorator that defines __unicode__ and __str__ methods under Python 2.
diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini
index bbec1afbb6d..45358c081ef 100644
--- a/tests/wpt/web-platform-tests/tools/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py27,py35,py36,py37,py38,{py27,py35,py36,py37,py38}-flake8,{py35,py36,py37,py38}-mypy
+envlist = py27,py35,py36,py37,py38,{py27,py35,py36,py37,py38}-flake8,py38-mypy2,{py35,py38}-mypy3
skipsdist=True
skip_missing_interpreters = False
@@ -42,26 +42,20 @@ commands = flake8 --append-config={toxinidir}/py3-flake8.ini {posargs}
deps = -rrequirements_flake8.txt
commands = flake8 --append-config={toxinidir}/py3-flake8.ini {posargs}
-[testenv:py35-mypy]
+[testenv:py38-mypy2]
deps = -rrequirements_mypy.txt
changedir = {toxinidir}/..
commands =
mypy --config-file={toxinidir}/mypy.ini --no-incremental --py2 -p tools.manifest -p tools.lint -p tools.gitignore
-[testenv:py36-mypy]
+[testenv:py35-mypy3]
deps = -rrequirements_mypy.txt
changedir = {toxinidir}/..
commands =
- mypy --config-file={toxinidir}/mypy.ini --no-incremental --py2 -p tools.manifest -p tools.lint -p tools.gitignore
+ mypy --config-file={toxinidir}/mypy.ini --no-incremental -p tools.manifest -p tools.lint -p tools.gitignore
-[testenv:py37-mypy]
+[testenv:py38-mypy3]
deps = -rrequirements_mypy.txt
changedir = {toxinidir}/..
commands =
- mypy --config-file={toxinidir}/mypy.ini --no-incremental --py2 -p tools.manifest -p tools.lint -p tools.gitignore
-
-[testenv:py38-mypy]
-deps = -rrequirements_mypy.txt
-changedir = {toxinidir}/..
-commands =
- mypy --config-file={toxinidir}/mypy.ini --no-incremental --py2 -p tools.manifest -p tools.lint -p tools.gitignore
+ mypy --config-file={toxinidir}/mypy.ini --no-incremental -p tools.manifest -p tools.lint -p tools.gitignore
diff --git a/tests/wpt/web-platform-tests/tools/wpt/revlist.py b/tests/wpt/web-platform-tests/tools/wpt/revlist.py
index 1893fdefa83..bd85612e2c2 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/revlist.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/revlist.py
@@ -33,19 +33,22 @@ def parse_epoch(string):
def get_tagged_revisions(pattern):
- # type: (bytes) -> List[..., Dict]
+ # type: (Text) -> List[..., Dict]
'''
Returns the tagged revisions indexed by the committer date.
'''
git = get_git_cmd(wpt_root)
args = [
pattern,
- '--sort=-committerdate',
- '--format=%(refname:lstrip=2) %(objectname) %(committerdate:raw)',
- '--count=100000'
+ u'--sort=-committerdate',
+ u'--format=%(refname:lstrip=2) %(objectname) %(committerdate:raw)',
+ u'--count=100000'
]
- for line in git("for-each-ref", *args).splitlines():
- tag, commit, date, _ = line.split(" ")
+ ref_list = git(u"for-each-ref", *args)
+ for line in ref_list.splitlines():
+ if not line:
+ continue
+ tag, commit, date, _ = line.split(u" ")
date = int(date)
yield tag, commit, date
@@ -81,7 +84,7 @@ def get_epoch_revisions(epoch, until, max_count):
# Expected result: N,M,K,J,H,G,F,C,A
cutoff_date = calculate_cutoff_date(until, epoch, epoch_offset)
- for _, commit, date in get_tagged_revisions("refs/tags/merge_pr_*"):
+ for _, commit, date in get_tagged_revisions(u"refs/tags/merge_pr_*"):
if count >= max_count:
return
if date < cutoff_date:
diff --git a/tests/wpt/web-platform-tests/tools/wpt/testfiles.py b/tests/wpt/web-platform-tests/tools/wpt/testfiles.py
index f2960e8f51e..c990aa21a65 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/testfiles.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/testfiles.py
@@ -2,15 +2,14 @@ import argparse
import logging
import os
import re
-import subprocess
import sys
-import six
from collections import OrderedDict
-from six import iteritems
+from six import ensure_text, ensure_str, iteritems
try:
from ..manifest import manifest
+ from ..manifest.utils import git as get_git_cmd
except ValueError:
# if we're not within the tools package, the above is an import from above
# the top-level which raises ValueError, so reimport it with an absolute
@@ -20,12 +19,12 @@ except ValueError:
# paths set up correctly to handle both and MYPY has no knowledge of our
# sys.path magic
from manifest import manifest # type: ignore
+ from manifest.utils import git as get_git_cmd # type: ignore
MYPY = False
if MYPY:
# MYPY is set to True when run under Mypy.
from typing import Any
- from typing import Callable
from typing import Dict
from typing import Iterable
from typing import List
@@ -35,30 +34,13 @@ if MYPY:
from typing import Set
from typing import Text
from typing import Tuple
- from typing import Union
-here = os.path.dirname(__file__)
+here = ensure_text(os.path.dirname(__file__))
wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
logger = logging.getLogger()
-def get_git_cmd(repo_path):
- # type: (bytes) -> Callable[..., Text]
- """Create a function for invoking git commands as a subprocess."""
- def git(cmd, *args):
- # type: (Text, *Union[bytes, Text]) -> Text
- full_cmd = [u"git", cmd] + list(item.decode("utf8") if isinstance(item, bytes) else item for item in args) # type: List[Text]
- try:
- logger.debug(" ".join(full_cmd))
- return subprocess.check_output(full_cmd, cwd=repo_path).decode("utf8").strip()
- except subprocess.CalledProcessError as e:
- logger.critical("Git command exited with status %i" % e.returncode)
- logger.critical(e.output)
- sys.exit(1)
- return git
-
-
def display_branch_point():
# type: () -> None
print(branch_point())
@@ -67,6 +49,9 @@ def display_branch_point():
def branch_point():
# type: () -> Optional[Text]
git = get_git_cmd(wpt_root)
+ if git is None:
+ raise Exception("git not found")
+
if (os.environ.get("GITHUB_PULL_REQUEST", "false") == "false" and
os.environ.get("GITHUB_BRANCH") == "master"):
# For builds on the master branch just return the HEAD commit
@@ -86,7 +71,7 @@ def branch_point():
# get everything in refs/heads and refs/remotes that doesn't include HEAD
not_heads = [item for item in git("rev-parse", "--not", "--branches", "--remotes").split("\n")
- if item != "^%s" % head]
+ if item and item != "^%s" % head]
# get all commits on HEAD but not reachable from anything in not_heads
commits = git("rev-list", "--topo-order", "--parents", "HEAD", *not_heads)
@@ -130,28 +115,33 @@ def branch_point():
logger.debug("Using first commit on another branch as the branch point")
logger.debug("Branch point from master: %s" % branch_point)
+ if branch_point:
+ branch_point = branch_point.strip()
return branch_point
def compile_ignore_rule(rule):
- # type: (str) -> Pattern[str]
- rule = rule.replace(os.path.sep, "/")
- parts = rule.split("/")
+ # type: (Text) -> Pattern[Text]
+ rule = rule.replace(ensure_text(os.path.sep), u"/")
+ parts = rule.split(u"/")
re_parts = []
for part in parts:
- if part.endswith("**"):
- re_parts.append(re.escape(part[:-2]) + ".*")
- elif part.endswith("*"):
- re_parts.append(re.escape(part[:-1]) + "[^/]*")
+ if part.endswith(u"**"):
+ re_parts.append(re.escape(part[:-2]) + u".*")
+ elif part.endswith(u"*"):
+ re_parts.append(re.escape(part[:-1]) + u"[^/]*")
else:
re_parts.append(re.escape(part))
- return re.compile("^%s$" % "/".join(re_parts))
+ return re.compile(u"^%s$" % u"/".join(re_parts))
def repo_files_changed(revish, include_uncommitted=False, include_new=False):
- # type: (str, bool, bool) -> Set[Text]
+ # type: (Text, bool, bool) -> Set[Text]
git = get_git_cmd(wpt_root)
- files_list = git("diff", "--name-only", "-z", revish).split("\0")
+ if git is None:
+ raise Exception("git not found")
+
+ files_list = git("diff", "--name-only", "-z", revish).split(u"\0")
assert not files_list[-1]
files = set(files_list[:-1])
@@ -175,7 +165,7 @@ def repo_files_changed(revish, include_uncommitted=False, include_new=False):
def exclude_ignored(files, ignore_rules):
- # type: (Iterable[Text], Optional[Sequence[str]]) -> Tuple[List[Text], List[Text]]
+ # type: (Iterable[Text], Optional[Sequence[Text]]) -> Tuple[List[Text], List[Text]]
if ignore_rules is None:
ignore_rules = []
compiled_ignore_rules = [compile_ignore_rule(item) for item in ignore_rules]
@@ -195,8 +185,8 @@ def exclude_ignored(files, ignore_rules):
return changed, ignored
-def files_changed(revish, # type: str
- ignore_rules=None, # type: Optional[Sequence[str]]
+def files_changed(revish, # type: Text
+ ignore_rules=None, # type: Optional[Sequence[Text]]
include_uncommitted=False, # type: bool
include_new=False # type: bool
):
@@ -217,29 +207,29 @@ def files_changed(revish, # type: str
def _in_repo_root(full_path):
- # type: (Union[bytes, Text]) -> bool
+ # type: (Text) -> bool
rel_path = os.path.relpath(full_path, wpt_root)
path_components = rel_path.split(os.sep)
return len(path_components) < 2
def load_manifest(manifest_path=None, manifest_update=True):
- # type: (Optional[str], bool) -> manifest.Manifest
+ # type: (Optional[Text], bool) -> manifest.Manifest
if manifest_path is None:
- manifest_path = os.path.join(wpt_root, "MANIFEST.json")
+ manifest_path = os.path.join(wpt_root, u"MANIFEST.json")
return manifest.load_and_update(wpt_root, manifest_path, "/",
update=manifest_update)
def affected_testfiles(files_changed, # type: Iterable[Text]
- skip_dirs=None, # type: Optional[Set[str]]
- manifest_path=None, # type: Optional[str]
+ skip_dirs=None, # type: Optional[Set[Text]]
+ manifest_path=None, # type: Optional[Text]
manifest_update=True # type: bool
):
- # type: (...) -> Tuple[Set[Text], Set[str]]
+ # type: (...) -> Tuple[Set[Text], Set[Text]]
"""Determine and return list of test files that reference changed files."""
if skip_dirs is None:
- skip_dirs = {"conformance-checkers", "docs", "tools"}
+ skip_dirs = {u"conformance-checkers", u"docs", u"tools"}
affected_testfiles = set()
# Exclude files that are in the repo root, because
# they are not part of any test.
@@ -282,7 +272,7 @@ def affected_testfiles(files_changed, # type: Iterable[Text]
for interface in interfaces_changed]
def affected_by_wdspec(test):
- # type: (str) -> bool
+ # type: (Text) -> bool
affected = False
if test in wdspec_test_files:
for support_full_path, _ in nontest_changed_paths:
@@ -298,7 +288,7 @@ def affected_testfiles(files_changed, # type: Iterable[Text]
return affected
def affected_by_interfaces(file_contents):
- # type: (Union[bytes, Text]) -> bool
+ # type: (Text) -> bool
if len(interfaces_changed_names) > 0:
if 'idlharness.js' in file_contents:
for interface in interfaces_changed_names:
@@ -376,27 +366,26 @@ def get_parser_affected():
def get_revish(**kwargs):
- # type: (**Any) -> bytes
+ # type: (**Any) -> Text
revish = kwargs.get("revish")
if revish is None:
- revish = "%s..HEAD" % branch_point()
- if isinstance(revish, six.text_type):
- revish = revish.encode("utf8")
- assert isinstance(revish, six.binary_type)
- return revish
+ revish = u"%s..HEAD" % branch_point()
+ return ensure_text(revish).strip()
def run_changed_files(**kwargs):
# type: (**Any) -> None
revish = get_revish(**kwargs)
- changed, _ = files_changed(revish, kwargs["ignore_rules"],
+ changed, _ = files_changed(revish,
+ kwargs["ignore_rules"],
include_uncommitted=kwargs["modified"],
include_new=kwargs["new"])
- separator = "\0" if kwargs["null"] else "\n"
+ separator = u"\0" if kwargs["null"] else u"\n"
for item in sorted(changed):
- sys.stdout.write(os.path.relpath(six.ensure_str(item), wpt_root) + separator)
+ line = os.path.relpath(item, wpt_root) + separator
+ sys.stdout.write(ensure_str(line))
def run_tests_affected(**kwargs):
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_testfiles.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_testfiles.py
index 9fd6c6f9b85..81f528457c6 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_testfiles.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_testfiles.py
@@ -6,13 +6,13 @@ from tools.wpt import testfiles
def test_getrevish_kwarg():
- assert testfiles.get_revish(revish=u"abcdef") == b"abcdef"
- assert testfiles.get_revish(revish=b"abcdef") == b"abcdef"
+ assert testfiles.get_revish(revish=u"abcdef") == u"abcdef"
+ assert testfiles.get_revish(revish=b"abcdef") == u"abcdef"
def test_getrevish_implicit():
with patch("tools.wpt.testfiles.branch_point", return_value=u"base"):
- assert testfiles.get_revish() == b"base..HEAD"
+ assert testfiles.get_revish() == u"base..HEAD"
def test_affected_testfiles():
diff --git a/tests/wpt/web-platform-tests/tools/wpt/utils.py b/tests/wpt/web-platform-tests/tools/wpt/utils.py
index 9a6c0646712..18551481ab8 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/utils.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/utils.py
@@ -5,15 +5,17 @@ import tarfile
import zipfile
from io import BytesIO
-try:
- from typing import Any, Callable
-except ImportError:
- pass
+MYPY = False
+if MYPY:
+ from typing import Any
+ from typing import Callable
+ from typing import Dict
logger = logging.getLogger(__name__)
class Kwargs(dict):
+ # type: Dict[Any, Any]
def set_if_none(self,
name, # type: str
value, # type: Any
diff --git a/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
index 18edcc04fb4..51b97cead8d 100644
--- a/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
@@ -55,9 +55,13 @@ class Virtualenv(object):
@property
def pip_path(self):
- path = find_executable("pip", self.bin_path)
+ if sys.version_info.major >= 3:
+ pip_executable = "pip3"
+ else:
+ pip_executable = "pip2"
+ path = find_executable(pip_executable, self.bin_path)
if path is None:
- raise ValueError("pip not found")
+ raise ValueError("%s not found" % pip_executable)
return path
@property
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 6dc04cedf34..a1ba8de2878 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
@@ -29,6 +29,19 @@ def SourceFileWithTest(path, hash, cls, *args):
return s
+def tree_and_sourcefile_mocks(source_files):
+ paths_dict = {}
+ tree = []
+ for source_file, file_hash, updated in source_files:
+ paths_dict[source_file.rel_path] = source_file
+ tree.append([source_file.rel_path, file_hash, updated])
+
+ def MockSourceFile(tests_root, path, url_base, file_hash):
+ return paths_dict[path]
+
+ return tree, MockSourceFile
+
+
item_classes = {"testharness": manifest_item.TestharnessTest,
"reftest": manifest_item.RefTest,
"manual": manifest_item.ManualTest,
@@ -129,9 +142,11 @@ def create_test_manifest(tests, url_base="/"):
source_files = []
for i, (test, _, test_type, _) in enumerate(tests):
if test_type:
- source_files.append((SourceFileWithTest(test, str(i) * 40, item_classes[test_type]), True))
- m = manifest.Manifest()
- m.update(source_files)
+ source_files.append(SourceFileWithTest(test, str(i) * 40, item_classes[test_type]))
+ m = manifest.Manifest("")
+ tree, sourcefile_mock = tree_and_sourcefile_mocks((item, None, True) for item in source_files)
+ with mock.patch("manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ m.update(tree)
return m
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py
index dbccd90e339..4eee9ccb1b6 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_wpttest.py
@@ -1,11 +1,13 @@
+import mock
from io import BytesIO
-from mock import Mock
from manifest import manifest as wptmanifest
from manifest.item import TestharnessTest, RefTest
from manifest.utils import to_os_path
+from . test_update import tree_and_sourcefile_mocks
from .. import manifestexpected, wpttest
+
dir_ini_0 = b"""\
prefs: [a:b]
"""
@@ -83,7 +85,7 @@ testharness_test = b"""<script src="/resources/testharness.js"></script>
def make_mock_manifest(*items):
- rv = Mock(tests_root="/foobar")
+ rv = mock.Mock(tests_root="/foobar")
tests = []
rv.__iter__ = lambda self: iter(tests)
rv.__getitem__ = lambda self, k: tests[k]
@@ -204,13 +206,15 @@ def test_metadata_fuzzy():
references=[["/a/fuzzy-ref.html", "=="]],
fuzzy=[[["/a/fuzzy.html", '/a/fuzzy-ref.html', '=='],
[[2, 3], [10, 15]]]])
- s = Mock(rel_path="a/fuzzy.html", rel_path_parts=("a", "fuzzy.html"), hash="0"*40)
- s.manifest_items = Mock(return_value=(item.item_type, [item]))
+ s = mock.Mock(rel_path="a/fuzzy.html", rel_path_parts=("a", "fuzzy.html"), hash="0"*40)
+ s.manifest_items = mock.Mock(return_value=(item.item_type, [item]))
- manifest = wptmanifest.Manifest()
+ manifest = wptmanifest.Manifest("")
- assert manifest.update([(s, True)]) is True
+ tree, sourcefile_mock = tree_and_sourcefile_mocks([(s, None, True)])
+ with mock.patch("manifest.manifest.SourceFile", side_effect=sourcefile_mock):
+ assert manifest.update(tree) is True
test_metadata = manifestexpected.static.compile(BytesIO(test_fuzzy),
{},
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
index 32de670ed3c..3c3bf5de56d 100644
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
+++ b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
@@ -599,7 +599,7 @@ const gCSSProperties1 = {
types: [
'fontVariationSettings',
{ type: 'discrete',
- options: [ ['"wght" 1.1, "wdth" 1', '"wdth" 5'],
+ options: [ ['"wdth" 1, "wght" 1.1', '"wdth" 5'],
['"wdth" 5', 'normal']
] },
]
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-duration-loop.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-duration-loop.html
deleted file mode 100644
index faa70e11c47..00000000000
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-duration-loop.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>
- Test AudioBufferSourceNode With Looping And Duration
- </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="/webaudio/resources/audit-util.js"></script>
- <script src="/webaudio/resources/audit.js"></script>
- </head>
- <body>
- <script id="layout-test-code">
- let audit = Audit.createTaskRunner();
- audit.define('loop with duration', (task, should) => {
- // Create the context
- let context = new OfflineAudioContext(1, 4096, 48000);
-
- // Create the sample buffer and fill the second half with 1
- let buffer = context.createBuffer(1, 2048, context.sampleRate);
- for(let i = 1024; i < 2048; i++) {
- buffer.getChannelData(0)[i] = 1;
- }
-
- // Create the source and set its value
- let source = context.createBufferSource();
- source.loop = true;
- source.loopStart = 1024 / context.sampleRate;
- source.loopEnd = 2048 / context.sampleRate;
- source.buffer = buffer;
- source.connect(context.destination);
- source.start(0, 1024 / context.sampleRate, 2048 / context.sampleRate);
- // Render it!
- context.startRendering()
- .then(function(audioBuffer) {
- for(let i = 0; i < 2048; i++) {
- assert_equals(audioBuffer.getChannelData(0)[i], 1,
- "audioBuffer did not loop as intended");
- }
- for(let i = 2048; i < 4096; i++) {
- assert_equals(audioBuffer.getChannelData(0)[i], 0,
- "audioBuffer did not respect duration");
- }
- })
- .then(task.done());
- });
-
- audit.run();
-
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html
new file mode 100644
index 00000000000..bebcc6abc43
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-oscillatornode-interface/osc-basic-waveform.html
@@ -0,0 +1,229 @@
+<!doctype html>
+<html>
+ <head>
+ <title>
+ Test Basic Oscillator Sine Wave Test
+ </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/webaudio/resources/audit-util.js"></script>
+ <script src="/webaudio/resources/audit.js"></script>
+ </head>
+
+ <body>
+ <script>
+ // Don't change the sample rate. The tests below depend on this sample
+ // rate to cover all the cases in Chrome's implementation. But the tests
+ // are general and apply to any browser.
+ const sampleRate = 44100;
+
+ // Only need a few samples for testing, so just use two renders.
+ const durationFrames = 2 * RENDER_QUANTUM_FRAMES;
+
+ let audit = Audit.createTaskRunner();
+
+ // The following tests verify that the oscillator produces the same
+ // results as the mathematical oscillators. We choose sine wave and a
+ // custom wave because we know they're bandlimited and won't change with
+ // the frequency.
+ //
+ // The tests for 1 and 2 Hz are intended to test Chrome's interpolation
+ // algorithm, but are still generally applicable to any browser.
+
+ audit.define(
+ {label: 'Test 0', description: 'Sine wave: 100 Hz'},
+ async (task, should) => {
+ let context = new OfflineAudioContext(
+ {length: durationFrames, sampleRate: sampleRate});
+
+ const freqHz = 100;
+
+ let src =
+ new OscillatorNode(context, {type: 'sine', frequency: freqHz});
+ src.connect(context.destination);
+
+ src.start();
+
+ let renderedBuffer = await context.startRendering();
+ checkResult(should, renderedBuffer, context, {
+ freqHz: freqHz,
+ a1: 0,
+ b1: 1,
+ prefix: 'Sine',
+ threshold: 1.8045e-6,
+ snrThreshold: 118.91
+ });
+ task.done();
+ });
+
+ audit.define(
+ {label: 'Test 1', description: 'Sine wave: -100 Hz'},
+ async (task, should) => {
+ let context = new OfflineAudioContext(
+ {length: durationFrames, sampleRate: sampleRate});
+
+ const freqHz = -100;
+
+ let src =
+ new OscillatorNode(context, {type: 'sine', frequency: freqHz});
+ src.connect(context.destination);
+
+ src.start();
+
+ let renderedBuffer = await context.startRendering();
+ checkResult(should, renderedBuffer, context, {
+ freqHz: freqHz,
+ a1: 0,
+ b1: 1,
+ prefix: 'Sine',
+ threshold: 4.1724e-7,
+ snrThreshold: 130.95
+ });
+ task.done();
+ });
+
+ audit.define(
+ {label: 'Test 2', description: 'Sine wave: 2 Hz'},
+ async (task, should) => {
+ let context = new OfflineAudioContext(
+ {length: durationFrames, sampleRate: sampleRate});
+
+ const freqHz = 2;
+
+ let src =
+ new OscillatorNode(context, {type: 'sine', frequency: freqHz});
+ src.connect(context.destination);
+
+ src.start();
+
+ let renderedBuffer = await context.startRendering();
+ checkResult(should, renderedBuffer, context, {
+ freqHz: freqHz,
+ a1: 0,
+ b1: 1,
+ prefix: 'Sine',
+ threshold: 1.4516e-7,
+ snrThreshold: 119.93
+ });
+ task.done();
+ });
+
+ audit.define(
+ {label: 'Test 3', description: 'Sine wave: 1 Hz'},
+ async (task, should) => {
+ let context = new OfflineAudioContext(
+ {length: durationFrames, sampleRate: sampleRate});
+
+ const freqHz = 1;
+
+ let src =
+ new OscillatorNode(context, {type: 'sine', frequency: freqHz});
+ src.connect(context.destination);
+
+ src.start();
+
+ let renderedBuffer = await context.startRendering();
+ checkResult(should, renderedBuffer, context, {
+ freqHz: freqHz,
+ a1: 0,
+ b1: 1,
+ prefix: 'Sine',
+ threshold: 1.4157e-7,
+ snrThreshold: 112.22
+ });
+ task.done();
+ });
+
+ audit.define(
+ {label: 'Test 4', description: 'Custom wave: 100 Hz'},
+ async (task, should) => {
+ let context = new OfflineAudioContext(
+ {length: durationFrames, sampleRate: sampleRate});
+
+ const freqHz = 100;
+
+ let wave = new PeriodicWave(
+ context,
+ {real: [0, 1], imag: [0, 1], disableNormalization: true});
+ let src = new OscillatorNode(
+ context,
+ {type: 'custom', frequency: freqHz, periodicWave: wave});
+ src.connect(context.destination);
+
+ src.start();
+
+ let renderedBuffer = await context.startRendering();
+ checkResult(should, renderedBuffer, context, {
+ freqHz: freqHz,
+ a1: 1,
+ b1: 1,
+ prefix: 'Custom',
+ threshold: 1.8478e-6,
+ snrThreshold: 122.43
+ });
+ task.done();
+ });
+
+ audit.define(
+ {label: 'Test 5', description: 'Custom wave: 1 Hz'},
+ async (task, should) => {
+ let context = new OfflineAudioContext(
+ {length: durationFrames, sampleRate: sampleRate});
+
+ const freqHz = 1;
+
+ let wave = new PeriodicWave(
+ context,
+ {real: [0, 1], imag: [0, 1], disableNormalization: true});
+ let src = new OscillatorNode(
+ context,
+ {type: 'custom', frequency: freqHz, periodicWave: wave});
+ src.connect(context.destination);
+
+ src.start();
+
+ let renderedBuffer = await context.startRendering();
+ checkResult(should, renderedBuffer, context, {
+ freqHz: freqHz,
+ a1: 1,
+ b1: 1,
+ prefix: 'Custom',
+ threshold: 4.7684e-7,
+ snrThreshold: 138.76
+ });
+ task.done();
+ });
+
+ audit.run();
+
+ function waveForm(context, freqHz, a1, b1, nsamples) {
+ let buffer =
+ new AudioBuffer({length: nsamples, sampleRate: context.sampleRate});
+ let signal = buffer.getChannelData(0);
+ const omega = 2 * Math.PI * freqHz / context.sampleRate;
+ for (let k = 0; k < nsamples; ++k) {
+ signal[k] = a1 * Math.cos(omega * k) + b1 * Math.sin(omega * k);
+ }
+
+ return buffer;
+ }
+
+ function checkResult(should, renderedBuffer, context, options) {
+ let {freqHz, a1, b1, prefix, threshold, snrThreshold} = options;
+
+ let actual = renderedBuffer.getChannelData(0);
+
+ let expected =
+ waveForm(context, freqHz, a1, b1, actual.length).getChannelData(0);
+
+ should(actual, `${prefix}: ${freqHz} Hz`).beCloseToArray(expected, {
+ absoluteThreshold: threshold
+ });
+
+ let snr = 10 * Math.log10(computeSNR(actual, expected));
+
+ should(snr, `${prefix}: SNR (db)`).beGreaterThanOrEqualTo(snrThreshold);
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_create_move.https.html b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_create_move.https.html
new file mode 100644
index 00000000000..af1898cac2e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_create_move.https.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/webxr_util.js"></script>
+<script src="../resources/webxr_test_asserts.js"></script>
+<script src="../resources/webxr_test_constants.js"></script>
+<script src="../resources/webxr_test_constants_fake_world.js"></script>
+<canvas />
+
+<script>
+
+// 1m above world origin.
+const VIEWER_ORIGIN_TRANSFORM = {
+ position: [0, 1, 0],
+ orientation: [0, 0, 0, 1],
+};
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ viewerOrigin: VIEWER_ORIGIN_TRANSFORM,
+};
+
+// All test cases require anchors.
+const sessionInit = { 'requiredFeatures': ['anchors'] };
+
+// Create an anchor, move it and verify that new pose gets propagated to the caller.
+const anchorCreateAndMove = function(session, fakeDeviceController, t) {
+ const debug = xr_debug.bind(this, 'anchorCreateAndMove');
+
+ let anchorController = null;
+ fakeDeviceController.setAnchorCreationCallback((parameters, controller) => {
+ anchorController = controller;
+ return Promise.resolve(true);
+ });
+
+ const watcherDone = new Event("watcherdone");
+ const eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
+ const eventPromise = eventWatcher.wait_for(["watcherdone"]);
+
+ session.requestReferenceSpace('local').then((localRefSpace) => {
+ debug("requesting animation frame");
+
+ session.requestAnimationFrame((time, frame) => {
+ debug("rAF 1");
+
+ let createdAnchor = null;
+ frame.createAnchor(new XRRigidTransform(), localRefSpace)
+ .then((anchor) => {
+ createdAnchor = anchor;
+ });
+
+ session.requestAnimationFrame((time_2, frame_2) => {
+ debug("rAF 2");
+
+ const pre_move_pose = frame_2.getPose(createdAnchor.anchorSpace, localRefSpace);
+
+ t.step(() => {
+ assert_true(frame_2.trackedAnchors.has(createdAnchor),
+ "Newly created anchor must be in tracked anchors set on subsequent RAF (2)!");
+ // We have created an anchor with an identity pose relative to local space and have not moved it yet:
+ assert_matrix_approx_equals(pre_move_pose.transform.matrix,
+ IDENTITY_MATRIX, FLOAT_EPSILON);
+ });
+
+ anchorController.setAnchorOrigin(VALID_POSE_TRANSFORM);
+
+ session.requestAnimationFrame((time_3, frame_3) => {
+ debug("rAF 3");
+
+ const post_move_pose = frame_3.getPose(createdAnchor.anchorSpace, localRefSpace);
+
+ t.step(() => {
+ assert_true(frame_3.trackedAnchors.has(createdAnchor),
+ "Newly created anchor must be in tracked anchors set on subsequent RAF (3)!");
+ // The anchor was moved by VALID_POSE_TRANSFORM, validate that its pose got adjusted:
+ assert_matrix_approx_equals(post_move_pose.transform.matrix,
+ VALID_POSE_MATRIX, FLOAT_EPSILON);
+ });
+
+ session.dispatchEvent(watcherDone);
+ });
+ });
+ });
+ }); // session.requestReferenceSpace(...).then({...});
+
+ return eventPromise;
+};
+
+xr_session_promise_test(
+ "Ensures free-floating anchor move gets propagated to anchor poses",
+ anchorCreateAndMove, fakeDeviceInitParams, 'immersive-ar', sessionInit);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html
new file mode 100644
index 00000000000..a2f43878181
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/webxr_util.js"></script>
+<script src="../resources/webxr_test_asserts.js"></script>
+<script src="../resources/webxr_test_constants.js"></script>
+<script src="../resources/webxr_test_constants_fake_world.js"></script>
+<canvas />
+
+<script>
+
+// 1m above world origin.
+const VIEWER_ORIGIN_TRANSFORM = {
+ position: [0, 1, 0],
+ orientation: [0, 0, 0, 1],
+};
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ viewerOrigin: VIEWER_ORIGIN_TRANSFORM,
+};
+
+// All test cases require anchors.
+const sessionInit = { 'requiredFeatures': ['anchors'] };
+
+// Creates a test function that will attempt to create an anchor with a delay.
+// In case the anchor creation is expected to succeed, the test will then
+// validate whether the anchor belongs to frame.trackedAnchors, has a valid pose,
+// and that after deleting it, it no longer allows access to its anchorSpace.
+// |shouldSucceed| - true if the anchor creation is expected to succeed.
+const anchorCreationDelayedCreator = function(shouldSucceed) {
+ return function(session, fakeDeviceController, t) {
+ const debug = xr_debug.bind(this, 'anchorCreationDelayed' + (shouldSucceed ? 'Success' : 'Failure'));
+
+ let anchorCreationResolve = null;
+ fakeDeviceController.setAnchorCreationCallback((parameters, controller) => {
+ return new Promise((resolve) => {
+ anchorCreationResolve = resolve;
+ });
+ });
+
+ const watcherDone = new Event("watcherdone");
+ const creationDelayedEvent = new Event("creationdelayed");
+ const eventWatcher = new EventWatcher(t, session, ["creationdelayed", "watcherdone"]);
+ const eventPromise = eventWatcher.wait_for(["creationdelayed", "watcherdone"]);
+
+ session.requestReferenceSpace('local').then((localRefSpace) => {
+ debug("requesting animation frame");
+
+ session.requestAnimationFrame((time, frame) => {
+ debug("rAF 1");
+
+ let createdAnchor = null;
+ frame.createAnchor(new XRRigidTransform(), localRefSpace)
+ .then((anchor) => {
+ createdAnchor = anchor;
+
+ t.step(() => {
+ assert_true(anchor != null, "Returned anchor should not be null!");
+ assert_true(shouldSucceed,
+ "Anchor creation succeeded when it was expected to fail!");
+ });
+ })
+ .catch((error) => {
+ t.step(() => {
+ assert_false(shouldSucceed,
+ "Anchor creation failed when it was expected to succeed!");
+ });
+
+ session.dispatchEvent(watcherDone);
+ });
+
+ session.requestAnimationFrame(() => {
+ debug("rAF 2");
+
+ session.dispatchEvent(creationDelayedEvent);
+
+ anchorCreationResolve(shouldSucceed);
+
+ session.requestAnimationFrame((time_2, frame_2) => {
+ debug("rAF 3");
+
+ if(shouldSucceed) {
+ t.step(() => {
+ assert_true(createdAnchor != null);
+ assert_true(frame_2.trackedAnchors.has(createdAnchor),
+ "Newly created anchor must be in tracked anchors set!");
+ assert_true(createdAnchor.anchorSpace != null,
+ "Newly created anchor must have a non-null anchor space!");
+ assert_true(frame_2.getPose(createdAnchor.anchorSpace, localRefSpace) != null,
+ "Newly created anchor should have a pose!");
+ });
+
+ createdAnchor.delete();
+
+ t.step(() => {
+ assert_throws_dom('InvalidStateError', () => {
+ createdAnchor.anchorSpace;
+ });
+ });
+
+ session.dispatchEvent(watcherDone);
+ }
+ });
+ });
+ });
+ }); // session.requestReferenceSpace(...).then({...});
+
+ return eventPromise;
+ };
+};
+
+xr_session_promise_test(
+ "Ensures free-floating anchor creation with delayed success is handled correctly",
+ anchorCreationDelayedCreator(true), fakeDeviceInitParams, 'immersive-ar', sessionInit);
+
+xr_session_promise_test(
+ "Ensures free-floating anchor creation with delayed failure is handled correctly",
+ anchorCreationDelayedCreator(false), fakeDeviceInitParams, 'immersive-ar', sessionInit);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_failure.https.html b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_failure.https.html
new file mode 100644
index 00000000000..1625538d754
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_failure.https.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/webxr_util.js"></script>
+<script src="../resources/webxr_test_asserts.js"></script>
+<script src="../resources/webxr_test_constants.js"></script>
+<script src="../resources/webxr_test_constants_fake_world.js"></script>
+<canvas />
+
+<script>
+
+// 1m above world origin.
+const VIEWER_ORIGIN_TRANSFORM = {
+ position: [0, 1, 0],
+ orientation: [0, 0, 0, 1],
+};
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ viewerOrigin: VIEWER_ORIGIN_TRANSFORM,
+};
+
+// All test cases require anchors.
+const sessionInit = { 'requiredFeatures': ['anchors'] };
+
+// Fail the anchor creation & see if it gets communicated to the caller.
+// The concrete error is not specified by the WebXR Test API / WebXR Anchors.
+const anchorCreationFail = function(session, fakeDeviceController, t) {
+ const debug = xr_debug.bind(this, 'anchorCreationFail');
+
+ fakeDeviceController.setAnchorCreationCallback((parameters, controller) => {
+ // Immediately fail anchor creation.
+ return Promise.resolve(false);
+ });
+
+ const watcherDone = new Event("watcherdone");
+ const eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
+ const eventPromise = eventWatcher.wait_for(["watcherdone"]);
+
+ session.requestReferenceSpace('local').then((localRefSpace) => {
+ debug("requesting animation frame");
+
+ session.requestAnimationFrame((time, frame) => {
+ debug("rAF 1");
+
+ frame.createAnchor(new XRRigidTransform(), localRefSpace)
+ .then((anchor) => {
+ t.step(() => {
+ assert_false(true, "Anchor creation should fail!");
+ });
+ })
+ .catch((error) => {
+ session.dispatchEvent(watcherDone);
+ });
+
+ // Anchor result will only take effect with frame data - schedule
+ // a frame after we requested anchor creation, otherwise the test will time out.
+ session.requestAnimationFrame(() => {
+ debug("rAF 2");
+ });
+ });
+ }); // session.requestReferenceSpace(...).then({...});
+
+ return eventPromise;
+}
+
+xr_session_promise_test(
+ "Ensures free-floating anchor creation failure is handled correctly",
+ anchorCreationFail, fakeDeviceInitParams, 'immersive-ar', sessionInit);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html
new file mode 100644
index 00000000000..d3cc4c72dd2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/webxr_util.js"></script>
+<script src="../resources/webxr_test_asserts.js"></script>
+<script src="../resources/webxr_test_constants.js"></script>
+<script src="../resources/webxr_test_constants_fake_world.js"></script>
+<canvas />
+
+<script>
+
+// 1m above world origin.
+const VIEWER_ORIGIN_TRANSFORM = {
+ position: [0, 1, 0],
+ orientation: [0, 0, 0, 1],
+};
+
+const fakeDeviceInitParams = {
+ supportedModes: ["immersive-ar"],
+ views: VALID_VIEWS,
+ supportedFeatures: ALL_FEATURES,
+ viewerOrigin: VIEWER_ORIGIN_TRANSFORM,
+};
+
+// All test cases require anchors.
+const sessionInit = { 'requiredFeatures': ['anchors'] };
+
+// Create an anchor, pause tracking, resume tracking, & stop tracking and validate
+// that the state changes are propagated to the caller.
+const anchorCreatePauseTrackingResumeAndDelete = function(session, fakeDeviceController, t) {
+ const debug = xr_debug.bind(this, 'anchorCreatePauseTrackingResumeAndDelete');
+
+ let anchorController = null;
+ fakeDeviceController.setAnchorCreationCallback((parameters, controller) => {
+ anchorController = controller;
+ return Promise.resolve(true);
+ });
+
+ const watcherDone = new Event("watcherdone");
+ const eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
+ const eventPromise = eventWatcher.wait_for(["watcherdone"]);
+
+ session.requestReferenceSpace('local').then((localRefSpace) => {
+ debug("requesting animation frame");
+
+ session.requestAnimationFrame((time, frame) => {
+ debug("rAF 1");
+
+ let createdAnchor = null;
+ frame.createAnchor(new XRRigidTransform(), localRefSpace)
+ .then((anchor) => {
+ createdAnchor = anchor;
+ });
+
+ session.requestAnimationFrame((time_2, frame_2) => {
+ debug("rAF 2");
+
+ t.step(() => {
+ assert_true(frame_2.getPose(createdAnchor.anchorSpace, localRefSpace) != null,
+ "Newly created anchor should have a pose!");
+ assert_true(frame_2.trackedAnchors.has(createdAnchor),
+ "Newly created anchor must be in tracked anchors set on subsequent RAF (2)!");
+ });
+
+ anchorController.pauseTracking();
+
+ session.requestAnimationFrame((time_3, frame_3) => {
+ debug("rAF 3");
+
+ t.step(() => {
+ assert_true(frame_3.getPose(createdAnchor.anchorSpace, localRefSpace) == null,
+ "Newly created anchor with paused tracking should not have a pose!");
+ assert_true(frame_3.trackedAnchors.has(createdAnchor),
+ "Newly created anchor with paused tracking must be in tracked anchors set on subsequent RAF (3)!");
+ });
+
+ anchorController.resumeTracking();
+
+ session.requestAnimationFrame((time_4, frame_4) => {
+ debug("rAF 4");
+
+ t.step(() => {
+ assert_true(frame_4.trackedAnchors.has(createdAnchor),
+ "Newly created anchor with resumed tracking must be in tracked anchors set on subsequent RAF (4)!");
+ assert_true(frame_4.getPose(createdAnchor.anchorSpace, localRefSpace) != null,
+ "Newly created anchor with resumed tracking should have a pose!");
+ });
+
+ anchorController.stopTracking();
+
+ session.requestAnimationFrame((time_5, frame_5) => {
+ debug("rAF 5");
+
+ t.step(() => {
+ assert_false(frame_5.trackedAnchors.has(createdAnchor),
+ "Newly created anchor with stopped tracking must not be in tracked anchors set on subsequent RAF (5)!");
+ });
+
+ session.dispatchEvent(watcherDone);
+ });
+ });
+ });
+ });
+ });
+ }); // session.requestReferenceSpace(...).then({...});
+
+ return eventPromise;
+};
+
+
+xr_session_promise_test(
+ "Ensures free-floating anchor state changes get propagated",
+ anchorCreatePauseTrackingResumeAndDelete, fakeDeviceInitParams,
+ 'immersive-ar', sessionInit);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_states.https.html b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_states.https.html
index 06bc6798839..1872cf527b8 100644
--- a/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_states.https.html
+++ b/tests/wpt/web-platform-tests/webxr/anchors/ar_anchor_states.https.html
@@ -30,7 +30,7 @@ const testFunctionGenerator = function(expectSucceeded, endSession, expectedErro
const testFunction = function(session, fakeDeviceController, t) {
- let debug = xr_debug.bind(this, 'testAnchorStates');
+ const debug = xr_debug.bind(this, 'testAnchorStates');
fakeDeviceController.setAnchorCreationCallback((parameters, controller) => {
// All anchor creation requests that reach this stage should be marked as successful.
@@ -39,9 +39,9 @@ const testFunctionGenerator = function(expectSucceeded, endSession, expectedErro
return Promise.resolve(true);
});
- let watcherDone = new Event("watcherdone");
- let eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
- let eventPromise = eventWatcher.wait_for(["watcherdone"]);
+ const watcherDone = new Event("watcherdone");
+ const eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
+ const eventPromise = eventWatcher.wait_for(["watcherdone"]);
session.requestReferenceSpace('local').then((localRefSpace) => {
diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
index 81dc3d620aa..a987ca1f442 100644
--- a/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
+++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js
@@ -1,3 +1,5 @@
+'use strict';
+
// These tests rely on the User Agent providing an implementation of the
// WebXR Testing API (https://github.com/immersive-web/webxr-test-api).
//
@@ -9,22 +11,34 @@
// Debugging message helper, by default does nothing. Implementations can
// override this.
-var xr_debug = function(name, msg) {}
-var isChromiumBased = 'MojoInterfaceInterceptor' in self;
-var isWebKitBased = 'internals' in self && 'xrTest' in internals;
+var xr_debug = function(name, msg) {};
function xr_promise_test(name, func, properties) {
promise_test(async (t) => {
// Perform any required test setup:
xr_debug(name, 'setup');
+ // Only set up once.
if (!navigator.xr.test) {
+ // Load test-only API helpers.
+ const script = document.createElement('script');
+ script.src = '/resources/test-only-api.js';
+ script.async = false;
+ const p = new Promise((resolve, reject) => {
+ script.onload = () => { resolve(); };
+ script.onerror = e => { reject(e); };
+ })
+ document.head.appendChild(script);
+ await p;
+
if (isChromiumBased) {
// Chrome setup
await loadChromiumResources();
} else if (isWebKitBased) {
// WebKit setup
await setupWebKitWebXRTestAPI();
+ } else {
+ assert_implements(false, "missing navigator.xr.test");
}
}
@@ -185,19 +199,27 @@ function forEachWebxrObject(callback) {
}
// Code for loading test API in Chromium.
-function loadChromiumResources() {
+async function loadChromiumResources() {
let chromiumResources = [
- '/gen/layout_test_data/mojo/public/js/mojo_bindings.js',
'/gen/mojo/public/mojom/base/time.mojom.js',
- '/gen/gpu/ipc/common/mailbox_holder.mojom.js',
+ '/gen/mojo/public/mojom/base/shared_memory.mojom.js',
+ '/gen/mojo/public/mojom/base/unguessable_token.mojom.js',
'/gen/gpu/ipc/common/sync_token.mojom.js',
- '/gen/ui/display/mojom/display.mojom.js',
+ '/gen/gpu/ipc/common/mailbox.mojom.js',
+ '/gen/gpu/ipc/common/mailbox_holder.mojom.js',
'/gen/ui/gfx/geometry/mojom/geometry.mojom.js',
+ '/gen/ui/gfx/mojom/native_handle_types.mojom.js',
+ '/gen/ui/gfx/mojom/buffer_types.mojom.js',
+ '/gen/ui/gfx/mojom/color_space.mojom.js',
+ '/gen/ui/gfx/mojom/display_color_spaces.mojom.js',
'/gen/ui/gfx/mojom/gpu_fence_handle.mojom.js',
'/gen/ui/gfx/mojom/transform.mojom.js',
+ '/gen/ui/display/mojom/display.mojom.js',
+ '/gen/device/gamepad/public/mojom/gamepad.mojom.js',
'/gen/device/vr/public/mojom/vr_service.mojom.js',
'/resources/chromium/webxr-test-math-helper.js',
'/resources/chromium/webxr-test.js',
+ // Required only by resources/chromium/webxr-test.js
'/resources/testdriver.js',
'/resources/testdriver-vendor.js',
];
@@ -210,22 +232,9 @@ function loadChromiumResources() {
chromiumResources = chromiumResources.concat(additionalChromiumResources);
}
- let chain = Promise.resolve();
- chromiumResources.forEach(path => {
- let script = document.createElement('script');
- script.src = path;
- script.async = false;
- chain = chain.then(() => new Promise(resolve => {
- script.onload = () => resolve();
- }));
- document.head.appendChild(script);
- });
-
- chain = chain.then(() => {
- xr_debug = navigator.xr.test.Debug;
- });
+ await loadMojoResources(chromiumResources);
- return chain;
+ xr_debug = navigator.xr.test.Debug;
}
function setupWebKitWebXRTestAPI() {
diff --git a/tests/wpt/web-platform-tests/webxr/xrInputSourceArray_iterable.html b/tests/wpt/web-platform-tests/webxr/xrInputSourceArray_iterable.html
deleted file mode 100644
index de784d5d1a6..00000000000
--- a/tests/wpt/web-platform-tests/webxr/xrInputSourceArray_iterable.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/webxr_util.js"></script>
-<script src="resources/webxr_test_constants.js"></script>
-<canvas id="webgl-canvas"></canvas>
-<script>
-let testName = "XRInputSourceArray is iterable";
-let testFunction = function(session, fakeDeviceController, t) {
- return new Promise((resolve) => {
- let input_source = fakeDeviceController.simulateInputSourceConnection({
- handedness: "right",
- targetRayMode: "tracked-pointer",
- pointerOrigin: VALID_POINTER_TRANSFORM,
- gripOrigin: VALID_GRIP_TRANSFORM,
- profiles: ["foo", "bar"]
- });
-
- requestSkipAnimationFrame(session, (time, xrFrame) => {
- let sources = [];
- t.step(() => {
- for (const source of session.inputSources) {
- sources.push(source);
- }
- assert_equals(sources.length, 1);
- });
- resolve();
- });
- });
-};
-
-xr_session_promise_test(
- testName, testFunction, TRACKED_IMMERSIVE_DEVICE, 'immersive-vr');
-</script>
diff --git a/tests/wpt/web-platform-tests/wpt b/tests/wpt/web-platform-tests/wpt
index 9930d77d0c9..329ea66852c 100755
--- a/tests/wpt/web-platform-tests/wpt
+++ b/tests/wpt/web-platform-tests/wpt
@@ -10,7 +10,7 @@ if __name__ == "__main__":
if (args.py3 or py3only) and sys.version_info.major < 3:
from subprocess import call
try:
- sys.exit(call(['python3', sys.argv[0]] + [args.command] + extra))
+ sys.exit(call(['python3'] + sys.argv))
except OSError as e:
if e.errno == 2:
sys.stderr.write("python3 is needed to run this command\n")