From 0e5e5db3976c2d5b97ae52bc88349d8b5e21cef9 Mon Sep 17 00:00:00 2001 From: WPT Sync Bot Date: Sat, 26 Jan 2019 20:37:16 -0500 Subject: [PATCH] Update web-platform-tests to revision 8ae1ddbc812733c3a73b103eafad56fb43a2f4b5 --- .../FileAPI/url/url-with-fetch.any.js.ini | 6 + tests/wpt/metadata/MANIFEST.json | 428 +++++++++++------- .../css/css-fonts/idlharness.html.ini | 51 ++- .../properties-value-001.html.ini | 6 - .../scroll-behavior-smooth.html.ini | 3 + .../encoding/single-byte-decoder.html.ini | 40 +- .../fetch/content-type/response.window.js.ini | 3 + .../stale-css.tentative.html.ini | 4 + .../stale-image.tentative.html.ini | 5 + .../stale-script.tentative.html.ini | 4 + ...ation-unload-same-origin-fragment.html.ini | 4 + .../traverse_the_history_1.html.ini | 4 + .../traverse_the_history_5.html.ini | 4 + .../html/dom/interfaces.https.html.ini | 27 ++ .../the-details-element/toggleEvent.html.ini | 7 + .../promise-rejection-events.html.ini | 5 + ...ce_connection_reuse_mixed_content.html.ini | 4 + ...tion_reuse_mixed_content_redirect.html.ini | 4 + .../metadata/wasm/jsapi/idlharness.any.js.ini | 18 + .../wpt/metadata/webstorage/set.window.js.ini | 7 + .../alpha/import-in-moduleworker.html.ini | 1 - .../semantics/run-a-worker/003.html.ini | 1 + .../css/transition_calc_implicit.html.ini | 2 + .../meta/mozilla/paint_timing.html.ini | 4 - .../animation-worklet/common.js | 6 - .../references/translated-box-ref.html | 11 - ...let-animation-pause-immediately.https.html | 37 -- .../worklet-animation-pause-resume.https.html | 40 -- .../worklet-animation-pause.https.html | 58 --- .../css/css-conditional/idlharness.html | 36 +- .../css/css-fonts/idlharness.html | 33 +- .../css/css-paint-api/idlharness.html | 20 +- .../css-properties-values-api/idlharness.html | 14 +- .../css/css-syntax/anb-parsing.html | 125 +++++ .../css/css-syntax/anb-serialization.html | 62 +++ .../css/css-syntax/inclusive-ranges.html | 60 +++ .../css/css-syntax/input-preprocessing.html | 46 ++ .../css/css-syntax/unclosed-constructs.html | 36 ++ .../css/css-syntax/whitespace.html | 62 +++ .../vh_not_refreshing_on_chrome.html | 1 + ...port-relative-lengths-scaled-viewport.html | 1 + .../css-values/viewport-units-css2-001.html | 1 + .../reporting/xr-report-only.https.html | 8 +- .../reporting/xr-reporting.https.html | 2 +- .../fetch.tentative.html | 17 + .../fetch/stale-while-revalidate/stale-css.py | 20 + .../stale-css.tentative.html | 47 ++ .../stale-while-revalidate/stale-image.py | 30 ++ .../stale-image.tentative.html | 51 +++ .../stale-while-revalidate/stale-script.py | 25 + .../stale-script.tentative.html | 55 +++ .../fonts/noto/NotoNaskhArabic-regular.woff2 | Bin 0 -> 92576 bytes .../interfaces/ambient-light.idl | 4 + .../interfaces/css-layout-api.idl | 48 +- .../interfaces/generic-sensor.idl | 90 ++++ .../web-platform-tests/interfaces/html.idl | 8 +- .../interfaces/payment-request.idl | 3 - .../interfaces/picture-in-picture.idl | 1 + .../interfaces/shape-detection-api.idl | 2 +- .../interfaces/wasm-js-api.idl | 2 +- .../interfaces/webrtc-stats.idl | 8 +- .../preload/link-header-preload-nonce.html | 4 +- .../link-header-preload-nonce.html.headers | 4 +- .../link-header-preload-srcset.tentative.html | 20 +- ...ader-preload-srcset.tentative.html.headers | 6 +- .../resource_connection_reuse.html | 2 +- .../resource_connection_reuse.https.html | 2 +- ...source_connection_reuse_mixed_content.html | 55 +++ ...nnection_reuse_mixed_content_redirect.html | 55 +++ .../resources/fake_responses.py | 9 +- .../resources/fake_responses_https.sub.html | 18 + .../fake_responses_https_redirect.sub.html | 20 + .../clients-get-resultingClientId.https.html | 177 ++++++++ .../resources/get-resultingClientId-worker.js | 107 +++++ .../signed-exchange/resources/sxg-util.js | 4 +- tests/wpt/web-platform-tests/tools/tox.ini | 8 +- tests/wpt/web-platform-tests/tools/wpt/run.py | 6 +- .../tools/wpt/tests/test_run.py | 1 + .../tools/wpt/tests/test_wpt.py | 2 +- .../tools/wpt/virtualenv.py | 10 +- tests/wpt/web-platform-tests/tools/wpt/wpt.py | 23 +- ...WorkerGlobalScope-importScripts.https.html | 42 -- .../WorkerGlobalScope-importScripts.https.js | 70 --- ...GlobalScope-importScripts.https.js.headers | 1 - .../tests/perform_actions/support/keys.py | 10 +- .../webrtc/RTCIceCandidate-constructor.html | 80 ++-- .../RTCIceTransport-extension.https.html | 3 +- .../webstorage/defineProperty.window.js | 57 +++ .../webstorage/set.window.js | 102 +++++ .../navigator_xr_requestDevice.https.html | 19 - ...ator_xr_requestDevice_no_device.https.html | 12 - .../webxr/resources/webxr_util.js | 10 +- ...Device_requestSession_immersive.https.html | 2 +- ...estSession_immersive_no_gesture.https.html | 5 +- ...stSession_immersive_unsupported.https.html | 5 +- ...ession_non_immersive_no_gesture.https.html | 5 +- ...evice_supportsSession_immersive.https.html | 5 +- ...tsSession_immersive_unsupported.https.html | 7 +- ...e_supportsSession_non_immersive.https.html | 14 +- .../xrSession_cancelAnimationFrame.https.html | 2 +- ...celAnimationFrame_invalidhandle.https.html | 2 +- .../webxr/xrSession_end.https.html | 2 +- .../webxr/xrSession_mode.https.html | 22 + ...sion_prevent_multiple_exclusive.https.html | 13 +- ...stAnimationFrame_callback_calls.https.html | 2 +- ...equestAnimationFrame_data_valid.https.html | 2 +- ...estAnimationFrame_getViewerPose.https.html | 2 +- ...xrSession_requestReferenceSpace.https.html | 2 +- .../workers/semantics/run-a-worker/003.html | 18 +- 109 files changed, 2053 insertions(+), 708 deletions(-) create mode 100644 tests/wpt/metadata/fetch/stale-while-revalidate/stale-css.tentative.html.ini create mode 100644 tests/wpt/metadata/fetch/stale-while-revalidate/stale-image.tentative.html.ini create mode 100644 tests/wpt/metadata/fetch/stale-while-revalidate/stale-script.tentative.html.ini create mode 100644 tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin-fragment.html.ini create mode 100644 tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini create mode 100644 tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini create mode 100644 tests/wpt/metadata/html/semantics/interactive-elements/the-details-element/toggleEvent.html.ini create mode 100644 tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini create mode 100644 tests/wpt/metadata/resource-timing/resource_connection_reuse_mixed_content.html.ini create mode 100644 tests/wpt/metadata/resource-timing/resource_connection_reuse_mixed_content_redirect.html.ini create mode 100644 tests/wpt/metadata/webstorage/set.window.js.ini create mode 100644 tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini delete mode 100644 tests/wpt/mozilla/meta/mozilla/paint_timing.html.ini delete mode 100644 tests/wpt/web-platform-tests/animation-worklet/references/translated-box-ref.html delete mode 100644 tests/wpt/web-platform-tests/animation-worklet/worklet-animation-pause-immediately.https.html delete mode 100644 tests/wpt/web-platform-tests/animation-worklet/worklet-animation-pause-resume.https.html delete mode 100644 tests/wpt/web-platform-tests/animation-worklet/worklet-animation-pause.https.html create mode 100644 tests/wpt/web-platform-tests/css/css-syntax/anb-parsing.html create mode 100644 tests/wpt/web-platform-tests/css/css-syntax/anb-serialization.html create mode 100644 tests/wpt/web-platform-tests/css/css-syntax/inclusive-ranges.html create mode 100644 tests/wpt/web-platform-tests/css/css-syntax/input-preprocessing.html create mode 100644 tests/wpt/web-platform-tests/css/css-syntax/unclosed-constructs.html create mode 100644 tests/wpt/web-platform-tests/css/css-syntax/whitespace.html create mode 100644 tests/wpt/web-platform-tests/fetch/stale-while-revalidate/fetch.tentative.html create mode 100644 tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-css.py create mode 100644 tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-css.tentative.html create mode 100644 tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-image.py create mode 100644 tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-image.tentative.html create mode 100644 tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.py create mode 100644 tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.tentative.html create mode 100644 tests/wpt/web-platform-tests/fonts/noto/NotoNaskhArabic-regular.woff2 create mode 100644 tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content.html create mode 100644 tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content_redirect.html create mode 100644 tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https.sub.html create mode 100644 tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https_redirect.sub.html create mode 100644 tests/wpt/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https.html create mode 100644 tests/wpt/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js delete mode 100644 tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.html delete mode 100644 tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js delete mode 100644 tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js.headers create mode 100644 tests/wpt/web-platform-tests/webstorage/defineProperty.window.js create mode 100644 tests/wpt/web-platform-tests/webstorage/set.window.js delete mode 100644 tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice.https.html delete mode 100644 tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice_no_device.https.html create mode 100644 tests/wpt/web-platform-tests/webxr/xrSession_mode.https.html diff --git a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini index 947e223fb28..3a3d15b8406 100644 --- a/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-with-fetch.any.js.ini @@ -14,6 +14,9 @@ [Revoke blob URL after creating Request, will fetch] expected: FAIL + [Revoke blob URL after calling fetch, fetch should succeed] + expected: FAIL + [url-with-fetch.any.html] [Untitled] @@ -34,3 +37,6 @@ [Revoke blob URL after creating Request, will fetch] expected: FAIL + [Revoke blob URL after calling fetch, fetch should succeed] + expected: FAIL + diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index fcefdf9f231..b39f044c13a 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -19377,30 +19377,6 @@ {} ] ], - "animation-worklet/worklet-animation-pause-immediately.https.html": [ - [ - "/animation-worklet/worklet-animation-pause-immediately.https.html", - [ - [ - "/animation-worklet/references/translated-box-ref.html", - "==" - ] - ], - {} - ] - ], - "animation-worklet/worklet-animation-pause-resume.https.html": [ - [ - "/animation-worklet/worklet-animation-pause-resume.https.html", - [ - [ - "/animation-worklet/references/translated-box-ref.html", - "==" - ] - ], - {} - ] - ], "apng/animated-png-timeout.html": [ [ "/apng/animated-png-timeout.html", @@ -202124,11 +202100,6 @@ {} ] ], - "animation-worklet/references/translated-box-ref.html": [ - [ - {} - ] - ], "animation-worklet/resources/animator-iframe.html": [ [ {} @@ -289134,6 +289105,21 @@ {} ] ], + "fetch/stale-while-revalidate/stale-css.py": [ + [ + {} + ] + ], + "fetch/stale-while-revalidate/stale-image.py": [ + [ + {} + ] + ], + "fetch/stale-while-revalidate/stale-script.py": [ + [ + {} + ] + ], "fonts/AD.woff": [ [ {} @@ -289879,6 +289865,11 @@ {} ] ], + "fonts/noto/NotoNaskhArabic-regular.woff2": [ + [ + {} + ] + ], "fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt": [ [ {} @@ -307759,6 +307750,16 @@ {} ] ], + "resource-timing/resources/fake_responses_https.sub.html": [ + [ + {} + ] + ], + "resource-timing/resources/fake_responses_https_redirect.sub.html": [ + [ + {} + ] + ], "resource-timing/resources/green_frame.htm": [ [ {} @@ -311604,6 +311605,11 @@ {} ] ], + "service-workers/service-worker/resources/get-resultingClientId-worker.js": [ + [ + {} + ] + ], "service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html": [ [ {} @@ -321044,16 +321050,6 @@ {} ] ], - "trusted-types/WorkerGlobalScope-importScripts.https.js": [ - [ - {} - ] - ], - "trusted-types/WorkerGlobalScope-importScripts.https.js.headers": [ - [ - {} - ] - ], "trusted-types/support/helper.sub.js": [ [ {} @@ -335489,12 +335485,6 @@ {} ] ], - "animation-worklet/worklet-animation-pause.https.html": [ - [ - "/animation-worklet/worklet-animation-pause.https.html", - {} - ] - ], "animation-worklet/worklet-animation-with-fill-mode.https.html": [ [ "/animation-worklet/worklet-animation-with-fill-mode.https.html", @@ -347547,6 +347537,18 @@ {} ] ], + "css/css-syntax/anb-parsing.html": [ + [ + "/css/css-syntax/anb-parsing.html", + {} + ] + ], + "css/css-syntax/anb-serialization.html": [ + [ + "/css/css-syntax/anb-serialization.html", + {} + ] + ], "css/css-syntax/charset-is-not-a-rule.html": [ [ "/css/css-syntax/charset-is-not-a-rule.html", @@ -347679,12 +347681,36 @@ {} ] ], + "css/css-syntax/inclusive-ranges.html": [ + [ + "/css/css-syntax/inclusive-ranges.html", + {} + ] + ], + "css/css-syntax/input-preprocessing.html": [ + [ + "/css/css-syntax/input-preprocessing.html", + {} + ] + ], + "css/css-syntax/unclosed-constructs.html": [ + [ + "/css/css-syntax/unclosed-constructs.html", + {} + ] + ], "css/css-syntax/unicode-range-selector.html": [ [ "/css/css-syntax/unicode-range-selector.html", {} ] ], + "css/css-syntax/whitespace.html": [ + [ + "/css/css-syntax/whitespace.html", + {} + ] + ], "css/css-tables/bounding-box-computation-1.html": [ [ "/css/css-tables/bounding-box-computation-1.html", @@ -369319,6 +369345,30 @@ {} ] ], + "fetch/stale-while-revalidate/fetch.tentative.html": [ + [ + "/fetch/stale-while-revalidate/fetch.tentative.html", + {} + ] + ], + "fetch/stale-while-revalidate/stale-css.tentative.html": [ + [ + "/fetch/stale-while-revalidate/stale-css.tentative.html", + {} + ] + ], + "fetch/stale-while-revalidate/stale-image.tentative.html": [ + [ + "/fetch/stale-while-revalidate/stale-image.tentative.html", + {} + ] + ], + "fetch/stale-while-revalidate/stale-script.tentative.html": [ + [ + "/fetch/stale-while-revalidate/stale-script.tentative.html", + {} + ] + ], "fullscreen/api/document-exit-fullscreen-active-document.html": [ [ "/fullscreen/api/document-exit-fullscreen-active-document.html", @@ -409345,6 +409395,18 @@ {} ] ], + "resource-timing/resource_connection_reuse_mixed_content.html": [ + [ + "/resource-timing/resource_connection_reuse_mixed_content.html", + {} + ] + ], + "resource-timing/resource_connection_reuse_mixed_content_redirect.html": [ + [ + "/resource-timing/resource_connection_reuse_mixed_content_redirect.html", + {} + ] + ], "resource-timing/resource_dedicated_worker.html": [ [ "/resource-timing/resource_dedicated_worker.html", @@ -410397,6 +410459,12 @@ {} ] ], + "service-workers/service-worker/clients-get-resultingClientId.https.html": [ + [ + "/service-workers/service-worker/clients-get-resultingClientId.https.html", + {} + ] + ], "service-workers/service-worker/clients-get.https.html": [ [ "/service-workers/service-worker/clients-get.https.html", @@ -415199,12 +415267,6 @@ {} ] ], - "trusted-types/WorkerGlobalScope-importScripts.https.html": [ - [ - "/trusted-types/WorkerGlobalScope-importScripts.https.html", - {} - ] - ], "trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html": [ [ "/trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html", @@ -422263,6 +422325,12 @@ } ] ], + "webstorage/defineProperty.window.js": [ + [ + "/webstorage/defineProperty.window.html", + {} + ] + ], "webstorage/document-domain.html": [ [ "/webstorage/document-domain.html", @@ -422403,6 +422471,12 @@ {} ] ], + "webstorage/set.window.js": [ + [ + "/webstorage/set.window.html", + {} + ] + ], "webstorage/storage_builtins.html": [ [ "/webstorage/storage_builtins.html", @@ -423205,18 +423279,6 @@ {} ] ], - "webxr/navigator_xr_requestDevice.https.html": [ - [ - "/webxr/navigator_xr_requestDevice.https.html", - {} - ] - ], - "webxr/navigator_xr_requestDevice_no_device.https.html": [ - [ - "/webxr/navigator_xr_requestDevice_no_device.https.html", - {} - ] - ], "webxr/webGLCanvasContext_create_xrcompatible.https.html": [ [ "/webxr/webGLCanvasContext_create_xrcompatible.https.html", @@ -423295,6 +423357,12 @@ {} ] ], + "webxr/xrSession_mode.https.html": [ + [ + "/webxr/xrSession_mode.https.html", + {} + ] + ], "webxr/xrSession_prevent_multiple_exclusive.https.html": [ [ "/webxr/xrSession_prevent_multiple_exclusive.https.html", @@ -455239,7 +455307,7 @@ "testharness" ], "animation-worklet/common.js": [ - "15dff829774a49a1c17eacefebc7e5e34a422f9d", + "eb114f24687289fcdd0515ead7dbbc074c7ccbba", "support" ], "animation-worklet/current-time.https.html": [ @@ -455250,10 +455318,6 @@ "e821a2fee8a3ace54e8e7092ab17c490a0ded914", "testharness" ], - "animation-worklet/references/translated-box-ref.html": [ - "c73f5a177bf70f3a71d981bc9f04b38c5afe9f1c", - "support" - ], "animation-worklet/resources/animator-iframe.html": [ "e30cc281fcdefd8d029e7bf0ea92a1a9cd7af7e7", "support" @@ -455262,18 +455326,6 @@ "5b20f03bfadb5790c79ddd51e1f3d89a9f948852", "testharness" ], - "animation-worklet/worklet-animation-pause-immediately.https.html": [ - "f9dcf30bc908adb4e6b260dd00263e434a9b9ae4", - "reftest" - ], - "animation-worklet/worklet-animation-pause-resume.https.html": [ - "f26a93468c07de8e59a3826cb39c6bdf2618706f", - "reftest" - ], - "animation-worklet/worklet-animation-pause.https.html": [ - "4b7a9a0251da7c8179f68249578dc851b145c850", - "testharness" - ], "animation-worklet/worklet-animation-with-fill-mode.https.html": [ "49fead8bd39c56c6335c0748b01be0181767bbec", "testharness" @@ -547163,7 +547215,7 @@ "reftest" ], "css/css-conditional/idlharness.html": [ - "410466b25230b246c09cd12d1d13b8ef58786abf", + "63cf750933737d3a221ccb48d2a667c110dd0bf9", "testharness" ], "css/css-conditional/js/001.html": [ @@ -554635,7 +554687,7 @@ "testharness" ], "css/css-fonts/idlharness.html": [ - "9209144c3e5132a284f79df13145b174af265e59", + "ecc601bcf6a97a1722e3901d731f9f424d0a79e1", "testharness" ], "css/css-fonts/language-specific-01.html": [ @@ -568059,7 +568111,7 @@ "reftest" ], "css/css-paint-api/idlharness.html": [ - "bb4c9357f243d7572134834e5678b4cd4d1076b6", + "c9675ab0412bb955d7a8653e7d28884a6953800b", "testharness" ], "css/css-paint-api/invalid-image-constructor-error-ref.html": [ @@ -568987,7 +569039,7 @@ "support" ], "css/css-properties-values-api/idlharness.html": [ - "e57f0f00ca26cb6a9342b1b6f84259e2bb908790", + "6f053757c3cef099f0cea41716a942dfa7e66100", "testharness" ], "css/css-properties-values-api/property-cascade.html": [ @@ -573674,6 +573726,14 @@ "17489e1bc2132f4c2acbc4ec901eccb8f7e4d365", "support" ], + "css/css-syntax/anb-parsing.html": [ + "7fcc06e2c7e8e1908badf6117a7b8c3f1576cf76", + "testharness" + ], + "css/css-syntax/anb-serialization.html": [ + "787700cebf39e5cc4fa0d5a2934a7e52bec6da32", + "testharness" + ], "css/css-syntax/charset-is-not-a-rule.html": [ "81b2a04dc5a0dd2f3434150f7bfb6a6d3f1cfef3", "testharness" @@ -573846,10 +573906,26 @@ "36faef9357746f4492d00a3fbb1e33ffd2021bb4", "testharness" ], + "css/css-syntax/inclusive-ranges.html": [ + "ac486bde569842417910cf75f33607f1d2e5de52", + "testharness" + ], + "css/css-syntax/input-preprocessing.html": [ + "9ef9a730820d85a015b51cb230aa09f397a78400", + "testharness" + ], + "css/css-syntax/unclosed-constructs.html": [ + "3d7940387c810572159bd55fcc79fc10626221dc", + "testharness" + ], "css/css-syntax/unicode-range-selector.html": [ "db09540bb08c47f62b4255be6ba72b289987d64c", "testharness" ], + "css/css-syntax/whitespace.html": [ + "bc7aa7ebda518a42a32a154c3ed13f00be86429a", + "testharness" + ], "css/css-tables/META.yml": [ "b5372064ac2721687998bb23a9a9b95226d74afd", "support" @@ -590355,15 +590431,15 @@ "support" ], "css/css-values/vh_not_refreshing_on_chrome.html": [ - "52a45a114c85bf96a175ca583d8a2b6f54b9ab6c", + "1749986b62c75b3deca3d40f008cade9c105e697", "reftest" ], "css/css-values/viewport-relative-lengths-scaled-viewport.html": [ - "a901000394d35eed94237b3ce5acc74b1b0e7bc9", + "dba2af8fa07b07d2ab7c6ca9f657b6e170cd9a41", "testharness" ], "css/css-values/viewport-units-css2-001.html": [ - "f0feb6d993537833569bd739e4d903b8e510881b", + "c51237dd8a07546d31eef6f6f9b3c84b6ac2b65b", "testharness" ], "css/css-variables/META.yml": [ @@ -617079,7 +617155,7 @@ "support" ], "feature-policy/reporting/xr-report-only.https.html": [ - "b52bdbfaa47071b89702cfb51166f08b405a95de", + "6844226f2bd2189e44c2e74396ba449ce1a49c10", "testharness" ], "feature-policy/reporting/xr-report-only.https.html.headers": [ @@ -617087,7 +617163,7 @@ "support" ], "feature-policy/reporting/xr-reporting.https.html": [ - "b737bb9a6047e79d0b35c6eedec39b6888b09eb0", + "1982ea544c53bad508c422befe589e9e15dabcb6", "testharness" ], "feature-policy/reporting/xr-reporting.https.html.headers": [ @@ -618614,6 +618690,34 @@ "20d307e9188405dcec011042487aa2c7354930bf", "support" ], + "fetch/stale-while-revalidate/fetch.tentative.html": [ + "01a991ebfb1cb42288a01da37c76b09fa53f407c", + "testharness" + ], + "fetch/stale-while-revalidate/stale-css.py": [ + "6f3014db5246994383354b139e7900306297dd57", + "support" + ], + "fetch/stale-while-revalidate/stale-css.tentative.html": [ + "df03bd96243138cbaee076dc9b0a6cc3d15d9a16", + "testharness" + ], + "fetch/stale-while-revalidate/stale-image.py": [ + "42d0764eb91e7145cfe1638d90421ca7492379db", + "support" + ], + "fetch/stale-while-revalidate/stale-image.tentative.html": [ + "d8383acb319c2e0398bd83632377ac8cb219da49", + "testharness" + ], + "fetch/stale-while-revalidate/stale-script.py": [ + "c17528d8e6314e60407085ca778ba2ff70666985", + "support" + ], + "fetch/stale-while-revalidate/stale-script.tentative.html": [ + "2e04e3905780add84f3da805a238946256ebda87", + "testharness" + ], "fonts/AD.woff": [ "3df8ea8efdabd11bc45fdcc6d4f3fec771be6650", "support" @@ -619210,6 +619314,10 @@ "42cfff628b4680024908635e353bfe9bbf10d952", "support" ], + "fonts/noto/NotoNaskhArabic-regular.woff2": [ + "e24020d46a4c4a4f355941b23e8bad3b9b5003cb", + "support" + ], "fonts/noto/NotoSansAdlam-hinted/LICENSE_OFL.txt": [ "d952d62c065f3f35fb83a173496e90b21525aef3", "support" @@ -639391,7 +639499,7 @@ "support" ], "interfaces/ambient-light.idl": [ - "e861cc561823f75d8bfc6526c7766e8716aac179", + "4e44c082b0709989870e7ed52e14cc77bfb5d6f2", "support" ], "interfaces/animation-worklet.idl": [ @@ -639475,7 +639583,7 @@ "support" ], "interfaces/css-layout-api.idl": [ - "5dc6db455e41f1ed5f3b01ab1d8f4f6b9554d469", + "9440684a26ccdbddee0ba9b0f587a482fba42be5", "support" ], "interfaces/css-masking.idl": [ @@ -639563,7 +639671,7 @@ "support" ], "interfaces/generic-sensor.idl": [ - "fd794cb15f3bb067fb9663e12eac5cc8d6946acc", + "2e7aacbec176dbd7dfd0707de9d0cc5efb00123f", "support" ], "interfaces/geolocation-API.idl": [ @@ -639591,7 +639699,7 @@ "support" ], "interfaces/html.idl": [ - "d46d1452eadbd3a1a7bb5aadd3a346818492daf1", + "46d0b852f095a65c0019a9f6dd518963b26a9ac6", "support" ], "interfaces/image-capture.idl": [ @@ -639691,7 +639799,7 @@ "support" ], "interfaces/payment-request.idl": [ - "63a9ccccad4d57356760a65cadbdd3faec47bce4", + "53922d315cfd3de149f88d18baeccc852bb3dca1", "support" ], "interfaces/performance-timeline.idl": [ @@ -639703,7 +639811,7 @@ "support" ], "interfaces/picture-in-picture.idl": [ - "2e89cfd89791f5f1009f27115f2d40d12a655893", + "164ec02a9cf208e3c56da82a9629b3bb674f27f0", "support" ], "interfaces/pointerevents-extension.idl": [ @@ -639779,7 +639887,7 @@ "support" ], "interfaces/shape-detection-api.idl": [ - "66c58896c300c47206462171b3063baedfff87db", + "72fce2001cad5a465440ef996150e38ddee609cf", "support" ], "interfaces/speech-api.idl": [ @@ -639823,7 +639931,7 @@ "support" ], "interfaces/wasm-js-api.idl": [ - "6de14fb8f0895a72b69f37b9dd8b72e2ab1604e0", + "2bd2ecba828df359fc61b18cde10ff9f7e80c4de", "support" ], "interfaces/wasm-web-api.idl": [ @@ -639875,7 +639983,7 @@ "support" ], "interfaces/webrtc-stats.idl": [ - "cf07738b8b45c808a80895356699a5e04967e25e", + "c86097b697b56f105abedfcd700d496f9687a153", "support" ], "interfaces/webrtc.idl": [ @@ -652907,19 +653015,19 @@ "support" ], "preload/link-header-preload-nonce.html": [ - "2db6eef569f1576a3d405c7f86f6eed8be10c9e2", + "51b2224864d5a47c9642ded613efcfc702eb0f9d", "testharness" ], "preload/link-header-preload-nonce.html.headers": [ - "a3c41d2386ac10576497e3080ff1e6d97dccf6b8", + "a54b69378e9cc785ee02ec4a37694f90c366403b", "support" ], "preload/link-header-preload-srcset.tentative.html": [ - "70d34e525c1feb541fefd277f1ae06a6a5888a08", + "9eb8ac4e00d20b9eb48ffd3a981b33b7604246f8", "testharness" ], "preload/link-header-preload-srcset.tentative.html.headers": [ - "1e4e9b85cac9a70ef01c994631402a5d452cad98", + "906de0c95aeb58e24d1b7e779f1ed99de40d7af1", "support" ], "preload/link-header-preload.html": [ @@ -662647,11 +662755,19 @@ "testharness" ], "resource-timing/resource_connection_reuse.html": [ - "7a31a7e1ab31d4d1a83fb5e2911b8ed95f0f2d92", + "f347a0b23e15e9134ba2bf37fdafa4cab5e8d809", "testharness" ], "resource-timing/resource_connection_reuse.https.html": [ - "bc79a8519b20659085b6cda9e98685a0aaf33785", + "86864090a2eea7e62f7f204ec7baf4eccc9f6771", + "testharness" + ], + "resource-timing/resource_connection_reuse_mixed_content.html": [ + "51c04ee604c963cb248ca6cb6b536ef9bf21ee12", + "testharness" + ], + "resource-timing/resource_connection_reuse_mixed_content_redirect.html": [ + "a46d14c9f159ad2839546ed4f595d7e8d7cf4ffa", "testharness" ], "resource-timing/resource_dedicated_worker.html": [ @@ -662767,7 +662883,15 @@ "support" ], "resource-timing/resources/fake_responses.py": [ - "f71693818cb726573e4d1f282b8d61fe8a87df6b", + "289c179317671ba4e87c06bb89e815c8c449fd19", + "support" + ], + "resource-timing/resources/fake_responses_https.sub.html": [ + "cf49fb914bebe0c18d8af19a1a1362ae64217eb5", + "support" + ], + "resource-timing/resources/fake_responses_https_redirect.sub.html": [ + "c55e037d1dc15c1247c1a0ad2396c1416b577800", "support" ], "resource-timing/resources/green_frame.htm": [ @@ -665782,6 +665906,10 @@ "1e4acfb286c6bcf2375fc762f9d60ea2d9f1cdc4", "testharness" ], + "service-workers/service-worker/clients-get-resultingClientId.https.html": [ + "3419cf14b523db41af70c7896d4aaa497441fb9b", + "testharness" + ], "service-workers/service-worker/clients-get.https.html": [ "4cfbf595cadeeea5fc8a5089127c5687ec174f53", "testharness" @@ -666938,6 +667066,10 @@ "7fc35f18914c1345e0f5ccab93305938180fe9eb", "support" ], + "service-workers/service-worker/resources/get-resultingClientId-worker.js": [ + "f0e6c7becab6126496fefa3f40a5e788dc64775b", + "support" + ], "service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html": [ "bcab35364dff6f4494d73adfa150d800efc6bf70", "support" @@ -668551,7 +668683,7 @@ "support" ], "signed-exchange/resources/sxg-util.js": [ - "7d592ea21431802655ce3134d50718ef37394a42", + "67439c8a6e4f111d0095519a77dc0e6ffd380e2c", "support" ], "signed-exchange/resources/sxg-version1b2.sxg": [ @@ -677955,7 +678087,7 @@ "support" ], "tools/tox.ini": [ - "3b0c6d172bc02e8df5fed5a08cd354416eff50dd", + "975056ea2c272bd70e117231f0d57928727f6bd1", "support" ], "tools/webdriver/.gitignore": [ @@ -678023,7 +678155,7 @@ "support" ], "tools/wpt/run.py": [ - "633d6b254db289f50b77e4c7f589b888caa2b566", + "df34e591568617616211e0f549872fe94c7568d8", "support" ], "tools/wpt/testfiles.py": [ @@ -678039,11 +678171,11 @@ "support" ], "tools/wpt/tests/test_run.py": [ - "aaff0fa5331498f898dc36fcf36186cebe989927", + "cd70fef5e8bf48d73a0e3cc36f11d28088140139", "support" ], "tools/wpt/tests/test_wpt.py": [ - "1ddac67a39a368e44b94150a502caa0e32f8044f", + "75cedf75ee016d975e2896268571f8217e8e1859", "support" ], "tools/wpt/tox.ini": [ @@ -678059,11 +678191,11 @@ "support" ], "tools/wpt/virtualenv.py": [ - "0ce7054ae2227a6dbc46e6215274d776e80494c7", + "b27529da7a7e0c9a2e9dc92faac7200405a8a508", "support" ], "tools/wpt/wpt.py": [ - "55802461553abe63655a359393cfac2fbf174df1", + "909d435b6485f7e78c996ef02960160b53a0851c", "support" ], "tools/wptrunner/.gitignore": [ @@ -679182,18 +679314,6 @@ "172d566e57fc635b551b5d355661db690869b220", "testharness" ], - "trusted-types/WorkerGlobalScope-importScripts.https.html": [ - "30dea82077c59d8bd9b95985dd1383ea47733534", - "testharness" - ], - "trusted-types/WorkerGlobalScope-importScripts.https.js": [ - "4e491b9fe601b2dba1f1acafbbec9f502f2e6671", - "support" - ], - "trusted-types/WorkerGlobalScope-importScripts.https.js.headers": [ - "1bc33add09b4b34ce2cba21f488f8ed53345a27a", - "support" - ], "trusted-types/block-string-assignment-to-DOMParser-parseFromString.tentative.html": [ "4446a58836695355efd0fbf3f9f5a0bd6c60c8a3", "testharness" @@ -684059,7 +684179,7 @@ "support" ], "webdriver/tests/perform_actions/support/keys.py": [ - "487381d5b29b7003b84b313e098d6045b04aa1b3", + "68e37b34e0303c89d64654ddc9cf8bba5fc92f67", "support" ], "webdriver/tests/perform_actions/support/mouse.py": [ @@ -684935,7 +685055,7 @@ "testharness" ], "webrtc/RTCIceCandidate-constructor.html": [ - "9842593a83c5330e0ed19bedac9f6c9908362c41", + "cad0464a3c045a000270127ce50f89798f9eca0b", "testharness" ], "webrtc/RTCIceTransport-extension-helper.js": [ @@ -684943,7 +685063,7 @@ "support" ], "webrtc/RTCIceTransport-extension.https.html": [ - "7803bde9b3aa61f6ac500d62c8a3aed79b1a1412", + "e9e70379a483e1456259b521fc8094689aa15373", "testharness" ], "webrtc/RTCIceTransport.html": [ @@ -686298,6 +686418,10 @@ "6b70aa5ac9d3d6a9d4a42013455d3992fbb5b9e9", "support" ], + "webstorage/defineProperty.window.js": [ + "d8ab163df68332af6236c25335bb41e5c04fe33c", + "testharness" + ], "webstorage/document-domain.html": [ "3232b0d508121222a6ff523b1aebd3540aad8f89", "testharness" @@ -686458,6 +686582,10 @@ "bc134af32b1e5b5063add18db0c044ed85f37be4", "support" ], + "webstorage/set.window.js": [ + "479ad588910b907e6e9fe41d5080b744a22a54fe", + "testharness" + ], "webstorage/storage_builtins.html": [ "2ae06d55b007cf35777665356fcd95ec48047420", "testharness" @@ -689662,20 +689790,12 @@ "3e54e367787cb95dada398790fe23b10174df29f", "testharness" ], - "webxr/navigator_xr_requestDevice.https.html": [ - "c51dd8db165a14514dcf364c760b8da6a81af0b0", - "testharness" - ], - "webxr/navigator_xr_requestDevice_no_device.https.html": [ - "3cd149bb0ce0df4b7006f4d99a83d2de09e0f282", - "testharness" - ], "webxr/resources/webxr_check.html": [ "2d8e5b387dc88588921ccfa49dd14db58009900c", "support" ], "webxr/resources/webxr_util.js": [ - "10bdc12810c3b34d140e6f04b0068c28c9dc1873", + "7344fa05f655cded22a3ba9b099a8726a0c4beb3", "support" ], "webxr/webGLCanvasContext_create_xrcompatible.https.html": [ @@ -689691,63 +689811,67 @@ "testharness" ], "webxr/xrDevice_requestSession_immersive.https.html": [ - "e9e7b9bc131b12d68fa8a2886967a7395a5b0f99", + "c5956e7f3d12745638092558abb0b41749fb16d6", "testharness" ], "webxr/xrDevice_requestSession_immersive_no_gesture.https.html": [ - "9f0f5f3d8ae0c4b7cb8794ad41cd1015cd942374", + "c1b3286709d3a7d4dc45029253e3bbffb579e237", "testharness" ], "webxr/xrDevice_requestSession_immersive_unsupported.https.html": [ - "e0d2688e997be1c765e3e146ff1eb0db212b976e", + "60e9e6cc6e1c0fa990af396e42418bb16984a5e8", "testharness" ], "webxr/xrDevice_requestSession_non_immersive_no_gesture.https.html": [ - "1634dfe9cba3a6798652613c407ec21b5e3c4d8e", + "6cf50f521c4836dede6f763b6e7f3e263e30f68e", "testharness" ], "webxr/xrDevice_supportsSession_immersive.https.html": [ - "3ca5eb11c53baa319c5188f74c6a0651801e0183", + "c0b47013f9d11ad292fdef2e51968c3a28c35f55", "testharness" ], "webxr/xrDevice_supportsSession_immersive_unsupported.https.html": [ - "0c1dd25869fcad3a442cde8e849365f0f326b3c9", + "2b17b96b1bc11693c87b931a5debc0e4f1c2336c", "testharness" ], "webxr/xrDevice_supportsSession_non_immersive.https.html": [ - "535b0bcbbc282ee5aaa7500cbd3a35ba21fed3d4", + "69a35c2510983550993f630ea6f0a165c2e89369", "testharness" ], "webxr/xrSession_cancelAnimationFrame.https.html": [ - "26c0e95605468634c9bc65bf959260e594998a2d", + "9b08f93eead693c1c9aa6d7e2458988aa7dae442", "testharness" ], "webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html": [ - "4f4b8dfe5ff47b4433f0de0d244b12dd434eaa0d", + "bc9b625fb9ed2e9001da1ddaf0a01230631b084e", "testharness" ], "webxr/xrSession_end.https.html": [ - "69bbda85fda9f732a0d682cf57be53115eb73854", + "2719bdd7dd1b4a73e8b2004f477beecf03d131bb", + "testharness" + ], + "webxr/xrSession_mode.https.html": [ + "4b54d9480211b3641997f78a61dfdc7058592ecd", "testharness" ], "webxr/xrSession_prevent_multiple_exclusive.https.html": [ - "ff3eaef81dd19d945a8c7128c7b5e677ea450689", + "c2e7f3bf444d38506f6a54c2cf9904c2927b2ad5", "testharness" ], "webxr/xrSession_requestAnimationFrame_callback_calls.https.html": [ - "48dc88779abcdd37a3778f860473569f7c55c6de", + "268efcd596e03125e3f7b90fa7f08eba2ae716a8", "testharness" ], "webxr/xrSession_requestAnimationFrame_data_valid.https.html": [ - "b5f4f180c1a911e7260310da34b32891443001c8", + "f873a11588045d612cb16f2487a6efa14b555679", "testharness" ], "webxr/xrSession_requestAnimationFrame_getViewerPose.https.html": [ - "17b5307f019dc7ec4696dbceef5eb3d5cd21d361", + "ca6a71758c691e16aad512e68c83e2fd42a8efbb", "testharness" ], "webxr/xrSession_requestReferenceSpace.https.html": [ - "d97852c917bc8f42f4999e5b0d1c13a7fef364ab", + "1eb49e0b875b1c686c9f5474c007af8c9d4790d0", "testharness" ], "workers/META.yml": [ @@ -690943,7 +691067,7 @@ "testharness" ], "workers/semantics/run-a-worker/003.html": [ - "8c2f07ee7305a7a6d83e3c2cd8aaf4367fac35ab", + "e96c176f20ab6aa6f01dc25184778abe9e861fd1", "testharness" ], "workers/semantics/structured-clone/dedicated.html": [ diff --git a/tests/wpt/metadata/css/css-fonts/idlharness.html.ini b/tests/wpt/metadata/css/css-fonts/idlharness.html.ini index 855d8c4002e..e81cba11107 100644 --- a/tests/wpt/metadata/css/css-fonts/idlharness.html.ini +++ b/tests/wpt/metadata/css/css-fonts/idlharness.html.ini @@ -4,68 +4,115 @@ [CSSFontFaceRule interface: attribute style] expected: FAIL + [CSSFontFeatureValuesRule interface: existence and properties of interface object] expected: FAIL + [CSSFontFeatureValuesRule interface object length] expected: FAIL + [CSSFontFeatureValuesRule interface object name] expected: FAIL + [CSSFontFeatureValuesRule interface: existence and properties of interface prototype object] expected: FAIL + [CSSFontFeatureValuesRule interface: existence and properties of interface prototype object's "constructor" property] expected: FAIL + [CSSFontFeatureValuesRule interface: existence and properties of interface prototype object's @@unscopables property] expected: FAIL + [CSSFontFeatureValuesRule interface: attribute fontFamily] expected: FAIL + [CSSFontFeatureValuesRule interface: attribute annotation] expected: FAIL + [CSSFontFeatureValuesRule interface: attribute ornaments] expected: FAIL + [CSSFontFeatureValuesRule interface: attribute stylistic] expected: FAIL + [CSSFontFeatureValuesRule interface: attribute swash] expected: FAIL + [CSSFontFeatureValuesRule interface: attribute characterVariant] expected: FAIL + [CSSFontFeatureValuesRule interface: attribute styleset] expected: FAIL + [CSSFontFeatureValuesMap interface: existence and properties of interface object] expected: FAIL + [CSSFontFeatureValuesMap interface object length] expected: FAIL + [CSSFontFeatureValuesMap interface object name] expected: FAIL + [CSSFontFeatureValuesMap interface: existence and properties of interface prototype object] expected: FAIL + [CSSFontFeatureValuesMap interface: existence and properties of interface prototype object's "constructor" property] expected: FAIL + [CSSFontFeatureValuesMap interface: existence and properties of interface prototype object's @@unscopables property] expected: FAIL - [CSSFontFeatureValuesMap interface: operation set(CSSOMString, \[object Object\],\[object Object\])] + + [CSSFontFeatureValuesMap interface: operation set(CSSOMString, [object Object\],[object Object\])] expected: FAIL + [CSSFontPaletteValuesRule interface: existence and properties of interface object] expected: FAIL + [CSSFontPaletteValuesRule interface object length] expected: FAIL + [CSSFontPaletteValuesRule interface object name] expected: FAIL + [CSSFontPaletteValuesRule interface: existence and properties of interface prototype object] expected: FAIL + [CSSFontPaletteValuesRule interface: existence and properties of interface prototype object's "constructor" property] expected: FAIL + [CSSFontPaletteValuesRule interface: existence and properties of interface prototype object's @@unscopables property] expected: FAIL + [CSSFontPaletteValuesRule interface: attribute fontFamily] expected: FAIL + [CSSFontPaletteValuesRule interface: attribute basePalette] expected: FAIL + [CSSRule interface: constant FONT_FEATURE_VALUES_RULE on interface object] expected: FAIL + [CSSRule interface: constant FONT_FEATURE_VALUES_RULE on interface prototype object] expected: FAIL + [CSSRule interface: constant FONT_PALETTE_VALUES_RULE on interface object] expected: FAIL + [CSSRule interface: constant FONT_PALETTE_VALUES_RULE on interface prototype object] expected: FAIL - + + [CSSFontFaceRule interface: cssFontFaceRule must inherit property "style" with the proper type] + expected: FAIL + + [CSSRule interface: cssRule must inherit property "FONT_PALETTE_VALUES_RULE" with the proper type] + expected: FAIL + + [CSSRule interface: cssFontFaceRule must inherit property "FONT_PALETTE_VALUES_RULE" with the proper type] + expected: FAIL + + [CSSRule interface: cssFontFaceRule must inherit property "FONT_FEATURE_VALUES_RULE" with the proper type] + expected: FAIL + + [CSSRule interface: cssRule must inherit property "FONT_FEATURE_VALUES_RULE" with the proper type] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini b/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini index 442aa176ed7..130c0181e43 100644 --- a/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini +++ b/tests/wpt/metadata/css/css-transitions/properties-value-001.html.ini @@ -1079,9 +1079,3 @@ [text-indent percentage(%) / values] expected: FAIL - [padding-left length(px) / values] - expected: FAIL - - [padding-bottom length(ex) / values] - expected: FAIL - diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini index bcd187f508c..8e2ceeddfbe 100644 --- a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini +++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth.html.ini @@ -6,3 +6,6 @@ [Instant scrolling while doing history navigation.] expected: FAIL + [Smooth scrolling while doing history navigation.] + expected: FAIL + diff --git a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini index 1ba6fdcec47..d3d593de47f 100644 --- a/tests/wpt/metadata/encoding/single-byte-decoder.html.ini +++ b/tests/wpt/metadata/encoding/single-byte-decoder.html.ini @@ -32,7 +32,7 @@ [single-byte-decoder.html?XMLHttpRequest] - expected: CRASH + expected: TIMEOUT [ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)] expected: FAIL @@ -55,7 +55,7 @@ expected: FAIL [windows-1252: iso_8859-1:1987 (XMLHttpRequest)] - expected: FAIL + expected: TIMEOUT [windows-1254: iso_8859-9:1989 (XMLHttpRequest)] expected: TIMEOUT @@ -126,5 +126,41 @@ [x-mac-cyrillic: x-mac-cyrillic (XMLHttpRequest)] expected: TIMEOUT + [windows-1253: x-cp1253 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1252: iso_8859-1 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1252: latin1 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1255: x-cp1255 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1253: windows-1253 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1252: x-cp1252 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1255: cp1255 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1252: l1 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1255: windows-1255 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1252: windows-1252 (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1252: us-ascii (XMLHttpRequest)] + expected: TIMEOUT + + [windows-1256: windows-1256 (XMLHttpRequest)] + expected: TIMEOUT + [single-byte-decoder.html?TextDecoder] 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 18f786d4963..bbdc2d4a2a5 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -312,3 +312,6 @@ [ + + diff --git a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.py b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.py new file mode 100644 index 00000000000..c17528d8e63 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.py @@ -0,0 +1,25 @@ +import random, string, datetime + +def token(): + letters = string.ascii_lowercase + return ''.join(random.choice(letters) for i in range(20)) + +def main(request, response): + cookie = request.cookies.first("Count", None) + count = 0 + if cookie != None: + count = int(cookie.value) + if request.GET.first("query", None) != None: + headers = [("Count", count)] + content = "" + return 200, headers, content + else: + count = count + 1 + + unique_id = token() + headers = [("Content-Type", "text/javascript"), + ("Cache-Control", "private, max-age=0, stale-while-revalidate=10"), + ("Set-Cookie", "Count={}".format(count)), + ("Token", unique_id)] + content = "report('{}')".format(unique_id) + return 200, headers, content diff --git a/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.tentative.html b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.tentative.html new file mode 100644 index 00000000000..2e04e390578 --- /dev/null +++ b/tests/wpt/web-platform-tests/fetch/stale-while-revalidate/stale-script.tentative.html @@ -0,0 +1,55 @@ + + + +Tests Stale While Revalidate works for scripts + + + + + diff --git a/tests/wpt/web-platform-tests/fonts/noto/NotoNaskhArabic-regular.woff2 b/tests/wpt/web-platform-tests/fonts/noto/NotoNaskhArabic-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e24020d46a4c4a4f355941b23e8bad3b9b5003cb GIT binary patch literal 92576 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 z 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�w5HOR!@?0VwQ%up!p7QS z`rRB7wq=WUa3E%=HUWHT_#!*tVSUOL=jO8!wlA7{zEgG7f zq9x{JPr$Avmv(l_SGu2##UB&);7PnB>Ee z!GKIzV1X9XEJ%@HmT4711cb&>23S#Rjq-7rrP`QB`t2x!(|-(sl?Dlgv9J&_YJ#vz PG^zE{ intrinsicSizes(); + Promise layoutNextFragment(LayoutConstraintsOptions constraints, ChildBreakToken breakToken); }; [Exposed=LayoutWorklet] @@ -57,7 +57,7 @@ interface IntrinsicSizes { readonly attribute double maxContentSize; }; -[Constructor(optional LayoutConstraintsOptions options),Exposed=LayoutWorklet] +[Exposed=LayoutWorklet] interface LayoutConstraints { readonly attribute double availableInlineSize; readonly attribute double availableBlockSize; @@ -74,9 +74,11 @@ interface LayoutConstraints { readonly attribute any data; }; +enum BlockFragmentationType { "none", "page", "column", "region" }; + dictionary LayoutConstraintsOptions { - double availableInlineSize = 0; - double availableBlockSize = 0; + double availableInlineSize; + double availableBlockSize; double fixedInlineSize; double fixedBlockSize; @@ -90,8 +92,6 @@ dictionary LayoutConstraintsOptions { any data; }; -enum BlockFragmentationType { "none", "page", "column", "region" }; - [Exposed=LayoutWorklet] interface ChildBreakToken { readonly attribute BreakType breakType; @@ -112,7 +112,7 @@ dictionary BreakTokenOptions { enum BreakType { "none", "line", "column", "page", "region" }; [Exposed=LayoutWorklet] -interface LayoutEdgeSizes { +interface LayoutEdges { readonly attribute double inlineStart; readonly attribute double inlineEnd; @@ -124,26 +124,6 @@ interface LayoutEdgeSizes { readonly attribute double block; }; -[Exposed=LayoutWorklet] -interface LayoutEdges { - readonly attribute LayoutEdgeSizes border; - readonly attribute LayoutEdgeSizes scrollbar; - readonly attribute LayoutEdgeSizes padding; - - readonly attribute LayoutEdgeSizes all; -}; - -[Exposed=LayoutWorklet] -interface IntrinsicSizesRequest { -}; - -[Exposed=LayoutWorklet] -interface LayoutFragmentRequest { -}; - -typedef (IntrinsicSizesRequest or LayoutFragmentRequest) - LayoutFragmentRequestOrIntrinsicSizesRequest; - // This is the final return value from the author defined layout() method. dictionary FragmentResultOptions { double inlineSize = 0; @@ -154,6 +134,12 @@ dictionary FragmentResultOptions { BreakTokenOptions breakToken = null; }; +[Constructor(FragmentResultOptions)] +interface FragmentResult { + readonly attribute double inlineSize; + readonly attribute double blockSize; +}; + dictionary IntrinsicSizesResultOptions { double maxContentSize; double minContentSize; diff --git a/tests/wpt/web-platform-tests/interfaces/generic-sensor.idl b/tests/wpt/web-platform-tests/interfaces/generic-sensor.idl index fd794cb15f3..2e7aacbec17 100644 --- a/tests/wpt/web-platform-tests/interfaces/generic-sensor.idl +++ b/tests/wpt/web-platform-tests/interfaces/generic-sensor.idl @@ -28,3 +28,93 @@ interface SensorErrorEvent : Event { dictionary SensorErrorEventInit : EventInit { required DOMException error; }; + +dictionary MockSensorConfiguration { + required MockSensorType mockSensorType; + boolean connected = true; + double? maxSamplingFrequency; + double? minSamplingFrequency; +}; + +dictionary MockSensor { + double maxSamplingFrequency; + double minSamplingFrequency; + double requestedSamplingFrequency; +}; + +enum MockSensorType { + "ambient-light", + "accelerometer", + "linear-acceleration", + "gravity", + "gyroscope", + "magnetometer", + "uncalibrated-magnetometer", + "absolute-orientation", + "relative-orientation", + "geolocation", + "proximity", +}; + +dictionary MockSensorReadingValues { +}; + +dictionary AmbientLightReadingValues { + required double? illuminance; +}; + +dictionary AccelerometerReadingValues { + required double? x; + required double? y; + required double? z; +}; + +dictionary LinearAccelerationReadingValues : AccelerometerReadingValues { +}; + +dictionary GravityReadingValues : AccelerometerReadingValues { +}; + +dictionary GyroscopeReadingValues { + required double? x; + required double? y; + required double? z; +}; + +dictionary MagnetometerReadingValues { + required double? x; + required double? y; + required double? z; +}; + +dictionary UncalibratedMagnetometerReadingValues { + required double? x; + required double? y; + required double? z; + required double? xBias; + required double? yBias; + required double? zBias; +}; + +dictionary AbsoluteOrientationReadingValues { + required FrozenArray? quaternion; +}; + +dictionary RelativeOrientationReadingValues : AbsoluteOrientationReadingValues { +}; + +dictionary GeolocationReadingValues { + required double? latitude; + required double? longitude; + required double? altitude; + required double? accuracy; + required double? altitudeAccuracy; + required double? heading; + required double? speed; +}; + +dictionary ProximityReadingValues { + required double? distance; + required double? max; + required boolean? near; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl index d46d1452ead..46d0b852f09 100644 --- a/tests/wpt/web-platform-tests/interfaces/html.idl +++ b/tests/wpt/web-platform-tests/interfaces/html.idl @@ -3,8 +3,6 @@ // (https://github.com/tidoust/reffy-reports) // Source: HTML Standard (https://html.spec.whatwg.org/) -// Example interface manually removed here, see https://github.com/tidoust/reffy/issues/129. - [Exposed=Window, LegacyUnenumerableNamedProperties] interface HTMLAllCollection { @@ -1524,6 +1522,7 @@ interface Window : EventTarget { void postMessage(any message, optional WindowPostMessageOptions options); }; Window includes GlobalEventHandlers; +Window includes WindowEventHandlers; dictionary WindowPostMessageOptions : PostMessageOptions { USVString targetOrigin = "/"; @@ -1817,7 +1816,7 @@ interface mixin NavigatorID { [Exposed=Window] readonly attribute DOMString vendorSub; // constant "" }; -partial interface NavigatorID { +partial interface mixin NavigatorID { [Exposed=Window] boolean taintEnabled(); // constant false [Exposed=Window] readonly attribute DOMString oscpu; }; @@ -2450,8 +2449,7 @@ partial interface Window { [Replaceable, SameObject] readonly attribute External external; }; -[Exposed=Window, - NoInterfaceObject] +[Exposed=Window] interface External { void AddSearchProvider(); void IsSearchProviderInstalled(); diff --git a/tests/wpt/web-platform-tests/interfaces/payment-request.idl b/tests/wpt/web-platform-tests/interfaces/payment-request.idl index 63a9ccccad4..53922d315cf 100644 --- a/tests/wpt/web-platform-tests/interfaces/payment-request.idl +++ b/tests/wpt/web-platform-tests/interfaces/payment-request.idl @@ -92,7 +92,6 @@ interface PaymentAddress { readonly attribute DOMString postalCode; readonly attribute DOMString recipient; readonly attribute DOMString region; - readonly attribute DOMString regionCode; readonly attribute DOMString sortingCode; readonly attribute FrozenArray addressLine; }; @@ -101,7 +100,6 @@ dictionary AddressInit { DOMString country; sequence addressLine; DOMString region; - DOMString regionCode; DOMString city; DOMString dependentLocality; DOMString postalCode; @@ -121,7 +119,6 @@ dictionary AddressErrors { DOMString postalCode; DOMString recipient; DOMString region; - DOMString regionCode; DOMString sortingCode; }; diff --git a/tests/wpt/web-platform-tests/interfaces/picture-in-picture.idl b/tests/wpt/web-platform-tests/interfaces/picture-in-picture.idl index 2e89cfd8979..164ec02a9cf 100644 --- a/tests/wpt/web-platform-tests/interfaces/picture-in-picture.idl +++ b/tests/wpt/web-platform-tests/interfaces/picture-in-picture.idl @@ -9,6 +9,7 @@ partial interface HTMLVideoElement { attribute EventHandler onenterpictureinpicture; attribute EventHandler onleavepictureinpicture; + [CEReactions] attribute boolean autoPictureInPicture; [CEReactions] attribute boolean disablePictureInPicture; }; diff --git a/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl b/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl index 66c58896c30..72fce2001ca 100644 --- a/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl @@ -34,7 +34,7 @@ enum LandmarkType { [Exposed=(Window,Worker), Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions)] interface BarcodeDetector { - readonly attribute FrozenArray supportedFormats; + static Promise> getSupportedFormats(); Promise> detect(ImageBitmapSource image); }; diff --git a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl index 6de14fb8f08..2bd2ecba828 100644 --- a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl @@ -43,7 +43,7 @@ dictionary ModuleImportDescriptor { interface Module { static sequence exports(Module moduleObject); static sequence imports(Module moduleObject); - static sequence customSections(Module moduleObject, USVString sectionName); + static sequence customSections(Module moduleObject, DOMString sectionName); }; [LegacyNamespace=WebAssembly, Constructor(Module module, optional object importObject), Exposed=(Window,Worker,Worklet)] diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl index cf07738b8b4..c86097b697b 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl @@ -3,12 +3,6 @@ // (https://github.com/tidoust/reffy-reports) // Source: Identifiers for WebRTC's Statistics API (https://w3c.github.io/webrtc-stats/) -dictionary RTCStats { -DOMHighResTimeStamp timestamp; -RTCStatsType type; -DOMString id; - }; - enum RTCStatsType { "codec", "inbound-rtp", @@ -314,7 +308,7 @@ partial dictionary RTCIceCandidatePairStats { unsigned long long priority; }; -partial dictionary RTCRTPStreamStats { +partial dictionary RTCRtpStreamStats { DOMString mediaType; double averageRTCPInterval; }; diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html index 2db6eef569f..51b2224864d 100644 --- a/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html +++ b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html @@ -9,8 +9,8 @@ diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers index a3c41d2386a..a54b69378e9 100644 --- a/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers +++ b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers @@ -1,3 +1,3 @@ Content-Security-Policy: script-src 'nonce-abc' -Link: ;rel=preload;as=script -Link: ;rel=preload;as=script;nonce=abc +Link: ;rel=preload;as=script +Link: ;rel=preload;as=script;nonce=abc diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html b/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html index 70d34e525c1..9eb8ac4e00d 100644 --- a/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html +++ b/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html @@ -11,16 +11,16 @@ diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html.headers b/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html.headers index 1e4e9b85cac..906de0c95ae 100644 --- a/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html.headers +++ b/tests/wpt/web-platform-tests/preload/link-header-preload-srcset.tentative.html.headers @@ -1,3 +1,3 @@ -Link: ; rel=preload; as=image; imagesrcset="resources/square.png?2x 2x, resources/square.png?3x 3x" -Link: ; rel=preload; as=image; imagesrcset="resources/square.png?200 200w, resources/square.png?400 400w, resources/square.png?800 800w"; imagesizes=400px -Link: ; rel=preload; as=image; imagesrcset="resources/square.png?150 150w, resources/square.png?300 300w, resources/square.png?600 600w"; imagesizes="(min-width: 300px) 300px, 150px" +Link: ; rel=preload; as=image; imagesrcset="resources/square.png?from-header&2x 2x, resources/square.png?from-header&3x 3x" +Link: ; rel=preload; as=image; imagesrcset="resources/square.png?from-header&200 200w, resources/square.png?from-header&400 400w, resources/square.png?from-header&800 800w"; imagesizes=400px +Link: ; rel=preload; as=image; imagesrcset="resources/square.png?from-header&150 150w, resources/square.png?from-header&300 300w, resources/square.png?from-header&600 600w"; imagesizes="(min-width: 300px) 300px, 150px" diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html index 7a31a7e1ab3..f347a0b23e1 100644 --- a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html +++ b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.html @@ -41,7 +41,7 @@ function onload_test() { test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same'); test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same'); if(!window.isSecureConnection) { - test_equals(entry.secureConnectionStart, 0, 'secureConnectStart should be zero'); + test_equals(entry.secureConnectionStart, 0, 'secureConnectionStart should be zero'); } test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same') test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same') diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.https.html b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.https.html index bc79a8519b2..86864090a2e 100644 --- a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.https.html +++ b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse.https.html @@ -40,7 +40,7 @@ function onload_test() { const entry = entries[1]; test_equals(entry.fetchStart, entry.connectStart, 'connectStart and fetchStart should be the same'); test_equals(entry.fetchStart, entry.connectEnd, 'connectEnd and fetchStart should be the same'); - test_equals(entry.fetchStart, entry.secureConnectionStart, 'secureConnectStart and fetchStart should be the same'); + test_equals(entry.fetchStart, entry.secureConnectionStart, 'secureConnectionStart and fetchStart should be the same'); test_equals(entry.fetchStart, entry.domainLookupStart, 'domainLookupStart and fetchStart should be the same') test_equals(entry.fetchStart, entry.domainLookupEnd, 'domainLookupEnd and fetchStart should be the same') } diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content.html b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content.html new file mode 100644 index 00000000000..51c04ee604c --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content.html @@ -0,0 +1,55 @@ + + + + +Resource Timing connection reuse + + + + + + + + +

Description

+

This test validates that connectStart and connectEnd are the same when a connection is reused (e.g. when a persistent connection is used).

+
+ + + diff --git a/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content_redirect.html b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content_redirect.html new file mode 100644 index 00000000000..a46d14c9f15 --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resource_connection_reuse_mixed_content_redirect.html @@ -0,0 +1,55 @@ + + + + +Resource Timing connection reuse + + + + + + + + +

Description

+

This test validates that connectStart and connectEnd are the same when a connection is reused (e.g. when a persistent connection is used).

+
+ + + diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.py b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.py index f71693818cb..289c1793176 100644 --- a/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.py +++ b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses.py @@ -2,13 +2,20 @@ def main(request, response): tag = request.GET.first("tag", None) + redirect = request.GET.first("redirect", None) match = request.headers.get("If-None-Match", None) date = request.GET.first("date", "") modified = request.headers.get("If-Modified-Since", None) + response.headers.set("Access-Control-Allow-Origin", "*"); + response.headers.set("Timing-Allow-Origin", "*"); if tag: response.headers.set("ETag", '"%s"' % tag) elif date: response.headers.set("Last-Modified", date) + if redirect: + response.headers.set("Location", redirect) + response.status = (302, "Moved") + return "" if ((match is not None and match == tag) or (modified is not None and modified == date)): @@ -16,4 +23,4 @@ def main(request, response): return "" else: response.headers.set("Content-Type", "text/plain") - return "MAYBE NOT" \ No newline at end of file + return "MAYBE NOT" diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https.sub.html b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https.sub.html new file mode 100644 index 00000000000..cf49fb914be --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https.sub.html @@ -0,0 +1,18 @@ + + + diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https_redirect.sub.html b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https_redirect.sub.html new file mode 100644 index 00000000000..c55e037d1dc --- /dev/null +++ b/tests/wpt/web-platform-tests/resource-timing/resources/fake_responses_https_redirect.sub.html @@ -0,0 +1,20 @@ + + + diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https.html new file mode 100644 index 00000000000..3419cf14b52 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-get-resultingClientId.https.html @@ -0,0 +1,177 @@ + + +Test clients.get(resultingClientId) + + + + + diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js new file mode 100644 index 00000000000..f0e6c7becab --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/get-resultingClientId-worker.js @@ -0,0 +1,107 @@ +// This worker expects a fetch event for a navigation and messages back the +// result of clients.get(event.resultingClientId). + +// Resolves when the test finishes. +let testFinishPromise; +let resolveTestFinishPromise; +let rejectTestFinishPromise; + +// Resolves to clients.get(event.resultingClientId) from the fetch event. +let getPromise; +let resolveGetPromise; +let rejectGetPromise; + +let resultingClientId; + +function startTest() { + testFinishPromise = new Promise((resolve, reject) => { + resolveTestFinishPromise = resolve; + rejectTestFinishPromise = reject; + }); + + getPromise = new Promise((resolve, reject) => { + resolveGetPromise = resolve; + rejectGetPromise = reject; + }); +} + +async function describeGetPromiseResult(promise) { + const result = {}; + + await promise.then( + (client) => { + result.promiseState = 'fulfilled'; + if (client === undefined) { + result.promiseValue = 'undefinedValue'; + } else if (client instanceof Client) { + result.promiseValue = 'client'; + result.client = { + id: client.id, + url: client.url + }; + } else { + result.promiseValue = 'unknown'; + } + }, + (error) => { + result.promiseState = 'rejected'; + }); + + return result; +} + +async function handleGetResultingClient(event) { + // Note that this message can arrive before |resultingClientId| is populated. + const result = await describeGetPromiseResult(getPromise); + // |resultingClientId| must be populated by now. + result.queriedId = resultingClientId; + event.source.postMessage(result); +}; + +async function handleGetClient(event) { + const id = event.data.id; + const result = await describeGetPromiseResult(self.clients.get(id)); + result.queriedId = id; + event.source.postMessage(result); +}; + +self.addEventListener('message', (event) => { + if (event.data.command == 'startTest') { + startTest(); + event.waitUntil(testFinishPromise); + event.source.postMessage('ok'); + return; + } + + if (event.data.command == 'finishTest') { + resolveTestFinishPromise(); + event.source.postMessage('ok'); + return; + } + + if (event.data.command == 'getResultingClient') { + event.waitUntil(handleGetResultingClient(event)); + return; + } + + if (event.data.command == 'getClient') { + event.waitUntil(handleGetClient(event)); + return; + } +}); + +async function handleFetch(event) { + try { + resultingClientId = event.resultingClientId; + const client = await self.clients.get(resultingClientId); + resolveGetPromise(client); + } catch (error) { + rejectGetPromise(error); + } +} + +self.addEventListener('fetch', (event) => { + if (event.request.mode != 'navigate') + return; + event.waitUntil(handleFetch(event)); +}); diff --git a/tests/wpt/web-platform-tests/signed-exchange/resources/sxg-util.js b/tests/wpt/web-platform-tests/signed-exchange/resources/sxg-util.js index 7d592ea2143..67439c8a6e4 100644 --- a/tests/wpt/web-platform-tests/signed-exchange/resources/sxg-util.js +++ b/tests/wpt/web-platform-tests/signed-exchange/resources/sxg-util.js @@ -1,10 +1,10 @@ // Opens |url| in an iframe, establish a message channel with it, and waits for // a message from the frame content. Returns a promise that resolves with the -// data of the message, or rejects on 2000ms timeout. +// data of the message, or rejects on 3000ms timeout. function openSXGInIframeAndWaitForMessage(test_object, url, referrerPolicy) { return new Promise(async (resolve, reject) => { // We can't catch the network error on iframe. So we use the timer. - test_object.step_timeout(() => reject('timeout'), 2000); + test_object.step_timeout(() => reject('timeout'), 3000); const frame = await withIframe(url, 'sxg_iframe', referrerPolicy); const channel = new MessageChannel(); diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini index 3b0c6d172bc..975056ea2c2 100644 --- a/tests/wpt/web-platform-tests/tools/tox.ini +++ b/tests/wpt/web-platform-tests/tools/tox.ini @@ -15,9 +15,9 @@ passenv = HYPOTHESIS_PROFILE [testenv:py27-flake8] -deps = -r requirements_flake8.txt -commands = flake8 --append-config=py27-flake8.ini {posargs} +deps = -rrequirements_flake8.txt +commands = flake8 --append-config={toxinidir}/py27-flake8.ini {posargs} [testenv:py36-flake8] -deps = -r requirements_flake8.txt -commands = flake8 --append-config=py36-flake8.ini {posargs} +deps = -rrequirements_flake8.txt +commands = flake8 --append-config={toxinidir}/py36-flake8.ini {posargs} diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py index 633d6b254db..df34e591568 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/run.py @@ -171,7 +171,8 @@ class BrowserSetup(object): return self.browser.install(venv.path, channel) def install_requirements(self): - self.venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", self.browser.requirements)) + if not self.venv.skip_virtualenv_setup: + self.venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", self.browser.requirements)) def setup(self, kwargs): self.setup_kwargs(kwargs) @@ -563,7 +564,8 @@ def setup_wptrunner(venv, prompt=True, install_browser=False, **kwargs): wptrunner_path = os.path.join(wpt_root, "tools", "wptrunner") - venv.install_requirements(os.path.join(wptrunner_path, "requirements.txt")) + if not venv.skip_virtualenv_setup: + venv.install_requirements(os.path.join(wptrunner_path, "requirements.txt")) kwargs['browser_version'] = setup_cls.browser.version(binary=kwargs.get("binary"), webdriver_binary=kwargs.get("webdriver_binary")) diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py index aaff0fa5331..cd70fef5e8b 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_run.py @@ -17,6 +17,7 @@ def venv(): class Virtualenv(virtualenv.Virtualenv): def __init__(self): self.path = tempfile.mkdtemp() + self.skip_virtualenv_setup = False def create(self): return diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py index 1ddac67a39a..75cedf75ee0 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py +++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py @@ -357,7 +357,7 @@ def test_tests_affected_idlharness(capsys, manifest_dir): wpt.main(argv=["tests-affected", "--metadata", manifest_dir, "%s~..%s" % (commit, commit)]) assert excinfo.value.code == 0 out, err = capsys.readouterr() - assert "webrtc/idlharness.https.window.js\n" == out + assert "webrtc-stats/idlharness.window.js\nwebrtc/idlharness.https.window.js\n" == out @pytest.mark.slow # this updates the manifest diff --git a/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py index 0ce7054ae22..b27529da7a7 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py +++ b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py @@ -9,11 +9,13 @@ from tools.wpt.utils import call logger = logging.getLogger(__name__) class Virtualenv(object): - def __init__(self, path): + def __init__(self, path, skip_virtualenv_setup): self.path = path - self.virtualenv = find_executable("virtualenv") - if not self.virtualenv: - raise ValueError("virtualenv must be installed and on the PATH") + self.skip_virtualenv_setup = skip_virtualenv_setup + if not skip_virtualenv_setup: + self.virtualenv = find_executable("virtualenv") + if not self.virtualenv: + raise ValueError("virtualenv must be installed and on the PATH") @property def exists(self): diff --git a/tests/wpt/web-platform-tests/tools/wpt/wpt.py b/tests/wpt/web-platform-tests/tools/wpt/wpt.py index 55802461553..909d435b648 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/wpt.py +++ b/tests/wpt/web-platform-tests/tools/wpt/wpt.py @@ -43,6 +43,9 @@ def load_commands(): def parse_args(argv, commands): parser = argparse.ArgumentParser() parser.add_argument("--venv", action="store", help="Path to an existing virtualenv to use") + parser.add_argument("--skip-venv-setup", action="store_true", + dest="skip_venv_setup", + help="Whether to use the virtualenv as-is. Must set --venv as well") parser.add_argument("--debug", action="store_true", help="Run the debugger in case of an exception") subparsers = parser.add_subparsers(dest="command") for command, props in iteritems(commands): @@ -77,15 +80,19 @@ def import_command(prog, command, props): return script, parser -def setup_virtualenv(path, props): +def setup_virtualenv(path, skip_venv_setup, props): + if skip_venv_setup and path is None: + raise ValueError("Must set --venv when --skip-venv-setup is used") + should_skip_setup = path is not None and skip_venv_setup if path is None: path = os.path.join(wpt_root, "_venv") - venv = virtualenv.Virtualenv(path) - venv.start() - for name in props["install"]: - venv.install(name) - for path in props["requirements"]: - venv.install_requirements(path) + venv = virtualenv.Virtualenv(path, should_skip_setup) + if not should_skip_setup: + venv.start() + for name in props["install"]: + venv.install(name) + for path in props["requirements"]: + venv.install_requirements(path) return venv @@ -105,7 +112,7 @@ def main(prog=None, argv=None): props = commands[command] venv = None if props["virtualenv"]: - venv = setup_virtualenv(main_args.venv, props) + venv = setup_virtualenv(main_args.venv, main_args.skip_venv_setup, props) script, parser = import_command(prog, command, props) if parser: if props["parse_known"]: diff --git a/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.html b/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.html deleted file mode 100644 index 30dea82077c..00000000000 --- a/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - -
- - - diff --git a/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js b/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js deleted file mode 100644 index 4e491b9fe60..00000000000 --- a/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js +++ /dev/null @@ -1,70 +0,0 @@ - -let test_setup_policy = TrustedTypes.createPolicy("hurrayanythinggoes", { - createScriptURL: x => new URL(x, location.href) -}); -importScripts(test_setup_policy.createScriptURL("/resources/testharness.js")); - - -// Determine worker type (for better logging) -let worker_type = "unknown"; -if (this.DedicatedWorkerGlobalScope !== undefined) { - worker_type = "dedicated worker"; -} else if (this.SharedWorkerGlobalScope !== undefined) { - worker_type = "shared worker"; -} else if (this.ServiceWorkerGlobalScope !== undefined) { - worker_type = "service worker"; -} - -const test_policy = TrustedTypes.createPolicy('xxx', { - createScriptURL: url => new URL(url.replace("play", "work"), this.location.href) }); - -test(t => { - self.result = "Fail"; - let trusted_url = test_policy.createScriptURL(new URL("support/player.js", location.href)); - assert_true(TrustedTypes.isScriptURL(trusted_url)); - importScripts(trusted_url); // support/worker.js modifies self.result. - assert_equals(self.result, "Pass"); -}, "importScripts with TrustedScriptURL works in " + worker_type); - -test(t => { - let untrusted_url = "support/player.js"; - assert_throws(new TypeError(), - function() { importScripts(untrusted_url) }, - "importScripts(untrusted_url)"); -}, "importScripts with untrusted URLs throws in " + worker_type); - -test(t => { - assert_throws(new TypeError(), - function() { importScripts(null) }, - "importScripts(null)"); -}, "null is not a trusted script URL throws in " + worker_type); - -test(t => { - self.result = "Fail"; - let trusted_url = test_policy.createScriptURL( - new URL("support/player.js?variant1", location.href)); - let trusted_url2 = test_policy.createScriptURL( - new URL("support/player.js?variant2", location.href)); - importScripts(trusted_url, trusted_url2); - assert_equals(self.result, "Pass"); -}, "importScripts with two URLs, both trusted, in " + worker_type); - -test(t => { - let untrusted_url = "support/player.js?variant1"; - let untrusted_url2 = "support/player.js?variant2"; - assert_throws(new TypeError(), - function() { importScripts(untrusted_url, untrusted_url2) }, - "importScripts(untrusted_url, untrusted_url2)"); -}, "importScripts with two URLs, both strings, in " + worker_type); - -test(t => { - let untrusted_url = "support/player.js"; - let trusted_url = test_policy.createScriptURL( - new URL(untrusted_url, location.href)); - assert_throws(new TypeError(), - function() { importScripts(untrusted_url, trusted_url) }, - "importScripts(untrusted_url, trusted_url)"); -}, "importScripts with two URLs, one trusted, in " + worker_type); - -done(); - diff --git a/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js.headers b/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js.headers deleted file mode 100644 index 1bc33add09b..00000000000 --- a/tests/wpt/web-platform-tests/trusted-types/WorkerGlobalScope-importScripts.https.js.headers +++ /dev/null @@ -1 +0,0 @@ -Content-Security-Policy: trusted-types * diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/keys.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/keys.py index 487381d5b29..68e37b34e03 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/keys.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/support/keys.py @@ -109,7 +109,7 @@ ALL_KEYS = getmembers(Keys, lambda x: type(x) == unicode) ALL_EVENTS = { "ADD": { - "code": "", + "code": "NumpadAdd", "ctrl": False, "key": "+", "location": 3, @@ -496,7 +496,7 @@ ALL_EVENTS = { "value": u"\ue023", }, "PAGE_DOWN": { - "code": "", + "code": "PageDown", "ctrl": False, "key": "PageDown", "location": 0, @@ -505,7 +505,7 @@ ALL_EVENTS = { "value": u"\ue00f", }, "PAGE_UP": { - "code": "", + "code": "PageUp", "ctrl": False, "key": "PageUp", "location": 0, @@ -676,7 +676,7 @@ ALL_EVENTS = { "value": u"\ue018", }, "SEPARATOR": { - "code": "NumpadSubtract", + "code": "NumpadComma", "ctrl": False, "key": ",", "location": 3, @@ -703,7 +703,7 @@ ALL_EVENTS = { "value": u"\ue00d", }, "SUBTRACT": { - "code": "", + "code": "NumpadSubtract", "ctrl": False, "key": "-", "location": 3, diff --git a/tests/wpt/web-platform-tests/webrtc/RTCIceCandidate-constructor.html b/tests/wpt/web-platform-tests/webrtc/RTCIceCandidate-constructor.html index 9842593a83c..cad0464a3c0 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCIceCandidate-constructor.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCIceCandidate-constructor.html @@ -74,19 +74,19 @@ test(t => { const candidate = new RTCIceCandidate({ sdpMid: 'audio' }); - assert_equals(candidate.candidate, ''); - assert_equals(candidate.sdpMid, 'audio'); - assert_equals(candidate.sdpMLineIndex, null); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.sdpMid, 'audio', 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, `new RTCIceCandidate({ sdpMid: 'audio' })`); test(t => { const candidate = new RTCIceCandidate({ sdpMLineIndex: 0 }); - assert_equals(candidate.candidate, ''); - assert_equals(candidate.sdpMid, null); - assert_equals(candidate.sdpMLineIndex, 0); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.sdpMid, null, 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, 0, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, 'new RTCIceCandidate({ sdpMLineIndex: 0 })'); test(t => { @@ -95,10 +95,10 @@ sdpMLineIndex: 0 }); - assert_equals(candidate.candidate, ''); - assert_equals(candidate.sdpMid, 'audio'); - assert_equals(candidate.sdpMLineIndex, 0); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.sdpMid, 'audio', 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, 0, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, `new RTCIceCandidate({ sdpMid: 'audio', sdpMLineIndex: 0 })`); test(t => { @@ -107,10 +107,10 @@ sdpMid: 'audio' }); - assert_equals(candidate.candidate, ''); - assert_equals(candidate.sdpMid, 'audio'); - assert_equals(candidate.sdpMLineIndex, null); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.sdpMid, 'audio', 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, `new RTCIceCandidate({ candidate: '', sdpMid: 'audio' }`); test(t => { @@ -119,10 +119,10 @@ sdpMLineIndex: 0 }); - assert_equals(candidate.candidate, ''); - assert_equals(candidate.sdpMid, null); - assert_equals(candidate.sdpMLineIndex, 0); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.sdpMid, null, 'sdpMid', 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, 0, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, `new RTCIceCandidate({ candidate: '', sdpMLineIndex: 0 }`); test(t => { @@ -131,10 +131,10 @@ sdpMid: 'audio' }); - assert_equals(candidate.candidate, candidateString); - assert_equals(candidate.sdpMid, 'audio'); - assert_equals(candidate.sdpMLineIndex, null); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, candidateString, 'candidate'); + assert_equals(candidate.sdpMid, 'audio', 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, 'new RTCIceCandidate({ ... }) with valid candidate string and sdpMid'); test(t =>{ @@ -144,10 +144,10 @@ sdpMid: 'audio' }); - assert_equals(candidate.candidate, arbitraryString); - assert_equals(candidate.sdpMid, 'audio'); - assert_equals(candidate.sdpMLineIndex, null); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, arbitraryString, 'candidate'); + assert_equals(candidate.sdpMid, 'audio', 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, 'new RTCIceCandidate({ ... }) with invalid candidate string and sdpMid'); test(t => { @@ -158,10 +158,10 @@ usernameFragment: 'test' }); - assert_equals(candidate.candidate, candidateString); - assert_equals(candidate.sdpMid, 'video'); - assert_equals(candidate.sdpMLineIndex, 1); - assert_equals(candidate.usernameFragment, 'test'); + assert_equals(candidate.candidate, candidateString, 'candidate'); + assert_equals(candidate.sdpMid, 'video', 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, 1, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, 'test', 'usernameFragment'); }, 'new RTCIceCandidate({ ... }) with non default value for all fields'); @@ -171,10 +171,10 @@ sdpMid: arbitraryString }); - assert_equals(candidate.candidate, ''); - assert_equals(candidate.sdpMid, arbitraryString); - assert_equals(candidate.sdpMLineIndex, null); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.sdpMid, arbitraryString, 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, null, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, 'new RTCIceCandidate({ ... }) with invalid sdpMid'); @@ -187,10 +187,10 @@ sdpMLineIndex: 65535 }); - assert_equals(candidate.candidate, ''); - assert_equals(candidate.sdpMid, null); - assert_equals(candidate.sdpMLineIndex, 65535); - assert_equals(candidate.usernameFragment, null); + assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.sdpMid, null, 'sdpMid'); + assert_equals(candidate.sdpMLineIndex, 65535, 'sdpMLineIndex'); + assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, 'new RTCIceCandidate({ ... }) with invalid sdpMLineIndex'); diff --git a/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html index 7803bde9b3a..e9e70379a48 100644 --- a/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html +++ b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport-extension.https.html @@ -177,6 +177,7 @@ test(t => { const candidate1 = new RTCIceCandidate({ candidate: 'candidate:1 1 udp 2113929471 203.0.113.100 10100 typ host', + sdpMid: '', }); test(() => { @@ -191,7 +192,7 @@ test(() => { const iceTransport = new RTCIceTransport(); assert_throws('OperationError', () => iceTransport.addRemoteCandidate( - new RTCIceCandidate({ candidate: 'invalid' }))); + new RTCIceCandidate({ candidate: 'invalid', sdpMid: '' }))); assert_array_equals(iceTransport.getRemoteCandidates(), []); }, 'addRemoteCandidate() throws on invalid candidate'); diff --git a/tests/wpt/web-platform-tests/webstorage/defineProperty.window.js b/tests/wpt/web-platform-tests/webstorage/defineProperty.window.js new file mode 100644 index 00000000000..d8ab163df68 --- /dev/null +++ b/tests/wpt/web-platform-tests/webstorage/defineProperty.window.js @@ -0,0 +1,57 @@ +["localStorage", "sessionStorage"].forEach(function(name) { + [9, "x"].forEach(function(key) { + test(function() { + var desc = { + value: "value", + }; + + var storage = window[name]; + storage.clear(); + + assert_equals(storage[key], undefined); + assert_equals(storage.getItem(key), null); + assert_equals(Object.defineProperty(storage, key, desc), storage); + assert_equals(storage[key], "value"); + assert_equals(storage.getItem(key), "value"); + }, "Defining data property for key " + key + " on " + name); + + test(function() { + var desc1 = { + value: "value", + }; + var desc2 = { + value: "new value", + }; + + var storage = window[name]; + storage.clear(); + + assert_equals(storage[key], undefined); + assert_equals(storage.getItem(key), null); + assert_equals(Object.defineProperty(storage, key, desc1), storage); + assert_equals(storage[key], "value"); + assert_equals(storage.getItem(key), "value"); + + assert_equals(Object.defineProperty(storage, key, desc2), storage); + assert_equals(storage[key], "new value"); + assert_equals(storage.getItem(key), "new value"); + }, "Defining data property for key " + key + " on " + name + " twice"); + + test(function() { + var desc = { + value: { + toString: function() { return "value"; } + }, + }; + + var storage = window[name]; + storage.clear(); + + assert_equals(storage[key], undefined); + assert_equals(storage.getItem(key), null); + assert_equals(Object.defineProperty(storage, key, desc), storage); + assert_equals(storage[key], "value"); + assert_equals(storage.getItem(key), "value"); + }, "Defining data property with toString for key " + key + " on " + name); + }); +}); diff --git a/tests/wpt/web-platform-tests/webstorage/set.window.js b/tests/wpt/web-platform-tests/webstorage/set.window.js new file mode 100644 index 00000000000..479ad588910 --- /dev/null +++ b/tests/wpt/web-platform-tests/webstorage/set.window.js @@ -0,0 +1,102 @@ +["localStorage", "sessionStorage"].forEach(function(name) { + [9, "x"].forEach(function(key) { + test(function() { + var value = "value"; + + var storage = window[name]; + storage.clear(); + + assert_equals(storage[key], undefined); + assert_equals(storage.getItem(key), null); + assert_equals(storage[key] = value, value); + assert_equals(storage[key], "value"); + assert_equals(storage.getItem(key), "value"); + }, "Setting property for key " + key + " on " + name); + + test(function() { + var value = { + toString: function() { return "value"; } + }; + + var storage = window[name]; + storage.clear(); + + assert_equals(storage[key], undefined); + assert_equals(storage.getItem(key), null); + assert_equals(storage[key] = value, value); + assert_equals(storage[key], "value"); + assert_equals(storage.getItem(key), "value"); + }, "Setting property with toString for key " + key + " on " + name); + + test(function() { + Storage.prototype[key] = "proto"; + this.add_cleanup(function() { delete Storage.prototype[key]; }); + + var value = "value"; + + var storage = window[name]; + storage.clear(); + + assert_equals(storage[key], "proto"); + assert_equals(storage.getItem(key), null); + assert_equals(storage[key] = value, value); + // Hidden because no [OverrideBuiltins]. + assert_equals(storage[key], "proto"); + assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); + assert_equals(storage.getItem(key), "value"); + }, "Setting property for key " + key + " on " + name + " with data property on prototype"); + + test(function() { + Storage.prototype[key] = "proto"; + this.add_cleanup(function() { delete Storage.prototype[key]; }); + + var value = "value"; + + var storage = window[name]; + storage.clear(); + + storage.setItem(key, "existing"); + + // Hidden because no [OverrideBuiltins]. + assert_equals(storage[key], "proto"); + assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); + assert_equals(storage.getItem(key), "existing"); + assert_equals(storage[key] = value, value); + assert_equals(storage[key], "proto"); + assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); + assert_equals(storage.getItem(key), "value"); + }, "Setting property for key " + key + " on " + name + " with data property on prototype and existing item"); + + test(function() { + var calledSetter = []; + Object.defineProperty(Storage.prototype, key, { + "get": function() { return "proto getter"; }, + "set": function(v) { calledSetter.push(v); }, + configurable: true, + }); + this.add_cleanup(function() { delete Storage.prototype[key]; }); + + var value = "value"; + + var storage = window[name]; + storage.clear(); + + assert_equals(storage[key], "proto getter"); + assert_equals(storage.getItem(key), null); + assert_equals(storage[key] = value, value); + // Property is hidden because no [OverrideBuiltins]. + if (typeof key === "number") { + // P is an array index: call through to OrdinarySetWithOwnDescriptor() + assert_array_equals(calledSetter, [value]); + assert_equals(storage[key], "proto getter"); + assert_equals(storage.getItem(key), null); + } else { + // P is not an array index: early return in [[Set]] step 2. + // https://github.com/heycam/webidl/issues/630 + assert_equals(storage[key], "proto getter"); + assert_equals(Object.getOwnPropertyDescriptor(storage, key), undefined); + assert_equals(storage.getItem(key), "value"); + } + }, "Setting property for key " + key + " on " + name + " with accessor property on prototype"); + }); +}); diff --git a/tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice.https.html b/tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice.https.html deleted file mode 100644 index c51dd8db165..00000000000 --- a/tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice.https.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - diff --git a/tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice_no_device.https.html b/tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice_no_device.https.html deleted file mode 100644 index 3cd149bb0ce..00000000000 --- a/tests/wpt/web-platform-tests/webxr/navigator_xr_requestDevice_no_device.https.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - 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 10bdc12810c..7344fa05f65 100644 --- a/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js +++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_util.js @@ -26,7 +26,6 @@ function xr_promise_test(name, func, properties) { // Requires a webglCanvas on the page. function xr_session_promise_test( name, func, fakeDeviceInit, sessionOptions, properties) { - let testDevice; let testDeviceController; let testSession; @@ -44,16 +43,12 @@ function xr_session_promise_test( XRTest.simulateDeviceConnection(fakeDeviceInit) .then((controller) => { testDeviceController = controller; - return navigator.xr.requestDevice(); - }) - .then((device) => { - testDevice = device; return gl.makeXRCompatible(); }) .then(() => new Promise((resolve, reject) => { // Perform the session request in a user gesture. XRTest.simulateUserActivation(() => { - testDevice.requestSession(sessionOptions) + navigator.xr.requestSession(sessionOptions) .then((session) => { testSession = session; // Session must have a baseLayer or frame requests @@ -74,7 +69,7 @@ function xr_session_promise_test( .then(() => { // Cleanup system state. testSession.end().catch(() => {}); - XRTest.simulateDeviceDisconnection(testDevice); + XRTest.simulateDeviceDisconnection(); }), properties); } @@ -97,7 +92,6 @@ function getOutputContext() { // that API object. function forEachWebxrObject(callback) { callback(window.navigator.xr, 'navigator.xr'); - callback(window.XRDevice, 'XRDevice'); callback(window.XRSession, 'XRSession'); callback(window.XRSessionCreationOptions, 'XRSessionCreationOptions'); callback(window.XRFrameRequestCallback, 'XRFrameRequestCallback'); diff --git a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive.https.html b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive.https.html index e9e7b9bc131..c5956e7f3d1 100644 --- a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive.https.html @@ -9,6 +9,6 @@ "Tests requestSession resolves when supported", (session) => { assert_not_equals(session, null); - }, { supportsImmersive:true }, { immersive: true }); + }, { supportsImmersive:true }, { mode: 'immersive-vr' }); \ No newline at end of file diff --git a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_no_gesture.https.html b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_no_gesture.https.html index 9f0f5f3d8ae..c1b3286709d 100644 --- a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_no_gesture.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_no_gesture.https.html @@ -8,9 +8,8 @@ "Requesting immersive session outside of a user gesture rejects", (t) => { return XRTest.simulateDeviceConnection({ supportsImmersive:true }) - .then( (controller) => { return navigator.xr.requestDevice() }) - .then( (device) => promise_rejects( - t, 'SecurityError', device.requestSession({ immersive: true }))); + .then( (controller) => promise_rejects( + t, 'SecurityError', navigator.xr.requestSession({ mode: 'immersive-vr' }))); }); diff --git a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_unsupported.https.html b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_unsupported.https.html index e0d2688e997..60e9e6cc6e1 100644 --- a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_unsupported.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_immersive_unsupported.https.html @@ -8,13 +8,12 @@ "Requesting an immersive session when unsupported rejects", (t) => { return XRTest.simulateDeviceConnection({ supportsImmersive:false }) - .then( (controller) => { return navigator.xr.requestDevice() }) - .then( (magicWindowOnlyDevice) => new Promise((resolve) => { + .then( (controller) => new Promise((resolve) => { XRTest.simulateUserActivation( () => { resolve(promise_rejects( t, "NotSupportedError", - magicWindowOnlyDevice.requestSession({ immersive: true }) + navigator.xr.requestSession({ mode: 'immersive-vr' }) )) }); })); diff --git a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_non_immersive_no_gesture.https.html b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_non_immersive_no_gesture.https.html index 1634dfe9cba..6cf50f521c4 100644 --- a/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_non_immersive_no_gesture.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrDevice_requestSession_non_immersive_no_gesture.https.html @@ -8,9 +8,8 @@ "Requesting non-immersive session outside of a user gesture succeeds", (t) => { return XRTest.simulateDeviceConnection({ supportsImmersive:false }) - .then( (controller) => { return navigator.xr.requestDevice(); }) - .then( (device) => device.requestSession({ - immersive: false, + .then( (controller) => navigator.xr.requestSession({ + mode: 'inline', outputContext: getOutputContext() })) .then( (session) => { assert_not_equals(session, null); }); diff --git a/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive.https.html b/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive.https.html index 3ca5eb11c53..c0b47013f9d 100644 --- a/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive.https.html @@ -5,11 +5,10 @@ diff --git a/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive_unsupported.https.html b/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive_unsupported.https.html index 0c1dd25869f..2b17b96b1bc 100644 --- a/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive_unsupported.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrDevice_supportsSession_immersive_unsupported.https.html @@ -5,15 +5,14 @@ diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame.https.html index 26c0e956054..9b08f93eead 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame.https.html @@ -13,7 +13,7 @@ let fakeDeviceInitParams = { supportsImmersive:true }; - let immersiveSessionOptions = { immersive: true }; + let immersiveSessionOptions = { mode: 'immersive-vr' }; let nonImmersiveSessionOptions = { outputContext: getOutputContext() }; let testFunction = (session) => new Promise((resolve, reject) => { diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html index 4f4b8dfe5ff..bc9b625fb9e 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html @@ -12,7 +12,7 @@ let fakeDeviceInitParams = { supportsImmersive:true }; - let immersiveSessionOptions = { immersive: true }; + let immersiveSessionOptions = { mode: 'immersive-vr' }; let nonImmersiveSessionOptions = { outputContext: getOutputContext() }; let testFunction = (testSession) => new Promise((resolve) => { diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_end.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_end.https.html index 69bbda85fda..2719bdd7dd1 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_end.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_end.https.html @@ -11,7 +11,7 @@ let watcherDone = new Event("watcherdone"); const fakeDeviceInitParams = { supportsImmersive:true }; - const immersiveSessionOptions = { immersive: true }; + const immersiveSessionOptions = { mode: 'immersive-vr' }; const nonImmersiveSessionOptions = { outputContext: getOutputContext() }; let testFunction = function(session, testDeviceController, t) { diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_mode.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_mode.https.html new file mode 100644 index 00000000000..4b54d948021 --- /dev/null +++ b/tests/wpt/web-platform-tests/webxr/xrSession_mode.https.html @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_prevent_multiple_exclusive.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_prevent_multiple_exclusive.https.html index ff3eaef81dd..c2e7f3bf444 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_prevent_multiple_exclusive.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_prevent_multiple_exclusive.https.html @@ -10,26 +10,25 @@ "Test prevention of multiple simultaneous immersive sessions", (t) => { return XRTest.simulateDeviceConnection({ supportsImmersive:true }) - .then( (controller) => { return navigator.xr.requestDevice() }) - .then( (device) => new Promise((resolve) => { + .then( (controller) => new Promise((resolve) => { XRTest.simulateUserActivation( () => { - resolve(device.requestSession({ immersive: true }) + resolve(navigator.xr.requestSession({ mode: 'immersive-vr' }) .then( (session) => new Promise((resolve) => { XRTest.simulateUserActivation( () => { - // Requesting a second immersive session from a device that already - // has an active immersive session should fail. Immersive sessions + // Requesting a second immersive session when another immersive + // session is active should fail. Immersive sessions // should take up the users entire view, and therefore it should // be impossible for a user to be engaged with more than one. resolve(promise_rejects( t, "InvalidStateError", - device.requestSession({ immersive: true }) + navigator.xr.requestSession({ mode: 'immersive-vr' }) ).then( () => { // End the immersive session and try again. Now the immersive // session creation should succeed. return session.end().then( () => new Promise((resolve) => { XRTest.simulateUserActivation( () => { - resolve(device.requestSession({ immersive: true })); + resolve(navigator.xr.requestSession({ mode: 'immersive-vr' })); }); })); })); diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_callback_calls.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_callback_calls.https.html index 48dc88779ab..268efcd596e 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_callback_calls.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_callback_calls.https.html @@ -13,7 +13,7 @@ let fakeDeviceInitParams = { supportsImmersive:true }; - let immersiveSessionOptions = { immersive: true }; + let immersiveSessionOptions = { mode: 'immersive-vr' }; let nonImmersiveSessionOptions = { outputContext: getOutputContext() }; let testFunction = (testSession) => new Promise((resolve) => { diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_data_valid.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_data_valid.https.html index b5f4f180c1a..f873a115880 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_data_valid.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_data_valid.https.html @@ -28,7 +28,7 @@ }; const fakeDeviceInitOptions = { supportsImmersive:true }; - const sessionOptions = { immersive:true }; + const sessionOptions = { mode: 'immersive-vr' }; let testSession; diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html index 17b5307f019..ca6a71758c6 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html @@ -14,7 +14,7 @@ let fakeDeviceInitParams = { supportsImmersive: true }; - let immersiveSessionOptions = { immersive: true }; + let immersiveSessionOptions = { mode: 'immersive-vr' }; let nonImmersiveSessionOptions = { outputContext: getOutputContext() }; // Valid matrices for when we don't care about specific values diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_requestReferenceSpace.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_requestReferenceSpace.https.html index d97852c917b..1eb49e0b875 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_requestReferenceSpace.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_requestReferenceSpace.https.html @@ -13,7 +13,7 @@ let fakeDeviceInitParams = { supportsImmersive: true }; - let immersiveSessionOptions = { immersive: true }; + let immersiveSessionOptions = { mode: 'immersive-vr' }; let nonImmersiveSessionOptions = { outputContext: getOutputContext() }; let testFunction = function(session, fakeDeviceController, t) { diff --git a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/003.html b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/003.html index 8c2f07ee730..e96c176f20a 100644 --- a/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/003.html +++ b/tests/wpt/web-platform-tests/workers/semantics/run-a-worker/003.html @@ -2,20 +2,14 @@ handling for 404 response -