From 3173ca7ad966b1768bbb537f9059e4311624c3f9 Mon Sep 17 00:00:00 2001 From: WPT Sync Bot Date: Fri, 25 Sep 2020 08:19:58 +0000 Subject: [PATCH] Update web-platform-tests to revision 0c112f38ee0040ba788d927e73b1ab1a7b856230 --- .../url/url-in-tags-revoke.window.js.ini | 2 +- .../transform-scale-hittest.html.ini | 3 - .../css/cssom-view/CaretPosition-001.html.ini | 4 + .../elementsFromPoint-invalid-cases.html.ini | 4 - .../matchMedia-display-none-iframe.html.ini | 2 + .../offsetTopLeft-border-box.html.ini | 7 - .../reactions/HTMLMediaElement.html.ini | 2 + .../fetch/content-type/response.window.js.ini | 10 +- .../traverse_the_history_1.html.ini | 4 + .../traverse_the_history_2.html.ini | 4 - ...ross-origin-objects-on-new-window.html.ini | 2 + .../embedded-opener-remove-frame.html.ini | 1 + ...ta-color-scheme-attribute-changes.html.ini | 5 + ...-color-scheme-empty-content-value.html.ini | 4 + ...-color-scheme-first-valid-applies.html.ini | 4 + .../meta-color-scheme-insert.html.ini | 10 + ...eta-color-scheme-no-content-value.html.ini | 4 + ...-color-scheme-presentational-hint.html.ini | 4 + .../meta-color-scheme-remove-head.html.ini | 7 + .../meta-color-scheme-remove.html.ini | 5 + ...color-scheme-single-value-in-body.html.ini | 4 + ...color-scheme-single-value-in-head.html.ini | 4 + ...cheme-single-value-in-shadow-tree.html.ini | 2 + .../iframe_sandbox_popups_escaping-1.html.ini | 2 +- .../iframe_sandbox_popups_escaping-2.html.ini | 2 +- .../iframe_sandbox_popups_escaping-3.html.ini | 1 + ...rame_sandbox_popups_nonescaping-1.html.ini | 1 + .../form-double-submit-3.html.ini | 4 + .../parsing/DOMContentLoaded-defer.html.ini | 4 + .../document-write/module-delayed.html.ini | 4 - ...le-event-handler-settings-objects.html.ini | 2 +- .../constructor-types.tentative.any.js.ini | 21 + .../wasm/jsapi/memory/constructor.any.js.ini | 9 - .../constructor-types.tentative.any.js.ini | 21 + .../realtimeanalyser-fft-scaling.html.ini | 1 + .../tests/perform_actions/wheel.py.ini | 19 + .../webmessaging/with-ports/018.html.ini | 5 - ...Context_create_xrcompatible.https.html.ini | 7 + .../webxr/webxr_feature_policy.https.html.ini | 11 + .../Worker/Worker-constructor.html.ini | 2 + .../url/url-in-tags-revoke.window.js.ini | 2 +- tests/wpt/metadata/MANIFEST.json | 444 +++++++++++------- .../transform-scale-hittest.html.ini | 3 - .../css/cssom-view/CaretPosition-001.html.ini | 4 + .../elementsFromPoint-invalid-cases.html.ini | 4 - .../matchMedia-display-none-iframe.html.ini | 2 + .../offsetTopLeft-border-box.html.ini | 7 - .../reactions/HTMLMediaElement.html.ini | 2 + .../fetch/content-type/response.window.js.ini | 10 +- .../traverse_the_history_1.html.ini | 4 + .../traverse_the_history_2.html.ini | 4 - ...ross-origin-objects-on-new-window.html.ini | 2 + .../embedded-opener-remove-frame.html.ini | 1 + ...ta-color-scheme-attribute-changes.html.ini | 5 + ...-color-scheme-empty-content-value.html.ini | 4 + ...-color-scheme-first-valid-applies.html.ini | 4 + .../meta-color-scheme-insert.html.ini | 10 + ...eta-color-scheme-no-content-value.html.ini | 4 + ...-color-scheme-presentational-hint.html.ini | 4 + .../meta-color-scheme-remove-head.html.ini | 7 + .../meta-color-scheme-remove.html.ini | 5 + ...color-scheme-single-value-in-body.html.ini | 4 + ...color-scheme-single-value-in-head.html.ini | 4 + ...cheme-single-value-in-shadow-tree.html.ini | 2 + .../iframe_sandbox_popups_escaping-1.html.ini | 2 +- .../iframe_sandbox_popups_escaping-2.html.ini | 2 +- .../iframe_sandbox_popups_escaping-3.html.ini | 1 + ...rame_sandbox_popups_nonescaping-1.html.ini | 1 + .../form-double-submit-3.html.ini | 4 + .../parsing/DOMContentLoaded-defer.html.ini | 4 + .../document-write/module-delayed.html.ini | 4 - ...le-event-handler-settings-objects.html.ini | 2 +- .../constructor-types.tentative.any.js.ini | 21 + .../wasm/jsapi/memory/constructor.any.js.ini | 6 - .../constructor-types.tentative.any.js.ini | 21 + .../realtimeanalyser-fft-scaling.html.ini | 1 + .../tests/perform_actions/wheel.py.ini | 19 + .../webmessaging/with-ports/018.html.ini | 5 - ...Context_create_xrcompatible.https.html.ini | 3 + .../webxr/webxr_feature_policy.https.html.ini | 3 + .../Worker/Worker-constructor.html.ini | 2 + .../out-of-flow-in-multicolum-001-ref.html | 5 + .../out-of-flow-in-multicolumn-001.html | 39 ++ .../css-overflow/scrollbar-gutter-001.html | 197 -------- .../css-overflow/scrollbar-gutter-002.html | 263 ----------- .../css-overflow/scrollbar-gutter-003.html | 263 ----------- .../css-overflow/scrollbar-gutter-004.html | 263 ----------- .../css-overflow/scrollbar-gutter-005.html | 263 ----------- .../aspect-ratio/abspos-014.tentative.html | 14 + .../flex-aspect-ratio-024.tentative.html | 2 +- .../reference/text-decoration-color-ref.html | 5 + .../css-text-decor/text-decoration-color.html | 5 + .../css/css-text/altering-dom-crash.html | 2 +- ...tespace-followed-by-cham-symbol-crash.html | 2 +- .../feature-policy/idlharness.window.js | 9 +- ...ross-origin-isolated-permission.https.html | 160 ++++++- .../resources/cross-origin-isolated-worker.js | 11 + .../shared-array-buffers/blob-data.https.html | 12 +- .../meta-color-scheme-attribute-changes.html | 4 +- ...meta-color-scheme-empty-content-value.html | 4 +- ...meta-color-scheme-first-valid-applies.html | 4 +- .../meta-color-scheme-insert.html | 4 +- .../meta-color-scheme-no-content-value.html | 4 +- ...meta-color-scheme-presentational-hint.html | 4 +- .../meta-color-scheme-remove-head.html | 4 +- .../meta-color-scheme-remove.html | 4 +- ...eta-color-scheme-single-value-in-body.html | 6 +- ...eta-color-scheme-single-value-in-head.html | 4 +- ...or-scheme-single-value-in-shadow-tree.html | 4 +- .../support/compute-root-color-scheme.js | 0 .../testdriver/actions/wheelScroll.html.ini | 3 + .../testdriver/actions/wheelScroll.html | 45 ++ .../interfaces/is-input-pending.idl | 8 +- .../interfaces/native-file-system.idl | 2 +- ...ture-policy.idl => permissions-policy.idl} | 10 +- .../is-input-pending/idlharness.window.js | 1 - .../resources/input-onmessage.js | 4 +- tests/wpt/web-platform-tests/lint.ignore | 8 + .../origin-isolation/popups-crash.https.html | 9 + .../resources/crashy-popup.sub.html | 6 + .../resources/crashy-popup.sub.html.headers | 1 + .../mouse_buttons_back_forward.html | 21 +- .../resources/chromium/webxr-test.js | 7 +- .../resources/testdriver-actions.js | 96 +++- .../wpt/web-platform-tests/tools/lint/lint.py | 2 +- .../tools/manifest/sourcefile.py | 60 +++ .../web-platform-tests/tools/serve/serve.py | 13 + .../tools/webdriver/webdriver/client.py | 26 + .../web-platform-tests/tools/wpt/browser.py | 58 ++- tests/wpt/web-platform-tests/tools/wpt/run.py | 9 +- .../tools/wpt/tests/test_browser.py | 62 +++ .../memory/constructor-types.tentative.any.js | 4 +- .../wasm/jsapi/memory/constructor.any.js | 2 +- .../table/constructor-types.tentative.any.js | 10 +- .../web-share/canShare.tentative.https.html | 82 ++-- .../getcredential-extensions.https.html | 13 +- .../tests/perform_actions/conftest.py | 11 + .../support/test_actions_scroll_wdspec.html | 103 ++++ .../webdriver/tests/perform_actions/wheel.py | 63 +++ .../RTCPeerConnection-getStats.https.html | 2 +- ...tRemoteDescription-replaceTrack.https.html | 8 +- .../RTCPeerConnection-track-stats.https.html | 24 +- .../RTCPeerConnection-addStream.https.html | 2 +- .../protocol/candidate-exchange.https.html | 27 ++ ...nvasContext_create_xrcompatible.https.html | 10 +- .../webxr/webxr_feature_policy.https.html | 16 + 146 files changed, 1587 insertions(+), 1659 deletions(-) create mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/CaretPosition-001.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini create mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/matchMedia-display-none-iframe.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/cssom-view/offsetTopLeft-border-box.html.ini create mode 100644 tests/wpt/metadata-layout-2020/custom-elements/reactions/HTMLMediaElement.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-attribute-changes.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-empty-content-value.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-first-valid-applies.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-insert.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-no-content-value.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-presentational-hint.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-remove-head.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-remove.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-single-value-in-body.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-single-value-in-head.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-single-value-in-shadow-tree.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini create mode 100644 tests/wpt/metadata-layout-2020/html/syntax/parsing/DOMContentLoaded-defer.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini create mode 100644 tests/wpt/metadata-layout-2020/wasm/jsapi/memory/constructor-types.tentative.any.js.ini delete mode 100644 tests/wpt/metadata-layout-2020/wasm/jsapi/memory/constructor.any.js.ini create mode 100644 tests/wpt/metadata-layout-2020/wasm/jsapi/table/constructor-types.tentative.any.js.ini create mode 100644 tests/wpt/metadata-layout-2020/webdriver/tests/perform_actions/wheel.py.ini delete mode 100644 tests/wpt/metadata-layout-2020/webmessaging/with-ports/018.html.ini create mode 100644 tests/wpt/metadata-layout-2020/webxr/webGLCanvasContext_create_xrcompatible.https.html.ini create mode 100644 tests/wpt/metadata-layout-2020/webxr/webxr_feature_policy.https.html.ini create mode 100644 tests/wpt/metadata-layout-2020/workers/constructors/Worker/Worker-constructor.html.ini create mode 100644 tests/wpt/metadata/css/cssom-view/CaretPosition-001.html.ini delete mode 100644 tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini create mode 100644 tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini delete mode 100644 tests/wpt/metadata/css/cssom-view/offsetTopLeft-border-box.html.ini create mode 100644 tests/wpt/metadata/custom-elements/reactions/HTMLMediaElement.html.ini create mode 100644 tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini delete mode 100644 tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_2.html.ini create mode 100644 tests/wpt/metadata/html/browsers/origin/cross-origin-objects/cross-origin-objects-on-new-window.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-attribute-changes.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-empty-content-value.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-first-valid-applies.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-insert.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-no-content-value.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-presentational-hint.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-remove-head.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-remove.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-single-value-in-body.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-single-value-in-head.html.ini create mode 100644 tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/color-scheme/meta-color-scheme-single-value-in-shadow-tree.html.ini create mode 100644 tests/wpt/metadata/html/semantics/forms/form-submission-0/form-double-submit-3.html.ini create mode 100644 tests/wpt/metadata/html/syntax/parsing/DOMContentLoaded-defer.html.ini delete mode 100644 tests/wpt/metadata/html/webappapis/dynamic-markup-insertion/document-write/module-delayed.html.ini create mode 100644 tests/wpt/metadata/wasm/jsapi/memory/constructor-types.tentative.any.js.ini create mode 100644 tests/wpt/metadata/wasm/jsapi/table/constructor-types.tentative.any.js.ini create mode 100644 tests/wpt/metadata/webdriver/tests/perform_actions/wheel.py.ini delete mode 100644 tests/wpt/metadata/webmessaging/with-ports/018.html.ini create mode 100644 tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini create mode 100644 tests/wpt/web-platform-tests/css/css-break/out-of-flow-in-multicolum-001-ref.html create mode 100644 tests/wpt/web-platform-tests/css/css-break/out-of-flow-in-multicolumn-001.html delete mode 100644 tests/wpt/web-platform-tests/css/css-overflow/scrollbar-gutter-001.html delete mode 100644 tests/wpt/web-platform-tests/css/css-overflow/scrollbar-gutter-002.html delete mode 100644 tests/wpt/web-platform-tests/css/css-overflow/scrollbar-gutter-003.html delete mode 100644 tests/wpt/web-platform-tests/css/css-overflow/scrollbar-gutter-004.html delete mode 100644 tests/wpt/web-platform-tests/css/css-overflow/scrollbar-gutter-005.html create mode 100644 tests/wpt/web-platform-tests/css/css-sizing/aspect-ratio/abspos-014.tentative.html create mode 100644 tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/cross-origin-isolated-worker.js rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-attribute-changes.html (87%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-empty-content-value.html (67%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-first-valid-applies.html (77%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-insert.html (84%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-no-content-value.html (66%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-presentational-hint.html (75%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-remove-head.html (73%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-remove.html (80%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-single-value-in-body.html (50%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-single-value-in-head.html (66%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/meta-color-scheme-single-value-in-shadow-tree.html (77%) rename tests/wpt/web-platform-tests/{css/css-color-adjust/meta => html/semantics/document-metadata/the-meta-element/color-scheme}/support/compute-root-color-scheme.js (100%) create mode 100644 tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini create mode 100644 tests/wpt/web-platform-tests/infrastructure/testdriver/actions/wheelScroll.html rename tests/wpt/web-platform-tests/interfaces/{feature-policy.idl => permissions-policy.idl} (67%) create mode 100644 tests/wpt/web-platform-tests/origin-isolation/popups-crash.https.html create mode 100644 tests/wpt/web-platform-tests/origin-isolation/resources/crashy-popup.sub.html create mode 100644 tests/wpt/web-platform-tests/origin-isolation/resources/crashy-popup.sub.html.headers create mode 100644 tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/test_actions_scroll_wdspec.html create mode 100644 tests/wpt/web-platform-tests/webdriver/tests/perform_actions/wheel.py 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 3605e8f3fc9..76b44d9e9cf 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: TIMEOUT + expected: FAIL [Fetching a blob URL immediately before revoking it works in an iframe.] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini index f8e7e539aae..4a1e8110f6f 100644 --- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-scale-hittest.html.ini @@ -2,6 +2,3 @@ [Hit test intersecting scaled box] expected: FAIL - [Hit test within unscaled box] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/CaretPosition-001.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/CaretPosition-001.html.ini new file mode 100644 index 00000000000..4c79907309b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/CaretPosition-001.html.ini @@ -0,0 +1,4 @@ +[CaretPosition-001.html] + [Element at (400, 100)] + expected: FAIL + diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index e181af5397f..00000000000 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[elementsFromPoint-invalid-cases.html] - [The root element is the last element returned for otherwise empty queries within the viewport] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/matchMedia-display-none-iframe.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/matchMedia-display-none-iframe.html.ini new file mode 100644 index 00000000000..e6e1f29e274 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/matchMedia-display-none-iframe.html.ini @@ -0,0 +1,2 @@ +[matchMedia-display-none-iframe.html] + expected: ERROR diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/offsetTopLeft-border-box.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/offsetTopLeft-border-box.html.ini deleted file mode 100644 index 239c35135e4..00000000000 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/offsetTopLeft-border-box.html.ini +++ /dev/null @@ -1,7 +0,0 @@ -[offsetTopLeft-border-box.html] - [container: 1] - expected: FAIL - - [container: 0] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/custom-elements/reactions/HTMLMediaElement.html.ini b/tests/wpt/metadata-layout-2020/custom-elements/reactions/HTMLMediaElement.html.ini new file mode 100644 index 00000000000..2ca05f57bb0 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/custom-elements/reactions/HTMLMediaElement.html.ini @@ -0,0 +1,2 @@ +[HTMLMediaElement.html] + expected: TIMEOUT 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 0d44a823cc7..ee975808986 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 @@ -318,9 +318,15 @@ [ + diff --git a/tests/wpt/web-platform-tests/origin-isolation/resources/crashy-popup.sub.html.headers b/tests/wpt/web-platform-tests/origin-isolation/resources/crashy-popup.sub.html.headers new file mode 100644 index 00000000000..ea3f6b335c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/origin-isolation/resources/crashy-popup.sub.html.headers @@ -0,0 +1 @@ +Origin-Isolation: ?1 diff --git a/tests/wpt/web-platform-tests/pointerlock/mouse_buttons_back_forward.html b/tests/wpt/web-platform-tests/pointerlock/mouse_buttons_back_forward.html index 95490d2d4df..6f4e764983b 100644 --- a/tests/wpt/web-platform-tests/pointerlock/mouse_buttons_back_forward.html +++ b/tests/wpt/web-platform-tests/pointerlock/mouse_buttons_back_forward.html @@ -32,15 +32,28 @@ } }); + document.addEventListener("pointerlockchange", function() { + assert_equals(document.pointerLockElement, document.body); + + // Inject mouse input + var actions = new test_driver.Actions(); + actions.pointerMove(1, 1) + .pointerDown({button: actions.ButtonType.BACK}) + .pointerUp({button: actions.ButtonType.BACK}) + .pointerDown({button: actions.ButtonType.FORWARD}) + .pointerUp({button: actions.ButtonType.FORWARD}) + .send(); + }, { once: true }); + + document.addEventListener("pointerlockerror", function() { + assert_unreached("Pointer lock error"); + }); + // Inject mouse input var actions = new test_driver.Actions(); actions.pointerMove(1, 1) .pointerDown({button: actions.ButtonType.LEFT}) .pointerUp({button: actions.ButtonType.LEFT}) - .pointerDown({button: actions.ButtonType.BACK}) - .pointerUp({button: actions.ButtonType.BACK}) - .pointerDown({button: actions.ButtonType.FORWARD}) - .pointerUp({button: actions.ButtonType.FORWARD}) .send(); 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 a1f57ac036b..800c0a4a978 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js +++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js @@ -217,8 +217,13 @@ class MockVRService { // Only handles asynchronous calls to makeXrCompatible. Synchronous calls are // not supported in Javascript. makeXrCompatible() { + if (this.runtimes_.length == 0) { + return Promise.resolve({ + xrCompatibleResult: device.mojom.XrCompatibleResult.kNoDeviceAvailable + }); + } return Promise.resolve({ - xr_compatible_result: device.mojom.XrCompatibleResult.kAlreadyCompatible + xrCompatibleResult: device.mojom.XrCompatibleResult.kAlreadyCompatible }); } } diff --git a/tests/wpt/web-platform-tests/resources/testdriver-actions.js b/tests/wpt/web-platform-tests/resources/testdriver-actions.js index 870a2e8e266..b6030bf1213 100644 --- a/tests/wpt/web-platform-tests/resources/testdriver-actions.js +++ b/tests/wpt/web-platform-tests/resources/testdriver-actions.js @@ -9,6 +9,7 @@ function Actions(defaultTickDuration=16) { this.sourceTypes = new Map([["key", KeySource], ["pointer", PointerSource], + ["wheel", WheelSource], ["none", GeneralSource]]); this.sources = new Map(); this.sourceOrder = []; @@ -73,7 +74,7 @@ * If no name is passed, a new source with the given type is * created. * - * @param {String} type - Source type ('none', 'key', or 'pointer') + * @param {String} type - Source type ('none', 'key', 'pointer', or 'wheel') * @param {String?} name - Name of the source * @returns {Source} Source object for that source. */ @@ -154,6 +155,32 @@ return this; }, + /** + * Add a new wheel input source with the given name + * + * @param {String} type - Name of the wheel source + * @param {Bool} set - Set source as the default wheel source + * @returns {Actions} + */ + addWheel: function(name, set=true) { + this.createSource("wheel", name); + if (set) { + this.setWheel(name); + } + return this; + }, + + /** + * Set the current default wheel source + * + * @param {String} name - Name of the wheel source + * @returns {Actions} + */ + setWheel: function(name) { + this.setSource("wheel", name); + return this; + }, + createSource: function(type, name, parameters={}) { if (!this.sources.has(type)) { throw new Error(`${type} is not a valid action type`); @@ -196,8 +223,9 @@ * * @param {Number?} duration - Minimum length of the tick in ms. * @param {String} sourceType - source type - * @param {String?} sourceName - Named key or pointer source to use or null for the default - * key or pointer source + * @param {String?} sourceName - Named key, pointer or wheel source to use + * or null for the default key, pointer or + * wheel source * @returns {Actions} */ pause: function(duration=0, sourceType="none", {sourceName=null}={}) { @@ -280,6 +308,27 @@ source.pointerMove(this, x, y, duration, origin); return this; }, + + /** + * Create a scroll event for the current default wheel source + * + * @param {Number} x - mouse cursor x coordinate + * @param {Number} y - mouse cursor y coordinate + * @param {Number} deltaX - scroll delta value along the x-axis in pixels + * @param {Number} deltaY - scroll delta value along the y-axis in pixels + * @param {String|Element} origin - Origin of the coordinate system. + * Either "viewport" or an Element + * @param {Number?} duration - Time in ms for the scroll + * @param {String?} sourceName - Named wheel source to use or null for the + * default wheel source + * @returns {Actions} + */ + scroll: function(x, y, deltaX, deltaY, + {origin="viewport", duration, sourceName=null}={}) { + let source = this.getSource("wheel", sourceName); + source.scroll(this, x, y, deltaX, deltaY, duration, origin); + return this; + }, }; function GeneralSource() { @@ -417,5 +466,46 @@ }, }; + function WheelSource() { + this.actions = new Map(); + } + + WheelSource.prototype = { + serialize: function(tickCount) { + if (!this.actions.size) { + return undefined; + } + let actions = []; + let data = {"type": "wheel", "actions": actions}; + for (let i=0; i Text + possible_types = self.possible_types + if len(possible_types) == 1: + return possible_types.pop() + rv, _ = self.manifest_items() return rv + @property + def possible_types(self): + # type: () -> Set[Text] + """Determines the set of possible types without reading the file""" + + if self.items_cache: + return {self.items_cache[0]} + + if self.name_is_non_test: + return {SupportFile.item_type} + + if self.name_is_manual: + return {ManualTest.item_type} + + if self.name_is_conformance: + return {ConformanceCheckerTest.item_type} + + if self.name_is_conformance_support: + return {SupportFile.item_type} + + if self.name_is_webdriver: + return {WebDriverSpecTest.item_type} + + if self.name_is_visual: + return {VisualTest.item_type} + + if self.name_is_crashtest: + return {CrashTest.item_type} + + if self.name_is_print_reftest: + return {PrintRefTest.item_type} + + if self.name_is_multi_global: + return {TestharnessTest.item_type} + + if self.name_is_worker: + return {TestharnessTest.item_type} + + if self.name_is_window: + return {TestharnessTest.item_type} + + if self.markup_type is None: + return {SupportFile.item_type} + + if not self.name_is_reference: + return {ManualTest.item_type, + TestharnessTest.item_type, + RefTest.item_type, + VisualTest.item_type, + SupportFile.item_type} + + return {TestharnessTest.item_type, + RefTest.item_type, + SupportFile.item_type} + def manifest_items(self): # type: () -> Tuple[Text, List[ManifestItem]] """List of manifest items corresponding to the file. There is typically one @@ -1070,6 +1129,7 @@ class SourceFile(object): self.rel_path )] + assert rv[0] in self.possible_types assert len(rv[1]) == len(set(rv[1])) self.items_cache = rv diff --git a/tests/wpt/web-platform-tests/tools/serve/serve.py b/tests/wpt/web-platform-tests/tools/serve/serve.py index 1c446153585..8243acc5eb8 100644 --- a/tests/wpt/web-platform-tests/tools/serve/serve.py +++ b/tests/wpt/web-platform-tests/tools/serve/serve.py @@ -418,6 +418,19 @@ class ServerProc(object): def create_daemon(self, init_func, host, port, paths, routes, bind_address, config, **kwargs): + if sys.platform == "darwin": + # on Darwin, NOFILE starts with a very low limit (256), so bump it up a little + # by way of comparison, Debian starts with a limit of 1024, Windows 512 + import resource # local, as it only exists on Unix-like systems + maxfilesperproc = int(subprocess.check_output( + ["sysctl", "-n", "kern.maxfilesperproc"] + ).strip()) + soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) + # 2048 is somewhat arbitrary, but gives us some headroom for wptrunner --parallel + # note that it's expected that 2048 will be the min here + new_soft = min(2048, maxfilesperproc, hard) + if soft < new_soft: + resource.setrlimit(resource.RLIMIT_NOFILE, (new_soft, hard)) try: self.daemon = init_func(host, port, paths, routes, bind_address, config, **kwargs) except socket.error: diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py index 0f79483826b..1a4b6498312 100644 --- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py +++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py @@ -203,6 +203,32 @@ class ActionSequence(object): self.key_up(c) return self + def scroll(self, x, y, delta_x, delta_y, duration=None, origin=None): + """Queue a scroll action. + + :param x: Destination x-axis coordinate of pointer in CSS pixels. + :param y: Destination y-axis coordinate of pointer in CSS pixels. + :param delta_x: scroll delta on x-axis in CSS pixels. + :param delta_y: scroll delta on y-axis in CSS pixels. + :param duration: Number of milliseconds over which to distribute the + scroll. If None, remote end defaults to 0. + :param origin: Origin of coordinates, either "viewport" or an Element. + If None, remote end defaults to "viewport". + """ + action = { + "type": "scroll", + "x": x, + "y": y, + "deltaX": delta_x, + "deltaY": delta_y + } + if duration is not None: + action["duration"] = duration + if origin is not None: + action["origin"] = origin + self._actions.append(action) + return self + class Actions(object): def __init__(self, session): diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py index 664d984da04..6f9da16c50b 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py @@ -656,8 +656,36 @@ class Chrome(Browser): self.logger.warning("Unable to find the browser binary.") return None - def find_webdriver(self, channel=None): - return find_executable("chromedriver") + def find_webdriver(self, channel=None, browser_binary=None): + chromedriver_binary = find_executable("chromedriver") + if not chromedriver_binary: + return chromedriver_binary + + chromedriver_version = self.webdriver_version(chromedriver_binary) + if not chromedriver_version: + self.logger.warning( + "Unable to get version for ChromeDriver %s, rejecting it" % + chromedriver_binary) + return None + + if not browser_binary: + browser_binary = self.find_binary(channel) + browser_version = self.version(browser_binary) + if not browser_version: + # If we can't get the browser version, we just have to assume the + # ChromeDriver is good. + return chromedriver_binary + + # Check that the ChromeDriver version matches the Chrome version. + chromedriver_major = chromedriver_version.split('.')[0] + browser_major = browser_version.split('.')[0] + if chromedriver_major != browser_major: + self.logger.warning( + "Found ChromeDriver %s; does not match Chrome/Chromium %s" % + (chromedriver_version, browser_version)) + return None + + return chromedriver_binary def _official_chromedriver_url(self, chrome_version): # http://chromedriver.chromium.org/downloads/version-selection @@ -700,6 +728,17 @@ class Chrome(Browser): def install_webdriver_by_version(self, version, dest=None): if dest is None: dest = os.pwd + + # There may be an existing chromedriver binary from a previous install. + # To provide a clean install experience, remove the old binary - this + # avoids tricky issues like unzipping over a read-only file. + existing_binary_path = find_executable("chromedriver", dest) + if existing_binary_path: + self.logger.info("Removing existing ChromeDriver binary: %s" % + existing_binary_path) + os.chmod(existing_binary_path, stat.S_IWUSR) + os.remove(existing_binary_path) + url = self._latest_chromedriver_url(version) if version \ else self._chromium_chromedriver_url(None) self.logger.info("Downloading ChromeDriver from %s" % url) @@ -749,6 +788,21 @@ class Chrome(Browser): return None return m.group(1) + def webdriver_version(self, webdriver_binary): + if uname[0] == "Windows": + return _get_fileversion(webdriver_binary, self.logger) + + try: + version_string = call(webdriver_binary, "--version").strip() + except subprocess.CalledProcessError: + self.logger.warning("Failed to call %s" % webdriver_binary) + return None + m = re.match(r"ChromeDriver ([0-9][0-9.]*)", version_string) + if not m: + self.logger.warning("Failed to extract version from: %s" % version_string) + return None + return m.group(1) + class ChromeAndroidBase(Browser): """A base class for ChromeAndroid and AndroidWebView. diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py index 18f1c55145e..8edaa60ab03 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/run.py @@ -334,16 +334,19 @@ class Chrome(BrowserSetup): logger.info("MojoJS enabled") except Exception as e: logger.error("Cannot enable MojoJS: %s" % e) + if kwargs["webdriver_binary"] is None: webdriver_binary = None if not kwargs["install_webdriver"]: - webdriver_binary = self.browser.find_webdriver() + webdriver_binary = self.browser.find_webdriver( + channel=kwargs["browser_channel"], + browser_binary=kwargs["binary"] + ) if webdriver_binary is None: install = self.prompt_install("chromedriver") if install: - logger.info("Downloading chromedriver") webdriver_binary = self.browser.install_webdriver( dest=self.venv.bin_path, channel=browser_channel, @@ -355,7 +358,7 @@ class Chrome(BrowserSetup): if webdriver_binary: kwargs["webdriver_binary"] = webdriver_binary else: - raise WptrunError("Unable to locate or install chromedriver binary") + raise WptrunError("Unable to locate or install matching ChromeDriver binary") if browser_channel in self.experimental_channels: logger.info("Automatically turning on experimental features for Chrome Dev/Canary or Chromium trunk") kwargs["binary_args"].append("--enable-experimental-web-platform-features") diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_browser.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_browser.py index 495d5f056fc..350ee9b5eae 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_browser.py @@ -24,6 +24,68 @@ def test_all_browser_abc(): assert not inspect.isabstract(cls), "%s is abstract" % name +@mock.patch('tools.wpt.browser.find_executable') +def test_chrome_find_webdriver(mocked_find_executable): + # Cannot find ChromeDriver + chrome = browser.Chrome(logger) + mocked_find_executable.return_value = None + assert chrome.find_webdriver() is None + + # ChromeDriver binary cannot be called. + chrome = browser.Chrome(logger) + mocked_find_executable.return_value = '/usr/bin/chromedriver' + chrome.webdriver_version = mock.MagicMock(return_value=None) + assert chrome.find_webdriver() is None + + # Browser binary cannot be called. + chrome = browser.Chrome(logger) + mocked_find_executable.return_value = '/usr/bin/chromedriver' + chrome.webdriver_version = mock.MagicMock(return_value='70.0.1') + chrome.version = mock.MagicMock(return_value=None) + assert chrome.find_webdriver(browser_binary='/usr/bin/chrome') == '/usr/bin/chromedriver' + + # Browser version matches. + chrome = browser.Chrome(logger) + mocked_find_executable.return_value = '/usr/bin/chromedriver' + chrome.webdriver_version = mock.MagicMock(return_value='70.0.1') + chrome.version = mock.MagicMock(return_value='70.1.5') + assert chrome.find_webdriver(browser_binary='/usr/bin/chrome') == '/usr/bin/chromedriver' + + # Browser version doesn't match. + chrome = browser.Chrome(logger) + mocked_find_executable.return_value = '/usr/bin/chromedriver' + chrome.webdriver_version = mock.MagicMock(return_value='70.0.1') + chrome.version = mock.MagicMock(return_value='69.0.1') + assert chrome.find_webdriver(browser_binary='/usr/bin/chrome') is None + + +# On Windows, webdriver_version directly calls _get_fileversion, so there is no +# logic to test there. +@pytest.mark.skipif(sys.platform.startswith('win'), reason='just uses _get_fileversion on Windows') +@mock.patch('tools.wpt.browser.call') +def test_chrome_webdriver_version(mocked_call): + chrome = browser.Chrome(logger) + webdriver_binary = '/usr/bin/chromedriver' + + # Working cases. + mocked_call.return_value = 'ChromeDriver 84.0.4147.30' + assert chrome.webdriver_version(webdriver_binary) == '84.0.4147.30' + mocked_call.return_value = 'ChromeDriver 87.0.1 (abcd1234-refs/branch-heads/4147@{#310})' + assert chrome.webdriver_version(webdriver_binary) == '87.0.1' + + # Various invalid version strings + mocked_call.return_value = 'Chrome 84.0.4147.30 (dev)' + assert chrome.webdriver_version(webdriver_binary) is None + mocked_call.return_value = 'ChromeDriver New 84.0.4147.30' + assert chrome.webdriver_version(webdriver_binary) is None + mocked_call.return_value = '' + assert chrome.webdriver_version(webdriver_binary) is None + + # The underlying subprocess call throws. + mocked_call.side_effect = subprocess.CalledProcessError(5, 'cmd', output='Call failed') + assert chrome.webdriver_version(webdriver_binary) is None + + @mock.patch('subprocess.check_output') def test_safari_version(mocked_check_output): safari = browser.Safari(logger) diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor-types.tentative.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor-types.tentative.any.js index 764aac78670..d5378dbe82b 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor-types.tentative.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor-types.tentative.any.js @@ -1,4 +1,4 @@ -// META: global=jsshell +// META: global=window,dedicatedworker,jsshell // META: script=/wasm/jsapi/assertions.js // META: script=/wasm/jsapi/memory/assertions.js @@ -13,7 +13,7 @@ test(() => { assert_Memory(memory, { "size": 0 }); }, "Zero minimum"); - test(() => { +test(() => { const argument = { minimum: 4 }; const memory = new WebAssembly.Memory(argument); assert_Memory(memory, { "size": 4 }); diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor.any.js index 30cc8ef9885..0a0be11e370 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/memory/constructor.any.js @@ -76,7 +76,7 @@ test(() => { switch (x) { case "shared": return false; - case "minimum": + case "initial": case "maximum": return 0; default: diff --git a/tests/wpt/web-platform-tests/wasm/jsapi/table/constructor-types.tentative.any.js b/tests/wpt/web-platform-tests/wasm/jsapi/table/constructor-types.tentative.any.js index 09ab18a2d8c..99ca41b55a9 100644 --- a/tests/wpt/web-platform-tests/wasm/jsapi/table/constructor-types.tentative.any.js +++ b/tests/wpt/web-platform-tests/wasm/jsapi/table/constructor-types.tentative.any.js @@ -1,20 +1,20 @@ -// META: global=jsshell +// META: global=window,dedicatedworker,jsshell // META: script=/wasm/jsapi/assertions.js // META: script=/wasm/jsapi/table/assertions.js test(() => { const argument = { "element": "anyfunc", "initial": 0, "minimum": 0 }; - assert_throws_js(TypeError, () => WebAssembly.Table(argument)); -}, "Supplying both initial and minimum"); + assert_throws_js(TypeError, () => new WebAssembly.Table(argument)); +}, "Initializing with both initial and minimum"); test(() => { const argument = { "element": "anyfunc", "minimum": 0 }; const table = new WebAssembly.Table(argument); assert_Table(table, { "length": 0 }); -}, "Basic (zero, minimum)"); +}, "Zero minimum"); test(() => { const argument = { "element": "anyfunc", "minimum": 5 }; const table = new WebAssembly.Table(argument); assert_Table(table, { "length": 5 }); -}, "Basic (non-zero, minimum)"); \ No newline at end of file +}, "Non-zero minimum"); \ No newline at end of file diff --git a/tests/wpt/web-platform-tests/web-share/canShare.tentative.https.html b/tests/wpt/web-platform-tests/web-share/canShare.tentative.https.html index bb263e54255..55e026dd4cc 100644 --- a/tests/wpt/web-platform-tests/web-share/canShare.tentative.https.html +++ b/tests/wpt/web-platform-tests/web-share/canShare.tentative.https.html @@ -11,74 +11,74 @@ 'use strict'; test(() => { - assert_equals(navigator.canShare(), false); + assert_false(navigator.canShare()); }, 'canShare with no arguments (same as empty dictionary)'); test(() => { - assert_equals(navigator.canShare({}), false); + assert_false(navigator.canShare({})); }, 'canShare with an empty dictionary'); test(() => { - assert_equals(navigator.canShare(undefined), false); + assert_false(navigator.canShare(undefined)); }, 'canShare with a undefined argument (same as empty dictionary)'); test(() => { - assert_equals(navigator.canShare(null), false); + assert_false(navigator.canShare(null)); }, 'canShare with a null argument (same as empty dictionary)'); test(() => { - assert_equals(navigator.canShare({unused: 'unexpected field'}), false); + assert_false(navigator.canShare({unused: 'unexpected field'})); }, 'canShare with a dictionary containing only surplus fields'); test(() => { // URL is invalid in that the URL Parser returns failure (port is too // large). const url = 'http://example.com:65536'; - assert_equals(navigator.canShare({url}), false); + assert_false(navigator.canShare({url})); }, 'canShare with an invalid URL'); test(() => { - assert_equals(navigator.canShare({title: undefined}), false); - }, 'canShare with attribute undefined is equivalent to omitting the attribute'); - - test(() => { - assert_equals(navigator.canShare({title: 'subject'}), true); - }, 'canShare with title'); - - test(() => { - assert_equals(navigator.canShare({text: 'body'}), true); - }, 'canShare with text'); - - test(() => { - assert_equals(navigator.canShare({url: 'https://www.example.com/some/path?some_query#some_fragment'}), true); - }, 'canShare with URL'); - - test(() => { - assert_equals(navigator.canShare({title: null}), true); - }, 'canShare with null attribute'); - - test(() => { - assert_equals(navigator.canShare({text: 123}), true); - }, 'canShare with number'); - - test(() => { - assert_equals(navigator.canShare({url: {toString() { return 'https://example.com/'; }}}), true); - }, 'canShare with object'); - - test(() => { - assert_equals(navigator.canShare({title: 'subject', text: 'body', url: 'https://example.com/', unused: 'unexpected field'}), true); - }, 'canShare with unexpected field'); - - test(() => { - assert_equals(navigator.canShare({url: 'data:the url'}), true); + assert_false(navigator.canShare({url: 'data:the url'})); }, 'canShare with data URL'); test(() => { - assert_equals(navigator.canShare({url: ''}), true); + assert_false(navigator.canShare({title: undefined})); + }, 'canShare with attribute undefined is equivalent to omitting the attribute'); + + test(() => { + assert_true(navigator.canShare({title: 'subject'})); + }, 'canShare with title'); + + test(() => { + assert_true(navigator.canShare({text: 'body'})); + }, 'canShare with text'); + + test(() => { + assert_true(navigator.canShare({url: 'https://www.example.com/some/path?some_query#some_fragment'})); + }, 'canShare with URL'); + + test(() => { + assert_true(navigator.canShare({title: null})); + }, 'canShare with null attribute'); + + test(() => { + assert_true(navigator.canShare({text: 123})); + }, 'canShare with number'); + + test(() => { + assert_true(navigator.canShare({url: {toString() { return 'https://example.com/'; }}})); + }, 'canShare with object'); + + test(() => { + assert_true(navigator.canShare({title: 'subject', text: 'body', url: 'https://example.com/', unused: 'unexpected field'})); + }, 'canShare with unexpected field'); + + test(() => { + assert_true(navigator.canShare({url: ''})); }, 'canShare with empty URL'); test(() => { - assert_equals(navigator.canShare({url: '//www.example.com/some/path?some_query#some_fragment'}), true); + assert_true(navigator.canShare({url: '//www.example.com/some/path?some_query#some_fragment'})); }, 'canShare with URL having no scheme'); diff --git a/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html b/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html index af03086ee04..fd8d38d2dfd 100644 --- a/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html +++ b/tests/wpt/web-platform-tests/webauthn/getcredential-extensions.https.html @@ -46,16 +46,9 @@ standardSetup(function() { .addCredential(credPromise) .runTest("extension ID too long"); - // TODO - // defined extensions: - // * appid - // * txAuthSimple - // * txAuthGeneric - // * authnSel - // * exts - // * uvi - // * loc - // * uvm + new GetCredentialsTest("options.publicKey.extensions", {credProps: true}) + .addCredential(credPromise) + .runTest("credProps is only supported at registration", "NotSupportedError"); }); /* JSHINT */ diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py index 5ee8ae1c741..970f7b7dd9b 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py @@ -18,6 +18,7 @@ def session_new_window(capabilities, session): session.window_handle = original_handle + @pytest.fixture def key_chain(session): return session.actions.sequence("key", "keyboard_id") @@ -36,6 +37,11 @@ def none_chain(session): return session.actions.sequence("none", "none_id") +@pytest.fixture +def wheel_chain(session): + return session.actions.sequence("wheel", "wheel_id") + + @pytest.fixture(autouse=True) def release_actions(session, request): # release all actions after each test @@ -55,3 +61,8 @@ def key_reporter(session, test_actions_page, request): @pytest.fixture def test_actions_page(session, url): session.url = url("/webdriver/tests/perform_actions/support/test_actions_wdspec.html") + + +@pytest.fixture +def test_actions_scroll_page(session, url): + session.url = url("/webdriver/tests/perform_actions/support/test_actions_scroll_wdspec.html") diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/test_actions_scroll_wdspec.html b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/test_actions_scroll_wdspec.html new file mode 100644 index 00000000000..b6e281e5818 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/test_actions_scroll_wdspec.html @@ -0,0 +1,103 @@ + + + + + Test Actions + + + + +
+

ScrollReporter

+
+
+
+
+

OverflowScrollReporter

+
+
+
+
+
+

IframeScrollReporter

+ +
+
+

Events

+
+
+ + diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/wheel.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/wheel.py new file mode 100644 index 00000000000..fc84f2f2e01 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/wheel.py @@ -0,0 +1,63 @@ +import pytest + +from webdriver.error import NoSuchWindowException + +from tests.perform_actions.support.refine import filter_dict, get_events +from tests.support.asserts import assert_move_to_coordinates + + +def test_null_response_value(session, wheel_chain): + value = wheel_chain.scroll(0, 0, 0, 10).perform() + assert value is None + + +def test_no_top_browsing_context(session, closed_window, wheel_chain): + with pytest.raises(NoSuchWindowException): + wheel_chain.scroll(0, 0, 0, 10).perform() + + +def test_no_browsing_context(session, closed_window, wheel_chain): + with pytest.raises(NoSuchWindowException): + wheel_chain.scroll(0, 0, 0, 10).perform() + + +def test_wheel_scroll(session, test_actions_scroll_page, wheel_chain): + session.execute_script("document.scrollingElement.scrollTop = 0") + + outer = session.find.css("#outer", all=False) + wheel_chain.scroll(0, 0, 5, 10, origin=outer).perform() + events = get_events(session) + assert len(events) == 1 + assert events[0]["type"] == "wheel" + assert events[0]["deltaX"] >= 5 + assert events[0]["deltaY"] >= 10 + assert events[0]["deltaZ"] == 0 + assert events[0]["target"] == "outer" + + +def test_wheel_scroll_overflow(session, test_actions_scroll_page, wheel_chain): + session.execute_script("document.scrollingElement.scrollTop = 0") + + scrollable = session.find.css("#scrollable", all=False) + wheel_chain.scroll(0, 0, 5, 10, origin=scrollable).perform() + events = get_events(session) + assert len(events) == 1 + assert events[0]["type"] == "wheel" + assert events[0]["deltaX"] >= 5 + assert events[0]["deltaY"] >= 10 + assert events[0]["deltaZ"] == 0 + assert events[0]["target"] == "scrollContent" + + +def test_wheel_scroll_iframe(session, test_actions_scroll_page, wheel_chain): + session.execute_script("document.scrollingElement.scrollTop = 0") + + subframe = session.find.css("#subframe", all=False) + wheel_chain.scroll(0, 0, 5, 10, origin=subframe).perform() + events = get_events(session) + assert len(events) == 1 + assert events[0]["type"] == "wheel" + assert events[0]["deltaX"] >= 5 + assert events[0]["deltaY"] >= 10 + assert events[0]["deltaZ"] == 0 + assert events[0]["target"] == "iframeContent" diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html index bdf7770350e..f39fd2c3137 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html @@ -247,7 +247,7 @@ const dataChannel = pc1.createDataChannel('test-channel'); - return getNoiseStream({ + getNoiseStream({ audio: true, video: true }) diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html index 4bdcddec511..217326bfae2 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-replaceTrack.https.html @@ -13,7 +13,7 @@ async_test(t => { const caller = new RTCPeerConnection(); t.add_cleanup(() => caller.close()); - return getUserMediaTracksAndStreams(2) + getUserMediaTracksAndStreams(2) .then(t.step_func(([tracks, streams]) => { const sender = caller.addTrack(tracks[0], streams[0]); return sender.replaceTrack(tracks[1]) @@ -30,7 +30,7 @@ async_test(t => { const caller = new RTCPeerConnection(); t.add_cleanup(() => caller.close()); - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { const sender = caller.addTrack(tracks[0], streams[0]); return sender.replaceTrack(null) @@ -47,7 +47,7 @@ async_test(t => { const caller = new RTCPeerConnection(); t.add_cleanup(() => caller.close()); - return getUserMediaTracksAndStreams(2) + getUserMediaTracksAndStreams(2) .then(t.step_func(([tracks, streams]) => { const sender = caller.addTrack(tracks[0], streams[0]); assert_equals(sender.track, tracks[0]); @@ -66,7 +66,7 @@ const expectedException = 'InvalidStateError'; const caller = new RTCPeerConnection(); t.add_cleanup(() => caller.close()); - return getUserMediaTracksAndStreams(2) + getUserMediaTracksAndStreams(2) .then(t.step_func(([tracks, streams]) => { const sender = caller.addTrack(tracks[0], streams[0]); caller.close(); diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html index 7b43e4e0bb4..42054ad9e66 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-track-stats.https.html @@ -23,7 +23,7 @@ const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); let track; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); track = tracks[0]; @@ -49,7 +49,7 @@ const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); let stream; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); let track = tracks[0]; @@ -72,7 +72,7 @@ const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); let track; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); track = tracks[0]; @@ -100,7 +100,7 @@ const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); let stream; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); let track = tracks[0]; @@ -130,7 +130,7 @@ t.add_cleanup(() => pc.close()); let track; let stream; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); track = tracks[0]; @@ -165,7 +165,7 @@ t.add_cleanup(() => pc.close()); let track; let stream; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); track = tracks[0]; @@ -203,7 +203,7 @@ const callee = new RTCPeerConnection(); t.add_cleanup(() => callee.close()); let sendingTrack; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); sendingTrack = tracks[0]; @@ -238,7 +238,7 @@ assert_equals(receivingTrack, undefined, 'ontrack has not fired before'); receivingTrack = trackEvent.track; }; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); caller.addTrack(tracks[0], streams[0]); @@ -271,7 +271,7 @@ let sendingTrack1; let sendingTrack2; let sender; - return getUserMediaTracksAndStreams(2) + getUserMediaTracksAndStreams(2) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); sendingTrack1 = tracks[0]; @@ -301,7 +301,7 @@ let sendingTrack1; let sendingTrack2; let sender; - return getUserMediaTracksAndStreams(2) + getUserMediaTracksAndStreams(2) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); sendingTrack1 = tracks[0]; @@ -339,7 +339,7 @@ let sendingTrack1; let sendingTrack2; let sender; - return getUserMediaTracksAndStreams(2) + getUserMediaTracksAndStreams(2) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); sendingTrack1 = tracks[0]; @@ -376,7 +376,7 @@ let sendingTrack1; let sendingTrack2; let sender; - return getUserMediaTracksAndStreams(2) + getUserMediaTracksAndStreams(2) .then(t.step_func(([tracks, streams]) => { t.add_cleanup(() => tracks.forEach(track => track.stop())); sendingTrack1 = tracks[0]; diff --git a/tests/wpt/web-platform-tests/webrtc/legacy/RTCPeerConnection-addStream.https.html b/tests/wpt/web-platform-tests/webrtc/legacy/RTCPeerConnection-addStream.https.html index 5a35ebc53b8..7ebcacda537 100644 --- a/tests/wpt/web-platform-tests/webrtc/legacy/RTCPeerConnection-addStream.https.html +++ b/tests/wpt/web-platform-tests/webrtc/legacy/RTCPeerConnection-addStream.https.html @@ -27,7 +27,7 @@ t.add_cleanup(() => pc.close()); let track; let stream; - return getUserMediaTracksAndStreams(1) + getUserMediaTracksAndStreams(1) .then(t.step_func(([tracks, streams]) => { track = tracks[0]; stream = streams[0]; diff --git a/tests/wpt/web-platform-tests/webrtc/protocol/candidate-exchange.https.html b/tests/wpt/web-platform-tests/webrtc/protocol/candidate-exchange.https.html index 82178953b6b..c54f26e6d80 100644 --- a/tests/wpt/web-platform-tests/webrtc/protocol/candidate-exchange.https.html +++ b/tests/wpt/web-platform-tests/webrtc/protocol/candidate-exchange.https.html @@ -186,6 +186,33 @@ promise_test(async t => { assert_array_equals(pc2IceStates.events, ['new', 'checking', 'connected']); }, 'Explicit offer/answer exchange gives a connection'); +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + pc1.createDataChannel('datachannel'); + pc1.onicecandidate = assert_unreached; + const offer = await pc1.createOffer(); + await pc1.setLocalDescription(offer); + await new Promise(resolve => { + pc1.onicecandidate = resolve; + }); +}, 'Candidates always arrive after setLocalDescription(offer) resolves'); + +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + pc1.createDataChannel('datachannel'); + pc2.onicecandidate = assert_unreached; + const offer = await pc1.createOffer(); + await pc2.setRemoteDescription(offer); + await pc2.setLocalDescription(await pc2.createAnswer()); + await new Promise(resolve => { + pc2.onicecandidate = resolve; + }); +}, 'Candidates always arrive after setLocalDescription(answer) resolves'); + diff --git a/tests/wpt/web-platform-tests/webxr/webGLCanvasContext_create_xrcompatible.https.html b/tests/wpt/web-platform-tests/webxr/webGLCanvasContext_create_xrcompatible.https.html index 33e54865253..2b3a1fccc45 100644 --- a/tests/wpt/web-platform-tests/webxr/webGLCanvasContext_create_xrcompatible.https.html +++ b/tests/wpt/web-platform-tests/webxr/webGLCanvasContext_create_xrcompatible.https.html @@ -6,6 +6,15 @@ diff --git a/tests/wpt/web-platform-tests/webxr/webxr_feature_policy.https.html b/tests/wpt/web-platform-tests/webxr/webxr_feature_policy.https.html index 7f3d03b48e5..b493ec73cce 100644 --- a/tests/wpt/web-platform-tests/webxr/webxr_feature_policy.https.html +++ b/tests/wpt/web-platform-tests/webxr/webxr_feature_policy.https.html @@ -78,4 +78,20 @@ xr_promise_test( }); }); + +xr_promise_test( +"Validate xr compatibility requests without xr-spatial-tracking policy", +(t) => { + let canvas = document.createElement('canvas'); + let gl = canvas.getContext('webgl', {xrCompatible: true}); + + t.step(() => { + assert_false(gl.getContextAttributes().xrCompatible, + "xrCompatibility shouldn't be set when requested without feature policy"); + }); + + return promise_rejects_dom(t, "SecurityError", + gl.makeXRCompatible(), + "makeXRCompatible should reject without feature policy"); +});