diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 36aca206776..91a7c5e8f8f 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -114105,6 +114105,18 @@ {} ] ], + "css/css-contain/contain-size-scrollbars-004.html": [ + [ + "css/css-contain/contain-size-scrollbars-004.html", + [ + [ + "/css/css-contain/reference/contain-size-scrollbars-004-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-size-select-001.html": [ [ "css/css-contain/contain-size-select-001.html", @@ -135439,6 +135451,30 @@ {} ] ], + "css/css-overflow/overflow-body-propagation-005.html": [ + [ + "css/css-overflow/overflow-body-propagation-005.html", + [ + [ + "/css/css-overflow/reference/overflow-body-propagation-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-overflow/overflow-body-propagation-006.html": [ + [ + "css/css-overflow/overflow-body-propagation-006.html", + [ + [ + "/css/css-overflow/reference/overflow-body-propagation-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-overflow/webkit-line-clamp-001.html": [ [ "css/css-overflow/webkit-line-clamp-001.html", @@ -143891,6 +143927,18 @@ {} ] ], + "css/css-tables/box-shadow-001.html": [ + [ + "css/css-tables/box-shadow-001.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-tables/calc-percent-plus-0px-auto.html": [ [ "css/css-tables/calc-percent-plus-0px-auto.html", @@ -152391,6 +152439,18 @@ {} ] ], + "css/css-text/white-space/eol-spaces-bidi-001.html": [ + [ + "css/css-text/white-space/eol-spaces-bidi-001.html", + [ + [ + "/css/css-text/white-space/reference/eol-spaces-bidi-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-text/white-space/line-edge-white-space-collapse-001.html": [ [ "css/css-text/white-space/line-edge-white-space-collapse-001.html", @@ -206217,6 +206277,18 @@ {} ] ], + "svg/text/reftests/dominant-baseline-hanging-small-font-size.svg": [ + [ + "svg/text/reftests/dominant-baseline-hanging-small-font-size.svg", + [ + [ + "/svg/embedded/reference/green-rect-100x100.svg", + "==" + ] + ], + {} + ] + ], "svg/text/reftests/text-clipped-offscreen-move-onscreen.html": [ [ "svg/text/reftests/text-clipped-offscreen-move-onscreen.html", @@ -214038,9 +214110,6 @@ "common/security-features/tools/util.py": [ [] ], - "common/sleep.py": [ - [] - ], "common/slow.py": [ [] ], @@ -244152,6 +244221,9 @@ "css/css-contain/reference/contain-size-scrollbars-001-ref.html": [ [] ], + "css/css-contain/reference/contain-size-scrollbars-004-ref.html": [ + [] + ], "css/css-contain/reference/contain-size-select-001-ref.html": [ [] ], @@ -255858,6 +255930,9 @@ "css/css-text/white-space/reference/control-chars-000-ref.html": [ [] ], + "css/css-text/white-space/reference/eol-spaces-bidi-001-ref.html": [ + [] + ], "css/css-text/white-space/reference/line-edge-white-space-collapse-001-ref.html": [ [] ], @@ -266418,6 +266493,9 @@ "fetch/metadata/resources/xslt-test.sub.xml": [ [] ], + "fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers": [ + [] + ], "fetch/nosniff/importscripts.js": [ [] ], @@ -267912,6 +267990,9 @@ "html/browsers/the-window-object/garbage-collection-and-browsing-contexts/non-automated/discard_iframe_history_2-3.html": [ [] ], + "html/browsers/the-window-object/named-access-on-the-window-object/cross-global-support.html": [ + [] + ], "html/browsers/the-window-object/named-access-on-the-window-object/test.html": [ [] ], @@ -273867,43 +273948,79 @@ "images/yellow75.png": [ [] ], - "import-maps/@std/__dir__.headers": [ - [] - ], - "import-maps/@std/blank": [ - [] - ], - "import-maps/@std/none": [ - [] - ], "import-maps/README.md": [ [] ], - "import-maps/bare/__dir__.headers": [ + "import-maps/builtin-support.tentative/@std/__dir__.headers": [ [] ], - "import-maps/bare/bare": [ + "import-maps/builtin-support.tentative/@std/blank": [ [] ], - "import-maps/bare/blank": [ + "import-maps/builtin-support.tentative/@std/none": [ [] ], - "import-maps/bare/cross-origin-bare": [ + "import-maps/builtin-support.tentative/bare/__dir__.headers": [ [] ], - "import-maps/bare/none": [ + "import-maps/builtin-support.tentative/bare/blank": [ [] ], - "import-maps/bare/std-blank": [ + "import-maps/builtin-support.tentative/bare/none": [ [] ], - "import-maps/bare/std-none": [ + "import-maps/builtin-support.tentative/bare/std-blank": [ [] ], - "import-maps/bare/to-bare": [ + "import-maps/builtin-support.tentative/bare/std-none": [ [] ], - "import-maps/bare/to-data": [ + "import-maps/builtin-support.tentative/imported/resources/helpers/parsing.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-addresses.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-schema.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-scope-keys.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-specifier-keys.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/resolving-builtins.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/resolving-not-yet-implemented.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/resolving-scopes.js": [ + [] + ], + "import-maps/builtin-support.tentative/imported/resources/resolving.js": [ + [] + ], + "import-maps/builtin-support.tentative/static-import.js": [ + [] + ], + "import-maps/core/bare/__dir__.headers": [ + [] + ], + "import-maps/core/bare/bare": [ + [] + ], + "import-maps/core/bare/cross-origin-bare": [ + [] + ], + "import-maps/core/bare/to-bare": [ + [] + ], + "import-maps/core/bare/to-data": [ + [] + ], + "import-maps/core/static-import.js": [ [] ], "import-maps/imported/resources/helpers/parsing.js": [ @@ -273921,12 +274038,6 @@ "import-maps/imported/resources/parsing-specifier-keys.js": [ [] ], - "import-maps/imported/resources/resolving-builtins.js": [ - [] - ], - "import-maps/imported/resources/resolving-not-yet-implemented.js": [ - [] - ], "import-maps/imported/resources/resolving-scopes.js": [ [] ], @@ -273948,9 +274059,6 @@ "import-maps/resources/test-helper.js": [ [] ], - "import-maps/static-import.js": [ - [] - ], "inert/frame/button.html": [ [] ], @@ -273984,6 +274092,9 @@ "infrastructure/assumptions/tools/build.sh": [ [] ], + "infrastructure/metadata/infrastructure/assumptions/ahem.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini": [ [] ], @@ -274065,6 +274176,9 @@ "infrastructure/metadata/infrastructure/testdriver/actions/elementPosition.html.ini": [ [] ], + "infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini": [ [] ], @@ -274074,6 +274188,9 @@ "infrastructure/metadata/infrastructure/testdriver/actions/pause.html.ini": [ [] ], + "infrastructure/metadata/infrastructure/testdriver/bless.html.ini": [ + [] + ], "infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini": [ [] ], @@ -274251,6 +274368,9 @@ "interfaces/css-regions.idl": [ [] ], + "interfaces/css-shadow-parts.idl": [ + [] + ], "interfaces/css-transitions.idl": [ [] ], @@ -276516,6 +276636,21 @@ "portals/csp/resources/frame-src.sub.html.sub.headers": [ [] ], + "portals/history/resources/inner-iframe.html": [ + [] + ], + "portals/history/resources/portal-harness.js": [ + [] + ], + "portals/history/resources/portal-manipulate-history-with-subframes.sub.html": [ + [] + ], + "portals/history/resources/portal-manipulate-history.html": [ + [] + ], + "portals/history/resources/run-test-in-portal.js": [ + [] + ], "portals/portals-referrer-inherit-header.html.headers": [ [] ], @@ -279021,6 +279156,9 @@ "resource-timing/resources/worker_with_images.js": [ [] ], + "resource-timing/sleep.py": [ + [] + ], "resource-timing/test_resource_timing.js": [ [] ], @@ -285882,6 +286020,9 @@ "tools/wpt/requirements.txt": [ [] ], + "tools/wpt/revlist.py": [ + [] + ], "tools/wpt/run.py": [ [] ], @@ -285894,6 +286035,9 @@ "tools/wpt/tests/test_browser.py": [ [] ], + "tools/wpt/tests/test_revlist.py": [ + [] + ], "tools/wpt/tests/test_run.py": [ [] ], @@ -287349,6 +287493,9 @@ "web-nfc/resources/nfc-helpers.js": [ [] ], + "web-nfc/resources/support-iframe.html": [ + [] + ], "web-share/META.yml": [ [] ], @@ -287907,12 +288054,18 @@ "webgpu/framework/url_query.js": [ [] ], + "webgpu/framework/util/async_mutex.js": [ + [] + ], "webgpu/framework/util/index.js": [ [] ], "webgpu/framework/util/stack.js": [ [] ], + "webgpu/framework/util/timeout.js": [ + [] + ], "webgpu/framework/version.js": [ [] ], @@ -287952,6 +288105,9 @@ "webgpu/suites/cts/command_buffer/render/rendering.spec.js": [ [] ], + "webgpu/suites/cts/command_buffer/render/storeop.spec.js": [ + [] + ], "webgpu/suites/cts/examples.spec.js": [ [] ], @@ -287964,6 +288120,63 @@ "webgpu/suites/cts/index.js": [ [] ], + "webgpu/suites/cts/validation/createBindGroup.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/createBindGroupLayout.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/createPipelineLayout.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/createRenderPipeline.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/createTexture.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/createView.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/error_scope.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/fences.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/queue_submit.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/render_pass.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/render_pass_descriptor.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/setBindGroup.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/setBlendColor.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/setScissorRect.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/setStencilReference.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/setVertexBuffer.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/setViewport.spec.js": [ + [] + ], + "webgpu/suites/cts/validation/validation_test.js": [ + [] + ], + "webgpu/suites/cts/validation/vertex_input.spec.js": [ + [] + ], "webmessaging/META.yml": [ [] ], @@ -296276,6 +296489,144 @@ {} ] ], + "IndexedDB/blob-contenttype.any.js": [ + [ + "IndexedDB/blob-contenttype.any.html", + { + "script_metadata": [ + [ + "title", + "Blob Content Type" + ], + [ + "script", + "support.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "IndexedDB/blob-contenttype.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Blob Content Type" + ], + [ + "script", + "support.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "IndexedDB/blob-delete-objectstore-db.any.js": [ + [ + "IndexedDB/blob-delete-objectstore-db.any.html", + { + "script_metadata": [ + [ + "title", + "Blob Delete Object Store" + ], + [ + "script", + "support.js" + ] + ] + } + ], + [ + "IndexedDB/blob-delete-objectstore-db.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Blob Delete Object Store" + ], + [ + "script", + "support.js" + ] + ] + } + ] + ], + "IndexedDB/blob-valid-after-deletion.any.js": [ + [ + "IndexedDB/blob-valid-after-deletion.any.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid After Deletion" + ], + [ + "script", + "support.js" + ] + ] + } + ], + [ + "IndexedDB/blob-valid-after-deletion.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid After Deletion" + ], + [ + "script", + "support.js" + ] + ] + } + ] + ], + "IndexedDB/blob-valid-before-commit.any.js": [ + [ + "IndexedDB/blob-valid-before-commit.any.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid Before Commit" + ], + [ + "script", + "support.js" + ] + ] + } + ], + [ + "IndexedDB/blob-valid-before-commit.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid Before Commit" + ], + [ + "script", + "support.js" + ] + ] + } + ] + ], "IndexedDB/clone-before-keypath-eval.html": [ [ "IndexedDB/clone-before-keypath-eval.html", @@ -309329,6 +309680,262 @@ {} ] ], + "compression/compression-bad-chunks.any.js": [ + [ + "compression/compression-bad-chunks.any.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ], + [ + "compression/compression-bad-chunks.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ], + [ + "compression/compression-bad-chunks.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ], + [ + "compression/compression-bad-chunks.any.worker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ] + ], + "compression/compression-including-empty-chunk.any.js": [ + [ + "compression/compression-including-empty-chunk.any.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "compression/compression-including-empty-chunk.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "compression/compression-including-empty-chunk.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "compression/compression-including-empty-chunk.any.worker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "compression/compression-multiple-chunks.any.js": [ + [ + "compression/compression-multiple-chunks.any.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "compression/compression-multiple-chunks.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "compression/compression-multiple-chunks.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "compression/compression-multiple-chunks.any.worker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ], + [ + "script", + "pako/pako_inflate.min.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "compression/compression-output-length.any.js": [ + [ + "compression/compression-output-length.any.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ], + [ + "compression/compression-output-length.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ], + [ + "compression/compression-output-length.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ], + [ + "compression/compression-output-length.any.worker.html", + { + "script_metadata": [ + [ + "global", + "worker" + ] + ] + } + ] + ], "compression/compression-stream.any.js": [ [ "compression/compression-stream.any.html", @@ -321025,6 +321632,12 @@ {} ] ], + "css/css-overflow/outline-with-opacity-crash.html": [ + [ + "css/css-overflow/outline-with-opacity-crash.html", + {} + ] + ], "css/css-overflow/overflow-abpos-transform.html": [ [ "css/css-overflow/overflow-abpos-transform.html", @@ -322597,6 +323210,12 @@ {} ] ], + "css/css-shadow-parts/idlharness.html": [ + [ + "css/css-shadow-parts/idlharness.html", + {} + ] + ], "css/css-shadow-parts/inner-host.html": [ [ "css/css-shadow-parts/inner-host.html", @@ -322681,6 +323300,30 @@ {} ] ], + "css/css-shadow-parts/simple-important-important.html": [ + [ + "css/css-shadow-parts/simple-important-important.html", + {} + ] + ], + "css/css-shadow-parts/simple-important-inline.html": [ + [ + "css/css-shadow-parts/simple-important-inline.html", + {} + ] + ], + "css/css-shadow-parts/simple-important.html": [ + [ + "css/css-shadow-parts/simple-important.html", + {} + ] + ], + "css/css-shadow-parts/simple-inline.html": [ + [ + "css/css-shadow-parts/simple-inline.html", + {} + ] + ], "css/css-shadow-parts/simple.html": [ [ "css/css-shadow-parts/simple.html", @@ -350274,6 +350917,254 @@ {} ] ], + "fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html", + { + "timeout": "long" + } + ] + ], + "fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/frame.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/frame.tentative.https.sub.html", + { + "testdriver": true + } + ] + ], + "fetch/metadata/sec-fetch-dest/frame.tentative.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/frame.tentative.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html", + { + "testdriver": true + } + ] + ], + "fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/navigation.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/navigation.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html", + { + "testdriver": true + } + ] + ], + "fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html", + { + "timeout": "long" + } + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/script.tentative.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/script.tentative.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html", + { + "testdriver": true + } + ] + ], + "fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html", + { + "testdriver": true + } + ] + ], + "fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html", + {} + ] + ], + "fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html": [ + [ + "fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html", + {} + ] + ], "fetch/metadata/serviceworker.tentative.https.sub.html": [ [ "fetch/metadata/serviceworker.tentative.https.sub.html", @@ -352772,6 +353663,12 @@ {} ] ], + "html/browsers/the-window-object/named-access-on-the-window-object/cross-global-npo.html": [ + [ + "html/browsers/the-window-object/named-access-on-the-window-object/cross-global-npo.html", + {} + ] + ], "html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html": [ [ "html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html", @@ -352791,6 +353688,12 @@ } ] ], + "html/browsers/the-window-object/named-access-on-the-window-object/prototype.html": [ + [ + "html/browsers/the-window-object/named-access-on-the-window-object/prototype.html", + {} + ] + ], "html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties.html": [ [ "html/browsers/the-window-object/named-access-on-the-window-object/window-named-properties.html", @@ -359037,6 +359940,24 @@ {} ] ], + "html/semantics/forms/form-submission-0/form-double-submit-2.html": [ + [ + "html/semantics/forms/form-submission-0/form-double-submit-2.html", + {} + ] + ], + "html/semantics/forms/form-submission-0/form-double-submit-3.html": [ + [ + "html/semantics/forms/form-submission-0/form-double-submit-3.html", + {} + ] + ], + "html/semantics/forms/form-submission-0/form-double-submit.html": [ + [ + "html/semantics/forms/form-submission-0/form-double-submit.html", + {} + ] + ], "html/semantics/forms/form-submission-0/form-submission-algorithm.html": [ [ "html/semantics/forms/form-submission-0/form-submission-algorithm.html", @@ -364862,6 +365783,12 @@ {} ] ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html": [ + [ + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html", + {} + ] + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js": [ [ "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.html", @@ -365870,29 +366797,135 @@ {} ] ], - "import-maps/bare.sub.tentative.html": [ + "import-maps/builtin-support.tentative/bare.sub.tentative.html": [ [ - "import-maps/bare.sub.tentative.html", + "import-maps/builtin-support.tentative/bare.sub.tentative.html", { "timeout": "long" } ] ], - "import-maps/builtin-empty.tentative.html": [ + "import-maps/builtin-support.tentative/builtin-empty.tentative.html": [ [ - "import-maps/builtin-empty.tentative.html", + "import-maps/builtin-support.tentative/builtin-empty.tentative.html", {} ] ], - "import-maps/builtin-import-scheme.tentative.html": [ + "import-maps/builtin-support.tentative/builtin-import-scheme.tentative.html": [ [ - "import-maps/builtin-import-scheme.tentative.html", + "import-maps/builtin-support.tentative/builtin-import-scheme.tentative.html", {} ] ], - "import-maps/builtin.tentative.html": [ + "import-maps/builtin-support.tentative/builtin.tentative.html": [ [ - "import-maps/builtin.tentative.html", + "import-maps/builtin-support.tentative/builtin.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/data.sub.tentative.html": [ + [ + "import-maps/builtin-support.tentative/data.sub.tentative.html", + { + "timeout": "long" + } + ] + ], + "import-maps/builtin-support.tentative/fallback-disallowed.sub.tentative.html": [ + [ + "import-maps/builtin-support.tentative/fallback-disallowed.sub.tentative.html", + { + "timeout": "long" + } + ] + ], + "import-maps/builtin-support.tentative/fallback.sub.tentative.html": [ + [ + "import-maps/builtin-support.tentative/fallback.sub.tentative.html", + { + "timeout": "long" + } + ] + ], + "import-maps/builtin-support.tentative/http.sub.tentative.html": [ + [ + "import-maps/builtin-support.tentative/http.sub.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/parsing-addresses.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/parsing-addresses.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/parsing-schema.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/parsing-schema.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/parsing-scope-keys.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/parsing-scope-keys.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/parsing-specifier-keys.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/parsing-specifier-keys.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/resolving-builtins.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/resolving-builtins.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/resolving-not-yet-implemented.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/resolving-not-yet-implemented.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/resolving-scopes.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/resolving-scopes.tentative.html", + {} + ] + ], + "import-maps/builtin-support.tentative/imported/resolving.tentative.html": [ + [ + "import-maps/builtin-support.tentative/imported/resolving.tentative.html", + {} + ] + ], + "import-maps/core/bare.sub.tentative.html": [ + [ + "import-maps/core/bare.sub.tentative.html", + { + "timeout": "long" + } + ] + ], + "import-maps/core/data.sub.tentative.html": [ + [ + "import-maps/core/data.sub.tentative.html", + { + "timeout": "long" + } + ] + ], + "import-maps/core/http.sub.tentative.html": [ + [ + "import-maps/core/http.sub.tentative.html", + {} + ] + ], + "import-maps/core/module-map-key.tentative.html": [ + [ + "import-maps/core/module-map-key.tentative.html", {} ] ], @@ -365938,36 +366971,6 @@ {} ] ], - "import-maps/data.sub.tentative.html": [ - [ - "import-maps/data.sub.tentative.html", - { - "timeout": "long" - } - ] - ], - "import-maps/fallback-disallowed.sub.tentative.html": [ - [ - "import-maps/fallback-disallowed.sub.tentative.html", - { - "timeout": "long" - } - ] - ], - "import-maps/fallback.sub.tentative.html": [ - [ - "import-maps/fallback.sub.tentative.html", - { - "timeout": "long" - } - ] - ], - "import-maps/http.sub.tentative.html": [ - [ - "import-maps/http.sub.tentative.html", - {} - ] - ], "import-maps/imported/parsing-addresses.tentative.html": [ [ "import-maps/imported/parsing-addresses.tentative.html", @@ -365992,18 +366995,6 @@ {} ] ], - "import-maps/imported/resolving-builtins.tentative.html": [ - [ - "import-maps/imported/resolving-builtins.tentative.html", - {} - ] - ], - "import-maps/imported/resolving-not-yet-implemented.tentative.html": [ - [ - "import-maps/imported/resolving-not-yet-implemented.tentative.html", - {} - ] - ], "import-maps/imported/resolving-scopes.tentative.html": [ [ "import-maps/imported/resolving-scopes.tentative.html", @@ -366016,12 +367007,6 @@ {} ] ], - "import-maps/module-map-key.tentative.html": [ - [ - "import-maps/module-map-key.tentative.html", - {} - ] - ], "inert/inert-does-not-match-disabled-selector.tentative.html": [ [ "inert/inert-does-not-match-disabled-selector.tentative.html", @@ -366587,6 +367572,12 @@ {} ] ], + "intersection-observer/document-scrolling-element-root.html": [ + [ + "intersection-observer/document-scrolling-element-root.html", + {} + ] + ], "intersection-observer/edge-inclusive-intersection.html": [ [ "intersection-observer/edge-inclusive-intersection.html", @@ -367194,6 +368185,12 @@ {} ] ], + "largest-contentful-paint/first-paint-equals-lcp-text.html": [ + [ + "largest-contentful-paint/first-paint-equals-lcp-text.html", + {} + ] + ], "largest-contentful-paint/idlharness.html": [ [ "largest-contentful-paint/idlharness.html", @@ -384519,6 +385516,18 @@ {} ] ], + "portals/history/history-manipulation-inside-portal-with-subframes.html": [ + [ + "portals/history/history-manipulation-inside-portal-with-subframes.html", + {} + ] + ], + "portals/history/history-manipulation-inside-portal.html": [ + [ + "portals/history/history-manipulation-inside-portal.html", + {} + ] + ], "portals/htmlportalelement-event-handler-content-attributes.html": [ [ "portals/htmlportalelement-event-handler-content-attributes.html", @@ -402783,6 +403792,38 @@ } ] ], + "shadow-dom/focus/click-focus-delegatesFocus-click-method.html": [ + [ + "shadow-dom/focus/click-focus-delegatesFocus-click-method.html", + { + "testdriver": true + } + ] + ], + "shadow-dom/focus/click-focus-delegatesFocus-tabindex-varies.html": [ + [ + "shadow-dom/focus/click-focus-delegatesFocus-tabindex-varies.html", + { + "testdriver": true + } + ] + ], + "shadow-dom/focus/click-focus-delegatesFocus-tabindex-zero.html": [ + [ + "shadow-dom/focus/click-focus-delegatesFocus-tabindex-zero.html", + { + "testdriver": true + } + ] + ], + "shadow-dom/focus/focus-method-delegatesFocus.html": [ + [ + "shadow-dom/focus/focus-method-delegatesFocus.html", + { + "testdriver": true + } + ] + ], "shadow-dom/focus/focus-selector-delegatesFocus.html": [ [ "shadow-dom/focus/focus-selector-delegatesFocus.html", @@ -402791,6 +403832,14 @@ } ] ], + "shadow-dom/focus/focus-tabindex-order-shadow-negative-delegatesFocus.html": [ + [ + "shadow-dom/focus/focus-tabindex-order-shadow-negative-delegatesFocus.html", + { + "testdriver": true + } + ] + ], "shadow-dom/focus/focus-tabindex-order-shadow-negative.html": [ [ "shadow-dom/focus/focus-tabindex-order-shadow-negative.html", @@ -402807,6 +403856,14 @@ } ] ], + "shadow-dom/focus/focus-tabindex-order-shadow-varying-delegatesFocus.html": [ + [ + "shadow-dom/focus/focus-tabindex-order-shadow-varying-delegatesFocus.html", + { + "testdriver": true + } + ] + ], "shadow-dom/focus/focus-tabindex-order-shadow-varying-tabindex.html": [ [ "shadow-dom/focus/focus-tabindex-order-shadow-varying-tabindex.html", @@ -402815,6 +403872,14 @@ } ] ], + "shadow-dom/focus/focus-tabindex-order-shadow-zero-delegatesFocus.html": [ + [ + "shadow-dom/focus/focus-tabindex-order-shadow-zero-delegatesFocus.html", + { + "testdriver": true + } + ] + ], "shadow-dom/focus/focus-tabindex-order-shadow-zero-host-negative.html": [ [ "shadow-dom/focus/focus-tabindex-order-shadow-zero-host-negative.html", @@ -404017,9 +405082,9 @@ } ] ], - "storage-access-api/idl.window.js": [ + "storage-access-api/idlharness.window.js": [ [ - "storage-access-api/idl.window.html", + "storage-access-api/idlharness.window.html", { "script_metadata": [ [ @@ -411775,24 +412840,6 @@ {} ] ], - "trusted-types/Location-assign.tentative.html": [ - [ - "trusted-types/Location-assign.tentative.html", - {} - ] - ], - "trusted-types/Location-href.tentative.html": [ - [ - "trusted-types/Location-href.tentative.html", - {} - ] - ], - "trusted-types/Location-replace.tentative.html": [ - [ - "trusted-types/Location-replace.tentative.html", - {} - ] - ], "trusted-types/Node-multiple-arguments.tentative.html": [ [ "trusted-types/Node-multiple-arguments.tentative.html", @@ -411903,12 +412950,6 @@ {} ] ], - "trusted-types/Window-open.tentative.html": [ - [ - "trusted-types/Window-open.tentative.html", - {} - ] - ], "trusted-types/WorkerGlobalScope-importScripts.https.html": [ [ "trusted-types/WorkerGlobalScope-importScripts.https.html", @@ -411975,36 +413016,12 @@ {} ] ], - "trusted-types/block-string-assignment-to-Location-assign.tentative.html": [ - [ - "trusted-types/block-string-assignment-to-Location-assign.tentative.html", - {} - ] - ], - "trusted-types/block-string-assignment-to-Location-href.tentative.html": [ - [ - "trusted-types/block-string-assignment-to-Location-href.tentative.html", - {} - ] - ], - "trusted-types/block-string-assignment-to-Location-replace.tentative.html": [ - [ - "trusted-types/block-string-assignment-to-Location-replace.tentative.html", - {} - ] - ], "trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html": [ [ "trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html", {} ] ], - "trusted-types/block-string-assignment-to-Window-open.tentative.html": [ - [ - "trusted-types/block-string-assignment-to-Window-open.tentative.html", - {} - ] - ], "trusted-types/block-text-node-insertion-into-script-element.tentative.html": [ [ "trusted-types/block-text-node-insertion-into-script-element.tentative.html", @@ -417032,6 +418049,12 @@ } ] ], + "wake-lock/wakelockpermissiondescriptor.https.html": [ + [ + "wake-lock/wakelockpermissiondescriptor.https.html", + {} + ] + ], "wasm/create_multiple_memory.worker.js": [ [ "wasm/create_multiple_memory.worker.html", @@ -420715,6 +421738,12 @@ {} ] ], + "web-nfc/NFCReader_scan_iframe.https.html": [ + [ + "web-nfc/NFCReader_scan_iframe.https.html", + {} + ] + ], "web-nfc/NFCReadingEvent_constructor.https.html": [ [ "web-nfc/NFCReadingEvent_constructor.https.html", @@ -422286,6 +423315,10 @@ "webgpu/cts.html?q=cts:command_buffer/render/rendering:", {} ], + [ + "webgpu/cts.html?q=cts:command_buffer/render/storeop:", + {} + ], [ "webgpu/cts.html?q=cts:examples:", {} @@ -422293,6 +423326,78 @@ [ "webgpu/cts.html?q=cts:fences:", {} + ], + [ + "webgpu/cts.html?q=cts:validation/createBindGroup:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/createBindGroupLayout:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/createPipelineLayout:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/createRenderPipeline:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/createTexture:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/createView:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/error_scope:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/fences:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/queue_submit:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/render_pass:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/render_pass_descriptor:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/setBindGroup:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/setBlendColor:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/setScissorRect:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/setStencilReference:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/setVertexBuffer:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/setViewport:", + {} + ], + [ + "webgpu/cts.html?q=cts:validation/vertex_input:", + {} ] ], "webmessaging/Channel_postMessage_Blob.htm": [ @@ -428794,9 +429899,15 @@ {} ] ], - "webxr/events_referenceSpace_reset.https.html": [ + "webxr/events_referenceSpace_reset_immersive.https.html": [ [ - "webxr/events_referenceSpace_reset.https.html", + "webxr/events_referenceSpace_reset_immersive.https.html", + {} + ] + ], + "webxr/events_referenceSpace_reset_inline.https.html": [ + [ + "webxr/events_referenceSpace_reset_inline.https.html", {} ] ], @@ -454847,7 +455958,7 @@ }, "paths": { ".azure-pipelines.yml": [ - "78f36842789b02036a0e4d86107c65c29190737e", + "ff466be667702bc2178cb1f7cf48cb2b1cf4230c", "support" ], ".codecov.yml": [ @@ -454883,7 +455994,7 @@ "support" ], ".taskcluster.yml": [ - "a267540cafba797ceb01a562936ed95d668a139f", + "27479fb57e072114e7898494468740b239c7ae92", "support" ], ".well-known/README.md": [ @@ -459682,6 +460793,22 @@ "c16c0a4e010f9805796cd93f9cbd1f141e6c91e5", "testharness" ], + "IndexedDB/blob-contenttype.any.js": [ + "0b2debae7b1a6498523459ee97882257a7ac974c", + "testharness" + ], + "IndexedDB/blob-delete-objectstore-db.any.js": [ + "61d7bad914e96a9063c97e3a14844aa8c30079e4", + "testharness" + ], + "IndexedDB/blob-valid-after-deletion.any.js": [ + "7c7825cb421e2f1e2aacb9838db594ff16e8f30a", + "testharness" + ], + "IndexedDB/blob-valid-before-commit.any.js": [ + "0803c9ea69c1e187bab2e6f0afe76a403973b645", + "testharness" + ], "IndexedDB/clone-before-keypath-eval.html": [ "bf67c5d6d732f6dfcf7687d9b12f3d313eb61707", "testharness" @@ -459743,7 +460870,7 @@ "testharness" ], "IndexedDB/idb-explicit-commit.any.js": [ - "12e56cc267a2a8ecb869b8b121f6e74047d0f73d", + "2acd904ea6ab5f887cfda7e7dece0ed506c27ae4", "testharness" ], "IndexedDB/idb_binary_key_conversion.htm": [ @@ -461059,7 +462186,7 @@ "testharness" ], "IndexedDB/structured-clone.any.js": [ - "8078aaf796b843aaf9f23be5889febbe4c8fb960", + "e03ba7aeee47bcd8ae75e2210fc2165581c0a82f", "testharness" ], "IndexedDB/support-promises.js": [ @@ -466742,10 +467869,6 @@ "269f464a547c7d1d23ba88527a55b9767e814304", "support" ], - "common/sleep.py": [ - "2e803b1b262423e219be592fab548ada982bc439", - "support" - ], "common/slow.py": [ "f3b1c7e2ea61b571bd56cc1c70c5f89bb8e7e4dc", "support" @@ -466918,6 +468041,22 @@ "1d3965fca6769c70bc02308a4c70b4e58c8990e5", "reftest" ], + "compression/compression-bad-chunks.any.js": [ + "06e3be9c0fe6d5663acf07cff12c4b9903c24661", + "testharness" + ], + "compression/compression-including-empty-chunk.any.js": [ + "eff928857903890e967fdbcab042a44a0731e946", + "testharness" + ], + "compression/compression-multiple-chunks.any.js": [ + "ca49b9cf42766a072b57cc8eb3f083127d90f8c4", + "testharness" + ], + "compression/compression-output-length.any.js": [ + "d7dafcd10092d5fd1135cbb4ca2d82d5844f6d08", + "testharness" + ], "compression/compression-stream.any.js": [ "47df70f7cd3979c1a3eab45581376fd38a6b2367", "testharness" @@ -556994,6 +558133,10 @@ "4684440bdbfd9886fd34a6ba1144ae1724b6a157", "reftest" ], + "css/css-contain/contain-size-scrollbars-004.html": [ + "6a45fdd23f4b797565e3cfa1934308f62709a0ca", + "reftest" + ], "css/css-contain/contain-size-select-001.html": [ "071db67831fd7951b8568ca1b7e4dcc5dbc119a1", "reftest" @@ -557298,6 +558441,10 @@ "402ff6c95e14c7c6dbe6e91cd779937bf6c4caa8", "support" ], + "css/css-contain/reference/contain-size-scrollbars-004-ref.html": [ + "91d9e51709465a24fbf418f197d2c01fd4cf2789", + "support" + ], "css/css-contain/reference/contain-size-select-001-ref.html": [ "960abc1e158756fca26ed3e42afcc9d97a0d07b1", "support" @@ -575827,11 +576974,11 @@ "visual" ], "css/css-lists/content-property/marker-text-matches-armenian-ref.html": [ - "f21dfff69608a6a1201bd586c2a6e1e24d5fd915", + "de55b7381ac1e2cf1553adcaee916e24e7348c4c", "support" ], "css/css-lists/content-property/marker-text-matches-armenian.html": [ - "fd0df631149a740a201510f2edff405d28f41929", + "58f570cd1197579aba1b646a1c970ab13c23c3e3", "reftest" ], "css/css-lists/content-property/marker-text-matches-circle-ref.html": [ @@ -577751,7 +578898,7 @@ "reftest" ], "css/css-multicol/extremely-tall-multicol-with-extremely-tall-child-crash.html": [ - "6e40afe54c9ce9aa50765f778d74640454dcc1ce", + "1f74697489df2d8ed687b40d3681d9918f2ecb0f", "testharness" ], "css/css-multicol/filter-with-abspos.html": [ @@ -577771,7 +578918,7 @@ "reftest" ], "css/css-multicol/going-out-of-flow-after-spanner.html": [ - "2433864333967f26a2354b791cd7b153d26e44f4", + "2fe0e42a7522647b7eca4db1e6f710a9975faaa4", "testharness" ], "css/css-multicol/inheritance.html": [ @@ -579730,6 +580877,10 @@ "534dff9766ddccf4dd239a307d28d7e8882d6f04", "testharness" ], + "css/css-overflow/outline-with-opacity-crash.html": [ + "556e3cfedcd31d696827211d5626f756fb25dd93", + "testharness" + ], "css/css-overflow/overflow-abpos-transform.html": [ "df1128316f6010f010e6d27c395d7751fa05d7b1", "testharness" @@ -579750,6 +580901,14 @@ "2ed8d2687a33608e0e70884ad2ea59330d2b09e3", "reftest" ], + "css/css-overflow/overflow-body-propagation-005.html": [ + "e4de5769584611f61ec2fecd99c2324916a3d6ec", + "reftest" + ], + "css/css-overflow/overflow-body-propagation-006.html": [ + "475815068357ee24cfe9f22f968b0289ca982383", + "reftest" + ], "css/css-overflow/overflow-codependent-scrollbars.html": [ "eb0e4f5ea2ed9a97c0931c2c53de5e62e72ba1dd", "testharness" @@ -581927,7 +583086,7 @@ "reftest" ], "css/css-pseudo/first-line-first-letter-insert-crash.html": [ - "17f035dedf1ef8df71918a1eacb01e1f0b80d46b", + "bc22aae409b80ee62f3079cb31e89b2130da8270", "testharness" ], "css/css-pseudo/first-line-on-ancestor-block-ref.html": [ @@ -581947,7 +583106,7 @@ "reftest" ], "css/css-pseudo/idlharness.html": [ - "4c113fc9091fb773cabd77f1419fac9a2e99650b", + "eb0652e9eeb374ed1d3bb4bf235b0b3cf13fde06", "testharness" ], "css/css-pseudo/marker-and-other-pseudo-elements-ref.html": [ @@ -585222,6 +586381,10 @@ "2e65c4b1b57bd9959c68e85e11b442c67f2c5a42", "testharness" ], + "css/css-shadow-parts/idlharness.html": [ + "182943ac69de04b409e91b4005fb378cac36f9e2", + "testharness" + ], "css/css-shadow-parts/inner-host.html": [ "2dfd4b0510a758c73bf8ac8291088d39077578d7", "testharness" @@ -585286,6 +586449,22 @@ "a1a19aee4ede175f7e862318105f4625144b6e42", "testharness" ], + "css/css-shadow-parts/simple-important-important.html": [ + "43ec1bbae346e03e2e28209409f24a91273c5bdd", + "testharness" + ], + "css/css-shadow-parts/simple-important-inline.html": [ + "61b83dd4be7f4ff19236e5b6568424191382de80", + "testharness" + ], + "css/css-shadow-parts/simple-important.html": [ + "e3240bd3905f86cfa37dbc72af14dc95eb40d84e", + "testharness" + ], + "css/css-shadow-parts/simple-inline.html": [ + "f2c3638d1e9cc66dcc8051a00f778bc95cb33129", + "testharness" + ], "css/css-shadow-parts/simple.html": [ "a7f17d9670b137995b0dfc6f43221e16b988376d", "testharness" @@ -586175,7 +587354,7 @@ "testharness" ], "css/css-shapes/shape-outside/values/shape-outside-computed-shape-000.html": [ - "f79b21a723e6e253df0176e53a4567d8ec9567ab", + "def2d75fd93e472d2a40e4fd3f3418c6b96bafd5", "testharness" ], "css/css-shapes/shape-outside/values/shape-outside-computed-shape-001.html": [ @@ -587566,6 +588745,10 @@ "188257af443a235e8ad5d5804058cbf0bcc07a94", "testharness" ], + "css/css-tables/box-shadow-001.html": [ + "cc699d999eaf9dd7a50c0111ef319816c5c2cb12", + "reftest" + ], "css/css-tables/calc-percent-plus-0px-auto.html": [ "ec6e9ccfdd702963a8c1b35c8c6c64576189de77", "reftest" @@ -594523,11 +595706,11 @@ "reftest" ], "css/css-text/white-space/break-spaces-tab-005.html": [ - "b5cf3f33ec2bb582bb3f322eeed7c45b426f0936", + "81c39aa27fe818a293229a3e819d2394c8824a43", "reftest" ], "css/css-text/white-space/break-spaces-tab-006.html": [ - "85d821a3e4d476e6fdfe74a7a2f9134ffb2629a3", + "34df3bfc1bd2f20abbe29b79124a95ce28a4cfaf", "reftest" ], "css/css-text/white-space/control-chars-000.html": [ @@ -594782,6 +595965,10 @@ "44f6f83f2d110ac24d99de9eccaa6321903d931f", "reftest" ], + "css/css-text/white-space/eol-spaces-bidi-001.html": [ + "976ce7c639f10d2137da1492f50ea74c769c1091", + "reftest" + ], "css/css-text/white-space/line-edge-white-space-collapse-001.html": [ "4e144e6c330191435f183936c2ab2437ec4f7609", "reftest" @@ -594955,11 +596142,11 @@ "reftest" ], "css/css-text/white-space/pre-wrap-tab-005.html": [ - "993aa92e370b708855aa883591e13251f9015364", + "edbc5974c15cd840a278c49f0438d41932a68b8a", "reftest" ], "css/css-text/white-space/pre-wrap-tab-006.html": [ - "a4c7f3d3ebd9ae73a494769b18f046185672030c", + "4bdb7a21c7c59888f7f20eefe704a14d47b8d9e3", "reftest" ], "css/css-text/white-space/reference/break-spaces-tab-003-ref.html": [ @@ -594974,6 +596161,10 @@ "9d5fcb27147a8c53e410d08511cb5035b612f80c", "support" ], + "css/css-text/white-space/reference/eol-spaces-bidi-001-ref.html": [ + "37da6649f9b776cb046a2bacdeb24968d27a2af8", + "support" + ], "css/css-text/white-space/reference/line-edge-white-space-collapse-001-ref.html": [ "02fa594255f00396f66e86837409cd579282f7de", "support" @@ -609779,7 +610970,7 @@ "reftest" ], "css/css-writing-modes/percentage-padding-in-shrink-to-fit.html": [ - "2d4364c886c48c3ef7ebddfb43d2210bdf75e094", + "240a66c9c6b81ba57addbebd456b5c497dcd4d51", "reftest" ], "css/css-writing-modes/reference/available-size-001-ref.html": [ @@ -612931,7 +614122,7 @@ "support" ], "css/css-writing-modes/wm-propagation-001.html": [ - "d313cacf38dac06ec5be6377a7cc9055dc4e2d07", + "f552265d0d0b32593f18df806929d86a368ee81b", "reftest" ], "css/css-writing-modes/wm-propagation-002-ref.html": [ @@ -613003,11 +614194,11 @@ "reftest" ], "css/css-writing-modes/wm-propagation-body-044-ref.html": [ - "31e98673720e06e2ed5519c38bf0ad28ec7b944c", + "9cf46c0b214652ca0bd7f28fe88c7943f6ccef8c", "support" ], "css/css-writing-modes/wm-propagation-body-044.html": [ - "60d444ca8b2f1de90be794a51ef5e3ae77005c7d", + "5993cee35934c63490b4ebbdc833a04f2f13256b", "reftest" ], "css/css-writing-modes/wm-propagation-body-045.html": [ @@ -613383,7 +614574,7 @@ "testharness" ], "css/cssom-view/elementFromPoint-list-001.html": [ - "e3c2c4d18f4c35f31908fd1095b0516fd0161b8a", + "b31453d6c32c2c7ed8192dc1e4b5037476645bcd", "testharness" ], "css/cssom-view/elementFromPoint-mixed-font-sizes.html": [ @@ -616011,7 +617202,7 @@ "reftest" ], "css/mediaqueries/mq-calc-006.html": [ - "989ee424867bb49f484324b7a3e90ed608a1342a", + "8f3ac37b057d0c9e53851e76d7144c602c02bb08", "reftest" ], "css/mediaqueries/mq-case-insensitive-001.html": [ @@ -616079,7 +617270,7 @@ "support" ], "css/mediaqueries/test_media_queries.html": [ - "d368acf8b57da4b98825cb4ddc25ae4c44338745", + "881df835f5a95e45487193881d5da89c81602ba9", "testharness" ], "css/mediaqueries/viewport-script-dynamic-ref.html": [ @@ -618691,7 +619882,7 @@ "support" ], "css/tools/build.py": [ - "d60e00fd330756f4212b9eda89d15a478fb0c861", + "9bbc2a5e7532c08eb2a70afe5569252d61142794", "support" ], "css/tools/w3ctestlib/.hgignore": [ @@ -628515,7 +629706,7 @@ "support" ], "docs/admin/index.md": [ - "8a04e2a0c805e9fc1fd3cf7c2fe4ecd053a45f32", + "7eca6e3a9a92cbbfb8b23d3c1ee88e43d1af69ad", "support" ], "docs/assets/_reftest_graph_example.dot": [ @@ -630847,7 +632038,7 @@ "support" ], "editing/data/inserthtml.js": [ - "0c6cff86c60401b404300ad7e92d697a2e7454c0", + "a3a23cd99e1b7140a9215554d2d17dc6cf34f51c", "support" ], "editing/data/insertimage.js": [ @@ -633507,7 +634698,7 @@ "testharness" ], "event-timing/crossiframe.html": [ - "bb19c82a2a1d64e5edcdc965812488aab1a73652", + "95e16afa0793e33d0839a6bad4a39a57a83ffec1", "testharness" ], "event-timing/idlharness.any.js": [ @@ -635719,7 +636910,7 @@ "support" ], "fetch/corb/resources/html-js-polyglot.js": [ - "5b048d336443c809831bdc08d1d8b0a6e2aecddb", + "db45bb4acc9251959a240da6c5c57603fb8fbce8", "support" ], "fetch/corb/resources/html-js-polyglot.js.headers": [ @@ -635727,7 +636918,7 @@ "support" ], "fetch/corb/resources/html-js-polyglot2.js": [ - "9443f8ed6c35efe7928249735b2faa0ef9bdf0a6", + "faae1b7682b547e93d492ba2c6085a956243f61c", "support" ], "fetch/corb/resources/html-js-polyglot2.js.headers": [ @@ -635787,7 +636978,7 @@ "testharness" ], "fetch/corb/script-html-js-polyglot.sub.html": [ - "ec4103771fb243864bbd8855b5c949922f1f3939", + "9a272d63ffc30e9ac365e6ce5e2179c1c694a955", "testharness" ], "fetch/corb/script-html-via-cross-origin-blob-url.sub.html": [ @@ -635803,11 +636994,11 @@ "testharness" ], "fetch/corb/script-resource-with-json-parser-breaker.tentative.sub.html": [ - "cabc7b09c458ca1f3852c633c9cd47680ab6e89d", + "d46944727f8ee9fc144caec437a5505be75e3d4b", "testharness" ], "fetch/corb/script-resource-with-nonsniffable-types.tentative.sub.html": [ - "4cbdd7b99e6b4bae045951733d61a794c476571c", + "f83eff82b5e4b21adfaf20915632e3ed6e6b9ba6", "testharness" ], "fetch/corb/style-css-mislabeled-as-html-nosniff.sub.html": [ @@ -635983,107 +637174,107 @@ "support" ], "fetch/metadata/appcache.tentative.https.sub.html": [ - "1b5a5767c2c60e969f9e24204ff17017d599c9dc", + "3aa902cc1462c08cedc4f8efbd0ae2d86c6961bd", "testharness" ], "fetch/metadata/embed.tentative.https.sub.html": [ - "bf895e9d5385e9c6e1411f3360fd8480b2a6aa84", + "77042e85de9f26655fc31085074e2401a8202efc", "testharness" ], "fetch/metadata/fetch-preflight.tentative.https.sub.html": [ - "27dafc25df78b74bb5ae2f86b414b49058c372de", + "1ab3de615c8a620c01378577acd8e032998fb980", "testharness" ], "fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html": [ - "86edfd06decf56e1ee81030054a582b570bdbecf", + "13016fe35374949ddc27c42b1b57a74190675c7e", "testharness" ], "fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html": [ - "d59348c257b1c01b3b7c58015da2457294948b29", + "d43715785b4a6c323bae1f96a064b97914c0db3f", "testharness" ], "fetch/metadata/fetch.tentative.https.sub.html": [ - "30042f8aeb86605bbc1d35d623554cec17b32f87", + "72fb52ecd5d8123d5e387fdb20c171a320e38caf", "testharness" ], "fetch/metadata/fetch.tentative.sub.html": [ - "a2d66d6afa932011f8f64b0a85e79fd91486eef9", + "a14c2c5f411c803b28d7a12f314eba466c838437", "testharness" ], "fetch/metadata/font.tentative.https.sub.html": [ - "07152e8f18ca0234710a64e98b6641b32070e36f", + "9064dd6897393b184634a1abcef2f92fed7f9a71", "testharness" ], "fetch/metadata/history.tentative.https.sub.html": [ - "ef8e74bc86daf994ff8249230b6ddaf7162bb749", + "0d78ec06035fa11e6cd9b6f50381079b2001a564", "testharness" ], "fetch/metadata/iframe.tentative.https.sub.html": [ - "7b89d8dc0daa6d50b76eeec7f7a7f7349e23a0cd", + "b8f11c66b7edeedeab85b947e0a0138e5dd0f333", "testharness" ], "fetch/metadata/iframe.tentative.sub.html": [ - "418e2a2d449ee48d2ab8147ed6923706a1eb9cba", + "c5469f458d37bed0ce43ddbf1011085879e9f743", "testharness" ], "fetch/metadata/img.tentative.https.sub.html": [ - "c3248f6096136149e9d496ecd0ffe30106f99326", + "ced6f9845e8af9e6a312d85e9c3f6efa209b8cbb", "testharness" ], "fetch/metadata/navigation.https.sub.html": [ - "50857aeabafc0e544a9895f4b862a38ad50109aa", + "1c2ce9537959c184d864e76010b0d5882932c2a4", "testharness" ], "fetch/metadata/object.tentative.https.sub.html": [ - "40ef308362eea3effd99a11a6b725d182742b8fb", + "cf1c26039995336e413c432c35589322cbcbc43f", "testharness" ], "fetch/metadata/portal.tentative.https.sub.html": [ - "50f0037dfd054dc4a9ea0e70c79b6a42c448d483", + "ee24b5ecbb90c7f0d2892d4f5abeb3c5d1d6acf3", "testharness" ], "fetch/metadata/prefetch.tentative.https.sub.html": [ - "1902b9bca7992a6d29910d60642acd3bdfd08b1c", + "30966f872f85bf0596011b4be2cb192ce7f55d15", "testharness" ], "fetch/metadata/preload.tentative.https.sub.html": [ - "9dbcad322a64bc545f5e00146efcd37f0101235a", + "e8c541ef7f955d72ac95bca171c401c2501f0e5c", "testharness" ], "fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html": [ - "4747ebf36f87d4b51927f4b87f29c7c180b75170", + "0874273ef94f91eda96b8244ea6c11c9809467eb", "testharness" ], "fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html": [ - "8120e762517d025d433ab3d28368c56cb0abc43e", + "efff1cdaae8415f54d51b2c54a7cb3f12e6b702e", "testharness" ], "fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html": [ - "a15e681ad84c95c012d0863aa20968e1771a2f1c", + "e7774f6ba10585a1897e11df10ee25fcaae473c6", "testharness" ], "fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html": [ - "8c65095cc9cd7a3e63c04e990f7c632da0cf0c45", + "b1df738354cc31b9c553b38a0d02f4edaac88462", "testharness" ], "fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html": [ - "6ba5b948332aa451d10c9c08aa07c80a2f2f8f13", + "c7e1721af78bbf6b3c258df7c7e8f28369c67e27", "testharness" ], "fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html": [ - "54e48e0c61c258905da416841a6243847ddc65b8", + "eee21dafcac42c5074f786b2b76f12d08735f0ef", "testharness" ], "fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html": [ - "b88429c540dab3743fb8d674aa0a6927d2ae06d4", + "a31d2d399f2ca7f9c3e167276287baf34e5b9202", "testharness" ], "fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html": [ - "795e418660d8ed6e5b499985415aa6d18970d506", + "f342b1c2669ecc17a68cd2699e786c9ee008af28", "testharness" ], "fetch/metadata/report.tentative.https.sub.html": [ - "8209fd17cd54295faffa9826fa2b7ac371e75eea", + "821c56f5877a7a478047ae8711bb8b4f856d54cd", "testharness" ], "fetch/metadata/report.tentative.https.sub.html.sub.headers": [ @@ -636123,7 +637314,7 @@ "support" ], "fetch/metadata/resources/helper.js": [ - "9425246881b1bdc7f4cace59e4e211d298316197", + "d9b00ed8b94b595a4d4c1a50396355d3518c6496", "support" ], "fetch/metadata/resources/post-to-owner.py": [ @@ -636151,47 +637342,207 @@ "support" ], "fetch/metadata/script.tentative.https.sub.html": [ - "f877b50ec2bd1f04862886853eebf15b0a0dd1c7", + "d5a1096e8198c30e8547e8d6dbcbf71822aad3ed", "testharness" ], "fetch/metadata/script.tentative.sub.html": [ - "66b821265baec27be875bc04dfd8f220facf1e57", + "b1361516cb5371bfe5562a09a32bac680ec2af0d", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html": [ + "469001e2f3380a61f59ffc9cebc123e8912b0f36", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html": [ + "d880deee5dd9560d180357d0631846ae92076447", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html": [ + "63d53e8969dad3d564eedc29675d1fdbd4430eda", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html": [ + "d2341572eb7940fd046e3f895dc251ee27074a5d", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html": [ + "f70ae8b9dd3a55c5dac0d83d01332cd6eba4fea4", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html": [ + "99f8191d7cb928ff5f552e3a4f65e50064bd13b8", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html": [ + "cf6c7977af221f2e5d2abd9f717e55988dc0294a", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html": [ + "bc892db320c29b2979060b4ed29aaf5f507798d8", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/frame.tentative.https.sub.html": [ + "d80b727469851c131df6226f20fff03377b4a9c6", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/frame.tentative.sub.html": [ + "61b6d1f446beb918cbaff18d4cbecbab7143aa32", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html": [ + "55e03a23660bc13d98763ffbe0ba8b077914cbcd", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html": [ + "356805d190024230dc691b584c03cb4e6f16951c", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html": [ + "e126e3c0a89147a5d878992f211b19be08e7089c", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html": [ + "f6b84b1795b40b9a9a8e0cab84456ee12d5547ea", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/navigation.https.sub.html": [ + "3ab843d165c0510192bca51a36f701ac583ea1bd", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html": [ + "29db51117858415f4a751892c758c88e9a72bc3e", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html": [ + "ad9e8fd936236ef2d8ba07cb0ad73dadd2e74ce3", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html": [ + "be495ba332ec50e6d2d499b25331154a27dde1a2", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html": [ + "2c82abb366403bd055ad3d95754b3d9df76d06dc", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html": [ + "ea13cc83bdfdb65d2af15f458accc18e20e2b1ec", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html": [ + "e74ce0c06d5b30765a696ea5c57be6f78ff68989", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html": [ + "78ee10dc736cac4ae648254df21afac781ca7526", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html": [ + "90a476684398cad2cf0ce14c29c2dcfcc08ff7c3", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html": [ + "a31efcbf26acd986aab126d990b2eb07f9e0da37", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html": [ + "425753cb5080fab47942a006914d14b9f15cc534", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html": [ + "9b8b44b0ef28882f80a7b6289eb4fe7e6b4b5451", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html": [ + "2f12fe03cab3bee32e9d65be24bbe5784411982b", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html": [ + "d3cb7e101a56c95a2fad3519fc7f6b45789bcd91", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers": [ + "1ec5df78f30183b07f2739f180354d87e4572c5b", + "support" + ], + "fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html": [ + "18e8be78848ffc2d821c38545f75d5a5fd23b0e1", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/script.tentative.sub.html": [ + "0512dc676aae721fcbd339540cc9f04f681da2c4", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html": [ + "1faee65bf076d15155e6f678064a851f18b949c9", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html": [ + "882572c86fec7c1b6fcd3b4abbee870fbcb866d7", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html": [ + "ed30c81c7dd23469510ed9a47cd4fef497b976bb", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html": [ + "09e927f1a7c10ab1214c3f4591baeb3944b81e82", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html": [ + "283b928e921917f6d6e54150f992713b29ed4135", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html": [ + "a702fb83d597e7662452d5afc8bcdbf3455502f6", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html": [ + "650ba6afa16c0b4cd230fbc85dfc4adb63001ede", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html": [ + "8e40fb621e24ae1fc60dc512fd8b6455e92bffdb", + "testharness" + ], + "fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html": [ + "df44514fa1f346b5bc46eb73c18495f84c68e8f1", "testharness" ], "fetch/metadata/serviceworker.tentative.https.sub.html": [ - "6fdb37a7f69c2e0bf15bebf5098dcdaac24a9962", + "1fbdee4f091bc46007a627bc80e07c50a1be708f", "testharness" ], "fetch/metadata/sharedworker.tentative.https.sub.html": [ - "90144156ee4b3e36368f685cc4a879f72998ac8e", + "0408c44201fa5125281671e71281d82b0925939f", "testharness" ], "fetch/metadata/style.tentative.https.sub.html": [ - "1f875e8c5104cdf6b950f3c406f8d80206489328", + "08ac184b42109259a5d4977ab1bf0f4865c988b7", "testharness" ], "fetch/metadata/track.tentative.https.sub.html": [ - "63d76372e0329708c6ef5629800c65c8279c358d", + "11e45e23efd00dc5f8c79af8a2f43747628c9050", "testharness" ], "fetch/metadata/trailing-dot.tentative.https.sub.html": [ - "f1a0ad1b485f68a2e097761769b333465b2d614e", + "f7069e7225586ca2de7b3a2c849142e0b4e6a498", "testharness" ], "fetch/metadata/unload.tentative.https.sub.html": [ - "c93ecab3197e32758a173df742a116b90e279f84", + "8917c53a3b3814162366df110fc20aaf38428d3b", "testharness" ], "fetch/metadata/window-open.tentative.https.sub.html": [ - "79f1eec8542a1122e1402dfd734a7051c87bba29", + "29c325f1213e7ca943da8144b0b9badc1e7fb11c", "testharness" ], "fetch/metadata/worker.tentative.https.sub.html": [ - "df1abc4bbca5f69404c9a21dfe9c1b584ddc10a0", + "d2162d5bc7aba1674a75a2f9bc19fccf0aa4eb81", "testharness" ], "fetch/metadata/xslt.tentative.https.sub.html": [ - "6e4f186d55c6c793dc8a6a6006b9217473443236", + "5fc647b3ae7da7a2d0d65a8a6808deb642165084", "testharness" ], "fetch/nosniff/image.html": [ @@ -639815,7 +641166,7 @@ "testharness" ], "html/browsers/origin/cross-origin-objects/cross-origin-objects.html": [ - "72aec0b7542b685945982186f1e2570e80ac6087", + "f16a18d639cc6e528b561d800088fcfebf2c10cf", "testharness" ], "html/browsers/origin/cross-origin-objects/frame-with-then.html": [ @@ -639823,7 +641174,7 @@ "support" ], "html/browsers/origin/cross-origin-objects/frame.html": [ - "3226c8719311f937bcee4ad3b42b840828d0f600", + "ca2dd8ebf829d6f677fdf57b4a6db029a4aa457d", "support" ], "html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html": [ @@ -640202,6 +641553,14 @@ "f266dd7acb96cc473129c066e59f027c2eb067f0", "testharness" ], + "html/browsers/the-window-object/named-access-on-the-window-object/cross-global-npo.html": [ + "2acad0734cda6a5076e836240cec107af036a72a", + "testharness" + ], + "html/browsers/the-window-object/named-access-on-the-window-object/cross-global-support.html": [ + "9d7b9f8a25ecc392abd74949a1362c8b13450a9d", + "support" + ], "html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html": [ "d5b1789d59455603d1f5929a7a7f05d8a7218d52", "testharness" @@ -640210,6 +641569,10 @@ "59d94efc994e365301c20dbc5ff1b14409dfcaab", "testharness" ], + "html/browsers/the-window-object/named-access-on-the-window-object/prototype.html": [ + "910374381be85e5b37e1f343b6070ce7a776fe2b", + "testharness" + ], "html/browsers/the-window-object/named-access-on-the-window-object/test.html": [ "c3b3cc185255d159b0f9ff9fd97aae71170d0af6", "support" @@ -650671,7 +652034,7 @@ "testharness" ], "html/semantics/embedded-content/the-iframe-element/iframe-load-event.html": [ - "d245bf0b96451b3419e0e69bda86fe4859c9cbfe", + "5ffe53c308ebed4784543984075deb0e5901be01", "testharness" ], "html/semantics/embedded-content/the-iframe-element/iframe-modify-scrolling-attr-to-yes-ref.html": [ @@ -651734,6 +653097,18 @@ "4ac26092eeea00cc84ccd04154c255280bc76cbb", "testharness" ], + "html/semantics/forms/form-submission-0/form-double-submit-2.html": [ + "f0c9471a704d4c0c0742d7ed8e8f13a789514d69", + "testharness" + ], + "html/semantics/forms/form-submission-0/form-double-submit-3.html": [ + "1bad23260d054b8f60e255de4d1a074803db4b2f", + "testharness" + ], + "html/semantics/forms/form-submission-0/form-double-submit.html": [ + "1102e304174eeec18b65b54deec74a328d998be0", + "testharness" + ], "html/semantics/forms/form-submission-0/form-echo.py": [ "a7f0dc87efd2d3bf8798919649873cb81fc25ade", "support" @@ -656951,7 +658326,7 @@ "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js": [ - "1d94de8a7c9f28dfab32111deb664d9921437e46", + "ba7278ef18adb42b3f527a9c27ff3a51bdb4dbf7", "testharness" ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/active.window.js": [ @@ -657030,6 +658405,10 @@ "43506a22a46da53885a2b5a0888095bc52b460ca", "testharness" ], + "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html": [ + "a3bdd86ee6ecfda5e09522df5e4c71373a362f5e", + "testharness" + ], "html/webappapis/dynamic-markup-insertion/opening-the-input-stream/mutation-events.window.js": [ "4efbb863c6372a3ee04d11f38d7ee56a44a2ac7d", "testharness" @@ -657519,7 +658898,7 @@ "testharness" ], "html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/disallow-crossorigin.html": [ - "627a2f3e5a7baca47cf40d8398e77a48d953b626", + "d61618a53ef8afd3cdd2527a0f7f7b094caf570b", "testharness" ], "html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-event-constructor.html": [ @@ -657555,7 +658934,7 @@ "testharness" ], "html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/support/promise-access-control.py": [ - "3e897bccdce1a3d1c340d03836c23bfabf59e90a", + "be74a36034eda86e1c6d77b84aef3fd631a8a9ef", "support" ], "html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/support/promise-rejection-events.js": [ @@ -658026,18 +659405,6 @@ "2bb82c9834790bfeb1a65cf2ef202dc63d2ebac4", "support" ], - "import-maps/@std/__dir__.headers": [ - "e7ec0d6699d07e5b13d0cb6f24c3639258fccdaa", - "support" - ], - "import-maps/@std/blank": [ - "38e1891bf7d5db9ad7063dc1f22bb17f8b1d4446", - "support" - ], - "import-maps/@std/none": [ - "69e165cce5e223684c9d0f0f7848bc6fc02b14cd", - "support" - ], "import-maps/README.md": [ "3803e350c844b4af77b871831817ac0d90aca97f", "support" @@ -658054,58 +659421,182 @@ "ceef4100aad01f5cd5959086aacf83665f60c805", "testharness" ], - "import-maps/bare.sub.tentative.html": [ - "cf99589f9bd56730423880d6fd4f93df293e6ddf", - "testharness" - ], - "import-maps/bare/__dir__.headers": [ + "import-maps/builtin-support.tentative/@std/__dir__.headers": [ "e7ec0d6699d07e5b13d0cb6f24c3639258fccdaa", "support" ], - "import-maps/bare/bare": [ - "1011e866b81dca7bf423fcb48266463c77591465", + "import-maps/builtin-support.tentative/@std/blank": [ + "38e1891bf7d5db9ad7063dc1f22bb17f8b1d4446", "support" ], - "import-maps/bare/blank": [ + "import-maps/builtin-support.tentative/@std/none": [ + "69e165cce5e223684c9d0f0f7848bc6fc02b14cd", + "support" + ], + "import-maps/builtin-support.tentative/bare.sub.tentative.html": [ + "e20424aed8a728b31774b71ae98ab7d882df2987", + "testharness" + ], + "import-maps/builtin-support.tentative/bare/__dir__.headers": [ + "e7ec0d6699d07e5b13d0cb6f24c3639258fccdaa", + "support" + ], + "import-maps/builtin-support.tentative/bare/blank": [ "841d433acf72f828c34faca23f26e9afd10fbab7", "support" ], - "import-maps/bare/cross-origin-bare": [ - "64851cc8e2455a4cd150b10edf051425bb6dc5bf", - "support" - ], - "import-maps/bare/none": [ + "import-maps/builtin-support.tentative/bare/none": [ "2aec0d72826f203074dea5a5268b9f937bdb7183", "support" ], - "import-maps/bare/std-blank": [ + "import-maps/builtin-support.tentative/bare/std-blank": [ "5ded98fd382a52a11d52af57cc7e79f56b083843", "support" ], - "import-maps/bare/std-none": [ + "import-maps/builtin-support.tentative/bare/std-none": [ "1437d9ff1e0c0c60672a1f656a2ab91aa01601db", "support" ], - "import-maps/bare/to-bare": [ + "import-maps/builtin-support.tentative/builtin-empty.tentative.html": [ + "9ede75a4c42067a989ee6abaf4728bdaa2d56694", + "testharness" + ], + "import-maps/builtin-support.tentative/builtin-import-scheme.tentative.html": [ + "d9977ae3535c48ebb33e6d3e97bd9d6bab409bc4", + "testharness" + ], + "import-maps/builtin-support.tentative/builtin.tentative.html": [ + "497bb5c606b7648bbdf9a3cd8990b462d9ab7787", + "testharness" + ], + "import-maps/builtin-support.tentative/data.sub.tentative.html": [ + "0377a788491cea37ee42ab4a00fba6a5d0df7d73", + "testharness" + ], + "import-maps/builtin-support.tentative/fallback-disallowed.sub.tentative.html": [ + "7efe90eb751d981012c7d382842001ba176a3b24", + "testharness" + ], + "import-maps/builtin-support.tentative/fallback.sub.tentative.html": [ + "45cf6dc1ced1dc34ef7df4ea477a4a85dbee45ee", + "testharness" + ], + "import-maps/builtin-support.tentative/http.sub.tentative.html": [ + "7689ae13bb5373201890794e7a51e72167e3317d", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/parsing-addresses.tentative.html": [ + "0cc92ce3e5e4be7c44abaa41c5d26046feabc049", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/parsing-schema.tentative.html": [ + "9e3bca2935bcf3f52fdfcb76eeb8339674f0db47", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/parsing-scope-keys.tentative.html": [ + "be23c645d0bf071818f96c01b330a5efcab69594", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/parsing-specifier-keys.tentative.html": [ + "7bc2d4799f1369750a8675f041c32f36f16c1e8f", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/resolving-builtins.tentative.html": [ + "065cfa30964da0ec2958b4e95634804b8994056b", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/resolving-not-yet-implemented.tentative.html": [ + "3bdd591fd0cba9f83c1bfb6a7e3274532efd2961", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/resolving-scopes.tentative.html": [ + "33b49352ccdc3658022559907db7ac5a098ea698", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/resolving.tentative.html": [ + "1d24eb2031e4097551d21df57f0c595957c695ee", + "testharness" + ], + "import-maps/builtin-support.tentative/imported/resources/helpers/parsing.js": [ + "daad6d26d220bb0241f8a413816bd100f3af580d", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-addresses.js": [ + "0f5fc73506b1222dd7b3ac422d8c6232ac202bd7", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-schema.js": [ + "695034533c7faa248a29436cfbe805f86506dc48", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-scope-keys.js": [ + "4993f3a9a8bac441b883be55b58d40423114beab", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/parsing-specifier-keys.js": [ + "9eb423a19eb1fb417526946c1701c7c9dde27c9c", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/resolving-builtins.js": [ + "a9383df843d44794351d5c6ffa5580d4d1254b9c", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/resolving-not-yet-implemented.js": [ + "93d782fdad83d58160061a4caa40659292a50866", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/resolving-scopes.js": [ + "ca19a66840601efe66fa2db24cffdcc0727681c5", + "support" + ], + "import-maps/builtin-support.tentative/imported/resources/resolving.js": [ + "29ee31ccbc936787894a43de1f6625608d14a192", + "support" + ], + "import-maps/builtin-support.tentative/static-import.js": [ + "1686fc123a798bddbf626f4d112516317739da8f", + "support" + ], + "import-maps/core/bare.sub.tentative.html": [ + "7fb769e09a2af432517522f91a2a101efc484ad8", + "testharness" + ], + "import-maps/core/bare/__dir__.headers": [ + "e7ec0d6699d07e5b13d0cb6f24c3639258fccdaa", + "support" + ], + "import-maps/core/bare/bare": [ + "1011e866b81dca7bf423fcb48266463c77591465", + "support" + ], + "import-maps/core/bare/cross-origin-bare": [ + "64851cc8e2455a4cd150b10edf051425bb6dc5bf", + "support" + ], + "import-maps/core/bare/to-bare": [ "bdb3791bc9471533434067b826dc59fef07e1c0c", "support" ], - "import-maps/bare/to-data": [ + "import-maps/core/bare/to-data": [ "6f25c5af12412dc6dbb374d4bee0fdd1472f475e", "support" ], - "import-maps/builtin-empty.tentative.html": [ - "aba28d18e043d53271888a382a7f7b4ca89a054a", + "import-maps/core/data.sub.tentative.html": [ + "25c18c45b7dc3e7311247fc945eb08a75185085f", "testharness" ], - "import-maps/builtin-import-scheme.tentative.html": [ - "6a27ef5aee2371b2114bc75b2b194c22a5fa85c2", + "import-maps/core/http.sub.tentative.html": [ + "a33a0945e316711a4338045f53ab71d91121c8f6", "testharness" ], - "import-maps/builtin.tentative.html": [ - "e85289e4d884d49bb4520154cecdd2826a07b333", + "import-maps/core/module-map-key.tentative.html": [ + "6f2f18a02e12a92530b7a3ae6bbbd31eecff3816", "testharness" ], + "import-maps/core/static-import.js": [ + "1686fc123a798bddbf626f4d112516317739da8f", + "support" + ], "import-maps/csp/applied-to-target-dynamic.sub.tentative.html": [ "cef80bfcda72956fe7acc59788d984370f25a62f", "testharness" @@ -658134,22 +659625,6 @@ "101c33cf84e9fb5e68cf8d5910f4ffbe7949e9d7", "testharness" ], - "import-maps/data.sub.tentative.html": [ - "634948942eea674ec923a4cb718cb92d5aab9021", - "testharness" - ], - "import-maps/fallback-disallowed.sub.tentative.html": [ - "280d02d847314f97bb88e02618aa46256e055f04", - "testharness" - ], - "import-maps/fallback.sub.tentative.html": [ - "3f4f2887da8208e8f65df41735e5b95e6bf59d4f", - "testharness" - ], - "import-maps/http.sub.tentative.html": [ - "bd24f3535507334a69bb98b711106466c8a340a3", - "testharness" - ], "import-maps/imported/parsing-addresses.tentative.html": [ "ddb3b724bb64e2edd60a620dc6ae1cc98f32a92a", "testharness" @@ -658166,14 +659641,6 @@ "dd547f01d1dfb2379f6afa893385fadc8f1217d1", "testharness" ], - "import-maps/imported/resolving-builtins.tentative.html": [ - "c1395c175c77455361e5ea51819ece56dd24737a", - "testharness" - ], - "import-maps/imported/resolving-not-yet-implemented.tentative.html": [ - "7db5f29f892976720a145499d6e40ccb8959b006", - "testharness" - ], "import-maps/imported/resolving-scopes.tentative.html": [ "4985249f4e2951965ad78321208ee08eca8617fa", "testharness" @@ -658183,51 +659650,39 @@ "testharness" ], "import-maps/imported/resources/helpers/parsing.js": [ - "5c22f6de710ea32753707273be5d63a285633860", + "daad6d26d220bb0241f8a413816bd100f3af580d", "support" ], "import-maps/imported/resources/parsing-addresses.js": [ - "0f5fc73506b1222dd7b3ac422d8c6232ac202bd7", + "92d7714ade9b965325372d58775bd990d3a1ce85", "support" ], "import-maps/imported/resources/parsing-schema.js": [ - "695034533c7faa248a29436cfbe805f86506dc48", + "f60422ae62bce21079cee8d6880cba0dc0dddaa5", "support" ], "import-maps/imported/resources/parsing-scope-keys.js": [ - "cd1d9b34890971dbb21f7bde5d34ed9f2cc91f20", + "4993f3a9a8bac441b883be55b58d40423114beab", "support" ], "import-maps/imported/resources/parsing-specifier-keys.js": [ - "9eb423a19eb1fb417526946c1701c7c9dde27c9c", - "support" - ], - "import-maps/imported/resources/resolving-builtins.js": [ - "a9383df843d44794351d5c6ffa5580d4d1254b9c", - "support" - ], - "import-maps/imported/resources/resolving-not-yet-implemented.js": [ - "93d782fdad83d58160061a4caa40659292a50866", + "7ac24bf867b06a6393fbd1ef8e9478d28b2d714d", "support" ], "import-maps/imported/resources/resolving-scopes.js": [ - "ca19a66840601efe66fa2db24cffdcc0727681c5", + "d133b50bd2b8d80ae6b08531e9ff8607e8ed16f6", "support" ], "import-maps/imported/resources/resolving.js": [ - "29ee31ccbc936787894a43de1f6625608d14a192", + "ef8a4f87d25e7fc6f11c3ee7ed6ef64497058d97", "support" ], - "import-maps/module-map-key.tentative.html": [ - "13bd122c673144f001048eacbaf4fc7bb78c9b58", - "testharness" - ], "import-maps/resources/empty.js": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", "support" ], "import-maps/resources/jest-test-helper.js": [ - "8d9236a84d81f838a50acefffca105b44eb5025f", + "8fa7b65adb5f77d0e5a6282305641c8268948cb4", "support" ], "import-maps/resources/log.js": [ @@ -658239,11 +659694,7 @@ "support" ], "import-maps/resources/test-helper.js": [ - "2447bfb94353e1ec193857cbcda79f46556216a1", - "support" - ], - "import-maps/static-import.js": [ - "1686fc123a798bddbf626f4d112516317739da8f", + "f21ad935baa5e1310e15232822902c86481bebc4", "support" ], "inert/frame/button.html": [ @@ -658394,8 +659845,12 @@ "f25f6e088fa06fbcd38b62929309e761b0060988", "testharness" ], + "infrastructure/metadata/infrastructure/assumptions/ahem.html.ini": [ + "8587775d8fc86891605a1509d3062a2c08f56a31", + "support" + ], "infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini": [ - "c9fbabede6d695cd3795e4390b35da0454ffcc34", + "c6f136d9715e86db9952dd6eac80b09b7782eed8", "support" ], "infrastructure/metadata/infrastructure/assumptions/document-fonts-ready.html.ini": [ @@ -658502,6 +659957,10 @@ "9ae71a6e73e22a855c69d3269936d71c17d6e9e5", "support" ], + "infrastructure/metadata/infrastructure/testdriver/actions/elementTiming.html.ini": [ + "fb4b51df66dfe434934f0f0110340e7e2d122f10", + "support" + ], "infrastructure/metadata/infrastructure/testdriver/actions/eventOrder.html.ini": [ "894f4a11df81be8e164898ab2091e1cc64175290", "support" @@ -658514,6 +659973,10 @@ "657d2a2492605557dcc62f02dca36364cf3007fd", "support" ], + "infrastructure/metadata/infrastructure/testdriver/bless.html.ini": [ + "d652b02787fb13e70fa5008a5b5f656dbacda8a3", + "support" + ], "infrastructure/metadata/infrastructure/testdriver/file_upload.sub.html.ini": [ "e2bfbf8fb8fb71003bd06a8356fec3a074395040", "support" @@ -658831,11 +660294,11 @@ "support" ], "interfaces/META.yml": [ - "6895a5fc5674a099909a481a46726c990804fc61", + "c1dd8dddf9eec3ab3fb58df01c549c251f3a3fdf", "support" ], "interfaces/README.md": [ - "f70ffd2e11e8ead7ccefed830331a1a5017a43e4", + "e0cdf0bc8fb16e32e3ea5465247756957ec1b73e", "support" ], "interfaces/SRI.idl": [ @@ -658966,6 +660429,10 @@ "f7cf3d31a114a653734990ef081ac109478dfcd8", "support" ], + "interfaces/css-shadow-parts.idl": [ + "66aaeba73a7a62280171ea1765915991b9da1ba3", + "support" + ], "interfaces/css-transitions.idl": [ "15ce4b30f211012b5fd9e6a713d92c0ea1045a54", "support" @@ -659215,7 +660682,7 @@ "support" ], "interfaces/reporting.idl": [ - "05d5a42458b5cd38c4a902b5a7066af524a396fc", + "f5370e8f1e656acf7409dbda907ee9672d5e8ed1", "support" ], "interfaces/requestidlecallback.idl": [ @@ -659275,7 +660742,7 @@ "support" ], "interfaces/trusted-types.tentative.idl": [ - "6ff45e7050c90feda36f99a422a243c01ff51156", + "be58b63b2c3d10e8a53ac2af7388e9a44f8fa3e6", "support" ], "interfaces/uievents.idl": [ @@ -659319,7 +660786,7 @@ "support" ], "interfaces/web-nfc.idl": [ - "4e0dc0725163e42455fb3418ed9757ddc1d8f632", + "5f0dd23a1cde61d4489e60ba82c48ccc74be67dd", "support" ], "interfaces/web-share.idl": [ @@ -659426,6 +660893,10 @@ "cae35095e8ec25b4fb6aa2ec4a2b55076fb7f269", "testharness" ], + "intersection-observer/document-scrolling-element-root.html": [ + "9996299312c996f3705af12e35c6eab088905047", + "testharness" + ], "intersection-observer/edge-inclusive-intersection.html": [ "b73c407a274bde4f4361c6b03bb1d214d86095cf", "testharness" @@ -659902,6 +661373,10 @@ "44d2a1a968083e8c91f61b33909ec115ea1b3a63", "testharness" ], + "largest-contentful-paint/first-paint-equals-lcp-text.html": [ + "a49a83f346d59f8c5e1a218891ecddc5a85ac5ea", + "testharness" + ], "largest-contentful-paint/idlharness.html": [ "273fef80ce2d855075781512a9a8ab0a736af420", "testharness" @@ -660067,7 +661542,7 @@ "testharness" ], "lint.whitelist": [ - "d9ea5c17c7cf66a47199faba54d4793e8236f6cb", + "afdc20b67b544ddc7a8ddee518e76f748e147def", "support" ], "loading/lazyload/common.js": [ @@ -673579,7 +675054,7 @@ "testharness" ], "pointerevents/pointerevent_setpointercapture_inactive_button_mouse.html": [ - "fa9a5fb3c5b8ae7df867159aab8fc3ad7a6c77e2", + "b9172dddb4c576eedeeec696af9576cb9a47e6a0", "testharness" ], "pointerevents/pointerevent_setpointercapture_invalid_pointerid.html": [ @@ -673830,6 +675305,34 @@ "d50520cd391a17bf175e9eb7a37ce7adc5be4c91", "support" ], + "portals/history/history-manipulation-inside-portal-with-subframes.html": [ + "8f69182f6467cbf504a5c5cb28bf9cc10ea0b1ba", + "testharness" + ], + "portals/history/history-manipulation-inside-portal.html": [ + "0fe88c4ea113d14f9800f69f49358ca4ff453ee3", + "testharness" + ], + "portals/history/resources/inner-iframe.html": [ + "5c6daa22a55b5c453355eb9fe3abcd549a8f36ac", + "support" + ], + "portals/history/resources/portal-harness.js": [ + "9761ac9268bce245cdf5335a613127874c0fd976", + "support" + ], + "portals/history/resources/portal-manipulate-history-with-subframes.sub.html": [ + "4b3e8cf2d923327f6a39ee46676bf4f2163350a3", + "support" + ], + "portals/history/resources/portal-manipulate-history.html": [ + "591fd2193c1ee7fc9080d0a775afa8870ab8f079", + "support" + ], + "portals/history/resources/run-test-in-portal.js": [ + "c982a1fac8ea4f96b0c7697ec5ec8c45fae44933", + "support" + ], "portals/htmlportalelement-event-handler-content-attributes.html": [ "8fc26386cfc9d30e89062440b9347c62b60aa592", "testharness" @@ -687107,7 +688610,7 @@ "support" ], "resource-timing/SyntheticResponse.py": [ - "26e0a8017d6c2c7b51c94998f34a79fa20eb1e12", + "c5158002f18a2af5c4d65a17c112547f3c3db508", "support" ], "resource-timing/TAO-case-insensitive-null-opaque-origin.sub.html": [ @@ -687622,6 +689125,10 @@ "c7f777a174a6a307c81fba3d6082fb152be99b1f", "testharness" ], + "resource-timing/sleep.py": [ + "2e803b1b262423e219be592fab548ada982bc439", + "support" + ], "resource-timing/status-codes-create-entry.html": [ "22e22c445b0812461ef06eb35ad6b611a3b6faa5", "testharness" @@ -690099,7 +691606,7 @@ "testharness" ], "service-workers/service-worker/fetch-waits-for-activate.https.html": [ - "889c5ec7bbb9367715118f78ae81a994856ad99f", + "7c888450f0d5f5fc72ec38909487877f38a1c024", "testharness" ], "service-workers/service-worker/getregistration.https.html": [ @@ -690995,7 +692502,7 @@ "support" ], "service-workers/service-worker/resources/fetch-waits-for-activate-worker.js": [ - "66f3e5936196d002f9e248677cfce7a211ded8a5", + "92a96ff88fb903748aebf6d6a0efaeb529c7ad39", "support" ], "service-workers/service-worker/resources/frame-for-getregistrations.html": [ @@ -692026,10 +693533,30 @@ "20456b057e1e724cdac9bc656f3b3d6c7ac2f658", "testharness" ], + "shadow-dom/focus/click-focus-delegatesFocus-click-method.html": [ + "92212cd85b86615db21192faa731799218a08d67", + "testharness" + ], + "shadow-dom/focus/click-focus-delegatesFocus-tabindex-varies.html": [ + "4051db128a915000bff162fefe4bed55eb338061", + "testharness" + ], + "shadow-dom/focus/click-focus-delegatesFocus-tabindex-zero.html": [ + "5f7914f2a4e31e107caa817de1b29720c9a21862", + "testharness" + ], + "shadow-dom/focus/focus-method-delegatesFocus.html": [ + "462542e3f7be18bc609b3e6d2c9d9e6ecde30a9f", + "testharness" + ], "shadow-dom/focus/focus-selector-delegatesFocus.html": [ "3702f8e2ba63228cba5c483a76f2b77372e68c4d", "testharness" ], + "shadow-dom/focus/focus-tabindex-order-shadow-negative-delegatesFocus.html": [ + "356b0bb329e27bf2706cbfeda66624adc277d43d", + "testharness" + ], "shadow-dom/focus/focus-tabindex-order-shadow-negative.html": [ "ab25ea829bd10952ad6e96898fc95a1a1ae25d8f", "testharness" @@ -692038,10 +693565,18 @@ "3c9e70867c5883e96f6288b85a9bac60b9526f4e", "testharness" ], + "shadow-dom/focus/focus-tabindex-order-shadow-varying-delegatesFocus.html": [ + "67899cff4a9d2e2acac622147c395720fb110f72", + "testharness" + ], "shadow-dom/focus/focus-tabindex-order-shadow-varying-tabindex.html": [ "875e5b6814a95754f5c01d18c125c39c363ad3c6", "testharness" ], + "shadow-dom/focus/focus-tabindex-order-shadow-zero-delegatesFocus.html": [ + "5e6ab3a90f8f12274c58620220e00e6bec09fc44", + "testharness" + ], "shadow-dom/focus/focus-tabindex-order-shadow-zero-host-negative.html": [ "b491c7d237c20604039f2b6482d484635c9f50da", "testharness" @@ -693182,7 +694717,7 @@ "a50c8bf1aeb4535ca18202274403ebe60ade5db7", "support" ], - "storage-access-api/idl.window.js": [ + "storage-access-api/idlharness.window.js": [ "a0b4c37d916a8ef66b2c09ad6afee5ec9f21e12f", "testharness" ], @@ -694355,7 +695890,7 @@ "testharness" ], "svg/animations/syncbase-remove-add-while-running.html": [ - "5b3ae94488f0a83f61cf1b4af4f6c9dc613552dc", + "61b9604a7b6751a156c48431b89fa2f3cd1af551", "testharness" ], "svg/coordinate-systems/abspos.html": [ @@ -698086,6 +699621,10 @@ "df64cc9ec3d387f26238b66b92c9f356f2f23e09", "testharness" ], + "svg/text/reftests/dominant-baseline-hanging-small-font-size.svg": [ + "aa27ec9c09484634330d04b3a1876640856f10f5", + "reftest" + ], "svg/text/reftests/text-clipped-offscreen-move-onscreen-ref.html": [ "b03ac22aaa3155323ea1574e49241368ec1ad66c", "support" @@ -698595,7 +700134,7 @@ "support" ], "tools/ci/azure/install_safari.yml": [ - "bfb6afc332b1b85d7c322e19066708f034e9ac77", + "2c4a25c83a494ad798e80664f417c53c3ec40ab8", "support" ], "tools/ci/azure/pip_install.yml": [ @@ -698655,7 +700194,7 @@ "support" ], "tools/ci/run_tc.py": [ - "956d1c353e54b2179316ad56ff85823bc5009ea6", + "60f175808715e2d8adf173c3145dc06b7bea64c2", "support" ], "tools/ci/taskcluster-run.py": [ @@ -703443,7 +704982,7 @@ "support" ], "tools/wpt/commands.json": [ - "178eda9c2656c393132792c2206489ee95a6a362", + "60fe1621af0decd0faa434f26dcba995154173e7", "support" ], "tools/wpt/create.py": [ @@ -703470,6 +705009,10 @@ "566083cb6be89a03e48cc5c1a0a88fc5ce53a853", "support" ], + "tools/wpt/revlist.py": [ + "f750311914ac13408cc082e58c36c2471e8f48be", + "support" + ], "tools/wpt/run.py": [ "de20e2916ad30244ef3635d1fce562cebbd26052", "support" @@ -703486,6 +705029,10 @@ "25b66e7d922f54edf197baaaf42c26c9fce04621", "support" ], + "tools/wpt/tests/test_revlist.py": [ + "7b13106d0f553727f6bdb32c47a6babf70d8f4a8", + "support" + ], "tools/wpt/tests/test_run.py": [ "ef58ec41b2b4cfc14955b701627d047af78f29bc", "support" @@ -703743,7 +705290,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/android_webview.py": [ - "dd45c0494b662a2b64709c32f4f45153bf3fc1f7", + "dc687b48ed7a9dde827334ae8b59096cc58d24d7", "support" ], "tools/wptrunner/wptrunner/browsers/base.py": [ @@ -703779,7 +705326,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/firefox.py": [ - "781d7e31c43c01c0a33328e1dc921f4f536d5296", + "6cf784fd01049a24ad6c8253179ad61d62073774", "support" ], "tools/wptrunner/wptrunner/browsers/firefox_android.py": [ @@ -703955,7 +705502,7 @@ "support" ], "tools/wptrunner/wptrunner/formatters/wptreport.py": [ - "d73911f6a94e922dc8dc6f1d7f746abbf1a04362", + "6d4401ae5aacf9db028f94e88bbfcc2be33726c3", "support" ], "tools/wptrunner/wptrunner/formatters/wptscreenshot.py": [ @@ -703975,7 +705522,7 @@ "support" ], "tools/wptrunner/wptrunner/metadata.py": [ - "15bbf94c33cea80ab4d0fdd958618f264fa57ab1", + "c328dcefa7253ddea952549c702723e98b4cadc4", "support" ], "tools/wptrunner/wptrunner/products.py": [ @@ -704059,7 +705606,7 @@ "support" ], "tools/wptrunner/wptrunner/tests/test_update.py": [ - "d453ae5b464d6a1570f03f99c8e9522a4fcdeeaa", + "5d900a3d6c9cd23696fe0d2b7c20d8ff5142b9e5", "support" ], "tools/wptrunner/wptrunner/tests/test_wpttest.py": [ @@ -704123,7 +705670,7 @@ "support" ], "tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py": [ - "43225a1e72861ee4ee3b8b6e1fb0594a17a0891d", + "aacd7857072f420a209aeeff559ec2ae294170ba", "support" ], "tools/wptrunner/wptrunner/wptmanifest/backends/static.py": [ @@ -704587,11 +706134,11 @@ "testharness" ], "trusted-types/Element-setAttribute.tentative.html": [ - "a284b2f83550b1b0e4cf7c79e7a200791ae8c70a", + "cd6617915bdd16343ff2499e09991fba50b444bc", "testharness" ], "trusted-types/Element-setAttributeNS.tentative.html": [ - "374e6a9cfa3c36a21daf7d8dd6d8111981fe192b", + "67e8236febd77ed3b544126d8c5f9dd37cc513ab", "testharness" ], "trusted-types/GlobalEventHandlers-onclick.tentative.html": [ @@ -704599,19 +706146,7 @@ "testharness" ], "trusted-types/HTMLElement-generic.tentative.html": [ - "d1fafa70cd2768e7b98b5eab6da9f5eb77175fbc", - "testharness" - ], - "trusted-types/Location-assign.tentative.html": [ - "62f98e96d7febe6c744b882f8d196d1686fe9166", - "testharness" - ], - "trusted-types/Location-href.tentative.html": [ - "bacadf6a91b1c0bc5c76293aab38f9d503cfa2b7", - "testharness" - ], - "trusted-types/Location-replace.tentative.html": [ - "4fb53d0260973ed5d714540a448909488b6e2465", + "3ec6cfa60da6d86e6be2e3ce68ae227441e6c5bb", "testharness" ], "trusted-types/META.yml": [ @@ -704639,7 +706174,7 @@ "testharness" ], "trusted-types/TrustedTypePolicy-createXXX.tentative.html": [ - "73ed8c72b23d5101f8e9e0f9867b1330aef0dc87", + "34fbf5587daf725222dd191fc941fffe2630e106", "testharness" ], "trusted-types/TrustedTypePolicy-name.tentative.html": [ @@ -704651,7 +706186,7 @@ "testharness" ], "trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html": [ - "05c7301af7172165a6594e56eadc413cc6900977", + "8608bcc24fed0fb050925bd52830db38082ae3b1", "testharness" ], "trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html": [ @@ -704675,25 +706210,21 @@ "testharness" ], "trusted-types/TrustedTypePolicyFactory-getPropertyType.tentative.html": [ - "f9ba8f2782209df2362c902d5666dbbf4bba34f8", + "0e5a0f51c80bf91c21b37bf02645c70b26ecf374", "testharness" ], "trusted-types/TrustedTypePolicyFactory-isXXX.tentative.html": [ - "efaac5d90d8f07f79f89aa72e633294a60487018", + "c620451ba8f797228fd20ea130aeff66d639cd73", "testharness" ], "trusted-types/TrustedTypePolicyFactory-metadata.tentative.html": [ - "70f77b1bb552c3e1f9069b8847a2231aa5b19d48", + "da7d1b4f87700e15420c7c849eaa683cd42c0e5d", "testharness" ], "trusted-types/Window-TrustedTypes.tentative.html": [ "c61d9207b65f430b08c6801a5ffc04d3d0efedd1", "testharness" ], - "trusted-types/Window-open.tentative.html": [ - "172d566e57fc635b551b5d355661db690869b220", - "testharness" - ], "trusted-types/WorkerGlobalScope-importScripts.https.html": [ "9dbfd7b93c97abda7beff52e2e9afebefe518f29", "testharness" @@ -704727,43 +706258,27 @@ "testharness" ], "trusted-types/block-string-assignment-to-Element-setAttribute.tentative.html": [ - "3cae5d29b445ec452d6832c062bf6ce59a54242f", + "1d6f3f6fe62afb4d76ecc4e3ea73c7d1136e9550", "testharness" ], "trusted-types/block-string-assignment-to-Element-setAttributeNS.tentative.html": [ - "76a639a622799dcb9769ad4781104d17be8439bc", + "5754521b2bd78ebf31c496961108386aff23650f", "testharness" ], "trusted-types/block-string-assignment-to-HTMLElement-generic.tentative.html": [ - "89d1216d27e2dcf27ad5faa941e224cc495e9363", - "testharness" - ], - "trusted-types/block-string-assignment-to-Location-assign.tentative.html": [ - "8e89d0d1a6044a354011ed904a621fc519e619ed", - "testharness" - ], - "trusted-types/block-string-assignment-to-Location-href.tentative.html": [ - "998ee21f3456a8a59692774d057bddba349ee15f", - "testharness" - ], - "trusted-types/block-string-assignment-to-Location-replace.tentative.html": [ - "e85bb646fc96f2eafbe2c1953633ebcd59212641", + "84ff83bc083ac473704d791f929df5ae6ba7f1f6", "testharness" ], "trusted-types/block-string-assignment-to-Range-createContextualFragment.tentative.html": [ "61553eb71dfcf4a49e580450602aabcc3e515282", "testharness" ], - "trusted-types/block-string-assignment-to-Window-open.tentative.html": [ - "e9c1c79050be5c0d28ea6927e9f8285da11b973d", - "testharness" - ], "trusted-types/block-text-node-insertion-into-script-element.tentative.html": [ "a6aa061f7307330e027c3e8b26e6b931cee2bb7c", "testharness" ], "trusted-types/default-policy-report-only.tentative.html": [ - "1a54fd6232917415338e3fac3f622f929a4432f8", + "ba23d7a3678e12419f077cd870e5e56fa701ad63", "testharness" ], "trusted-types/default-policy-report-only.tentative.html.headers": [ @@ -704771,7 +706286,7 @@ "support" ], "trusted-types/default-policy.tentative.html": [ - "672eccfb430b404f8d13e8fb3ec8ea8408d4a70c", + "955cdfaa4042119f04ad21622fdc804872613e0f", "testharness" ], "trusted-types/default-policy.tentative.html.headers": [ @@ -704783,7 +706298,7 @@ "testharness" ], "trusted-types/idlharness.window.js": [ - "4c1ee6e04a36971593eea7e89841d147a4febcd5", + "7be9615ce67ca1582c3b82ed849d7019a61e4cdd", "testharness" ], "trusted-types/support/WorkerGlobalScope-importScripts.https.js": [ @@ -704795,7 +706310,7 @@ "support" ], "trusted-types/support/helper.sub.js": [ - "d63ff54ad60d40045da5bbe864458688c0554dbc", + "d13ad567a726f39299a7e7f58aeffec4ba90a908", "support" ], "trusted-types/support/worker.js": [ @@ -704827,7 +706342,7 @@ "support" ], "trusted-types/trusted-types-report-only.tentative.https.html": [ - "1a17d529fd158db853af547c55de675bf71f194e", + "bf0a1eb9c1911e2fb25ed89dbd14e7dfd86cf358", "testharness" ], "trusted-types/trusted-types-report-only.tentative.https.html.headers": [ @@ -704843,7 +706358,7 @@ "support" ], "trusted-types/trusted-types-reporting.tentative.https.html": [ - "6a79fec07b6626c87a22a3b1c4e778a33c975e67", + "10a951fa12cb8d69249a96cb85ce34f6136e52c5", "testharness" ], "trusted-types/trusted-types-reporting.tentative.https.html.headers": [ @@ -709598,6 +711113,10 @@ "62f59a75db2e65b24807efff74321b9083e1604b", "testharness" ], + "wake-lock/wakelockpermissiondescriptor.https.html": [ + "673990f36f6b3e2bbf4024ef52d2f1cbde600cc9", + "testharness" + ], "wasm/META.yml": [ "3ea02ee7c9e41831aafbd37436f59b51244b142e", "support" @@ -710427,7 +711946,7 @@ "support" ], "web-nfc/NDEFMessage_constructor.https.html": [ - "19122112f59bbbbb15f4988e841ab7b18042c4e6", + "88c9ec4006e60c27a0c33f154a3f7f419f5ee2a3", "testharness" ], "web-nfc/NDEFRecord_constructor.https.html": [ @@ -710450,6 +711969,10 @@ "638d0c5a1d1b8d0e2e8e8422bd4b9e9488512e54", "testharness" ], + "web-nfc/NFCReader_scan_iframe.https.html": [ + "1f29fe4b41d9028a2381210b8b3d9ccba598b9b2", + "testharness" + ], "web-nfc/NFCReadingEvent_constructor.https.html": [ "20585176b7f89a129fad99f17d068b2deb828f68", "testharness" @@ -710459,7 +711982,7 @@ "manual" ], "web-nfc/NFCWriter_push.https.html": [ - "dda160f159a23223c0910d2393ecbc8c8e38aed1", + "6b4034fccc2987c0366ccdfd58dd394a5111709b", "testharness" ], "web-nfc/README.md": [ @@ -710478,6 +712001,10 @@ "ed5cc9c9718d01580460535ea14405c2817c0986", "support" ], + "web-nfc/resources/support-iframe.html": [ + "540eab108b19fe917272ad718445693abb989dbe", + "support" + ], "web-share/META.yml": [ "d2eccca6f424e93cc463fafc5a3b16e5a7ecc565", "support" @@ -711855,7 +713382,7 @@ "support" ], "webdriver/tests/element_click/bubbling.py": [ - "2b08be1f983787f69507176b650e64902577b72d", + "a069a5a5df3d7f2bd2851eb4f1a2f9aecdeed86c", "wdspec" ], "webdriver/tests/element_click/center_point.py": [ @@ -712727,7 +714254,7 @@ "testharness" ], "webgpu/cts.html": [ - "661060fcd7b32f7cecbbbc87499c7b70d1f39694", + "b60faec9623bb0adf7c1b9ad0e5d488ce14b5882", "testharness" ], "webgpu/framework/allowed_characters.js": [ @@ -712739,7 +714266,7 @@ "support" ], "webgpu/framework/fixture.js": [ - "d77ede708f0377feec5101d7272eaf27d07c5598", + "6e13385eef42d8af73b97a44a0945802483538c7", "support" ], "webgpu/framework/gpu/implementation.js": [ @@ -712763,7 +714290,7 @@ "support" ], "webgpu/framework/logger.js": [ - "8aa332c571a19f9db7a5486b9a8d28269101051e", + "d97be59091a1d9b5eadd93a105ba1023e730f8a1", "support" ], "webgpu/framework/params/combine.js": [ @@ -712787,11 +714314,11 @@ "support" ], "webgpu/framework/test_filter/filter_by_group.js": [ - "3036e21bd63c40b7d34f0f46dea432d505b131b1", + "e7cc5f78ba52a49eb021bf7cc9247448f2620f53", "support" ], "webgpu/framework/test_filter/filter_one_file.js": [ - "6a998db0de9c96f796bd05f90e73e60e0d141aee", + "7616bee6afeaec3fb6836f21fd318a4185d78c5a", "support" ], "webgpu/framework/test_filter/index.js": [ @@ -712807,27 +714334,35 @@ "support" ], "webgpu/framework/test_group.js": [ - "c9cafb37b670dd1cf79a46fbcb6acd595b3b53b7", + "09697765b8c7c715bac92536418cceb1ce632ef9", "support" ], "webgpu/framework/url_query.js": [ - "b265139043918b98e9937a6c216e3748a7c5cb87", + "f7c7cbc17fe5a908eb5b496a4a267274ebbc0030", + "support" + ], + "webgpu/framework/util/async_mutex.js": [ + "cb900605bcfe77bae785c207419787e317bf1d73", "support" ], "webgpu/framework/util/index.js": [ - "8d0fe0e5b48c6149bbf5c1f0aa8af2876fad00a3", + "32aea98dea7040379b5f2ccd74fdd57dd264f632", "support" ], "webgpu/framework/util/stack.js": [ "ae99ac904a132d947f304ca0f03f50b25fd197ae", "support" ], + "webgpu/framework/util/timeout.js": [ + "e565a518efc045cfc90e7dd7b23dc65604c6b805", + "support" + ], "webgpu/framework/version.js": [ - "9be025609f36ae16b7395de98c355f6872a9d660", + "0bfbfad4f3995d27200b1601ef8411f5b16c12ae", "support" ], "webgpu/runtime/wpt.js": [ - "d11499f1e8cd45553e2ae6832413e108790fe505", + "ec4ab0123924659e9cb23ba916c51d7ea6aa75cc", "support" ], "webgpu/suites/cts/buffers/create_mapped.spec.js": [ @@ -712855,39 +714390,119 @@ "support" ], "webgpu/suites/cts/command_buffer/basic.spec.js": [ - "137e428bd9db9311987662d6e5024c31f04742ca", + "c4333c794d2d75ca0b09991da9b40cd864b2bb91", "support" ], "webgpu/suites/cts/command_buffer/compute/basic.spec.js": [ - "56754d5f39e21f483f9f21e931e35a7dfa1e1259", + "a001cbc0d82dc1388e875254d1eddd505ffc01f4", "support" ], "webgpu/suites/cts/command_buffer/copies.spec.js": [ - "9bf78db8454bf848a6a1236db6503f893d33a225", + "0055a58d115303f0dfdd79422babfede04efd3c3", "support" ], "webgpu/suites/cts/command_buffer/render/basic.spec.js": [ - "83bb026d963d105e3e73ae118664d9951d246710", + "8f4d8c879da7b16f3fc162c697025c2fab4c6ff7", "support" ], "webgpu/suites/cts/command_buffer/render/rendering.spec.js": [ - "c8a7d7f5738b6efd199e96fadb937a64bd603d99", + "c065ed23be4f21d3368742e0760f07cea2c6f6ff", + "support" + ], + "webgpu/suites/cts/command_buffer/render/storeop.spec.js": [ + "da58ad2d8a571685134180199369244339d4a4a1", "support" ], "webgpu/suites/cts/examples.spec.js": [ - "ad86e73b191e74a8a23a81ccccf54cc2c95f3fa9", + "8a992a6239d78c1f45b2323d77690b8c5b4fab1f", "support" ], "webgpu/suites/cts/fences.spec.js": [ - "d9f8ce57678e9907f20a5819b2a43686e27ba53c", + "ccf513633daf307119ffcfc0eb3e81d27da3f9d3", "support" ], "webgpu/suites/cts/gpu_test.js": [ - "a67ce4ab0ba24f13c8a66dae551390c3d71d06ba", + "e437ee09449bae87f6b410c1643b8c23e628d703", "support" ], "webgpu/suites/cts/index.js": [ - "cb2a592697f9b1041e5a2f71cf59939b5a04ed4a", + "b38ea11df28f63c6374d9b58df5c276d636b7b8d", + "support" + ], + "webgpu/suites/cts/validation/createBindGroup.spec.js": [ + "24d29d0e61e653c34ebde4a35bb01717ee23ab9e", + "support" + ], + "webgpu/suites/cts/validation/createBindGroupLayout.spec.js": [ + "8e3bfc22572c6e8bbeab51c98520f1cfbb3633b2", + "support" + ], + "webgpu/suites/cts/validation/createPipelineLayout.spec.js": [ + "dc759750a986630dc87ea5136afffb4b3b5bd396", + "support" + ], + "webgpu/suites/cts/validation/createRenderPipeline.spec.js": [ + "7cbe93dd9c958cc8331316a522846d126be89556", + "support" + ], + "webgpu/suites/cts/validation/createTexture.spec.js": [ + "c99204b9667fbfa53d743eff285a4090abe70b07", + "support" + ], + "webgpu/suites/cts/validation/createView.spec.js": [ + "2330c6ecdd91abedde02e88391921586cfd40dec", + "support" + ], + "webgpu/suites/cts/validation/error_scope.spec.js": [ + "2232db9b54e48426abf18f0d3c91f3c8901437de", + "support" + ], + "webgpu/suites/cts/validation/fences.spec.js": [ + "4aca3d7773afff6a801a705ca36fe675ee429588", + "support" + ], + "webgpu/suites/cts/validation/queue_submit.spec.js": [ + "50d912f4d6f2a3d53e072fae9b9930616e7ed1a7", + "support" + ], + "webgpu/suites/cts/validation/render_pass.spec.js": [ + "f71a4a2b97420ab76ead6cadf29c31e3d440ce1a", + "support" + ], + "webgpu/suites/cts/validation/render_pass_descriptor.spec.js": [ + "5a171879082762b039c1f21d18f7066b5c193078", + "support" + ], + "webgpu/suites/cts/validation/setBindGroup.spec.js": [ + "c669ea08d586b4911a74336314c72437aa2abec3", + "support" + ], + "webgpu/suites/cts/validation/setBlendColor.spec.js": [ + "a04bcd038ee5f0f957772bb52a63563b400fa502", + "support" + ], + "webgpu/suites/cts/validation/setScissorRect.spec.js": [ + "ee1588d2a885bd2d0fc386737b3e37a5fc91dd7d", + "support" + ], + "webgpu/suites/cts/validation/setStencilReference.spec.js": [ + "3db37a4908e719212043856b9bdf5e3b31a91065", + "support" + ], + "webgpu/suites/cts/validation/setVertexBuffer.spec.js": [ + "949dd91932d8d4e6b498f578e11d5c7c3fb019df", + "support" + ], + "webgpu/suites/cts/validation/setViewport.spec.js": [ + "5610930829e58862955ec7ba26e17d96ca5cb253", + "support" + ], + "webgpu/suites/cts/validation/validation_test.js": [ + "35ad5d895521f1207ab21be1de5af3a0d672cc4f", + "support" + ], + "webgpu/suites/cts/validation/vertex_input.spec.js": [ + "432a04a4ceef0e895e0bc881bf6d4f2ec7f91034", "support" ], "webmessaging/Channel_postMessage_Blob.htm": [ @@ -718518,8 +720133,12 @@ "107cc9b544e3a395c14655d0f4356485f05d7bf5", "testharness" ], - "webxr/events_referenceSpace_reset.https.html": [ - "3a931168fd328b9fb62f5ecd65958f4365b7aa03", + "webxr/events_referenceSpace_reset_immersive.https.html": [ + "2da3788a39a20db3396d542f7fb0dc5d486c2aa3", + "testharness" + ], + "webxr/events_referenceSpace_reset_inline.https.html": [ + "b3abcc817bdf3e53c22284a14d03e31e1184e1a3", "testharness" ], "webxr/events_session_select.https.html": [ diff --git a/tests/wpt/metadata/css/CSS2/linebox/inline-negative-margin-001.html.ini b/tests/wpt/metadata/css/CSS2/linebox/inline-negative-margin-001.html.ini index 35f64aeb424..94a3570d26b 100644 --- a/tests/wpt/metadata/css/CSS2/linebox/inline-negative-margin-001.html.ini +++ b/tests/wpt/metadata/css/CSS2/linebox/inline-negative-margin-001.html.ini @@ -2,12 +2,12 @@ [#container 1] expected: FAIL - [[data-expected-height\] 1] - expected: FAIL - - [[data-expected-height\] 2] - expected: FAIL - [[data-expected-height\] 7] expected: FAIL + [[data-expected-height\] 3] + expected: FAIL + + [[data-expected-height\] 4] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/white-space/eol-spaces-bidi-001.html.ini b/tests/wpt/metadata/css/css-text/white-space/eol-spaces-bidi-001.html.ini new file mode 100644 index 00000000000..eafc8f6012c --- /dev/null +++ b/tests/wpt/metadata/css/css-text/white-space/eol-spaces-bidi-001.html.ini @@ -0,0 +1,2 @@ +[eol-spaces-bidi-001.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini index e953c8679d0..668c3f52a5b 100644 --- a/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini +++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini @@ -2,3 +2,15 @@ [
  • Outside 1
  • ] expected: FAIL + [
  • Image Outside 2
  • ] + expected: FAIL + + [
  • Outside 2
  • ] + expected: FAIL + + [
  • Image Outside 1
  • ] + expected: FAIL + + [
  • Outside 3
  • ] + expected: FAIL + diff --git a/tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini b/tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini new file mode 100644 index 00000000000..e6e1f29e274 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/matchMedia-display-none-iframe.html.ini @@ -0,0 +1,2 @@ +[matchMedia-display-none-iframe.html] + expected: ERROR diff --git a/tests/wpt/metadata/css/cssom-view/matchMediaAddListener-handleEvent.html.ini b/tests/wpt/metadata/css/cssom-view/matchMediaAddListener-handleEvent.html.ini index 176c9ea4568..e797a8fe6de 100644 --- a/tests/wpt/metadata/css/cssom-view/matchMediaAddListener-handleEvent.html.ini +++ b/tests/wpt/metadata/css/cssom-view/matchMediaAddListener-handleEvent.html.ini @@ -8,3 +8,6 @@ [throws if handleEvent is thruthy and not callable] expected: FAIL + [doesn't look up handleEvent method on callable event listeners] + expected: FAIL + diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index fa33468f5ab..fa48a708082 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -324,9 +324,9 @@ [ + + +
    + + +
    + + diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-3.html b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-3.html new file mode 100644 index 00000000000..1bad23260d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit-3.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + +
    + + +
    + + diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit.html b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit.html new file mode 100644 index 00000000000..1102e304174 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/form-double-submit.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + +
    + + +
    + + diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js index 1d94de8a7c9..ba7278ef18a 100644 --- a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/aborted-parser.window.js @@ -1,28 +1,31 @@ -// document.open() bails out early if there is an **active parser** with -// non-zero script nesting level. window.stop() aborts the current parser and -// makes it no longer active, and should allow document.open() to work. -// For more details, see https://bugzilla.mozilla.org/show_bug.cgi?id=1475000. +// document.open() bails out early if there is an active parser with non-zero +// script nesting level or if a load was aborted while there was an active +// parser. window.stop() aborts the current parser, so once it has been called +// while a parser is active, document.open() will no longer do anything to that +// document, window.handlers = {}; async_test(t => { const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); frame.src = "resources/aborted-parser-frame.html"; window.handlers.afterOpen = t.step_func_done(() => { const openCalled = frame.contentDocument.childNodes.length === 0; - frame.remove(); - assert_true(openCalled, "child document should be empty"); + assert_false(openCalled, "child document should not be empty"); + assert_equals(frame.contentDocument.querySelector("p").textContent, + "Text", "Should still have our paragraph"); }); }, "document.open() after parser is aborted"); -// Note: This test should pass even if window.close() is not there, as -// document.open() is not executed synchronously in an inline script. async_test(t => { const frame = document.body.appendChild(document.createElement("iframe")); + t.add_cleanup(() => frame.remove()); frame.src = "resources/aborted-parser-async-frame.html"; window.handlers.afterOpenAsync = t.step_func_done(() => { const openCalled = frame.contentDocument.childNodes.length === 0; - frame.remove(); - assert_true(openCalled, "child document should be empty"); + assert_false(openCalled, "child document should not be empty"); + assert_equals(frame.contentDocument.querySelector("p").textContent, + "Text", "Should still have our paragraph"); }); }, "async document.open() after parser is aborted"); diff --git a/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html new file mode 100644 index 00000000000..a3bdd86ee6e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/disallow-crossorigin.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/disallow-crossorigin.html index 627a2f3e5a7..d61618a53ef 100644 --- a/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/disallow-crossorigin.html +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/disallow-crossorigin.html @@ -10,21 +10,83 @@ - + - + - + - + - + - + - + - + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-schema.tentative.html b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-schema.tentative.html new file mode 100644 index 00000000000..9e3bca2935b --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-schema.tentative.html @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-scope-keys.tentative.html b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-scope-keys.tentative.html new file mode 100644 index 00000000000..be23c645d0b --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-scope-keys.tentative.html @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-specifier-keys.tentative.html b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-specifier-keys.tentative.html new file mode 100644 index 00000000000..7bc2d4799f1 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/parsing-specifier-keys.tentative.html @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resolving-builtins.tentative.html b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resolving-builtins.tentative.html similarity index 86% rename from tests/wpt/web-platform-tests/import-maps/imported/resolving-builtins.tentative.html rename to tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resolving-builtins.tentative.html index c1395c175c7..065cfa30964 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resolving-builtins.tentative.html +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resolving-builtins.tentative.html @@ -2,7 +2,7 @@ - + + diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resolving.tentative.html b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resolving.tentative.html new file mode 100644 index 00000000000..1d24eb2031e --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resolving.tentative.html @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/helpers/parsing.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/helpers/parsing.js new file mode 100644 index 00000000000..daad6d26d22 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/helpers/parsing.js @@ -0,0 +1,44 @@ +'use strict'; +const { parseFromString } = require('../../lib/parser.js'); + +// Local modifications from upstream: +// Currently warnings and scopes are not checked in expectSpecifierMap(). +exports.expectSpecifierMap = (input, baseURL, output, warnings = []) => { + expect(parseFromString(`{ "imports": ${input} }`, baseURL)) + .toEqual({ imports: output, scopes: {} }); +}; + +exports.expectScopes = (inputArray, baseURL, outputArray, warnings = []) => { + const checkWarnings = testWarningHandler(warnings); + + const inputScopesAsStrings = inputArray.map(scopePrefix => `${JSON.stringify(scopePrefix)}: {}`); + const inputString = `{ "scopes": { ${inputScopesAsStrings.join(', ')} } }`; + + const outputScopesObject = {}; + for (const outputScopePrefix of outputArray) { + outputScopesObject[outputScopePrefix] = {}; + } + + expect(parseFromString(inputString, baseURL)).toEqual({ imports: {}, scopes: outputScopesObject }); + + checkWarnings(); +}; + +exports.expectBad = (input, baseURL, warnings = []) => { + const checkWarnings = testWarningHandler(warnings); + expect(() => parseFromString(input, baseURL)).toThrow(TypeError); + checkWarnings(); +}; + +exports.expectWarnings = (input, baseURL, output, warnings = []) => { + const checkWarnings = testWarningHandler(warnings); + expect(parseFromString(input, baseURL)).toEqual(output); + + checkWarnings(); +}; + +function testWarningHandler(expectedWarnings) { + // We don't check warnings on WPT tests, because there are no + // ways to catch console warnings from JavaScript. + return () => {}; +} diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-addresses.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-addresses.js new file mode 100644 index 00000000000..0f5fc73506b --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-addresses.js @@ -0,0 +1,351 @@ +'use strict'; +const { expectSpecifierMap } = require('./helpers/parsing.js'); +const { BUILT_IN_MODULE_SCHEME } = require('../lib/utils.js'); + +describe('Relative URL-like addresses', () => { + it('should accept strings prefixed with ./, ../, or /', () => { + expectSpecifierMap( + `{ + "dotSlash": "./foo", + "dotDotSlash": "../foo", + "slash": "/foo" + }`, + 'https://base.example/path1/path2/path3', + { + dotSlash: [expect.toMatchURL('https://base.example/path1/path2/foo')], + dotDotSlash: [expect.toMatchURL('https://base.example/path1/foo')], + slash: [expect.toMatchURL('https://base.example/foo')] + } + ); + }); + + it('should not accept strings prefixed with ./, ../, or / for data: base URLs', () => { + expectSpecifierMap( + `{ + "dotSlash": "./foo", + "dotDotSlash": "../foo", + "slash": "/foo" + }`, + 'data:text/html,test', + { + dotSlash: [], + dotDotSlash: [], + slash: [] + }, + [ + `Invalid address "./foo" for the specifier key "dotSlash".`, + `Invalid address "../foo" for the specifier key "dotDotSlash".`, + `Invalid address "/foo" for the specifier key "slash".` + ] + ); + }); + + it('should accept the literal strings ./, ../, or / with no suffix', () => { + expectSpecifierMap( + `{ + "dotSlash": "./", + "dotDotSlash": "../", + "slash": "/" + }`, + 'https://base.example/path1/path2/path3', + { + dotSlash: [expect.toMatchURL('https://base.example/path1/path2/')], + dotDotSlash: [expect.toMatchURL('https://base.example/path1/')], + slash: [expect.toMatchURL('https://base.example/')] + } + ); + }); + + it('should ignore percent-encoded variants of ./, ../, or /', () => { + expectSpecifierMap( + `{ + "dotSlash1": "%2E/", + "dotDotSlash1": "%2E%2E/", + "dotSlash2": ".%2F", + "dotDotSlash2": "..%2F", + "slash2": "%2F", + "dotSlash3": "%2E%2F", + "dotDotSlash3": "%2E%2E%2F" + }`, + 'https://base.example/path1/path2/path3', + { + dotSlash1: [], + dotDotSlash1: [], + dotSlash2: [], + dotDotSlash2: [], + slash2: [], + dotSlash3: [], + dotDotSlash3: [] + }, + [ + `Invalid address "%2E/" for the specifier key "dotSlash1".`, + `Invalid address "%2E%2E/" for the specifier key "dotDotSlash1".`, + `Invalid address ".%2F" for the specifier key "dotSlash2".`, + `Invalid address "..%2F" for the specifier key "dotDotSlash2".`, + `Invalid address "%2F" for the specifier key "slash2".`, + `Invalid address "%2E%2F" for the specifier key "dotSlash3".`, + `Invalid address "%2E%2E%2F" for the specifier key "dotDotSlash3".` + ] + ); + }); +}); + +describe('Built-in module addresses', () => { + it('should accept URLs using the built-in module scheme', () => { + expectSpecifierMap( + `{ + "foo": "${BUILT_IN_MODULE_SCHEME}:foo" + }`, + 'https://base.example/path1/path2/path3', + { + foo: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo`)] + } + ); + }); + + it('should ignore percent-encoded variants of the built-in module scheme', () => { + expectSpecifierMap( + `{ + "foo": "${encodeURIComponent(BUILT_IN_MODULE_SCHEME + ':')}foo" + }`, + 'https://base.example/path1/path2/path3', + { + foo: [] + }, + [`Invalid address "${encodeURIComponent(BUILT_IN_MODULE_SCHEME + ':')}foo" for the specifier key "foo".`] + ); + }); + + it('should allow built-in module URLs that contain "/" or "\\"', () => { + expectSpecifierMap( + `{ + "slashEnd": "${BUILT_IN_MODULE_SCHEME}:foo/", + "slashMiddle": "${BUILT_IN_MODULE_SCHEME}:foo/bar", + "backslash": "${BUILT_IN_MODULE_SCHEME}:foo\\\\baz" + }`, + 'https://base.example/path1/path2/path3', + { + slashEnd: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo/`)], + slashMiddle: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo/bar`)], + backslash: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo\\baz`)] + } + ); + }); +}); + +describe('Absolute URL addresses', () => { + it('should only accept absolute URL addresses with fetch schemes', () => { + expectSpecifierMap( + `{ + "about": "about:good", + "blob": "blob:good", + "data": "data:good", + "file": "file:///good", + "filesystem": "filesystem:good", + "http": "http://good/", + "https": "https://good/", + "ftp": "ftp://good/", + "import": "import:bad", + "mailto": "mailto:bad", + "javascript": "javascript:bad", + "wss": "wss:bad" + }`, + 'https://base.example/path1/path2/path3', + { + about: [expect.toMatchURL('about:good')], + blob: [expect.toMatchURL('blob:good')], + data: [expect.toMatchURL('data:good')], + file: [expect.toMatchURL('file:///good')], + filesystem: [expect.toMatchURL('filesystem:good')], + http: [expect.toMatchURL('http://good/')], + https: [expect.toMatchURL('https://good/')], + ftp: [expect.toMatchURL('ftp://good/')], + import: [], + mailto: [], + javascript: [], + wss: [] + }, + [ + `Invalid address "import:bad" for the specifier key "import".`, + `Invalid address "mailto:bad" for the specifier key "mailto".`, + `Invalid address "javascript:bad" for the specifier key "javascript".`, + `Invalid address "wss:bad" for the specifier key "wss".` + ] + ); + }); + + it('should only accept absolute URL addresses with fetch schemes inside arrays', () => { + expectSpecifierMap( + `{ + "about": ["about:good"], + "blob": ["blob:good"], + "data": ["data:good"], + "file": ["file:///good"], + "filesystem": ["filesystem:good"], + "http": ["http://good/"], + "https": ["https://good/"], + "ftp": ["ftp://good/"], + "import": ["import:bad"], + "mailto": ["mailto:bad"], + "javascript": ["javascript:bad"], + "wss": ["wss:bad"] + }`, + 'https://base.example/path1/path2/path3', + { + about: [expect.toMatchURL('about:good')], + blob: [expect.toMatchURL('blob:good')], + data: [expect.toMatchURL('data:good')], + file: [expect.toMatchURL('file:///good')], + filesystem: [expect.toMatchURL('filesystem:good')], + http: [expect.toMatchURL('http://good/')], + https: [expect.toMatchURL('https://good/')], + ftp: [expect.toMatchURL('ftp://good/')], + import: [], + mailto: [], + javascript: [], + wss: [] + }, + [ + `Invalid address "import:bad" for the specifier key "import".`, + `Invalid address "mailto:bad" for the specifier key "mailto".`, + `Invalid address "javascript:bad" for the specifier key "javascript".`, + `Invalid address "wss:bad" for the specifier key "wss".` + ] + ); + }); + + it('should parse absolute URLs, ignoring unparseable ones', () => { + expectSpecifierMap( + `{ + "unparseable1": "https://ex ample.org/", + "unparseable2": "https://example.com:demo", + "unparseable3": "http://[www.example.com]/", + "invalidButParseable1": "https:example.org", + "invalidButParseable2": "https://///example.com///", + "prettyNormal": "https://example.net", + "percentDecoding": "https://ex%41mple.com/", + "noPercentDecoding": "https://example.com/%41" + }`, + 'https://base.example/path1/path2/path3', + { + unparseable1: [], + unparseable2: [], + unparseable3: [], + invalidButParseable1: [expect.toMatchURL('https://example.org/')], + invalidButParseable2: [expect.toMatchURL('https://example.com///')], + prettyNormal: [expect.toMatchURL('https://example.net/')], + percentDecoding: [expect.toMatchURL('https://example.com/')], + noPercentDecoding: [expect.toMatchURL('https://example.com/%41')] + }, + [ + `Invalid address "https://ex ample.org/" for the specifier key "unparseable1".`, + `Invalid address "https://example.com:demo" for the specifier key "unparseable2".`, + `Invalid address "http://[www.example.com]/" for the specifier key "unparseable3".` + ] + ); + }); + + it('should parse absolute URLs, ignoring unparseable ones inside arrays', () => { + expectSpecifierMap( + `{ + "unparseable1": ["https://ex ample.org/"], + "unparseable2": ["https://example.com:demo"], + "unparseable3": ["http://[www.example.com]/"], + "invalidButParseable1": ["https:example.org"], + "invalidButParseable2": ["https://///example.com///"], + "prettyNormal": ["https://example.net"], + "percentDecoding": ["https://ex%41mple.com/"], + "noPercentDecoding": ["https://example.com/%41"] + }`, + 'https://base.example/path1/path2/path3', + { + unparseable1: [], + unparseable2: [], + unparseable3: [], + invalidButParseable1: [expect.toMatchURL('https://example.org/')], + invalidButParseable2: [expect.toMatchURL('https://example.com///')], + prettyNormal: [expect.toMatchURL('https://example.net/')], + percentDecoding: [expect.toMatchURL('https://example.com/')], + noPercentDecoding: [expect.toMatchURL('https://example.com/%41')] + }, + [ + `Invalid address "https://ex ample.org/" for the specifier key "unparseable1".`, + `Invalid address "https://example.com:demo" for the specifier key "unparseable2".`, + `Invalid address "http://[www.example.com]/" for the specifier key "unparseable3".` + ] + ); + }); +}); + +describe('Failing addresses: mismatched trailing slashes', () => { + it('should warn for the simple case', () => { + expectSpecifierMap( + `{ + "trailer/": "/notrailer", + "${BUILT_IN_MODULE_SCHEME}:trailer/": "/bim-notrailer" + }`, + 'https://base.example/path1/path2/path3', + { + 'trailer/': [], + [`${BUILT_IN_MODULE_SCHEME}:trailer/`]: [] + }, + [ + `Invalid address "https://base.example/notrailer" for package specifier key "trailer/". Package addresses must end with "/".`, + `Invalid address "https://base.example/bim-notrailer" for package specifier key "${BUILT_IN_MODULE_SCHEME}:trailer/". Package addresses must end with "/".` + ] + ); + }); + + it('should warn for a mismatch alone in an array', () => { + expectSpecifierMap( + `{ + "trailer/": ["/notrailer"], + "${BUILT_IN_MODULE_SCHEME}:trailer/": ["/bim-notrailer"] + }`, + 'https://base.example/path1/path2/path3', + { + 'trailer/': [], + [`${BUILT_IN_MODULE_SCHEME}:trailer/`]: [] + }, + [ + `Invalid address "https://base.example/notrailer" for package specifier key "trailer/". Package addresses must end with "/".`, + `Invalid address "https://base.example/bim-notrailer" for package specifier key "${BUILT_IN_MODULE_SCHEME}:trailer/". Package addresses must end with "/".` + ] + ); + }); + + it('should warn for a mismatch alongside non-mismatches in an array', () => { + expectSpecifierMap( + `{ + "trailer/": ["/atrailer/", "/notrailer"], + "${BUILT_IN_MODULE_SCHEME}:trailer/": ["/bim-atrailer/", "/bim-notrailer"] + }`, + 'https://base.example/path1/path2/path3', + { + 'trailer/': [expect.toMatchURL('https://base.example/atrailer/')], + [`${BUILT_IN_MODULE_SCHEME}:trailer/`]: [expect.toMatchURL('https://base.example/bim-atrailer/')] + }, + [ + `Invalid address "https://base.example/notrailer" for package specifier key "trailer/". Package addresses must end with "/".`, + `Invalid address "https://base.example/bim-notrailer" for package specifier key "${BUILT_IN_MODULE_SCHEME}:trailer/". Package addresses must end with "/".` + ] + ); + }); +}); + +describe('Other invalid addresses', () => { + it('should ignore unprefixed strings that are not absolute URLs', () => { + for (const bad of ['bar', '\\bar', '~bar', '#bar', '?bar']) { + expectSpecifierMap( + `{ + "foo": ${JSON.stringify(bad)} + }`, + 'https://base.example/path1/path2/path3', + { + foo: [] + }, + [`Invalid address "${bad}" for the specifier key "foo".`] + ); + } + }); +}); diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-schema.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-schema.js new file mode 100644 index 00000000000..695034533c7 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-schema.js @@ -0,0 +1,139 @@ +'use strict'; +const { parseFromString } = require('../lib/parser.js'); +const { expectBad, expectWarnings, expectSpecifierMap } = require('./helpers/parsing.js'); + +const nonObjectStrings = ['null', 'true', '1', '"foo"', '[]']; + +test('Invalid JSON', () => { + expect(() => parseFromString('{ imports: {} }', 'https://base.example/')).toThrow(SyntaxError); +}); + +describe('Mismatching the top-level schema', () => { + it('should throw for top-level non-objects', () => { + for (const nonObject of nonObjectStrings) { + expectBad(nonObject, 'https://base.example/'); + } + }); + + it('should throw if imports is a non-object', () => { + for (const nonObject of nonObjectStrings) { + expectBad(`{ "imports": ${nonObject} }`, 'https://base.example/'); + } + }); + + it('should throw if scopes is a non-object', () => { + for (const nonObject of nonObjectStrings) { + expectBad(`{ "scopes": ${nonObject} }`, 'https://base.example/'); + } + }); + + it('should ignore unspecified top-level entries', () => { + expectWarnings( + `{ + "imports": {}, + "new-feature": {}, + "scops": {} + }`, + 'https://base.example/', + { imports: {}, scopes: {} }, + [ + `Invalid top-level key "new-feature". Only "imports" and "scopes" can be present.`, + `Invalid top-level key "scops". Only "imports" and "scopes" can be present.` + ] + ); + }); +}); + +describe('Mismatching the specifier map schema', () => { + const invalidAddressStrings = ['true', '1', '{}']; + const invalidInsideArrayStrings = ['null', 'true', '1', '{}', '[]']; + + it('should ignore entries where the address is not a string, array, or null', () => { + for (const invalid of invalidAddressStrings) { + expectSpecifierMap( + `{ + "foo": ${invalid}, + "bar": ["https://example.com/"] + }`, + 'https://base.example/', + { + bar: [expect.toMatchURL('https://example.com/')] + }, + [ + `Invalid address ${invalid} for the specifier key "foo". ` + + `Addresses must be strings, arrays, or null.` + ] + ); + } + }); + + it('should ignore entries where the specifier key is an empty string', () => { + expectSpecifierMap( + `{ + "": ["https://example.com/"] + }`, + 'https://base.example/', + {}, + [`Invalid empty string specifier key.`] + ); + }); + + it('should ignore members of an address array that are not strings', () => { + for (const invalid of invalidInsideArrayStrings) { + expectSpecifierMap( + `{ + "foo": ["https://example.com/", ${invalid}], + "bar": ["https://example.com/"] + }`, + 'https://base.example/', + { + foo: [expect.toMatchURL('https://example.com/')], + bar: [expect.toMatchURL('https://example.com/')] + }, + [ + `Invalid address ${invalid} inside the address array for the specifier key "foo". ` + + `Address arrays must only contain strings.` + ] + ); + } + }); + + it('should throw if a scope\'s value is not an object', () => { + for (const invalid of nonObjectStrings) { + expectBad(`{ "scopes": { "https://scope.example/": ${invalid} } }`, 'https://base.example/'); + } + }); +}); + +describe('Normalization', () => { + it('should normalize empty import maps to have imports and scopes keys', () => { + expect(parseFromString(`{}`, 'https://base.example/')) + .toEqual({ imports: {}, scopes: {} }); + }); + + it('should normalize an import map without imports to have imports', () => { + expect(parseFromString(`{ "scopes": {} }`, 'https://base.example/')) + .toEqual({ imports: {}, scopes: {} }); + }); + + it('should normalize an import map without scopes to have scopes', () => { + expect(parseFromString(`{ "imports": {} }`, 'https://base.example/')) + .toEqual({ imports: {}, scopes: {} }); + }); + + it('should normalize addresses to arrays', () => { + expectSpecifierMap( + `{ + "foo": "https://example.com/1", + "bar": ["https://example.com/2"], + "baz": null + }`, + 'https://base.example/', + { + foo: [expect.toMatchURL('https://example.com/1')], + bar: [expect.toMatchURL('https://example.com/2')], + baz: [] + } + ); + }); +}); diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-scope-keys.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-scope-keys.js new file mode 100644 index 00000000000..4993f3a9a8b --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-scope-keys.js @@ -0,0 +1,144 @@ +'use strict'; +const { expectScopes } = require('./helpers/parsing.js'); + +describe('Relative URL scope keys', () => { + it('should work with no prefix', () => { + expectScopes( + ['foo'], + 'https://base.example/path1/path2/path3', + ['https://base.example/path1/path2/foo'] + ); + }); + + it('should work with ./, ../, and / prefixes', () => { + expectScopes( + ['./foo', '../foo', '/foo'], + 'https://base.example/path1/path2/path3', + [ + 'https://base.example/path1/path2/foo', + 'https://base.example/path1/foo', + 'https://base.example/foo' + ] + ); + }); + + it('should work with /s, ?s, and #s', () => { + expectScopes( + ['foo/bar?baz#qux'], + 'https://base.example/path1/path2/path3', + ['https://base.example/path1/path2/foo/bar?baz#qux'] + ); + }); + + it('should work with an empty string scope key', () => { + expectScopes( + [''], + 'https://base.example/path1/path2/path3', + ['https://base.example/path1/path2/path3'] + ); + }); + + it('should work with / suffixes', () => { + expectScopes( + ['foo/', './foo/', '../foo/', '/foo/', '/foo//'], + 'https://base.example/path1/path2/path3', + [ + 'https://base.example/path1/path2/foo/', + 'https://base.example/path1/path2/foo/', + 'https://base.example/path1/foo/', + 'https://base.example/foo/', + 'https://base.example/foo//' + ] + ); + }); + + it('should deduplicate based on URL parsing rules', () => { + expectScopes( + ['foo/\\', 'foo//', 'foo\\\\'], + 'https://base.example/path1/path2/path3', + ['https://base.example/path1/path2/foo//'] + ); + }); +}); + +describe('Absolute URL scope keys', () => { + it('should accept all absolute URL scope keys, with or without fetch schemes', () => { + expectScopes( + [ + 'about:good', + 'blob:good', + 'data:good', + 'file:///good', + 'filesystem:http://example.com/good/', + 'http://good/', + 'https://good/', + 'ftp://good/', + 'import:bad', + 'mailto:bad', + 'javascript:bad', + 'wss:ba' + ], + 'https://base.example/path1/path2/path3', + [ + 'about:good', + 'blob:good', + 'data:good', + 'file:///good', + 'filesystem:http://example.com/good/', + 'http://good/', + 'https://good/', + 'ftp://good/', + 'import:bad', + 'mailto:bad', + 'javascript:bad', + 'wss://ba/' + ], + [] + ); + }); + + it('should parse absolute URL scope keys, ignoring unparseable ones', () => { + expectScopes( + [ + 'https://ex ample.org/', + 'https://example.com:demo', + 'http://[www.example.com]/', + 'https:example.org', + 'https://///example.com///', + 'https://example.net', + 'https://ex%41mple.com/foo/', + 'https://example.com/%41' + ], + 'https://base.example/path1/path2/path3', + [ + 'https://base.example/path1/path2/example.org', // tricky case! remember we have a base URL + 'https://example.com///', + 'https://example.net/', + 'https://example.com/foo/', + 'https://example.com/%41' + ], + [ + 'Invalid scope "https://ex ample.org/" (parsed against base URL "https://base.example/path1/path2/path3").', + 'Invalid scope "https://example.com:demo" (parsed against base URL "https://base.example/path1/path2/path3").', + 'Invalid scope "http://[www.example.com]/" (parsed against base URL "https://base.example/path1/path2/path3").' + ] + ); + }); + + it('should ignore relative URL scope keys when the base URL is a data: URL', () => { + expectScopes( + [ + './foo', + '../foo', + '/foo' + ], + 'data:text/html,test', + [], + [ + 'Invalid scope "./foo" (parsed against base URL "data:text/html,test").', + 'Invalid scope "../foo" (parsed against base URL "data:text/html,test").', + 'Invalid scope "/foo" (parsed against base URL "data:text/html,test").' + ] + ); + }); +}); diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-specifier-keys.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-specifier-keys.js new file mode 100644 index 00000000000..9eb423a19eb --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/parsing-specifier-keys.js @@ -0,0 +1,159 @@ +'use strict'; +const { expectSpecifierMap } = require('./helpers/parsing.js'); +const { BUILT_IN_MODULE_SCHEME } = require('../lib/utils.js'); + +const BLANK = `${BUILT_IN_MODULE_SCHEME}:blank`; + +describe('Relative URL-like specifier keys', () => { + it('should absolutize strings prefixed with ./, ../, or / into the corresponding URLs', () => { + expectSpecifierMap( + `{ + "./foo": "/dotslash", + "../foo": "/dotdotslash", + "/foo": "/slash" + }`, + 'https://base.example/path1/path2/path3', + { + 'https://base.example/path1/path2/foo': [expect.toMatchURL('https://base.example/dotslash')], + 'https://base.example/path1/foo': [expect.toMatchURL('https://base.example/dotdotslash')], + 'https://base.example/foo': [expect.toMatchURL('https://base.example/slash')] + } + ); + }); + + it('should not absolutize strings prefixed with ./, ../, or / with a data: URL base', () => { + expectSpecifierMap( + `{ + "./foo": "https://example.com/dotslash", + "../foo": "https://example.com/dotdotslash", + "/foo": "https://example.com/slash" + }`, + 'data:text/html,test', + { + './foo': [expect.toMatchURL('https://example.com/dotslash')], + '../foo': [expect.toMatchURL('https://example.com/dotdotslash')], + '/foo': [expect.toMatchURL('https://example.com/slash')] + } + ); + }); + + it('should absolutize the literal strings ./, ../, or / with no suffix', () => { + expectSpecifierMap( + `{ + "./": "/dotslash/", + "../": "/dotdotslash/", + "/": "/slash/" + }`, + 'https://base.example/path1/path2/path3', + { + 'https://base.example/path1/path2/': [expect.toMatchURL('https://base.example/dotslash/')], + 'https://base.example/path1/': [expect.toMatchURL('https://base.example/dotdotslash/')], + 'https://base.example/': [expect.toMatchURL('https://base.example/slash/')] + } + ); + }); + + it('should treat percent-encoded variants of ./, ../, or / as bare specifiers', () => { + expectSpecifierMap( + `{ + "%2E/": "/dotSlash1/", + "%2E%2E/": "/dotDotSlash1/", + ".%2F": "/dotSlash2", + "..%2F": "/dotDotSlash2", + "%2F": "/slash2", + "%2E%2F": "/dotSlash3", + "%2E%2E%2F": "/dotDotSlash3" + }`, + 'https://base.example/path1/path2/path3', + { + '%2E/': [expect.toMatchURL('https://base.example/dotSlash1/')], + '%2E%2E/': [expect.toMatchURL('https://base.example/dotDotSlash1/')], + '.%2F': [expect.toMatchURL('https://base.example/dotSlash2')], + '..%2F': [expect.toMatchURL('https://base.example/dotDotSlash2')], + '%2F': [expect.toMatchURL('https://base.example/slash2')], + '%2E%2F': [expect.toMatchURL('https://base.example/dotSlash3')], + '%2E%2E%2F': [expect.toMatchURL('https://base.example/dotDotSlash3')] + } + ); + }); +}); + +describe('Absolute URL specifier keys', () => { + it('should only accept absolute URL specifier keys with fetch schemes, treating others as bare specifiers', () => { + expectSpecifierMap( + `{ + "about:good": "/about", + "blob:good": "/blob", + "data:good": "/data", + "file:///good": "/file", + "filesystem:good": "/filesystem", + "http://good/": "/http/", + "https://good/": "/https/", + "ftp://good/": "/ftp/", + "import:bad": "/import", + "mailto:bad": "/mailto", + "javascript:bad": "/javascript", + "wss:bad": "/wss" + }`, + 'https://base.example/path1/path2/path3', + { + 'about:good': [expect.toMatchURL('https://base.example/about')], + 'blob:good': [expect.toMatchURL('https://base.example/blob')], + 'data:good': [expect.toMatchURL('https://base.example/data')], + 'file:///good': [expect.toMatchURL('https://base.example/file')], + 'filesystem:good': [expect.toMatchURL('https://base.example/filesystem')], + 'http://good/': [expect.toMatchURL('https://base.example/http/')], + 'https://good/': [expect.toMatchURL('https://base.example/https/')], + 'ftp://good/': [expect.toMatchURL('https://base.example/ftp/')], + 'import:bad': [expect.toMatchURL('https://base.example/import')], + 'mailto:bad': [expect.toMatchURL('https://base.example/mailto')], + 'javascript:bad': [expect.toMatchURL('https://base.example/javascript')], + 'wss:bad': [expect.toMatchURL('https://base.example/wss')] + } + ); + }); + + it('should parse absolute URLs, treating unparseable ones as bare specifiers', () => { + expectSpecifierMap( + `{ + "https://ex ample.org/": "/unparseable1/", + "https://example.com:demo": "/unparseable2", + "http://[www.example.com]/": "/unparseable3/", + "https:example.org": "/invalidButParseable1/", + "https://///example.com///": "/invalidButParseable2/", + "https://example.net": "/prettyNormal/", + "https://ex%41mple.com/": "/percentDecoding/", + "https://example.com/%41": "/noPercentDecoding" + }`, + 'https://base.example/path1/path2/path3', + { + 'https://ex ample.org/': [expect.toMatchURL('https://base.example/unparseable1/')], + 'https://example.com:demo': [expect.toMatchURL('https://base.example/unparseable2')], + 'http://[www.example.com]/': [expect.toMatchURL('https://base.example/unparseable3/')], + 'https://example.org/': [expect.toMatchURL('https://base.example/invalidButParseable1/')], + 'https://example.com///': [expect.toMatchURL('https://base.example/invalidButParseable2/')], + 'https://example.net/': [expect.toMatchURL('https://base.example/prettyNormal/')], + 'https://example.com/': [expect.toMatchURL('https://base.example/percentDecoding/')], + 'https://example.com/%41': [expect.toMatchURL('https://base.example/noPercentDecoding')] + } + ); + }); + + it('should parse built-in module specifier keys, including with a "/"', () => { + expectSpecifierMap( + `{ + "${BLANK}": "/blank", + "${BLANK}/": "/blank/", + "${BLANK}/foo": "/blank/foo", + "${BLANK}\\\\foo": "/blank/backslashfoo" + }`, + 'https://base.example/path1/path2/path3', + { + [BLANK]: [expect.toMatchURL('https://base.example/blank')], + [`${BLANK}/`]: [expect.toMatchURL('https://base.example/blank/')], + [`${BLANK}/foo`]: [expect.toMatchURL('https://base.example/blank/foo')], + [`${BLANK}\\foo`]: [expect.toMatchURL('https://base.example/blank/backslashfoo')] + } + ); + }); +}); diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-builtins.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving-builtins.js similarity index 100% rename from tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-builtins.js rename to tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving-builtins.js diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-not-yet-implemented.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving-not-yet-implemented.js similarity index 100% rename from tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-not-yet-implemented.js rename to tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving-not-yet-implemented.js diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving-scopes.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving-scopes.js new file mode 100644 index 00000000000..ca19a668406 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving-scopes.js @@ -0,0 +1,230 @@ +'use strict'; +const { URL } = require('url'); +const { parseFromString } = require('../lib/parser.js'); +const { resolve } = require('../lib/resolver.js'); + +const mapBaseURL = new URL('https://example.com/app/index.html'); + +function makeResolveUnderTest(mapString) { + const map = parseFromString(mapString, mapBaseURL); + return (specifier, baseURL) => resolve(specifier, map, baseURL); +} + +describe('Mapped using scope instead of "imports"', () => { + const jsNonDirURL = new URL('https://example.com/js'); + const jsPrefixedURL = new URL('https://example.com/jsiscool'); + const inJSDirURL = new URL('https://example.com/js/app.mjs'); + const topLevelURL = new URL('https://example.com/app.mjs'); + + it('should fail when the mapping is to an empty array', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "scopes": { + "/js/": { + "moment": null, + "lodash": [] + } + } + }`); + + expect(() => resolveUnderTest('moment', inJSDirURL)).toThrow(TypeError); + expect(() => resolveUnderTest('lodash', inJSDirURL)).toThrow(TypeError); + }); + + describe('Exact vs. prefix based matching', () => { + it('should match correctly when both are in the map', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "scopes": { + "/js": { + "moment": "/only-triggered-by-exact/moment", + "moment/": "/only-triggered-by-exact/moment/" + }, + "/js/": { + "moment": "/triggered-by-any-subpath/moment", + "moment/": "/triggered-by-any-subpath/moment/" + } + } + }`); + + expect(resolveUnderTest('moment', jsNonDirURL)).toMatchURL('https://example.com/only-triggered-by-exact/moment'); + expect(resolveUnderTest('moment/foo', jsNonDirURL)).toMatchURL('https://example.com/only-triggered-by-exact/moment/foo'); + + expect(resolveUnderTest('moment', inJSDirURL)).toMatchURL('https://example.com/triggered-by-any-subpath/moment'); + expect(resolveUnderTest('moment/foo', inJSDirURL)).toMatchURL('https://example.com/triggered-by-any-subpath/moment/foo'); + + expect(() => resolveUnderTest('moment', jsPrefixedURL)).toThrow(TypeError); + expect(() => resolveUnderTest('moment/foo', jsPrefixedURL)).toThrow(TypeError); + }); + + it('should match correctly when only an exact match is in the map', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "scopes": { + "/js": { + "moment": "/only-triggered-by-exact/moment", + "moment/": "/only-triggered-by-exact/moment/" + } + } + }`); + + expect(resolveUnderTest('moment', jsNonDirURL)).toMatchURL('https://example.com/only-triggered-by-exact/moment'); + expect(resolveUnderTest('moment/foo', jsNonDirURL)).toMatchURL('https://example.com/only-triggered-by-exact/moment/foo'); + + expect(() => resolveUnderTest('moment', inJSDirURL)).toThrow(TypeError); + expect(() => resolveUnderTest('moment/foo', inJSDirURL)).toThrow(TypeError); + + expect(() => resolveUnderTest('moment', jsPrefixedURL)).toThrow(TypeError); + expect(() => resolveUnderTest('moment/foo', jsPrefixedURL)).toThrow(TypeError); + }); + + it('should match correctly when only a prefix match is in the map', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "scopes": { + "/js/": { + "moment": "/triggered-by-any-subpath/moment", + "moment/": "/triggered-by-any-subpath/moment/" + } + } + }`); + + expect(() => resolveUnderTest('moment', jsNonDirURL)).toThrow(TypeError); + expect(() => resolveUnderTest('moment/foo', jsNonDirURL)).toThrow(TypeError); + + expect(resolveUnderTest('moment', inJSDirURL)).toMatchURL('https://example.com/triggered-by-any-subpath/moment'); + expect(resolveUnderTest('moment/foo', inJSDirURL)).toMatchURL('https://example.com/triggered-by-any-subpath/moment/foo'); + + expect(() => resolveUnderTest('moment', jsPrefixedURL)).toThrow(TypeError); + expect(() => resolveUnderTest('moment/foo', jsPrefixedURL)).toThrow(TypeError); + }); + }); + + describe('Package-like scenarios', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "moment": "/node_modules/moment/src/moment.js", + "moment/": "/node_modules/moment/src/", + "lodash-dot": "./node_modules/lodash-es/lodash.js", + "lodash-dot/": "./node_modules/lodash-es/", + "lodash-dotdot": "../node_modules/lodash-es/lodash.js", + "lodash-dotdot/": "../node_modules/lodash-es/" + }, + "scopes": { + "/": { + "moment": "/node_modules_3/moment/src/moment.js", + "vue": "/node_modules_3/vue/dist/vue.runtime.esm.js" + }, + "/js/": { + "lodash-dot": "./node_modules_2/lodash-es/lodash.js", + "lodash-dot/": "./node_modules_2/lodash-es/", + "lodash-dotdot": "../node_modules_2/lodash-es/lodash.js", + "lodash-dotdot/": "../node_modules_2/lodash-es/" + } + } + }`); + + it('should resolve scoped', () => { + expect(resolveUnderTest('lodash-dot', inJSDirURL)).toMatchURL('https://example.com/app/node_modules_2/lodash-es/lodash.js'); + expect(resolveUnderTest('lodash-dotdot', inJSDirURL)).toMatchURL('https://example.com/node_modules_2/lodash-es/lodash.js'); + expect(resolveUnderTest('lodash-dot/foo', inJSDirURL)).toMatchURL('https://example.com/app/node_modules_2/lodash-es/foo'); + expect(resolveUnderTest('lodash-dotdot/foo', inJSDirURL)).toMatchURL('https://example.com/node_modules_2/lodash-es/foo'); + }); + + it('should apply best scope match', () => { + expect(resolveUnderTest('moment', topLevelURL)).toMatchURL('https://example.com/node_modules_3/moment/src/moment.js'); + expect(resolveUnderTest('moment', inJSDirURL)).toMatchURL('https://example.com/node_modules_3/moment/src/moment.js'); + expect(resolveUnderTest('vue', inJSDirURL)).toMatchURL('https://example.com/node_modules_3/vue/dist/vue.runtime.esm.js'); + }); + + it('should fallback to "imports"', () => { + expect(resolveUnderTest('moment/foo', topLevelURL)).toMatchURL('https://example.com/node_modules/moment/src/foo'); + expect(resolveUnderTest('moment/foo', inJSDirURL)).toMatchURL('https://example.com/node_modules/moment/src/foo'); + expect(resolveUnderTest('lodash-dot', topLevelURL)).toMatchURL('https://example.com/app/node_modules/lodash-es/lodash.js'); + expect(resolveUnderTest('lodash-dotdot', topLevelURL)).toMatchURL('https://example.com/node_modules/lodash-es/lodash.js'); + expect(resolveUnderTest('lodash-dot/foo', topLevelURL)).toMatchURL('https://example.com/app/node_modules/lodash-es/foo'); + expect(resolveUnderTest('lodash-dotdot/foo', topLevelURL)).toMatchURL('https://example.com/node_modules/lodash-es/foo'); + }); + + it('should still fail for package-like specifiers that are not declared', () => { + expect(() => resolveUnderTest('underscore/', inJSDirURL)).toThrow(TypeError); + expect(() => resolveUnderTest('underscore/foo', inJSDirURL)).toThrow(TypeError); + }); + }); + + describe('The scope inheritance example from the README', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "a": "/a-1.mjs", + "b": "/b-1.mjs", + "c": "/c-1.mjs" + }, + "scopes": { + "/scope2/": { + "a": "/a-2.mjs" + }, + "/scope2/scope3/": { + "b": "/b-3.mjs" + } + } + }`); + + const scope1URL = new URL('https://example.com/scope1/foo.mjs'); + const scope2URL = new URL('https://example.com/scope2/foo.mjs'); + const scope3URL = new URL('https://example.com/scope2/scope3/foo.mjs'); + + it('should fall back to "imports" when none match', () => { + expect(resolveUnderTest('a', scope1URL)).toMatchURL('https://example.com/a-1.mjs'); + expect(resolveUnderTest('b', scope1URL)).toMatchURL('https://example.com/b-1.mjs'); + expect(resolveUnderTest('c', scope1URL)).toMatchURL('https://example.com/c-1.mjs'); + }); + + it('should use a direct scope override', () => { + expect(resolveUnderTest('a', scope2URL)).toMatchURL('https://example.com/a-2.mjs'); + expect(resolveUnderTest('b', scope2URL)).toMatchURL('https://example.com/b-1.mjs'); + expect(resolveUnderTest('c', scope2URL)).toMatchURL('https://example.com/c-1.mjs'); + }); + + it('should use an indirect scope override', () => { + expect(resolveUnderTest('a', scope3URL)).toMatchURL('https://example.com/a-2.mjs'); + expect(resolveUnderTest('b', scope3URL)).toMatchURL('https://example.com/b-3.mjs'); + expect(resolveUnderTest('c', scope3URL)).toMatchURL('https://example.com/c-1.mjs'); + }); + }); + + describe('Relative URL scope keys', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "a": "/a-1.mjs", + "b": "/b-1.mjs", + "c": "/c-1.mjs" + }, + "scopes": { + "": { + "a": "/a-empty-string.mjs" + }, + "./": { + "b": "/b-dot-slash.mjs" + }, + "../": { + "c": "/c-dot-dot-slash.mjs" + } + } + }`); + const inSameDirAsMap = new URL('./foo.mjs', mapBaseURL); + const inDirAboveMap = new URL('../foo.mjs', mapBaseURL); + + it('should resolve an empty string scope using the import map URL', () => { + expect(resolveUnderTest('a', mapBaseURL)).toMatchURL('https://example.com/a-empty-string.mjs'); + expect(resolveUnderTest('a', inSameDirAsMap)).toMatchURL('https://example.com/a-1.mjs'); + }); + + it('should resolve a ./ scope using the import map URL\'s directory', () => { + expect(resolveUnderTest('b', mapBaseURL)).toMatchURL('https://example.com/b-dot-slash.mjs'); + expect(resolveUnderTest('b', inSameDirAsMap)).toMatchURL('https://example.com/b-dot-slash.mjs'); + }); + + it('should resolve a ../ scope using the import map URL\'s directory', () => { + expect(resolveUnderTest('c', mapBaseURL)).toMatchURL('https://example.com/c-dot-dot-slash.mjs'); + expect(resolveUnderTest('c', inSameDirAsMap)).toMatchURL('https://example.com/c-dot-dot-slash.mjs'); + expect(resolveUnderTest('c', inDirAboveMap)).toMatchURL('https://example.com/c-dot-dot-slash.mjs'); + }); + }); +}); + diff --git a/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving.js new file mode 100644 index 00000000000..29ee31ccbc9 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/imported/resources/resolving.js @@ -0,0 +1,270 @@ +'use strict'; +const { URL } = require('url'); +const { parseFromString } = require('../lib/parser.js'); +const { resolve } = require('../lib/resolver.js'); + +const mapBaseURL = new URL('https://example.com/app/index.html'); +const scriptURL = new URL('https://example.com/js/app.mjs'); + +function makeResolveUnderTest(mapString) { + const map = parseFromString(mapString, mapBaseURL); + return specifier => resolve(specifier, map, scriptURL); +} + +describe('Unmapped', () => { + const resolveUnderTest = makeResolveUnderTest(`{}`); + + it('should resolve ./ specifiers as URLs', () => { + expect(resolveUnderTest('./foo')).toMatchURL('https://example.com/js/foo'); + expect(resolveUnderTest('./foo/bar')).toMatchURL('https://example.com/js/foo/bar'); + expect(resolveUnderTest('./foo/../bar')).toMatchURL('https://example.com/js/bar'); + expect(resolveUnderTest('./foo/../../bar')).toMatchURL('https://example.com/bar'); + }); + + it('should resolve ../ specifiers as URLs', () => { + expect(resolveUnderTest('../foo')).toMatchURL('https://example.com/foo'); + expect(resolveUnderTest('../foo/bar')).toMatchURL('https://example.com/foo/bar'); + expect(resolveUnderTest('../../../foo/bar')).toMatchURL('https://example.com/foo/bar'); + }); + + it('should resolve / specifiers as URLs', () => { + expect(resolveUnderTest('/foo')).toMatchURL('https://example.com/foo'); + expect(resolveUnderTest('/foo/bar')).toMatchURL('https://example.com/foo/bar'); + expect(resolveUnderTest('/../../foo/bar')).toMatchURL('https://example.com/foo/bar'); + expect(resolveUnderTest('/../foo/../bar')).toMatchURL('https://example.com/bar'); + }); + + it('should parse absolute fetch-scheme URLs', () => { + expect(resolveUnderTest('about:good')).toMatchURL('about:good'); + expect(resolveUnderTest('https://example.net')).toMatchURL('https://example.net/'); + expect(resolveUnderTest('https://ex%41mple.com/')).toMatchURL('https://example.com/'); + expect(resolveUnderTest('https:example.org')).toMatchURL('https://example.org/'); + expect(resolveUnderTest('https://///example.com///')).toMatchURL('https://example.com///'); + }); + + it('should fail for absolute non-fetch-scheme URLs', () => { + expect(() => resolveUnderTest('mailto:bad')).toThrow(TypeError); + expect(() => resolveUnderTest('import:bad')).toThrow(TypeError); + expect(() => resolveUnderTest('javascript:bad')).toThrow(TypeError); + expect(() => resolveUnderTest('wss:bad')).toThrow(TypeError); + }); + + it('should fail for strings not parseable as absolute URLs and not starting with ./ ../ or /', () => { + expect(() => resolveUnderTest('foo')).toThrow(TypeError); + expect(() => resolveUnderTest('\\foo')).toThrow(TypeError); + expect(() => resolveUnderTest(':foo')).toThrow(TypeError); + expect(() => resolveUnderTest('@foo')).toThrow(TypeError); + expect(() => resolveUnderTest('%2E/foo')).toThrow(TypeError); + expect(() => resolveUnderTest('%2E%2E/foo')).toThrow(TypeError); + expect(() => resolveUnderTest('.%2Ffoo')).toThrow(TypeError); + expect(() => resolveUnderTest('https://ex ample.org/')).toThrow(TypeError); + expect(() => resolveUnderTest('https://example.com:demo')).toThrow(TypeError); + expect(() => resolveUnderTest('http://[www.example.com]/')).toThrow(TypeError); + }); +}); + +describe('Mapped using the "imports" key only (no scopes)', () => { + it('should fail when the mapping is to an empty array', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "moment": null, + "lodash": [] + } + }`); + + expect(() => resolveUnderTest('moment')).toThrow(TypeError); + expect(() => resolveUnderTest('lodash')).toThrow(TypeError); + }); + + describe('Package-like scenarios', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "moment": "/node_modules/moment/src/moment.js", + "moment/": "/node_modules/moment/src/", + "lodash-dot": "./node_modules/lodash-es/lodash.js", + "lodash-dot/": "./node_modules/lodash-es/", + "lodash-dotdot": "../node_modules/lodash-es/lodash.js", + "lodash-dotdot/": "../node_modules/lodash-es/", + "nowhere/": [] + } + }`); + + it('should work for package main modules', () => { + expect(resolveUnderTest('moment')).toMatchURL('https://example.com/node_modules/moment/src/moment.js'); + expect(resolveUnderTest('lodash-dot')).toMatchURL('https://example.com/app/node_modules/lodash-es/lodash.js'); + expect(resolveUnderTest('lodash-dotdot')).toMatchURL('https://example.com/node_modules/lodash-es/lodash.js'); + }); + + it('should work for package submodules', () => { + expect(resolveUnderTest('moment/foo')).toMatchURL('https://example.com/node_modules/moment/src/foo'); + expect(resolveUnderTest('lodash-dot/foo')).toMatchURL('https://example.com/app/node_modules/lodash-es/foo'); + expect(resolveUnderTest('lodash-dotdot/foo')).toMatchURL('https://example.com/node_modules/lodash-es/foo'); + }); + + it('should work for package names that end in a slash by just passing through', () => { + // TODO: is this the right behavior, or should we throw? + expect(resolveUnderTest('moment/')).toMatchURL('https://example.com/node_modules/moment/src/'); + }); + + it('should still fail for package modules that are not declared', () => { + expect(() => resolveUnderTest('underscore/')).toThrow(TypeError); + expect(() => resolveUnderTest('underscore/foo')).toThrow(TypeError); + }); + + it('should fail for package submodules that map to nowhere', () => { + expect(() => resolveUnderTest('nowhere/foo')).toThrow(TypeError); + }); + }); + + describe('Tricky specifiers', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "package/withslash": "/node_modules/package-with-slash/index.mjs", + "not-a-package": "/lib/not-a-package.mjs", + ".": "/lib/dot.mjs", + "..": "/lib/dotdot.mjs", + "..\\\\": "/lib/dotdotbackslash.mjs", + "%2E": "/lib/percent2e.mjs", + "%2F": "/lib/percent2f.mjs" + } + }`); + + it('should work for explicitly-mapped specifiers that happen to have a slash', () => { + expect(resolveUnderTest('package/withslash')).toMatchURL('https://example.com/node_modules/package-with-slash/index.mjs'); + }); + + it('should work when the specifier has punctuation', () => { + expect(resolveUnderTest('.')).toMatchURL('https://example.com/lib/dot.mjs'); + expect(resolveUnderTest('..')).toMatchURL('https://example.com/lib/dotdot.mjs'); + expect(resolveUnderTest('..\\')).toMatchURL('https://example.com/lib/dotdotbackslash.mjs'); + expect(resolveUnderTest('%2E')).toMatchURL('https://example.com/lib/percent2e.mjs'); + expect(resolveUnderTest('%2F')).toMatchURL('https://example.com/lib/percent2f.mjs'); + }); + + it('should fail for attempting to get a submodule of something not declared with a trailing slash', () => { + expect(() => resolveUnderTest('not-a-package/foo')).toThrow(TypeError); + }); + }); + + describe('URL-like specifiers', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "/node_modules/als-polyfill/index.mjs": "std:kv-storage", + + "/lib/foo.mjs": "./more/bar.mjs", + "./dotrelative/foo.mjs": "/lib/dot.mjs", + "../dotdotrelative/foo.mjs": "/lib/dotdot.mjs", + + "/lib/no.mjs": null, + "./dotrelative/no.mjs": [], + + "/": "/lib/slash-only/", + "./": "/lib/dotslash-only/", + + "/test/": "/lib/url-trailing-slash/", + "./test/": "/lib/url-trailing-slash-dot/", + + "/test": "/lib/test1.mjs", + "../test": "/lib/test2.mjs" + } + }`); + + it('should remap to other URLs', () => { + expect(resolveUnderTest('https://example.com/lib/foo.mjs')).toMatchURL('https://example.com/app/more/bar.mjs'); + expect(resolveUnderTest('https://///example.com/lib/foo.mjs')).toMatchURL('https://example.com/app/more/bar.mjs'); + expect(resolveUnderTest('/lib/foo.mjs')).toMatchURL('https://example.com/app/more/bar.mjs'); + + expect(resolveUnderTest('https://example.com/app/dotrelative/foo.mjs')).toMatchURL('https://example.com/lib/dot.mjs'); + expect(resolveUnderTest('../app/dotrelative/foo.mjs')).toMatchURL('https://example.com/lib/dot.mjs'); + + expect(resolveUnderTest('https://example.com/dotdotrelative/foo.mjs')).toMatchURL('https://example.com/lib/dotdot.mjs'); + expect(resolveUnderTest('../dotdotrelative/foo.mjs')).toMatchURL('https://example.com/lib/dotdot.mjs'); + }); + + it('should fail for URLs that remap to empty arrays', () => { + expect(() => resolveUnderTest('https://example.com/lib/no.mjs')).toThrow(TypeError); + expect(() => resolveUnderTest('/lib/no.mjs')).toThrow(TypeError); + expect(() => resolveUnderTest('../lib/no.mjs')).toThrow(TypeError); + + expect(() => resolveUnderTest('https://example.com/app/dotrelative/no.mjs')).toThrow(TypeError); + expect(() => resolveUnderTest('/app/dotrelative/no.mjs')).toThrow(TypeError); + expect(() => resolveUnderTest('../app/dotrelative/no.mjs')).toThrow(TypeError); + }); + + it('should remap URLs that are just composed from / and .', () => { + expect(resolveUnderTest('https://example.com/')).toMatchURL('https://example.com/lib/slash-only/'); + expect(resolveUnderTest('/')).toMatchURL('https://example.com/lib/slash-only/'); + expect(resolveUnderTest('../')).toMatchURL('https://example.com/lib/slash-only/'); + + expect(resolveUnderTest('https://example.com/app/')).toMatchURL('https://example.com/lib/dotslash-only/'); + expect(resolveUnderTest('/app/')).toMatchURL('https://example.com/lib/dotslash-only/'); + expect(resolveUnderTest('../app/')).toMatchURL('https://example.com/lib/dotslash-only/'); + }); + + it('should remap URLs that are prefix-matched by keys with trailing slashes', () => { + expect(resolveUnderTest('/test/foo.mjs')).toMatchURL('https://example.com/lib/url-trailing-slash/foo.mjs'); + expect(resolveUnderTest('https://example.com/app/test/foo.mjs')).toMatchURL('https://example.com/lib/url-trailing-slash-dot/foo.mjs'); + }); + + it('should use the last entry\'s address when URL-like specifiers parse to the same absolute URL', () => { + expect(resolveUnderTest('/test')).toMatchURL('https://example.com/lib/test2.mjs'); + }); + }); + + describe('Overlapping entries with trailing slashes', () => { + it('should favor the most-specific key (no empty arrays)', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "a": "/1", + "a/": "/2/", + "a/b": "/3", + "a/b/": "/4/" + } + }`); + + expect(resolveUnderTest('a')).toMatchURL('https://example.com/1'); + expect(resolveUnderTest('a/')).toMatchURL('https://example.com/2/'); + expect(resolveUnderTest('a/b')).toMatchURL('https://example.com/3'); + expect(resolveUnderTest('a/b/')).toMatchURL('https://example.com/4/'); + expect(resolveUnderTest('a/b/c')).toMatchURL('https://example.com/4/c'); + }); + + it('should favor the most-specific key when empty arrays are involved for less-specific keys', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "a": [], + "a/": [], + "a/b": "/3", + "a/b/": "/4/" + } + }`); + + expect(() => resolveUnderTest('a')).toThrow(TypeError); + expect(() => resolveUnderTest('a/')).toThrow(TypeError); + expect(() => resolveUnderTest('a/x')).toThrow(TypeError); + expect(resolveUnderTest('a/b')).toMatchURL('https://example.com/3'); + expect(resolveUnderTest('a/b/')).toMatchURL('https://example.com/4/'); + expect(resolveUnderTest('a/b/c')).toMatchURL('https://example.com/4/c'); + expect(() => resolveUnderTest('a/x/c')).toThrow(TypeError); + }); + + it('should favor the most-specific key when empty arrays are involved for more-specific keys', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "a": "/1", + "a/": "/2/", + "a/b": [], + "a/b/": [] + } + }`); + + expect(resolveUnderTest('a')).toMatchURL('https://example.com/1'); + expect(resolveUnderTest('a/')).toMatchURL('https://example.com/2/'); + expect(resolveUnderTest('a/x')).toMatchURL('https://example.com/2/x'); + expect(() => resolveUnderTest('a/b')).toThrow(TypeError); + expect(() => resolveUnderTest('a/b/')).toThrow(TypeError); + expect(() => resolveUnderTest('a/b/c')).toThrow(TypeError); + expect(resolveUnderTest('a/x/c')).toMatchURL('https://example.com/2/x/c'); + }); + }); +}); diff --git a/tests/wpt/web-platform-tests/import-maps/static-import.js b/tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/static-import.js similarity index 100% rename from tests/wpt/web-platform-tests/import-maps/static-import.js rename to tests/wpt/web-platform-tests/import-maps/builtin-support.tentative/static-import.js diff --git a/tests/wpt/web-platform-tests/import-maps/core/bare.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/core/bare.sub.tentative.html new file mode 100644 index 00000000000..7fb769e09a2 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/core/bare.sub.tentative.html @@ -0,0 +1,51 @@ + + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/core/bare/__dir__.headers b/tests/wpt/web-platform-tests/import-maps/core/bare/__dir__.headers new file mode 100644 index 00000000000..e7ec0d6699d --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/core/bare/__dir__.headers @@ -0,0 +1 @@ +Content-Type: text/javascript diff --git a/tests/wpt/web-platform-tests/import-maps/bare/bare b/tests/wpt/web-platform-tests/import-maps/core/bare/bare similarity index 100% rename from tests/wpt/web-platform-tests/import-maps/bare/bare rename to tests/wpt/web-platform-tests/import-maps/core/bare/bare diff --git a/tests/wpt/web-platform-tests/import-maps/bare/cross-origin-bare b/tests/wpt/web-platform-tests/import-maps/core/bare/cross-origin-bare similarity index 100% rename from tests/wpt/web-platform-tests/import-maps/bare/cross-origin-bare rename to tests/wpt/web-platform-tests/import-maps/core/bare/cross-origin-bare diff --git a/tests/wpt/web-platform-tests/import-maps/bare/to-bare b/tests/wpt/web-platform-tests/import-maps/core/bare/to-bare similarity index 100% rename from tests/wpt/web-platform-tests/import-maps/bare/to-bare rename to tests/wpt/web-platform-tests/import-maps/core/bare/to-bare diff --git a/tests/wpt/web-platform-tests/import-maps/bare/to-data b/tests/wpt/web-platform-tests/import-maps/core/bare/to-data similarity index 100% rename from tests/wpt/web-platform-tests/import-maps/bare/to-data rename to tests/wpt/web-platform-tests/import-maps/core/bare/to-data diff --git a/tests/wpt/web-platform-tests/import-maps/core/data.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/core/data.sub.tentative.html new file mode 100644 index 00000000000..25c18c45b7d --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/core/data.sub.tentative.html @@ -0,0 +1,53 @@ + + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/core/http.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/core/http.sub.tentative.html new file mode 100644 index 00000000000..a33a0945e31 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/core/http.sub.tentative.html @@ -0,0 +1,52 @@ + + + + + + + diff --git a/tests/wpt/web-platform-tests/import-maps/module-map-key.tentative.html b/tests/wpt/web-platform-tests/import-maps/core/module-map-key.tentative.html similarity index 75% rename from tests/wpt/web-platform-tests/import-maps/module-map-key.tentative.html rename to tests/wpt/web-platform-tests/import-maps/core/module-map-key.tentative.html index 13bd122c673..6f2f18a02e1 100644 --- a/tests/wpt/web-platform-tests/import-maps/module-map-key.tentative.html +++ b/tests/wpt/web-platform-tests/import-maps/core/module-map-key.tentative.html @@ -5,7 +5,7 @@ @@ -17,8 +17,8 @@ const log = []; // key will become the URL/specifier BEFORE import map resolution. // https://crbug.com/928435 promise_test(() => { - return import("./resources/log.js?pipe=sub&name=A") - .then(() => import("./resources/log.js?pipe=sub&name=B")) + return import("../resources/log.js?pipe=sub&name=A") + .then(() => import("../resources/log.js?pipe=sub&name=B")) .then(() => assert_array_equals(log, ["log:B"])) }, "Module map's key is the URL after import map resolution"); diff --git a/tests/wpt/web-platform-tests/import-maps/core/static-import.js b/tests/wpt/web-platform-tests/import-maps/core/static-import.js new file mode 100644 index 00000000000..1686fc123a7 --- /dev/null +++ b/tests/wpt/web-platform-tests/import-maps/core/static-import.js @@ -0,0 +1 @@ +import "{{GET[url]}}"; diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/helpers/parsing.js b/tests/wpt/web-platform-tests/import-maps/imported/resources/helpers/parsing.js index 5c22f6de710..daad6d26d22 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resources/helpers/parsing.js +++ b/tests/wpt/web-platform-tests/import-maps/imported/resources/helpers/parsing.js @@ -38,13 +38,7 @@ exports.expectWarnings = (input, baseURL, output, warnings = []) => { }; function testWarningHandler(expectedWarnings) { - const warnings = []; - const { warn } = console; - console.warn = warning => { - warnings.push(warning); - }; - return () => { - console.warn = warn; - expect(warnings).toEqual(expectedWarnings); - }; + // We don't check warnings on WPT tests, because there are no + // ways to catch console warnings from JavaScript. + return () => {}; } diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-addresses.js b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-addresses.js index 0f5fc73506b..92d7714ade9 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-addresses.js +++ b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-addresses.js @@ -1,6 +1,5 @@ 'use strict'; const { expectSpecifierMap } = require('./helpers/parsing.js'); -const { BUILT_IN_MODULE_SCHEME } = require('../lib/utils.js'); describe('Relative URL-like addresses', () => { it('should accept strings prefixed with ./, ../, or /', () => { @@ -12,9 +11,9 @@ describe('Relative URL-like addresses', () => { }`, 'https://base.example/path1/path2/path3', { - dotSlash: [expect.toMatchURL('https://base.example/path1/path2/foo')], - dotDotSlash: [expect.toMatchURL('https://base.example/path1/foo')], - slash: [expect.toMatchURL('https://base.example/foo')] + dotSlash: expect.toMatchURL('https://base.example/path1/path2/foo'), + dotDotSlash: expect.toMatchURL('https://base.example/path1/foo'), + slash: expect.toMatchURL('https://base.example/foo') } ); }); @@ -28,9 +27,6 @@ describe('Relative URL-like addresses', () => { }`, 'data:text/html,test', { - dotSlash: [], - dotDotSlash: [], - slash: [] }, [ `Invalid address "./foo" for the specifier key "dotSlash".`, @@ -49,9 +45,9 @@ describe('Relative URL-like addresses', () => { }`, 'https://base.example/path1/path2/path3', { - dotSlash: [expect.toMatchURL('https://base.example/path1/path2/')], - dotDotSlash: [expect.toMatchURL('https://base.example/path1/')], - slash: [expect.toMatchURL('https://base.example/')] + dotSlash: expect.toMatchURL('https://base.example/path1/path2/'), + dotDotSlash: expect.toMatchURL('https://base.example/path1/'), + slash: expect.toMatchURL('https://base.example/') } ); }); @@ -69,13 +65,6 @@ describe('Relative URL-like addresses', () => { }`, 'https://base.example/path1/path2/path3', { - dotSlash1: [], - dotDotSlash1: [], - dotSlash2: [], - dotDotSlash2: [], - slash2: [], - dotSlash3: [], - dotDotSlash3: [] }, [ `Invalid address "%2E/" for the specifier key "dotSlash1".`, @@ -90,49 +79,6 @@ describe('Relative URL-like addresses', () => { }); }); -describe('Built-in module addresses', () => { - it('should accept URLs using the built-in module scheme', () => { - expectSpecifierMap( - `{ - "foo": "${BUILT_IN_MODULE_SCHEME}:foo" - }`, - 'https://base.example/path1/path2/path3', - { - foo: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo`)] - } - ); - }); - - it('should ignore percent-encoded variants of the built-in module scheme', () => { - expectSpecifierMap( - `{ - "foo": "${encodeURIComponent(BUILT_IN_MODULE_SCHEME + ':')}foo" - }`, - 'https://base.example/path1/path2/path3', - { - foo: [] - }, - [`Invalid address "${encodeURIComponent(BUILT_IN_MODULE_SCHEME + ':')}foo" for the specifier key "foo".`] - ); - }); - - it('should allow built-in module URLs that contain "/" or "\\"', () => { - expectSpecifierMap( - `{ - "slashEnd": "${BUILT_IN_MODULE_SCHEME}:foo/", - "slashMiddle": "${BUILT_IN_MODULE_SCHEME}:foo/bar", - "backslash": "${BUILT_IN_MODULE_SCHEME}:foo\\\\baz" - }`, - 'https://base.example/path1/path2/path3', - { - slashEnd: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo/`)], - slashMiddle: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo/bar`)], - backslash: [expect.toMatchURL(`${BUILT_IN_MODULE_SCHEME}:foo\\baz`)] - } - ); - }); -}); - describe('Absolute URL addresses', () => { it('should only accept absolute URL addresses with fetch schemes', () => { expectSpecifierMap( @@ -141,7 +87,7 @@ describe('Absolute URL addresses', () => { "blob": "blob:good", "data": "data:good", "file": "file:///good", - "filesystem": "filesystem:good", + "filesystem": "filesystem:http://example.com/good/", "http": "http://good/", "https": "https://good/", "ftp": "ftp://good/", @@ -152,65 +98,20 @@ describe('Absolute URL addresses', () => { }`, 'https://base.example/path1/path2/path3', { - about: [expect.toMatchURL('about:good')], - blob: [expect.toMatchURL('blob:good')], - data: [expect.toMatchURL('data:good')], - file: [expect.toMatchURL('file:///good')], - filesystem: [expect.toMatchURL('filesystem:good')], - http: [expect.toMatchURL('http://good/')], - https: [expect.toMatchURL('https://good/')], - ftp: [expect.toMatchURL('ftp://good/')], - import: [], - mailto: [], - javascript: [], - wss: [] + about: expect.toMatchURL('about:good'), + blob: expect.toMatchURL('blob:good'), + data: expect.toMatchURL('data:good'), + file: expect.toMatchURL('file:///good'), + filesystem: expect.toMatchURL('filesystem:http://example.com/good/'), + http: expect.toMatchURL('http://good/'), + https: expect.toMatchURL('https://good/'), + ftp: expect.toMatchURL('ftp://good/'), + import: expect.toMatchURL('import:bad'), + javascript: expect.toMatchURL('javascript:bad'), + mailto: expect.toMatchURL('mailto:bad'), + wss: expect.toMatchURL('wss://bad/') }, - [ - `Invalid address "import:bad" for the specifier key "import".`, - `Invalid address "mailto:bad" for the specifier key "mailto".`, - `Invalid address "javascript:bad" for the specifier key "javascript".`, - `Invalid address "wss:bad" for the specifier key "wss".` - ] - ); - }); - - it('should only accept absolute URL addresses with fetch schemes inside arrays', () => { - expectSpecifierMap( - `{ - "about": ["about:good"], - "blob": ["blob:good"], - "data": ["data:good"], - "file": ["file:///good"], - "filesystem": ["filesystem:good"], - "http": ["http://good/"], - "https": ["https://good/"], - "ftp": ["ftp://good/"], - "import": ["import:bad"], - "mailto": ["mailto:bad"], - "javascript": ["javascript:bad"], - "wss": ["wss:bad"] - }`, - 'https://base.example/path1/path2/path3', - { - about: [expect.toMatchURL('about:good')], - blob: [expect.toMatchURL('blob:good')], - data: [expect.toMatchURL('data:good')], - file: [expect.toMatchURL('file:///good')], - filesystem: [expect.toMatchURL('filesystem:good')], - http: [expect.toMatchURL('http://good/')], - https: [expect.toMatchURL('https://good/')], - ftp: [expect.toMatchURL('ftp://good/')], - import: [], - mailto: [], - javascript: [], - wss: [] - }, - [ - `Invalid address "import:bad" for the specifier key "import".`, - `Invalid address "mailto:bad" for the specifier key "mailto".`, - `Invalid address "javascript:bad" for the specifier key "javascript".`, - `Invalid address "wss:bad" for the specifier key "wss".` - ] + [] ); }); @@ -228,45 +129,11 @@ describe('Absolute URL addresses', () => { }`, 'https://base.example/path1/path2/path3', { - unparseable1: [], - unparseable2: [], - unparseable3: [], - invalidButParseable1: [expect.toMatchURL('https://example.org/')], - invalidButParseable2: [expect.toMatchURL('https://example.com///')], - prettyNormal: [expect.toMatchURL('https://example.net/')], - percentDecoding: [expect.toMatchURL('https://example.com/')], - noPercentDecoding: [expect.toMatchURL('https://example.com/%41')] - }, - [ - `Invalid address "https://ex ample.org/" for the specifier key "unparseable1".`, - `Invalid address "https://example.com:demo" for the specifier key "unparseable2".`, - `Invalid address "http://[www.example.com]/" for the specifier key "unparseable3".` - ] - ); - }); - - it('should parse absolute URLs, ignoring unparseable ones inside arrays', () => { - expectSpecifierMap( - `{ - "unparseable1": ["https://ex ample.org/"], - "unparseable2": ["https://example.com:demo"], - "unparseable3": ["http://[www.example.com]/"], - "invalidButParseable1": ["https:example.org"], - "invalidButParseable2": ["https://///example.com///"], - "prettyNormal": ["https://example.net"], - "percentDecoding": ["https://ex%41mple.com/"], - "noPercentDecoding": ["https://example.com/%41"] - }`, - 'https://base.example/path1/path2/path3', - { - unparseable1: [], - unparseable2: [], - unparseable3: [], - invalidButParseable1: [expect.toMatchURL('https://example.org/')], - invalidButParseable2: [expect.toMatchURL('https://example.com///')], - prettyNormal: [expect.toMatchURL('https://example.net/')], - percentDecoding: [expect.toMatchURL('https://example.com/')], - noPercentDecoding: [expect.toMatchURL('https://example.com/%41')] + invalidButParseable1: expect.toMatchURL('https://example.org/'), + invalidButParseable2: expect.toMatchURL('https://example.com///'), + prettyNormal: expect.toMatchURL('https://example.net/'), + percentDecoding: expect.toMatchURL('https://example.com/'), + noPercentDecoding: expect.toMatchURL('https://example.com/%41') }, [ `Invalid address "https://ex ample.org/" for the specifier key "unparseable1".`, @@ -281,54 +148,12 @@ describe('Failing addresses: mismatched trailing slashes', () => { it('should warn for the simple case', () => { expectSpecifierMap( `{ - "trailer/": "/notrailer", - "${BUILT_IN_MODULE_SCHEME}:trailer/": "/bim-notrailer" + "trailer/": "/notrailer" }`, 'https://base.example/path1/path2/path3', { - 'trailer/': [], - [`${BUILT_IN_MODULE_SCHEME}:trailer/`]: [] }, - [ - `Invalid address "https://base.example/notrailer" for package specifier key "trailer/". Package addresses must end with "/".`, - `Invalid address "https://base.example/bim-notrailer" for package specifier key "${BUILT_IN_MODULE_SCHEME}:trailer/". Package addresses must end with "/".` - ] - ); - }); - - it('should warn for a mismatch alone in an array', () => { - expectSpecifierMap( - `{ - "trailer/": ["/notrailer"], - "${BUILT_IN_MODULE_SCHEME}:trailer/": ["/bim-notrailer"] - }`, - 'https://base.example/path1/path2/path3', - { - 'trailer/': [], - [`${BUILT_IN_MODULE_SCHEME}:trailer/`]: [] - }, - [ - `Invalid address "https://base.example/notrailer" for package specifier key "trailer/". Package addresses must end with "/".`, - `Invalid address "https://base.example/bim-notrailer" for package specifier key "${BUILT_IN_MODULE_SCHEME}:trailer/". Package addresses must end with "/".` - ] - ); - }); - - it('should warn for a mismatch alongside non-mismatches in an array', () => { - expectSpecifierMap( - `{ - "trailer/": ["/atrailer/", "/notrailer"], - "${BUILT_IN_MODULE_SCHEME}:trailer/": ["/bim-atrailer/", "/bim-notrailer"] - }`, - 'https://base.example/path1/path2/path3', - { - 'trailer/': [expect.toMatchURL('https://base.example/atrailer/')], - [`${BUILT_IN_MODULE_SCHEME}:trailer/`]: [expect.toMatchURL('https://base.example/bim-atrailer/')] - }, - [ - `Invalid address "https://base.example/notrailer" for package specifier key "trailer/". Package addresses must end with "/".`, - `Invalid address "https://base.example/bim-notrailer" for package specifier key "${BUILT_IN_MODULE_SCHEME}:trailer/". Package addresses must end with "/".` - ] + [`Invalid address "https://base.example/notrailer" for package specifier key "trailer/". Package addresses must end with "/".`] ); }); }); @@ -342,7 +167,6 @@ describe('Other invalid addresses', () => { }`, 'https://base.example/path1/path2/path3', { - foo: [] }, [`Invalid address "${bad}" for the specifier key "foo".`] ); diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-schema.js b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-schema.js index 695034533c7..f60422ae62b 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-schema.js +++ b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-schema.js @@ -45,24 +45,20 @@ describe('Mismatching the top-level schema', () => { }); describe('Mismatching the specifier map schema', () => { - const invalidAddressStrings = ['true', '1', '{}']; - const invalidInsideArrayStrings = ['null', 'true', '1', '{}', '[]']; + const invalidAddressStrings = ['null', 'true', '1', '{}', '[]', '["https://example.com/"]']; - it('should ignore entries where the address is not a string, array, or null', () => { + it('should ignore entries where the address is not a string', () => { for (const invalid of invalidAddressStrings) { expectSpecifierMap( `{ "foo": ${invalid}, - "bar": ["https://example.com/"] + "bar": "https://example.com/" }`, 'https://base.example/', { - bar: [expect.toMatchURL('https://example.com/')] + bar: expect.toMatchURL('https://example.com/') }, - [ - `Invalid address ${invalid} for the specifier key "foo". ` + - `Addresses must be strings, arrays, or null.` - ] + [`Invalid address ${invalid} for the specifier key "foo". Addresses must be strings.`] ); } }); @@ -70,7 +66,7 @@ describe('Mismatching the specifier map schema', () => { it('should ignore entries where the specifier key is an empty string', () => { expectSpecifierMap( `{ - "": ["https://example.com/"] + "": "https://example.com/" }`, 'https://base.example/', {}, @@ -78,26 +74,6 @@ describe('Mismatching the specifier map schema', () => { ); }); - it('should ignore members of an address array that are not strings', () => { - for (const invalid of invalidInsideArrayStrings) { - expectSpecifierMap( - `{ - "foo": ["https://example.com/", ${invalid}], - "bar": ["https://example.com/"] - }`, - 'https://base.example/', - { - foo: [expect.toMatchURL('https://example.com/')], - bar: [expect.toMatchURL('https://example.com/')] - }, - [ - `Invalid address ${invalid} inside the address array for the specifier key "foo". ` + - `Address arrays must only contain strings.` - ] - ); - } - }); - it('should throw if a scope\'s value is not an object', () => { for (const invalid of nonObjectStrings) { expectBad(`{ "scopes": { "https://scope.example/": ${invalid} } }`, 'https://base.example/'); @@ -120,20 +96,4 @@ describe('Normalization', () => { expect(parseFromString(`{ "imports": {} }`, 'https://base.example/')) .toEqual({ imports: {}, scopes: {} }); }); - - it('should normalize addresses to arrays', () => { - expectSpecifierMap( - `{ - "foo": "https://example.com/1", - "bar": ["https://example.com/2"], - "baz": null - }`, - 'https://base.example/', - { - foo: [expect.toMatchURL('https://example.com/1')], - bar: [expect.toMatchURL('https://example.com/2')], - baz: [] - } - ); - }); }); diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-scope-keys.js b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-scope-keys.js index cd1d9b34890..4993f3a9a8b 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-scope-keys.js +++ b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-scope-keys.js @@ -62,14 +62,14 @@ describe('Relative URL scope keys', () => { }); describe('Absolute URL scope keys', () => { - it('should only accept absolute URL scope keys with fetch schemes', () => { + it('should accept all absolute URL scope keys, with or without fetch schemes', () => { expectScopes( [ 'about:good', 'blob:good', 'data:good', 'file:///good', - 'filesystem:good', + 'filesystem:http://example.com/good/', 'http://good/', 'https://good/', 'ftp://good/', @@ -84,17 +84,16 @@ describe('Absolute URL scope keys', () => { 'blob:good', 'data:good', 'file:///good', - 'filesystem:good', + 'filesystem:http://example.com/good/', 'http://good/', 'https://good/', - 'ftp://good/' + 'ftp://good/', + 'import:bad', + 'mailto:bad', + 'javascript:bad', + 'wss://ba/' ], - [ - 'Invalid scope "import:bad". Scope URLs must have a fetch scheme.', - 'Invalid scope "mailto:bad". Scope URLs must have a fetch scheme.', - 'Invalid scope "javascript:bad". Scope URLs must have a fetch scheme.', - 'Invalid scope "wss://ba/". Scope URLs must have a fetch scheme.' - ] + [] ); }); diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-specifier-keys.js b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-specifier-keys.js index 9eb423a19eb..7ac24bf867b 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-specifier-keys.js +++ b/tests/wpt/web-platform-tests/import-maps/imported/resources/parsing-specifier-keys.js @@ -1,8 +1,5 @@ 'use strict'; const { expectSpecifierMap } = require('./helpers/parsing.js'); -const { BUILT_IN_MODULE_SCHEME } = require('../lib/utils.js'); - -const BLANK = `${BUILT_IN_MODULE_SCHEME}:blank`; describe('Relative URL-like specifier keys', () => { it('should absolutize strings prefixed with ./, ../, or / into the corresponding URLs', () => { @@ -14,9 +11,9 @@ describe('Relative URL-like specifier keys', () => { }`, 'https://base.example/path1/path2/path3', { - 'https://base.example/path1/path2/foo': [expect.toMatchURL('https://base.example/dotslash')], - 'https://base.example/path1/foo': [expect.toMatchURL('https://base.example/dotdotslash')], - 'https://base.example/foo': [expect.toMatchURL('https://base.example/slash')] + 'https://base.example/path1/path2/foo': expect.toMatchURL('https://base.example/dotslash'), + 'https://base.example/path1/foo': expect.toMatchURL('https://base.example/dotdotslash'), + 'https://base.example/foo': expect.toMatchURL('https://base.example/slash') } ); }); @@ -30,9 +27,9 @@ describe('Relative URL-like specifier keys', () => { }`, 'data:text/html,test', { - './foo': [expect.toMatchURL('https://example.com/dotslash')], - '../foo': [expect.toMatchURL('https://example.com/dotdotslash')], - '/foo': [expect.toMatchURL('https://example.com/slash')] + './foo': expect.toMatchURL('https://example.com/dotslash'), + '../foo': expect.toMatchURL('https://example.com/dotdotslash'), + '/foo': expect.toMatchURL('https://example.com/slash') } ); }); @@ -46,9 +43,9 @@ describe('Relative URL-like specifier keys', () => { }`, 'https://base.example/path1/path2/path3', { - 'https://base.example/path1/path2/': [expect.toMatchURL('https://base.example/dotslash/')], - 'https://base.example/path1/': [expect.toMatchURL('https://base.example/dotdotslash/')], - 'https://base.example/': [expect.toMatchURL('https://base.example/slash/')] + 'https://base.example/path1/path2/': expect.toMatchURL('https://base.example/dotslash/'), + 'https://base.example/path1/': expect.toMatchURL('https://base.example/dotdotslash/'), + 'https://base.example/': expect.toMatchURL('https://base.example/slash/') } ); }); @@ -66,27 +63,27 @@ describe('Relative URL-like specifier keys', () => { }`, 'https://base.example/path1/path2/path3', { - '%2E/': [expect.toMatchURL('https://base.example/dotSlash1/')], - '%2E%2E/': [expect.toMatchURL('https://base.example/dotDotSlash1/')], - '.%2F': [expect.toMatchURL('https://base.example/dotSlash2')], - '..%2F': [expect.toMatchURL('https://base.example/dotDotSlash2')], - '%2F': [expect.toMatchURL('https://base.example/slash2')], - '%2E%2F': [expect.toMatchURL('https://base.example/dotSlash3')], - '%2E%2E%2F': [expect.toMatchURL('https://base.example/dotDotSlash3')] + '%2E/': expect.toMatchURL('https://base.example/dotSlash1/'), + '%2E%2E/': expect.toMatchURL('https://base.example/dotDotSlash1/'), + '.%2F': expect.toMatchURL('https://base.example/dotSlash2'), + '..%2F': expect.toMatchURL('https://base.example/dotDotSlash2'), + '%2F': expect.toMatchURL('https://base.example/slash2'), + '%2E%2F': expect.toMatchURL('https://base.example/dotSlash3'), + '%2E%2E%2F': expect.toMatchURL('https://base.example/dotDotSlash3') } ); }); }); describe('Absolute URL specifier keys', () => { - it('should only accept absolute URL specifier keys with fetch schemes, treating others as bare specifiers', () => { + it('Accept all absolute URL specifier keys even with fetch schemes as URLs', () => { expectSpecifierMap( `{ "about:good": "/about", "blob:good": "/blob", "data:good": "/data", "file:///good": "/file", - "filesystem:good": "/filesystem", + "filesystem:http://example.com/good/": "/filesystem/", "http://good/": "/http/", "https://good/": "/https/", "ftp://good/": "/ftp/", @@ -97,18 +94,18 @@ describe('Absolute URL specifier keys', () => { }`, 'https://base.example/path1/path2/path3', { - 'about:good': [expect.toMatchURL('https://base.example/about')], - 'blob:good': [expect.toMatchURL('https://base.example/blob')], - 'data:good': [expect.toMatchURL('https://base.example/data')], - 'file:///good': [expect.toMatchURL('https://base.example/file')], - 'filesystem:good': [expect.toMatchURL('https://base.example/filesystem')], - 'http://good/': [expect.toMatchURL('https://base.example/http/')], - 'https://good/': [expect.toMatchURL('https://base.example/https/')], - 'ftp://good/': [expect.toMatchURL('https://base.example/ftp/')], - 'import:bad': [expect.toMatchURL('https://base.example/import')], - 'mailto:bad': [expect.toMatchURL('https://base.example/mailto')], - 'javascript:bad': [expect.toMatchURL('https://base.example/javascript')], - 'wss:bad': [expect.toMatchURL('https://base.example/wss')] + 'about:good': expect.toMatchURL('https://base.example/about'), + 'blob:good': expect.toMatchURL('https://base.example/blob'), + 'data:good': expect.toMatchURL('https://base.example/data'), + 'file:///good': expect.toMatchURL('https://base.example/file'), + 'filesystem:http://example.com/good/': expect.toMatchURL('https://base.example/filesystem/'), + 'http://good/': expect.toMatchURL('https://base.example/http/'), + 'https://good/': expect.toMatchURL('https://base.example/https/'), + 'ftp://good/': expect.toMatchURL('https://base.example/ftp/'), + 'import:bad': expect.toMatchURL('https://base.example/import'), + 'mailto:bad': expect.toMatchURL('https://base.example/mailto'), + 'javascript:bad': expect.toMatchURL('https://base.example/javascript'), + 'wss://bad/': expect.toMatchURL('https://base.example/wss') } ); }); @@ -127,32 +124,40 @@ describe('Absolute URL specifier keys', () => { }`, 'https://base.example/path1/path2/path3', { - 'https://ex ample.org/': [expect.toMatchURL('https://base.example/unparseable1/')], - 'https://example.com:demo': [expect.toMatchURL('https://base.example/unparseable2')], - 'http://[www.example.com]/': [expect.toMatchURL('https://base.example/unparseable3/')], - 'https://example.org/': [expect.toMatchURL('https://base.example/invalidButParseable1/')], - 'https://example.com///': [expect.toMatchURL('https://base.example/invalidButParseable2/')], - 'https://example.net/': [expect.toMatchURL('https://base.example/prettyNormal/')], - 'https://example.com/': [expect.toMatchURL('https://base.example/percentDecoding/')], - 'https://example.com/%41': [expect.toMatchURL('https://base.example/noPercentDecoding')] + 'https://ex ample.org/': expect.toMatchURL('https://base.example/unparseable1/'), + 'https://example.com:demo': expect.toMatchURL('https://base.example/unparseable2'), + 'http://[www.example.com]/': expect.toMatchURL('https://base.example/unparseable3/'), + 'https://example.org/': expect.toMatchURL('https://base.example/invalidButParseable1/'), + 'https://example.com///': expect.toMatchURL('https://base.example/invalidButParseable2/'), + 'https://example.net/': expect.toMatchURL('https://base.example/prettyNormal/'), + 'https://example.com/': expect.toMatchURL('https://base.example/percentDecoding/'), + 'https://example.com/%41': expect.toMatchURL('https://base.example/noPercentDecoding') } ); }); - it('should parse built-in module specifier keys, including with a "/"', () => { + it('should sort correctly (issue #181)', () => { expectSpecifierMap( `{ - "${BLANK}": "/blank", - "${BLANK}/": "/blank/", - "${BLANK}/foo": "/blank/foo", - "${BLANK}\\\\foo": "/blank/backslashfoo" + "https://example.com/aaa": "https://example.com/aaa", + "https://example.com/a": "https://example.com/a" }`, - 'https://base.example/path1/path2/path3', + 'https://base.example/', { - [BLANK]: [expect.toMatchURL('https://base.example/blank')], - [`${BLANK}/`]: [expect.toMatchURL('https://base.example/blank/')], - [`${BLANK}/foo`]: [expect.toMatchURL('https://base.example/blank/foo')], - [`${BLANK}\\foo`]: [expect.toMatchURL('https://base.example/blank/backslashfoo')] + 'https://example.com/aaa': expect.toMatchURL('https://example.com/aaa'), + 'https://example.com/a': expect.toMatchURL('https://example.com/a') + } + ); + + expectSpecifierMap( + `{ + "https://example.com/a": "https://example.com/a", + "https://example.com/aaa": "https://example.com/aaa" + }`, + 'https://base.example/', + { + 'https://example.com/aaa': expect.toMatchURL('https://example.com/aaa'), + 'https://example.com/a': expect.toMatchURL('https://example.com/a') } ); }); diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-scopes.js b/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-scopes.js index ca19a668406..d133b50bd2b 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-scopes.js +++ b/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving-scopes.js @@ -16,20 +16,6 @@ describe('Mapped using scope instead of "imports"', () => { const inJSDirURL = new URL('https://example.com/js/app.mjs'); const topLevelURL = new URL('https://example.com/app.mjs'); - it('should fail when the mapping is to an empty array', () => { - const resolveUnderTest = makeResolveUnderTest(`{ - "scopes": { - "/js/": { - "moment": null, - "lodash": [] - } - } - }`); - - expect(() => resolveUnderTest('moment', inJSDirURL)).toThrow(TypeError); - expect(() => resolveUnderTest('lodash', inJSDirURL)).toThrow(TypeError); - }); - describe('Exact vs. prefix based matching', () => { it('should match correctly when both are in the map', () => { const resolveUnderTest = makeResolveUnderTest(`{ @@ -153,14 +139,17 @@ describe('Mapped using scope instead of "imports"', () => { "imports": { "a": "/a-1.mjs", "b": "/b-1.mjs", - "c": "/c-1.mjs" + "c": "/c-1.mjs", + "d": "/d-1.mjs" }, "scopes": { "/scope2/": { - "a": "/a-2.mjs" + "a": "/a-2.mjs", + "d": "/d-2.mjs" }, "/scope2/scope3/": { - "b": "/b-3.mjs" + "b": "/b-3.mjs", + "d": "/d-3.mjs" } } }`); @@ -173,18 +162,21 @@ describe('Mapped using scope instead of "imports"', () => { expect(resolveUnderTest('a', scope1URL)).toMatchURL('https://example.com/a-1.mjs'); expect(resolveUnderTest('b', scope1URL)).toMatchURL('https://example.com/b-1.mjs'); expect(resolveUnderTest('c', scope1URL)).toMatchURL('https://example.com/c-1.mjs'); + expect(resolveUnderTest('d', scope1URL)).toMatchURL('https://example.com/d-1.mjs'); }); it('should use a direct scope override', () => { expect(resolveUnderTest('a', scope2URL)).toMatchURL('https://example.com/a-2.mjs'); expect(resolveUnderTest('b', scope2URL)).toMatchURL('https://example.com/b-1.mjs'); expect(resolveUnderTest('c', scope2URL)).toMatchURL('https://example.com/c-1.mjs'); + expect(resolveUnderTest('d', scope2URL)).toMatchURL('https://example.com/d-2.mjs'); }); it('should use an indirect scope override', () => { expect(resolveUnderTest('a', scope3URL)).toMatchURL('https://example.com/a-2.mjs'); expect(resolveUnderTest('b', scope3URL)).toMatchURL('https://example.com/b-3.mjs'); expect(resolveUnderTest('c', scope3URL)).toMatchURL('https://example.com/c-1.mjs'); + expect(resolveUnderTest('d', scope3URL)).toMatchURL('https://example.com/d-3.mjs'); }); }); diff --git a/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving.js b/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving.js index 29ee31ccbc9..ef8a4f87d25 100644 --- a/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving.js +++ b/tests/wpt/web-platform-tests/import-maps/imported/resources/resolving.js @@ -42,11 +42,11 @@ describe('Unmapped', () => { expect(resolveUnderTest('https://///example.com///')).toMatchURL('https://example.com///'); }); - it('should fail for absolute non-fetch-scheme URLs', () => { - expect(() => resolveUnderTest('mailto:bad')).toThrow(TypeError); - expect(() => resolveUnderTest('import:bad')).toThrow(TypeError); - expect(() => resolveUnderTest('javascript:bad')).toThrow(TypeError); - expect(() => resolveUnderTest('wss:bad')).toThrow(TypeError); + it('should parse absolute non-fetch-scheme URLs', () => { + expect(resolveUnderTest('mailto:bad')).toMatchURL('mailto:bad'); + expect(resolveUnderTest('import:bad')).toMatchURL('import:bad'); + expect(resolveUnderTest('javascript:bad')).toMatchURL('javascript:bad'); + expect(resolveUnderTest('wss:bad')).toMatchURL('wss://bad/'); }); it('should fail for strings not parseable as absolute URLs and not starting with ./ ../ or /', () => { @@ -64,18 +64,6 @@ describe('Unmapped', () => { }); describe('Mapped using the "imports" key only (no scopes)', () => { - it('should fail when the mapping is to an empty array', () => { - const resolveUnderTest = makeResolveUnderTest(`{ - "imports": { - "moment": null, - "lodash": [] - } - }`); - - expect(() => resolveUnderTest('moment')).toThrow(TypeError); - expect(() => resolveUnderTest('lodash')).toThrow(TypeError); - }); - describe('Package-like scenarios', () => { const resolveUnderTest = makeResolveUnderTest(`{ "imports": { @@ -84,8 +72,7 @@ describe('Mapped using the "imports" key only (no scopes)', () => { "lodash-dot": "./node_modules/lodash-es/lodash.js", "lodash-dot/": "./node_modules/lodash-es/", "lodash-dotdot": "../node_modules/lodash-es/lodash.js", - "lodash-dotdot/": "../node_modules/lodash-es/", - "nowhere/": [] + "lodash-dotdot/": "../node_modules/lodash-es/" } }`); @@ -110,10 +97,6 @@ describe('Mapped using the "imports" key only (no scopes)', () => { expect(() => resolveUnderTest('underscore/')).toThrow(TypeError); expect(() => resolveUnderTest('underscore/foo')).toThrow(TypeError); }); - - it('should fail for package submodules that map to nowhere', () => { - expect(() => resolveUnderTest('nowhere/foo')).toThrow(TypeError); - }); }); describe('Tricky specifiers', () => { @@ -121,6 +104,7 @@ describe('Mapped using the "imports" key only (no scopes)', () => { "imports": { "package/withslash": "/node_modules/package-with-slash/index.mjs", "not-a-package": "/lib/not-a-package.mjs", + "only-slash/": "/lib/only-slash/", ".": "/lib/dot.mjs", "..": "/lib/dotdot.mjs", "..\\\\": "/lib/dotdotbackslash.mjs", @@ -144,20 +128,19 @@ describe('Mapped using the "imports" key only (no scopes)', () => { it('should fail for attempting to get a submodule of something not declared with a trailing slash', () => { expect(() => resolveUnderTest('not-a-package/foo')).toThrow(TypeError); }); + + it('should fail for attempting to get a module if only a trailing-slash version is present', () => { + expect(() => resolveUnderTest('only-slash')).toThrow(TypeError); + }); }); describe('URL-like specifiers', () => { const resolveUnderTest = makeResolveUnderTest(`{ "imports": { - "/node_modules/als-polyfill/index.mjs": "std:kv-storage", - "/lib/foo.mjs": "./more/bar.mjs", "./dotrelative/foo.mjs": "/lib/dot.mjs", "../dotdotrelative/foo.mjs": "/lib/dotdot.mjs", - "/lib/no.mjs": null, - "./dotrelative/no.mjs": [], - "/": "/lib/slash-only/", "./": "/lib/dotslash-only/", @@ -181,16 +164,6 @@ describe('Mapped using the "imports" key only (no scopes)', () => { expect(resolveUnderTest('../dotdotrelative/foo.mjs')).toMatchURL('https://example.com/lib/dotdot.mjs'); }); - it('should fail for URLs that remap to empty arrays', () => { - expect(() => resolveUnderTest('https://example.com/lib/no.mjs')).toThrow(TypeError); - expect(() => resolveUnderTest('/lib/no.mjs')).toThrow(TypeError); - expect(() => resolveUnderTest('../lib/no.mjs')).toThrow(TypeError); - - expect(() => resolveUnderTest('https://example.com/app/dotrelative/no.mjs')).toThrow(TypeError); - expect(() => resolveUnderTest('/app/dotrelative/no.mjs')).toThrow(TypeError); - expect(() => resolveUnderTest('../app/dotrelative/no.mjs')).toThrow(TypeError); - }); - it('should remap URLs that are just composed from / and .', () => { expect(resolveUnderTest('https://example.com/')).toMatchURL('https://example.com/lib/slash-only/'); expect(resolveUnderTest('/')).toMatchURL('https://example.com/lib/slash-only/'); @@ -212,7 +185,7 @@ describe('Mapped using the "imports" key only (no scopes)', () => { }); describe('Overlapping entries with trailing slashes', () => { - it('should favor the most-specific key (no empty arrays)', () => { + it('should favor the most-specific key', () => { const resolveUnderTest = makeResolveUnderTest(`{ "imports": { "a": "/1", @@ -229,11 +202,9 @@ describe('Mapped using the "imports" key only (no scopes)', () => { expect(resolveUnderTest('a/b/c')).toMatchURL('https://example.com/4/c'); }); - it('should favor the most-specific key when empty arrays are involved for less-specific keys', () => { + it('should favor the most-specific key when there are no mappings for less-specific keys', () => { const resolveUnderTest = makeResolveUnderTest(`{ "imports": { - "a": [], - "a/": [], "a/b": "/3", "a/b/": "/4/" } @@ -247,24 +218,15 @@ describe('Mapped using the "imports" key only (no scopes)', () => { expect(resolveUnderTest('a/b/c')).toMatchURL('https://example.com/4/c'); expect(() => resolveUnderTest('a/x/c')).toThrow(TypeError); }); + }); - it('should favor the most-specific key when empty arrays are involved for more-specific keys', () => { - const resolveUnderTest = makeResolveUnderTest(`{ - "imports": { - "a": "/1", - "a/": "/2/", - "a/b": [], - "a/b/": [] - } - }`); + it('should deal with data: URL bases', () => { + const resolveUnderTest = makeResolveUnderTest(`{ + "imports": { + "foo/": "data:text/javascript,foo/" + } + }`); - expect(resolveUnderTest('a')).toMatchURL('https://example.com/1'); - expect(resolveUnderTest('a/')).toMatchURL('https://example.com/2/'); - expect(resolveUnderTest('a/x')).toMatchURL('https://example.com/2/x'); - expect(() => resolveUnderTest('a/b')).toThrow(TypeError); - expect(() => resolveUnderTest('a/b/')).toThrow(TypeError); - expect(() => resolveUnderTest('a/b/c')).toThrow(TypeError); - expect(resolveUnderTest('a/x/c')).toMatchURL('https://example.com/2/x/c'); - }); + expect(() => resolveUnderTest('foo/bar')).toThrow(TypeError); }); }); diff --git a/tests/wpt/web-platform-tests/import-maps/resources/jest-test-helper.js b/tests/wpt/web-platform-tests/import-maps/resources/jest-test-helper.js index 8d9236a84d8..8fa7b65adb5 100644 --- a/tests/wpt/web-platform-tests/import-maps/resources/jest-test-helper.js +++ b/tests/wpt/web-platform-tests/import-maps/resources/jest-test-helper.js @@ -15,6 +15,22 @@ function require(name) { }, exports); } +// Sort keys and then stringify for comparison. +function stringifyImportMap(importMap) { + function getKeys(m) { + if (typeof m !== 'object') + return []; + + let keys = []; + for (const key in m) { + keys.push(key); + keys = keys.concat(getKeys(m[key])); + } + return keys; + } + return JSON.stringify(importMap, getKeys(importMap).sort()); +} + function expect(v) { return { toMatchURL: expected => assert_equals(v, expected), @@ -34,10 +50,8 @@ function expect(v) { const actualParsedImportMap = JSON.parse( internals.getParsedImportMap(v.contentDocument)); assert_equals( - JSON.stringify(actualParsedImportMap, - Object.keys(actualParsedImportMap).sort()), - JSON.stringify(expected.imports, - Object.keys(expected.imports).sort()) + stringifyImportMap(actualParsedImportMap), + stringifyImportMap(expected) ); } else { assert_object_equals(v, expected); @@ -75,6 +89,11 @@ function it(message, f) { // Currently document.write() is used to make everything synchronous, which // is just needed for running the existing Jest-based tests easily. function parseFromString(mapString, mapBaseURL) { + // We can't test data: base URLs because rejects data: URLs. + if (new URL(mapBaseURL).protocol === 'data:') { + throw Error('test helper does not support data: base URLs'); + } + const iframe = document.createElement('iframe'); document.body.appendChild(iframe); iframe.contentDocument.write(` diff --git a/tests/wpt/web-platform-tests/import-maps/resources/test-helper.js b/tests/wpt/web-platform-tests/import-maps/resources/test-helper.js index 2447bfb9435..f21ad935baa 100644 --- a/tests/wpt/web-platform-tests/import-maps/resources/test-helper.js +++ b/tests/wpt/web-platform-tests/import-maps/resources/test-helper.js @@ -153,7 +153,7 @@ function testStaticImport(importMapString, importMapBaseURL, specifier, expected const script = document.createElement("script"); script.setAttribute("type", "module"); script.setAttribute("src", - "/import-maps/static-import.js?pipe=sub(none)&url=" + + "static-import.js?pipe=sub(none)&url=" + encodeURIComponent("${specifier}")); script.addEventListener("load", handlers[Handler.ScriptLoadEvent]); script.addEventListener("error", handlers[Handler.ScriptErrorEvent]); diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/ahem.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/ahem.html.ini new file mode 100644 index 00000000000..8587775d8fc --- /dev/null +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/ahem.html.ini @@ -0,0 +1,3 @@ +[ahem.html] + expected: + if product == "safari": FAIL # system fonts not loaded since macOS Mojave diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini index c9fbabede6d..c6f136d9715 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/assumptions/allowed-to-play.html.ini @@ -2,7 +2,10 @@ expected: if product == "safari": ERROR # https://bugs.webkit.org/show_bug.cgi?id=190775 - [