diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-08-23 19:22:15 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-23 19:22:15 -0400 |
commit | 2fb324e174ed75eb545a6936c54c6944f24fadd6 (patch) | |
tree | 53f4ceac31d7398369d3d490d5d06a2aee6b978d | |
parent | 6680f8aae035157167b9b832ef72c43ca8592eff (diff) | |
parent | 482fda3a78d188fdaa5a6c1a11ead2d27861e8dc (diff) | |
download | servo-2fb324e174ed75eb545a6936c54c6944f24fadd6.tar.gz servo-2fb324e174ed75eb545a6936c54c6944f24fadd6.zip |
Auto merge of #24039 - servo-wpt-sync:wpt_update_23-08-2019, r=servo-wpt-sync
Sync WPT with upstream (23-08-2019)
Automated downstream sync of changes from upstream as of 23-08-2019.
[no-wpt-sync]
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/24039)
<!-- Reviewable:end -->
524 files changed, 14684 insertions, 3268 deletions
diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index a9e46713244..76b398963ae 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -7,7 +7,7 @@ expected: FAIL [Opening a blob URL in a new window immediately before revoking it works.] - expected: TIMEOUT + expected: FAIL [Opening a blob URL in a noopener about:blank window immediately before revoking it works.] expected: FAIL diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 15ec7336ee8..43826c8d5ba 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -105957,6 +105957,18 @@ {} ] ], + "css/css-backgrounds/background-position-negative-percentage-comparison.html": [ + [ + "css/css-backgrounds/background-position-negative-percentage-comparison.html", + [ + [ + "/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-backgrounds/background-repeat/background-repeat-no-repeat.xht": [ [ "css/css-backgrounds/background-repeat/background-repeat-no-repeat.xht", @@ -113505,6 +113517,18 @@ {} ] ], + "css/css-contain/contain-size-012b.html": [ + [ + "css/css-contain/contain-size-012b.html", + [ + [ + "/css/css-contain/reference/pass_if_pass_below_clipped.html", + "==" + ] + ], + {} + ] + ], "css/css-contain/contain-size-013.html": [ [ "css/css-contain/contain-size-013.html", @@ -117861,6 +117885,18 @@ {} ] ], + "css/css-flexbox/dynamic-change-simplified-layout.html": [ + [ + "css/css-flexbox/dynamic-change-simplified-layout.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-flexbox/fit-content-item-001.html": [ [ "css/css-flexbox/fit-content-item-001.html", @@ -117873,6 +117909,42 @@ {} ] ], + "css/css-flexbox/fit-content-item-002.html": [ + [ + "css/css-flexbox/fit-content-item-002.html", + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], + "css/css-flexbox/fit-content-item-003.html": [ + [ + "css/css-flexbox/fit-content-item-003.html", + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], + "css/css-flexbox/fit-content-item-004.html": [ + [ + "css/css-flexbox/fit-content-item-004.html", + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "css/css-flexbox/flex-001.htm": [ [ "css/css-flexbox/flex-001.htm", @@ -119289,6 +119361,18 @@ {} ] ], + "css/css-flexbox/flexbox_align-items-stretch-3.html": [ + [ + "css/css-flexbox/flexbox_align-items-stretch-3.html", + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "css/css-flexbox/flexbox_align-items-stretch.html": [ [ "css/css-flexbox/flexbox_align-items-stretch.html", @@ -128119,6 +128203,174 @@ {} ] ], + "css/css-layout-api/edges/all.https.html": [ + [ + "css/css-layout-api/edges/all.https.html", + [ + [ + "/css/css-layout-api/edges/all-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/border-htb-rtl.https.html": [ + [ + "css/css-layout-api/edges/border-htb-rtl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/border-htb.https.html": [ + [ + "css/css-layout-api/edges/border-htb.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/border-vlr-rtl.https.html": [ + [ + "css/css-layout-api/edges/border-vlr-rtl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/border-vlr.https.html": [ + [ + "css/css-layout-api/edges/border-vlr.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/border-vrl-rtl.https.html": [ + [ + "css/css-layout-api/edges/border-vrl-rtl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/border-vrl.https.html": [ + [ + "css/css-layout-api/edges/border-vrl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/padding-htb-rtl.https.html": [ + [ + "css/css-layout-api/edges/padding-htb-rtl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/padding-htb.https.html": [ + [ + "css/css-layout-api/edges/padding-htb.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/padding-vlr-rtl.https.html": [ + [ + "css/css-layout-api/edges/padding-vlr-rtl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/padding-vlr.https.html": [ + [ + "css/css-layout-api/edges/padding-vlr.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/padding-vrl-rtl.https.html": [ + [ + "css/css-layout-api/edges/padding-vrl-rtl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/padding-vrl.https.html": [ + [ + "css/css-layout-api/edges/padding-vrl.https.html", + [ + [ + "/css/css-layout-api/green-square-ref.html", + "==" + ] + ], + {} + ] + ], + "css/css-layout-api/edges/scrollbar.https.html": [ + [ + "css/css-layout-api/edges/scrollbar.https.html", + [ + [ + "/css/css-layout-api/edges/scrollbar-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-layout-api/fallback-layout/bad-return.https.html": [ [ "css/css-layout-api/fallback-layout/bad-return.https.html", @@ -204981,6 +205233,66 @@ {} ] ], + "mathml/relations/css-styling/displaystyle-011.html": [ + [ + "mathml/relations/css-styling/displaystyle-011.html", + [ + [ + "/mathml/relations/css-styling/displaystyle-011-ref.html", + "==" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/displaystyle-012.html": [ + [ + "mathml/relations/css-styling/displaystyle-012.html", + [ + [ + "/mathml/relations/css-styling/displaystyle-012-ref.html", + "==" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/displaystyle-013.html": [ + [ + "mathml/relations/css-styling/displaystyle-013.html", + [ + [ + "/mathml/relations/css-styling/displaystyle-013-ref.html", + "==" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/displaystyle-014.html": [ + [ + "mathml/relations/css-styling/displaystyle-014.html", + [ + [ + "/mathml/relations/css-styling/displaystyle-014-ref.html", + "==" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/displaystyle-015.html": [ + [ + "mathml/relations/css-styling/displaystyle-015.html", + [ + [ + "/mathml/relations/css-styling/displaystyle-015-ref.html", + "==" + ] + ], + {} + ] + ], "mathml/relations/css-styling/dynamic-dir-1.html": [ [ "mathml/relations/css-styling/dynamic-dir-1.html", @@ -205005,6 +205317,114 @@ {} ] ], + "mathml/relations/css-styling/mathbackground-001.html": [ + [ + "mathml/relations/css-styling/mathbackground-001.html", + [ + [ + "/mathml/relations/css-styling/mathbackground-001-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathbackground-002.html": [ + [ + "mathml/relations/css-styling/mathbackground-002.html", + [ + [ + "/mathml/relations/css-styling/mathbackground-002-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathbackground-003.html": [ + [ + "mathml/relations/css-styling/mathbackground-003.html", + [ + [ + "/mathml/relations/css-styling/mathbackground-003-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathbackground-004.html": [ + [ + "mathml/relations/css-styling/mathbackground-004.html", + [ + [ + "/mathml/relations/css-styling/mathbackground-004-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathcolor-001.html": [ + [ + "mathml/relations/css-styling/mathcolor-001.html", + [ + [ + "/mathml/relations/css-styling/mathcolor-001-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathcolor-002.html": [ + [ + "mathml/relations/css-styling/mathcolor-002.html", + [ + [ + "/mathml/relations/css-styling/mathcolor-002-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathcolor-003.html": [ + [ + "mathml/relations/css-styling/mathcolor-003.html", + [ + [ + "/mathml/relations/css-styling/mathcolor-003-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathcolor-004.html": [ + [ + "mathml/relations/css-styling/mathcolor-004.html", + [ + [ + "/mathml/relations/css-styling/mathcolor-004-notref.html", + "!=" + ] + ], + {} + ] + ], + "mathml/relations/css-styling/mathsize-attribute-css-keywords.html": [ + [ + "mathml/relations/css-styling/mathsize-attribute-css-keywords.html", + [ + [ + "/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html", + "==" + ] + ], + {} + ] + ], "mathml/relations/css-styling/mathsize-attribute-legacy-values.html": [ [ "mathml/relations/css-styling/mathsize-attribute-legacy-values.html", @@ -210155,6 +210575,18 @@ {} ] ], + "webvtt/rendering/cues-with-video/processing-model/snap-to-line.html": [ + [ + "webvtt/rendering/cues-with-video/processing-model/snap-to-line.html", + [ + [ + "/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html", + "==" + ] + ], + {} + ] + ], "webvtt/rendering/cues-with-video/processing-model/too_many_cues.html": [ [ "webvtt/rendering/cues-with-video/processing-model/too_many_cues.html", @@ -212225,6 +212657,18 @@ "2dcontext/imagebitmap/common.sub.js": [ [] ], + "2dcontext/imagebitmap/resources/coop-coep-popup.html": [ + [] + ], + "2dcontext/imagebitmap/resources/coop-coep-popup.html.headers": [ + [] + ], + "2dcontext/imagebitmap/resources/coop-coep-worker.js": [ + [] + ], + "2dcontext/imagebitmap/resources/coop-coep-worker.js.headers": [ + [] + ], "2dcontext/imagebitmap/transfer-worker.js": [ [] ], @@ -214679,7 +215123,7 @@ "bluetooth/resources/health-thermometer-iframe.html": [ [] ], - "bluetooth/script-tests/base_test_html.template": [ + "bluetooth/script-tests/base_test_js.template": [ [] ], "bluetooth/script-tests/characteristic/characteristic-is-removed.js": [ @@ -244373,6 +244817,9 @@ "css/css-backgrounds/reference/background-paint-order-001-ref.html": [ [] ], + "css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html": [ + [] + ], "css/css-backgrounds/reference/background-rounded-image-clip.html": [ [] ], @@ -251978,6 +252425,15 @@ "css/css-layout-api/constraints/support/constraints-fixed-inline-size.js": [ [] ], + "css/css-layout-api/edges/all-ref.html": [ + [] + ], + "css/css-layout-api/edges/scrollbar-ref.html": [ + [] + ], + "css/css-layout-api/edges/support/edges.js": [ + [] + ], "css/css-layout-api/fallback-layout/fallback-ref.html": [ [] ], @@ -265433,6 +265889,9 @@ "element-timing/resources/iframe-stores-entry.html": [ [] ], + "element-timing/resources/iframe-with-content.html": [ + [] + ], "element-timing/resources/iframe-with-square-sends-entry.html": [ [] ], @@ -268712,9 +269171,15 @@ "html/cross-origin-embedder-policy/non-initial-about-blank.https.html.headers": [ [] ], + "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers": [ + [] + ], "html/cross-origin-embedder-policy/none.https.html.headers": [ [] ], + "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers": [ + [] + ], "html/cross-origin-embedder-policy/require-corp.https.html.headers": [ [] ], @@ -268748,6 +269213,9 @@ "html/cross-origin-embedder-policy/resources/script-factory.js": [ [] ], + "html/cross-origin-embedder-policy/resources/sw.js": [ + [] + ], "html/cross-origin-embedder-policy/sandbox.https.html.headers": [ [] ], @@ -271901,12 +272369,15 @@ "html/infrastructure/urls/resolving-urls/query-encoding/resources/stash.py": [ [] ], - "html/interaction/focus/document-level-focus-apis/test.html": [ + "html/interaction/focus/document-level-focus-apis/support/test.html": [ [] ], "html/interaction/focus/processing-model/support/preventScroll-helper.html": [ [] ], + "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html": [ + [] + ], "html/obsolete/META.yml": [ [] ], @@ -275420,12 +275891,54 @@ "mathml/relations/css-styling/display-1-ref.html": [ [] ], + "mathml/relations/css-styling/displaystyle-011-ref.html": [ + [] + ], + "mathml/relations/css-styling/displaystyle-012-ref.html": [ + [] + ], + "mathml/relations/css-styling/displaystyle-013-ref.html": [ + [] + ], + "mathml/relations/css-styling/displaystyle-014-ref.html": [ + [] + ], + "mathml/relations/css-styling/displaystyle-015-ref.html": [ + [] + ], "mathml/relations/css-styling/dynamic-dir-1-ref.html": [ [] ], "mathml/relations/css-styling/lengths-1-ref.html": [ [] ], + "mathml/relations/css-styling/mathbackground-001-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathbackground-002-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathbackground-003-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathbackground-004-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathcolor-001-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathcolor-002-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathcolor-003-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathcolor-004-notref.html": [ + [] + ], + "mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html": [ + [] + ], "mathml/relations/css-styling/mathsize-attribute-legacy-values-ref.html": [ [] ], @@ -279584,6 +280097,9 @@ "scroll-animations/resources/scrolltimeline-utils.js": [ [] ], + "scroll-to-text-fragment/scroll-to-text-fragment-target.html": [ + [] + ], "secure-contexts/META.yml": [ [] ], @@ -280463,6 +280979,9 @@ "service-workers/service-worker/resources/client-navigated-frame.html": [ [] ], + "service-workers/service-worker/resources/clients-frame-freeze.html": [ + [] + ], "service-workers/service-worker/resources/clients-get-client-types-frame-worker.js": [ [] ], @@ -286031,6 +286550,9 @@ "tools/wptrunner/requirements.txt": [ [] ], + "tools/wptrunner/requirements_android_webview.txt": [ + [] + ], "tools/wptrunner/requirements_chrome.txt": [ [] ], @@ -286166,6 +286688,9 @@ "tools/wptrunner/wptrunner/browsers/__init__.py": [ [] ], + "tools/wptrunner/wptrunner/browsers/android_webview.py": [ + [] + ], "tools/wptrunner/wptrunner/browsers/base.py": [ [] ], @@ -289187,6 +289712,9 @@ "webvtt/rendering/cues-with-video/processing-model/size_50-ref.html": [ [] ], + "webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html": [ + [] + ], "webvtt/rendering/cues-with-video/processing-model/support/2_cues_overlapping_completely_move_up.vtt": [ [] ], @@ -289319,6 +289847,9 @@ "webvtt/rendering/cues-with-video/processing-model/support/size_50.vtt": [ [] ], + "webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt": [ + [] + ], "webvtt/rendering/cues-with-video/processing-model/support/start_alignment.vtt": [ [] ], @@ -293251,6 +293782,23 @@ {} ] ], + "2dcontext/imagebitmap/no-coop-coep.https.window.js": [ + [ + "2dcontext/imagebitmap/no-coop-coep.https.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "/common/get-host-info.sub.js" + ] + ] + } + ] + ], "2dcontext/line-styles/2d.line.cap.butt.html": [ [ "2dcontext/line-styles/2d.line.cap.butt.html", @@ -306126,6 +306674,209 @@ } ] ], + "bluetooth/adapter/adapter-absent-getAvailability.https.window.js": [ + [ + "bluetooth/adapter/adapter-absent-getAvailability.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] + } + ] + ], + "bluetooth/adapter/adapter-added-getAvailability.https.window.js": [ + [ + "bluetooth/adapter/adapter-added-getAvailability.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] + } + ] + ], + "bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js": [ + [ + "bluetooth/adapter/adapter-powered-off-getAvailability.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] + } + ] + ], + "bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js": [ + [ + "bluetooth/adapter/adapter-powered-on-getAvailability.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] + } + ] + ], + "bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js": [ + [ + "bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] + } + ] + ], + "bluetooth/adapter/adapter-removed-getAvailability.https.window.js": [ + [ + "bluetooth/adapter/adapter-removed-getAvailability.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] + } + ] + ], + "bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js": [ + [ + "bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.html", + { + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] + } + ] + ], "bluetooth/characteristic/characteristicProperties.https.window.js": [ [ "bluetooth/characteristic/characteristicProperties.https.window.html", @@ -306155,67 +306906,235 @@ } ] ], - "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html": [ + "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js": [ [ - "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html", + "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html": [ + "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js": [ [ - "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html", + "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html": [ + "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js": [ [ - "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html", + "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html": [ + "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js": [ [ - "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html", + "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html": [ + "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js": [ [ - "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html", + "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html": [ + "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js": [ [ - "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html", + "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html": [ + "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js": [ [ - "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html", + "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html": [ + "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js": [ [ - "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html", + "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -306364,11 +307283,32 @@ } ] ], - "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html": [ + "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js": [ [ - "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html", + "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -306517,11 +307457,32 @@ } ] ], - "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [ + "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js": [ [ - "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html", + "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -306583,11 +307544,32 @@ } ] ], - "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html": [ + "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js": [ [ - "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html", + "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -306649,67 +307631,235 @@ } ] ], - "bluetooth/descriptor/readValue/gen-service-is-removed.https.html": [ + "bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js": [ [ - "bluetooth/descriptor/readValue/gen-service-is-removed.https.html", + "bluetooth/descriptor/readValue/gen-service-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/descriptor/readValue/read-succeeds.https.html": [ + "bluetooth/descriptor/readValue/read-succeeds.https.window.js": [ [ - "bluetooth/descriptor/readValue/read-succeeds.https.html", + "bluetooth/descriptor/readValue/read-succeeds.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/descriptor/writeValue/buffer-is-detached.https.html": [ + "bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js": [ [ - "bluetooth/descriptor/writeValue/buffer-is-detached.https.html", + "bluetooth/descriptor/writeValue/buffer-is-detached.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/descriptor/writeValue/gen-service-is-removed.https.html": [ + "bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js": [ [ - "bluetooth/descriptor/writeValue/gen-service-is-removed.https.html", + "bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/device/gattserverdisconnected-event/disconnected.https.html": [ + "bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js": [ [ - "bluetooth/device/gattserverdisconnected-event/disconnected.https.html", + "bluetooth/device/gattserverdisconnected-event/disconnected.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html": [ + "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js": [ [ - "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html", + "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html": [ + "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js": [ [ - "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html", + "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html": [ + "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js": [ [ - "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html", + "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -307122,131 +308272,467 @@ } ] ], - "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html": [ + "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html", + "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html": [ + "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html", + "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html": [ + "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html", + "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html": [ + "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html", + "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html": [ + "bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html", + "bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html": [ + "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html", + "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html": [ + "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html", + "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html": [ + "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html", + "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html": [ + "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html", + "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html": [ + "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html", + "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-get-same-object.https.html": [ + "bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-get-same-object.https.html", + "bluetooth/server/getPrimaryService/gen-get-same-object.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html": [ + "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html", + "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html": [ + "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html", + "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html": [ + "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html", + "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html": [ + "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html", + "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryService/gen-service-not-found.https.html": [ + "bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js": [ [ - "bluetooth/server/getPrimaryService/gen-service-not-found.https.html", + "bluetooth/server/getPrimaryService/gen-service-not-found.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -307290,211 +308776,757 @@ } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html": [ + "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html", + "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html": [ + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html": [ + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html": [ + "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html", + "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html": [ + "bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html", + "bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html": [ + "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html", + "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html": [ + "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html", + "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html": [ + "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js": [ [ - "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html", + "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -307546,59 +309578,206 @@ } ] ], - "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html": [ + "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js": [ [ - "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html", + "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html": [ + "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js": [ [ - "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html", + "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html": [ + "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js": [ [ - "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html", + "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristic/gen-get-same-object.https.html": [ + "bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js": [ [ - "bluetooth/service/getCharacteristic/gen-get-same-object.https.html", + "bluetooth/service/getCharacteristic/gen-get-same-object.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html": [ + "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js": [ [ - "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html", + "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristic/gen-reconnect-during.https.html": [ + "bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js": [ [ - "bluetooth/service/getCharacteristic/gen-reconnect-during.https.html", + "bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristic/gen-service-is-removed.https.html": [ + "bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js": [ [ - "bluetooth/service/getCharacteristic/gen-service-is-removed.https.html", + "bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -307634,91 +309813,322 @@ } ] ], - "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html": [ + "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html", + "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html": [ + "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html", + "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html": [ + "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html", + "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html": [ + "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html", + "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html": [ + "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html", + "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-get-same-object.https.html": [ + "bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-get-same-object.https.html", + "bluetooth/service/getCharacteristics/gen-get-same-object.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html": [ + "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html", + "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html": [ + "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html", + "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-reconnect-during.https.html": [ + "bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-reconnect-during.https.html", + "bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html": [ + "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html", + "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], - "bluetooth/service/getCharacteristics/gen-service-is-removed.https.html": [ + "bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js": [ [ - "bluetooth/service/getCharacteristics/gen-service-is-removed.https.html", + "bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.html", { - "testdriver": true + "script_metadata": [ + [ + "script", + "/resources/testharness.js" + ], + [ + "script", + "/resources/testharnessreport.js" + ], + [ + "script", + "/resources/testdriver.js" + ], + [ + "script", + "/resources/testdriver-vendor.js" + ], + [ + "script", + "/bluetooth/resources/bluetooth-helpers.js" + ] + ] } ] ], @@ -312835,6 +315245,30 @@ {} ] ], + "css/css-backgrounds/animations/background-color-interpolation.html": [ + [ + "css/css-backgrounds/animations/background-color-interpolation.html", + {} + ] + ], + "css/css-backgrounds/animations/background-position-interpolation.html": [ + [ + "css/css-backgrounds/animations/background-position-interpolation.html", + {} + ] + ], + "css/css-backgrounds/animations/background-position-origin-interpolation.html": [ + [ + "css/css-backgrounds/animations/background-position-origin-interpolation.html", + {} + ] + ], + "css/css-backgrounds/animations/background-size-interpolation.html": [ + [ + "css/css-backgrounds/animations/background-size-interpolation.html", + {} + ] + ], "css/css-backgrounds/background-331.html": [ [ "css/css-backgrounds/background-331.html", @@ -314739,6 +317173,36 @@ {} ] ], + "css/css-fonts/animations/font-size-adjust-interpolation.html": [ + [ + "css/css-fonts/animations/font-size-adjust-interpolation.html", + {} + ] + ], + "css/css-fonts/animations/font-size-interpolation-001.html": [ + [ + "css/css-fonts/animations/font-size-interpolation-001.html", + {} + ] + ], + "css/css-fonts/animations/font-size-interpolation-002.html": [ + [ + "css/css-fonts/animations/font-size-interpolation-002.html", + {} + ] + ], + "css/css-fonts/animations/font-size-interpolation-003.html": [ + [ + "css/css-fonts/animations/font-size-interpolation-003.html", + {} + ] + ], + "css/css-fonts/animations/font-variation-settings-interpolation.html": [ + [ + "css/css-fonts/animations/font-variation-settings-interpolation.html", + {} + ] + ], "css/css-fonts/calc-in-font-variation-settings.html": [ [ "css/css-fonts/calc-in-font-variation-settings.html", @@ -314787,6 +317251,12 @@ {} ] ], + "css/css-fonts/font-size-relative-across-calc-ff-bug-001.html": [ + [ + "css/css-fonts/font-size-relative-across-calc-ff-bug-001.html", + {} + ] + ], "css/css-fonts/font-style-angle.html": [ [ "css/css-fonts/font-style-angle.html", @@ -317899,6 +320369,12 @@ {} ] ], + "css/css-logical/parsing/margin-block-inline-computed.html": [ + [ + "css/css-logical/parsing/margin-block-inline-computed.html", + {} + ] + ], "css/css-logical/parsing/margin-block-inline-invalid.html": [ [ "css/css-logical/parsing/margin-block-inline-invalid.html", @@ -317983,6 +320459,12 @@ {} ] ], + "css/css-logical/parsing/padding-block-inline-computed.html": [ + [ + "css/css-logical/parsing/padding-block-inline-computed.html", + {} + ] + ], "css/css-logical/parsing/padding-block-inline-invalid.html": [ [ "css/css-logical/parsing/padding-block-inline-invalid.html", @@ -320605,6 +323087,36 @@ {} ] ], + "css/css-sizing/animation/height-interpolation.html": [ + [ + "css/css-sizing/animation/height-interpolation.html", + {} + ] + ], + "css/css-sizing/animation/max-height-interpolation.html": [ + [ + "css/css-sizing/animation/max-height-interpolation.html", + {} + ] + ], + "css/css-sizing/animation/max-width-interpolation.html": [ + [ + "css/css-sizing/animation/max-width-interpolation.html", + {} + ] + ], + "css/css-sizing/animation/min-height-interpolation.html": [ + [ + "css/css-sizing/animation/min-height-interpolation.html", + {} + ] + ], + "css/css-sizing/animation/min-width-interpolation.html": [ + [ + "css/css-sizing/animation/min-width-interpolation.html", + {} + ] + ], "css/css-sizing/animation/width-interpolation.html": [ [ "css/css-sizing/animation/width-interpolation.html", @@ -320677,6 +323189,12 @@ {} ] ], + "css/css-sizing/parsing/max-height-computed.html": [ + [ + "css/css-sizing/parsing/max-height-computed.html", + {} + ] + ], "css/css-sizing/parsing/max-height-invalid.html": [ [ "css/css-sizing/parsing/max-height-invalid.html", @@ -320689,6 +323207,12 @@ {} ] ], + "css/css-sizing/parsing/max-width-computed.html": [ + [ + "css/css-sizing/parsing/max-width-computed.html", + {} + ] + ], "css/css-sizing/parsing/max-width-invalid.html": [ [ "css/css-sizing/parsing/max-width-invalid.html", @@ -320701,6 +323225,12 @@ {} ] ], + "css/css-sizing/parsing/min-height-computed.html": [ + [ + "css/css-sizing/parsing/min-height-computed.html", + {} + ] + ], "css/css-sizing/parsing/min-height-invalid.html": [ [ "css/css-sizing/parsing/min-height-invalid.html", @@ -320713,6 +323243,12 @@ {} ] ], + "css/css-sizing/parsing/min-width-computed.html": [ + [ + "css/css-sizing/parsing/min-width-computed.html", + {} + ] + ], "css/css-sizing/parsing/min-width-invalid.html": [ [ "css/css-sizing/parsing/min-width-invalid.html", @@ -321733,6 +324269,24 @@ {} ] ], + "css/css-text/animations/letter-spacing-interpolation.html": [ + [ + "css/css-text/animations/letter-spacing-interpolation.html", + {} + ] + ], + "css/css-text/animations/text-indent-interpolation.html": [ + [ + "css/css-text/animations/text-indent-interpolation.html", + {} + ] + ], + "css/css-text/animations/word-spacing-interpolation.html": [ + [ + "css/css-text/animations/word-spacing-interpolation.html", + {} + ] + ], "css/css-text/i18n/css3-text-line-break-baspglwj-001.html": [ [ "css/css-text/i18n/css3-text-line-break-baspglwj-001.html", @@ -326545,6 +329099,66 @@ {} ] ], + "css/css-values/minmax-angle-serialize.html": [ + [ + "css/css-values/minmax-angle-serialize.html", + {} + ] + ], + "css/css-values/minmax-integer-computed.html": [ + [ + "css/css-values/minmax-integer-computed.html", + {} + ] + ], + "css/css-values/minmax-length-computed.html": [ + [ + "css/css-values/minmax-length-computed.html", + {} + ] + ], + "css/css-values/minmax-length-invalid.html": [ + [ + "css/css-values/minmax-length-invalid.html", + {} + ] + ], + "css/css-values/minmax-number-computed.html": [ + [ + "css/css-values/minmax-number-computed.html", + {} + ] + ], + "css/css-values/minmax-number-invalid.html": [ + [ + "css/css-values/minmax-number-invalid.html", + {} + ] + ], + "css/css-values/minmax-percentage-computed.html": [ + [ + "css/css-values/minmax-percentage-computed.html", + {} + ] + ], + "css/css-values/minmax-percentage-invalid.html": [ + [ + "css/css-values/minmax-percentage-invalid.html", + {} + ] + ], + "css/css-values/minmax-time-computed.html": [ + [ + "css/css-values/minmax-time-computed.html", + {} + ] + ], + "css/css-values/minmax-time-invalid.html": [ + [ + "css/css-values/minmax-time-invalid.html", + {} + ] + ], "css/css-values/rgba-011.html": [ [ "css/css-values/rgba-011.html", @@ -349616,6 +352230,12 @@ {} ] ], + "html/browsers/the-window-object/window-open-defaults.window.js": [ + [ + "html/browsers/the-window-object/window-open-defaults.window.html", + {} + ] + ], "html/browsers/the-window-object/window-open-noopener.html": [ [ "html/browsers/the-window-object/window-open-noopener.html?_parent", @@ -349941,6 +352561,18 @@ {} ] ], + "html/cross-origin-embedder-policy/none-sw-from-none.https.html": [ + [ + "html/cross-origin-embedder-policy/none-sw-from-none.https.html", + {} + ] + ], + "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html": [ + [ + "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html", + {} + ] + ], "html/cross-origin-embedder-policy/none.https.html": [ [ "html/cross-origin-embedder-policy/none.https.html", @@ -349949,6 +352581,18 @@ } ] ], + "html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html": [ + [ + "html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html", + {} + ] + ], + "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html": [ + [ + "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html", + {} + ] + ], "html/cross-origin-embedder-policy/require-corp.https.html": [ [ "html/cross-origin-embedder-policy/require-corp.https.html", @@ -351258,6 +353902,12 @@ } ] ], + "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html": [ + [ + "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html", + {} + ] + ], "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter.html": [ [ "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter.html", @@ -351734,6 +354384,12 @@ {} ] ], + "html/rendering/widgets/appearance/default-styles.html": [ + [ + "html/rendering/widgets/appearance/default-styles.html", + {} + ] + ], "html/rendering/widgets/button-layout/abspos.html": [ [ "html/rendering/widgets/button-layout/abspos.html", @@ -355196,6 +357852,12 @@ {} ] ], + "html/semantics/embedded-content/the-img-element/historical-progress-event.window.js": [ + [ + "html/semantics/embedded-content/the-img-element/historical-progress-event.window.html", + {} + ] + ], "html/semantics/embedded-content/the-img-element/img.complete.html": [ [ "html/semantics/embedded-content/the-img-element/img.complete.html", @@ -355458,9 +358120,9 @@ {} ] ], - "html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html": [ + "html/semantics/forms/autofocus/no-cross-origin-autofocus.html": [ [ - "html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html", + "html/semantics/forms/autofocus/no-cross-origin-autofocus.html", { "testdriver": true } @@ -362524,19 +365186,25 @@ "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": [ @@ -363759,6 +366427,12 @@ {} ] ], + "largest-contentful-paint/iframe-content-not-observed.html": [ + [ + "largest-contentful-paint/iframe-content-not-observed.html", + {} + ] + ], "largest-contentful-paint/image-TAO.sub.html": [ [ "largest-contentful-paint/image-TAO.sub.html", @@ -363771,6 +366445,24 @@ {} ] ], + "largest-contentful-paint/invisible-images.html": [ + [ + "largest-contentful-paint/invisible-images.html", + {} + ] + ], + "largest-contentful-paint/larger-image.html": [ + [ + "largest-contentful-paint/larger-image.html", + {} + ] + ], + "largest-contentful-paint/larger-text.html": [ + [ + "largest-contentful-paint/larger-text.html", + {} + ] + ], "largest-contentful-paint/loadTime-after-appendChild.html": [ [ "largest-contentful-paint/loadTime-after-appendChild.html", @@ -391816,6 +394508,15 @@ {} ] ], + "scroll-to-text-fragment/scroll-to-text-fragment.html": [ + [ + "scroll-to-text-fragment/scroll-to-text-fragment.html", + { + "testdriver": true, + "timeout": "long" + } + ] + ], "secure-contexts/basic-dedicated-worker.html": [ [ "secure-contexts/basic-dedicated-worker.html", @@ -392227,6 +394928,12 @@ {} ] ], + "selection/toString-ff-bug-001.html": [ + [ + "selection/toString-ff-bug-001.html", + {} + ] + ], "selection/type.html": [ [ "selection/type.html", @@ -392810,6 +395517,12 @@ {} ] ], + "service-workers/service-worker/clients-matchall-frozen.https.html": [ + [ + "service-workers/service-worker/clients-matchall-frozen.https.html", + {} + ] + ], "service-workers/service-worker/clients-matchall-include-uncontrolled.https.html": [ [ "service-workers/service-worker/clients-matchall-include-uncontrolled.https.html", @@ -402987,12 +405700,6 @@ {} ] ], - "trusted-types/TrustedTypePolicy-exposed.tentative.html": [ - [ - "trusted-types/TrustedTypePolicy-exposed.tentative.html", - {} - ] - ], "trusted-types/TrustedTypePolicy-name.tentative.html": [ [ "trusted-types/TrustedTypePolicy-name.tentative.html", @@ -403029,21 +405736,15 @@ {} ] ], - "trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html": [ - [ - "trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html", - {} - ] - ], - "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html": [ + "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [ [ - "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html", + "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html", {} ] ], - "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [ + "trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html": [ [ - "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html", + "trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html", {} ] ], @@ -416013,6 +418714,12 @@ {} ] ], + "webxr/xrSession_features_deviceSupport.https.html": [ + [ + "webxr/xrSession_features_deviceSupport.https.html", + {} + ] + ], "webxr/xrSession_input_events_end.https.html": [ [ "webxr/xrSession_input_events_end.https.html", @@ -416067,6 +418774,12 @@ {} ] ], + "webxr/xrSession_viewer_availability.https.html": [ + [ + "webxr/xrSession_viewer_availability.https.html", + {} + ] + ], "webxr/xrSession_viewer_referenceSpace.https.html": [ [ "webxr/xrSession_viewer_referenceSpace.https.html", @@ -441709,7 +444422,7 @@ }, "paths": { ".azure-pipelines.yml": [ - "5799d624b4efc1e974b3cbeec0e7d9a9f6cf2e17", + "1884272c4fc71bbe25294c197d6e3b7cf867ff2d", "support" ], ".codecov.yml": [ @@ -441721,7 +444434,7 @@ "support" ], ".github/workflows/pull_request.yml": [ - "0bedfe3d42ceadc2ffd32d8c66b9c38c120ab9ca", + "8f3940a291b25f48e578b22dc68f7cf94ce32202", "support" ], ".github/workflows/push-build-publish-documentation-website.yml": [ @@ -444256,6 +446969,26 @@ "030263472a36c76f7ce15256187a658ed6b77cf7", "testharness" ], + "2dcontext/imagebitmap/no-coop-coep.https.window.js": [ + "5295f1e10cfdd572272519f96e4f17d63f60abec", + "testharness" + ], + "2dcontext/imagebitmap/resources/coop-coep-popup.html": [ + "f0228503ffa8aa6dd57eebdead094f085ed7dedf", + "support" + ], + "2dcontext/imagebitmap/resources/coop-coep-popup.html.headers": [ + "63b60e490f47f4db77d33d7a4ca2f5b9a4181de8", + "support" + ], + "2dcontext/imagebitmap/resources/coop-coep-worker.js": [ + "a6e9cc58935c417369cf5aee29c03dd17c86a5c7", + "support" + ], + "2dcontext/imagebitmap/resources/coop-coep-worker.js.headers": [ + "6604450991a122e3e241e40b1b9e0516c525389d", + "support" + ], "2dcontext/imagebitmap/transfer-worker.js": [ "55465a899ca27d5202dfa796ec5200bde845892b", "support" @@ -452176,40 +454909,68 @@ "dcf3d2832c33f72e8dce2356956baac1d83eafed", "support" ], + "bluetooth/adapter/adapter-absent-getAvailability.https.window.js": [ + "cec09c38b138653297ee1df6ab0811a0575978bc", + "testharness" + ], + "bluetooth/adapter/adapter-added-getAvailability.https.window.js": [ + "d5e9d1f2b6ffbb009b03d0cde8155144aeee630b", + "testharness" + ], + "bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js": [ + "8fe9265a46ed22a9bb0e0480f045135b323565f0", + "testharness" + ], + "bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js": [ + "8b9256a4c35680722ad2ee00784de6649b703611", + "testharness" + ], + "bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js": [ + "b8b49121fc0170eb9dc95614b5c3b19ef16bd02b", + "testharness" + ], + "bluetooth/adapter/adapter-removed-getAvailability.https.window.js": [ + "cc2c33d1d4c2bf2cdad0cd0874a739b462ff90ec", + "testharness" + ], + "bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js": [ + "bf5e4226e08d44e521b533f020c0deaa95851983", + "testharness" + ], "bluetooth/characteristic/characteristicProperties.https.window.js": [ "abe9f79ce26ed7cc9f5c17cfd2f0e1e70d1d3657", "testharness" ], - "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html": [ - "02aaeccb02283bf981d3ef08fa05a38f20c749e1", + "bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js": [ + "97256a4533007d9c52ec395ba5a811c212aaf48c", "testharness" ], - "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html": [ - "52b39c1e0cb3c552c48b642c33e56e07cdf3614f", + "bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js": [ + "8847efab3c1565150110155f3fcbf11c54003846", "testharness" ], - "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html": [ - "bfb4c8dcf6ad78aeee33b0b80a38c0e7c6772ecd", + "bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js": [ + "b9dc92482ab6f4f564c322c2fa9b19198e576e33", "testharness" ], - "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html": [ - "c00d4cf57833756412d265a52822d34892f9efec", + "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js": [ + "25bde7cecc5fbfa7d83bf5fd5c29f551598a2d43", "testharness" ], - "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html": [ - "a29548f3656217b614ab236298e92ef225ba2e35", + "bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js": [ + "c3ff9f6a05c625da3ffc4ab5bdab3a6bab82f524", "testharness" ], - "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html": [ - "20df1d080024f12cbc28a09f3b90caed2d734730", + "bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js": [ + "c997d7afda2c1faef8fe2e33ac430286334edd4d", "testharness" ], - "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html": [ - "de83400b20816908d45601bd670f4c5acc1c3b9a", + "bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js": [ + "03bb51239dccd4ca479f8159052086c2c0c1c285", "testharness" ], - "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html": [ - "c9056dd3b3c937f157b0495ee2964bbf21a59692", + "bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js": [ + "762f9cc99554aa206f7cf4c767c2db5dbdb0634c", "testharness" ], "bluetooth/characteristic/notifications/characteristic-is-removed.https.window.js": [ @@ -452232,8 +454993,8 @@ "eee34d0612d3611121d219c0b4098937df507ece", "testharness" ], - "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html": [ - "a80bccfe469223145ae4ec78dfd33e24a613fcd7", + "bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js": [ + "a2de3c39e20626b617926618da10acfb5f81a83d", "testharness" ], "bluetooth/characteristic/readValue/read-succeeds.https.window.js": [ @@ -452256,8 +455017,8 @@ "6b1f543ae5e9944d4792a01209417016f4566a2e", "testharness" ], - "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html": [ - "d9a9594320d5ec337b5b50ac5f7873e547e4b30a", + "bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js": [ + "76b2d42a481f1f73ba869e2350627c080531bf7e", "testharness" ], "bluetooth/characteristic/writeValue/buffer-is-detached.https.window.js": [ @@ -452268,8 +455029,8 @@ "33a963bed0950485a06685df8a601025bd4c419c", "testharness" ], - "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html": [ - "1652070463057dc48ef64cdb4bfe07379a672a49", + "bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js": [ + "00c50894e5bb1e444ecc02c441d6bd6343ccdd58", "testharness" ], "bluetooth/characteristic/writeValue/service-is-removed.https.window.js": [ @@ -452280,44 +455041,44 @@ "1472c619a2dbdf5c8536e240ff024349a6e938ea", "testharness" ], - "bluetooth/descriptor/readValue/gen-service-is-removed.https.html": [ - "e453c8063741f565c15166ddf6565dd5bae02693", + "bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js": [ + "3b6c78a97c586fd02da2ccd53c81291b79512f8c", "testharness" ], - "bluetooth/descriptor/readValue/read-succeeds.https.html": [ - "35ff057cbadf12c8d7ada949fe1db07a01450a66", + "bluetooth/descriptor/readValue/read-succeeds.https.window.js": [ + "5f3c5f8f084c11639ea86f7332d03f56e7c72b4e", "testharness" ], - "bluetooth/descriptor/writeValue/buffer-is-detached.https.html": [ - "2ab990de61c5603976d3dc915d078a59f11d30a2", + "bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js": [ + "23ea2329a64f4da8a4cc5cd4a9de7ed0a7b6047e", "testharness" ], - "bluetooth/descriptor/writeValue/gen-service-is-removed.https.html": [ - "acd56c3aa45723f1019806b15332697e2e04690f", + "bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js": [ + "ca75ebaba8867c0ede9ed743537ace2b702f095d", "testharness" ], - "bluetooth/device/gattserverdisconnected-event/disconnected.https.html": [ - "c406e50c199200c3df8df52c308ce8be68dfc9ee", + "bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js": [ + "245e43d31504a555af42971b87978a4f48c949a2", "testharness" ], - "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html": [ - "8208231bf55614f65d31e3dd46443c390adf1dc9", + "bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js": [ + "69e30443ee6f505fbd2a4623457251ac564bcb4b", "testharness" ], - "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html": [ - "92be9c35039adcb9e192f6a899e6800a7672ecd2", + "bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js": [ + "317eddee9ba86d6b1357ce6a845b2b99c78d15da", "testharness" ], - "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html": [ - "6d0c8e28c5d21bb2ec3a9b54a8b9037a39c0b6c8", + "bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js": [ + "93a46eeb934f0ebef9ff378ed7f9e59379d9d094", "testharness" ], "bluetooth/generate.py": [ - "034ca22c619bcfc93cd4c8b4cd29dd7a04a15ebc", + "f7fffddbc301f3e555f75ad4cb2d067430628925", "support" ], "bluetooth/generate_test.py": [ - "881f7dbcb73af73b18b447f5cea142f53ba2fd36", + "8cb61dda8fa43ac677998ee212006fda25dd6927", "support" ], "bluetooth/idl/idl-Bluetooth.https.html": [ @@ -452501,11 +455262,11 @@ "support" ], "bluetooth/resources/health-thermometer-iframe.html": [ - "1545a513960ac346412fb63095b2a716aafe42f8", + "367b778c45416b0fe50e9d1281bb71062f5e381f", "support" ], - "bluetooth/script-tests/base_test_html.template": [ - "714333c5e1302ea918dd939190174ccd9c6f9998", + "bluetooth/script-tests/base_test_js.template": [ + "56971d2c6c98faaf479f3a89fb0757e85bf9b42c", "support" ], "bluetooth/script-tests/characteristic/characteristic-is-removed.js": [ @@ -452648,68 +455409,68 @@ "04ccedeb5e9781923fe02d598a25218d3f59179e", "testharness" ], - "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html": [ - "af00c66d789a0e3e1a98492f091e0554fb00a7ca", + "bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js": [ + "2d94b41e0207689824be914a21ef7fab4f866d10", "testharness" ], - "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html": [ - "6656ff16a1439deede03eebe10e304d071c7e747", + "bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js": [ + "0d6e8a7a179070c7d4a023ad550d8b25f3a3bcdf", "testharness" ], - "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html": [ - "760be97ebd8e5c8125762a5f6e38e455380333f8", + "bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js": [ + "18af59d7f803a5a7adbcf1658a4449302b5d8291", "testharness" ], - "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html": [ - "4c3c577fcc5969082121985b4d03f661b5c0d6fb", + "bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js": [ + "5cfe893f5d81ca2a6c07ec02e4c29ab96b594175", "testharness" ], - "bluetooth/server/getPrimaryService/gen-disconnected-device.https.html": [ - "abfd1a9c2da426de15cb525e76f7d5009ee6464b", + "bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js": [ + "622f2cf3212cf66f11545e157e0fa389c7f5f3d8", "testharness" ], - "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html": [ - "098eec4113b06228787bdf7d78c28a920a32c5fc", + "bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js": [ + "5afb0262658249caee332d8988f62a5da8829865", "testharness" ], - "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html": [ - "233a45adf0695f44b4b03a4c9760dd0a33a4ede5", + "bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js": [ + "86fa5e9b011b8c4c08ffad135a5e893c138c4e4b", "testharness" ], - "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html": [ - "ab93d334818365216cd63d522dc76adb9b5b9b71", + "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js": [ + "2c35c1b7556297c4d595f451662ed6df7d09df77", "testharness" ], - "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html": [ - "647aa504a208de51cb1b7d1bdb8bc19b9d0d101c", + "bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js": [ + "cca8c2c5d2f2bf0c5f758b4299d54ca2a1f76e4d", "testharness" ], - "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html": [ - "f09e4e65c27944a4b23a1f7bfd8c5b81915d27dc", + "bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js": [ + "a0f073d8a314ea9574a9187a6b97c39fd7c1fdad", "testharness" ], - "bluetooth/server/getPrimaryService/gen-get-same-object.https.html": [ - "35893d24a6037b7ab4086b8ec0d7b15a5e807f51", + "bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js": [ + "3deb387406e4fd197890422d77c1b0e288b9ad3a", "testharness" ], - "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html": [ - "40777eee90679905f603d00e47d994e3f4bc30dd", + "bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js": [ + "d59e202d71cc3d4b8876ebbdef188170fdaa339f", "testharness" ], - "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html": [ - "7883ef36d4e0b60ed67add1cd5dd74138ca7b798", + "bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js": [ + "89ca46884478194b5e0b447bbe51810ea8217cd7", "testharness" ], - "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html": [ - "566a9fbe091a36f8fce020bb71f3c2671c70b864", + "bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js": [ + "fec0055dcdb7ab1c11b44388d2ea4b2972e19910", "testharness" ], - "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html": [ - "c9ce1b80aa43f89c947eb36a653f678a0c866ebf", + "bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js": [ + "a0161a0446b37b00ba351eaff67ba5f6c4a53cda", "testharness" ], - "bluetooth/server/getPrimaryService/gen-service-not-found.https.html": [ - "aca14c5fd4082940cac547703fbac663200162d7", + "bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js": [ + "60fb4f2c529443eb06e28118cf506d5fff12bfd8", "testharness" ], "bluetooth/server/getPrimaryService/service-found.https.html": [ @@ -452732,108 +455493,108 @@ "9fffbd5d00e3c5d41e43e1b722d87f53933ea1a3", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html": [ - "4449d2ebbd4036a1465a47bf77d6bb4c9d38c86d", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js": [ + "86a346d14839efc6a5baa913c430328517780d67", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html": [ - "3bf4ed6dccb84a9c3704e834384799168fe9f229", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js": [ + "97e9f77d12e668021ca6303eb669666ec16b787d", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html": [ - "d7cb43725edf72c6a0903942c8dbd0c476e6d33c", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js": [ + "37394075d80cf113bec492d02c48e7e2ba394651", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html": [ - "27440af916220d791ca7cb6f96d55300c9d64ecb", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js": [ + "9c7aac67a4a3e1fba531a817973daf211e5e9fab", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html": [ - "7b9955ade4489154d84ba21314f7d799cf511a3e", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js": [ + "bffcea4e9fb3b1e6367bbc353f36dd4ccd7d3855", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html": [ - "4b09bce4eeef026e7bf4ca394e6b6f186e9490ad", + "bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js": [ + "162a61f3eb5f15a1b152eb8d6d4d3b0463beea3c", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html": [ - "2ef6b5904ac8527f3e252398ae7180f1f29fa60c", + "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js": [ + "05dce42424d02d7dd6a47d867189be3fdd827ea3", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html": [ - "bc21ea1f2dbc20b901bcf61e6d06a824bf80ba56", + "bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js": [ + "e17162a71987c291060199dd156e64033d6829b7", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html": [ - "0a87bce2d03099804a572b320142d537afff4790", + "bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js": [ + "3bfa60d8ccb3e6e5403b06d0d1d1fa82a52fc284", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html": [ - "dbc4428665ca20b23e3c396a373fb40cac666644", + "bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js": [ + "7072b3efb1f7aeeb8d07eb2c5ff01f045859dad4", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html": [ - "460b94d2565e7ee1d1680de8818476ba633388c1", + "bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js": [ + "589ebe386444f2f50820034a737c8a30cdbe5060", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html": [ - "38e0d455b462e5065b3baa462bb1a771feb947af", + "bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js": [ + "15b8b978040129b6bc416d838b317ca97fc1219b", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html": [ - "31ab862e82cc98bf55ae223c760feeb12ad930ef", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [ + "17495d24ebadcd9752b06201a7035f45cfcb3635", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html": [ - "a79060adc56ac3b45bf83e33193cdac9f167c549", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js": [ + "741cd2171f894c99bdfa9fa506a62e1bd2488218", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html": [ - "b6f0e4a3eef6acae0a69092cbcaad3423f97b48a", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js": [ + "1ee4f21ccba63ef5806840934248c7a6d6def35f", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html": [ - "baf7865b2f5690e0684674bab06287a3ad8d9fd8", + "bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js": [ + "285b774c4e70557f8f14b05c4d9de2b8276a945f", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html": [ - "b87a24a5e0e5ebecebf9c22522a5d4bbc24b7a69", + "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js": [ + "eb20e6f4b2f8fc2193b2f566eb8b7952747c495c", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html": [ - "9ed3c50e6bef4d0002f837495ee9a0164d5ac439", + "bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js": [ + "14fc656c70dd4352aa4d2ab53e98015dd2704978", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html": [ - "9d213d5dfd824c052c74ac2aa2647c643d7a49fc", + "bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js": [ + "f3fc4906b44eec68feebcd289320a54fba682246", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-get-same-object.https.html": [ - "258bda0ec68fc511189a138cf80f04e06d4b9f5c", + "bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js": [ + "c7c488a18b9413e488680b431361981beacb5c1a", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html": [ - "969ad61ea65d91d2b7d83b00e6fca298277d6544", + "bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js": [ + "025f1ccdf7c832343d6631e7a85452f7390c5c16", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html": [ - "696b1f9471dd61a290520457321c4e8261e94063", + "bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js": [ + "6f1bb251723a6fda193fe3f0428d730da416506c", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html": [ - "41bbf6eecd0af9ee5403c46b7549863853bbcb71", + "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js": [ + "4bbddeae56ef7fa18656133191abc0e6b2bce1ca", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html": [ - "58bea8829463c50d1ccd2ab67444e40aaa2b8573", + "bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js": [ + "40b8b576ff4fc57b53a544a5c863985630bbe5ea", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html": [ - "4f8254ad86e3da558e90da3560b0b32a512ce9ea", + "bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js": [ + "6f737ecf889d9f96c0e28851c2eb9f5782522fd9", "testharness" ], - "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html": [ - "cb5e0941f6662a40060fc0d91bb9675fa66f36da", + "bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js": [ + "33946d281bd8219f4dd07a7a2166f626187c10cf", "testharness" ], "bluetooth/server/getPrimaryServices/services-found-with-uuid.https.html": [ @@ -452860,32 +455621,32 @@ "9746f4b058ca73a508a875d5749175a782b752bb", "testharness" ], - "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html": [ - "9e42a469c678d97893048150544c3def1b0c19fc", + "bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js": [ + "04176f1ecdadcdfa6214468973d9d52c2f074c90", "testharness" ], - "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html": [ - "5fc3ec470acb80f0aca243f0e56915fd39b21338", + "bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js": [ + "cfec509c49205dd407cfe5b114800d1c65f87c8a", "testharness" ], - "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html": [ - "0b81768d50876754b5335f309ba995cf446e71b7", + "bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js": [ + "9543a5e56337ad970a2ab29ef7d2cd2b3ad5c584", "testharness" ], - "bluetooth/service/getCharacteristic/gen-get-same-object.https.html": [ - "e8fc6542ccebc1f1088efeeb1b3e6c644a57d6eb", + "bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js": [ + "73691befa52f79c6739f2e1763569afce4a61c46", "testharness" ], - "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html": [ - "08c1352155a8bb54cb05c994077cedab6af7bd84", + "bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js": [ + "d21dcf561224906c05e7dacd323f81bab7e408d1", "testharness" ], - "bluetooth/service/getCharacteristic/gen-reconnect-during.https.html": [ - "2fe9cd06cf7b043b7011e87585711e3c4017afe1", + "bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js": [ + "6f86214246457a68fe383ff2aa148f533f547a72", "testharness" ], - "bluetooth/service/getCharacteristic/gen-service-is-removed.https.html": [ - "391c49a0babb7d3442fefac00eaaad9034d55e23", + "bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js": [ + "b6d6a9df96e73b53008c2655bf524c0d1fe2f687", "testharness" ], "bluetooth/service/getCharacteristics/blocklisted-characteristics.https.html": [ @@ -452904,48 +455665,48 @@ "6401740681a66b8581120671edcb70f5663621a3", "testharness" ], - "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html": [ - "eeaa5b3da30526fd13057968f70ba44369c35f00", + "bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js": [ + "3afd294d5b12755b4401287d2ff818e4c50f7f38", "testharness" ], - "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html": [ - "7f32b30b3034ff7b402bea63347797d03755662e", + "bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js": [ + "549f6b2671940e0a132fa3b2123ae24be9a912c7", "testharness" ], - "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html": [ - "36ef29b6c5bfc4b9b2a5a339c6927c958304b96c", + "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js": [ + "643e2f839efabbc2e907e20b062903e13dc2be92", "testharness" ], - "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html": [ - "5768ff42abc1c5009524fa92cc86fa7ff39af53a", + "bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js": [ + "b7db67f613f65f43dcb078740302d2fed08c4ded", "testharness" ], - "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html": [ - "917d84df4c7229e8a550d0826eca7942a719525e", + "bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js": [ + "15b552af4913a45235ac196111692764f07691ef", "testharness" ], - "bluetooth/service/getCharacteristics/gen-get-same-object.https.html": [ - "ebdd803efa249ada38aaed6fe710b64effa5973e", + "bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js": [ + "df30d514f39adaa3e6d42747cf7c13a247011992", "testharness" ], - "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html": [ - "0bcb25cdf0cac9caedf081076062e641be703a6d", + "bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js": [ + "f980ac03d5f4e5c2c9e1036eda709245c2836d27", "testharness" ], - "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html": [ - "4226bcbbfa27b190bcd58f11d0fdc9c66a313dd7", + "bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js": [ + "eb4233764aaadc4389ebe9518b1eb89c882ce68c", "testharness" ], - "bluetooth/service/getCharacteristics/gen-reconnect-during.https.html": [ - "9157275640ce7f52a0fea8d44df3958b3a599308", + "bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js": [ + "a6d38805973a7638c36dfd09af6d566280576b44", "testharness" ], - "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html": [ - "62caaad12b57af31aa8d2985ffcabf1c4c1a0786", + "bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js": [ + "527eb76527696505dde06078b11985499cb74ed1", "testharness" ], - "bluetooth/service/getCharacteristics/gen-service-is-removed.https.html": [ - "4868127465adfe8ec405d843de9fc115d725c280", + "bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js": [ + "466503241ed098f063b59b6317e112434ac04c47", "testharness" ], "check_stability.ini": [ @@ -473637,11 +476398,11 @@ "testharness" ], "content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html": [ - "16df5100b59a80178cab59ff703c250042d628b1", + "92e8f17acd5816c505289b71df45e2110a391a89", "testharness" ], "content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html": [ - "a076eafd559c80bb510aa3c43669be563646adb8", + "8a2e17ce8e7eafa0d7292845f9c9f81b86810d62", "testharness" ], "content-security-policy/style-src/stylehash-allowed.sub.html": [ @@ -537672,6 +540433,22 @@ "d673be5f4f29bf82619aba6f40ed7e287e902582", "support" ], + "css/css-backgrounds/animations/background-color-interpolation.html": [ + "bb727d8e4ef3328547a746c31340b6ca2b885f5c", + "testharness" + ], + "css/css-backgrounds/animations/background-position-interpolation.html": [ + "35100fb33622c03f6454ebc051569ccba67564e9", + "testharness" + ], + "css/css-backgrounds/animations/background-position-origin-interpolation.html": [ + "c6b84ca2aef0a8222b4b4c5713d1998beff799db", + "testharness" + ], + "css/css-backgrounds/animations/background-size-interpolation.html": [ + "f6a480c7bd2ccc4a6c46fa2eade5e7231fab4938", + "testharness" + ], "css/css-backgrounds/background-331.html": [ "121623453a61599fcc494a9582c31a79f78cfeb1", "testharness" @@ -538192,6 +540969,10 @@ "af0efd918ec401b8e2289b7589bcbf88c8b28848", "reftest" ], + "css/css-backgrounds/background-position-negative-percentage-comparison.html": [ + "389ee719196cd3dd1afae63d6d773039d0472111", + "reftest" + ], "css/css-backgrounds/background-repeat-round-001.html": [ "d4ff39384de587a70e4d8e06780b25098d460fbb", "visual" @@ -540800,6 +543581,10 @@ "8be4ce20e3d756e9121299bddba79951005905fc", "support" ], + "css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html": [ + "aa68e23fe09ba6e2c4a2391f9b2ae129037f1dde", + "support" + ], "css/css-backgrounds/reference/background-rounded-image-clip.html": [ "2436bedad5022b95f0913d07501e7ebf206f8a51", "support" @@ -543173,7 +545958,11 @@ "reftest" ], "css/css-contain/contain-size-012.html": [ - "b80e605a32b50c51e75e6ea0eab386377ca94e37", + "5c8e4f0370647465b9c07e8bd6e487df4c37a0fd", + "reftest" + ], + "css/css-contain/contain-size-012b.html": [ + "e52f34578532f95360db41c785c041006a541a07", "reftest" ], "css/css-contain/contain-size-013.html": [ @@ -546584,10 +549373,26 @@ "7148f26e2770b669dfcc69435e3a506882ffd457", "reftest" ], + "css/css-flexbox/dynamic-change-simplified-layout.html": [ + "5d15e22c5eba93488c8e6e667b61306669c32026", + "reftest" + ], "css/css-flexbox/fit-content-item-001.html": [ "c5dfb74711f5c22c2f12b456f78cd7dd373f1659", "reftest" ], + "css/css-flexbox/fit-content-item-002.html": [ + "d10700d242ab53cd64cd37607d68ded1d9eae286", + "reftest" + ], + "css/css-flexbox/fit-content-item-003.html": [ + "45905b16ce3ffb7db56181073345b6c050763936", + "reftest" + ], + "css/css-flexbox/fit-content-item-004.html": [ + "b9318c2e1800723394b16572696bac5169b4784c", + "reftest" + ], "css/css-flexbox/flex-001.htm": [ "df3fbe533aa59a87ba1e7670ac8c7446527c98aa", "reftest" @@ -547236,6 +550041,10 @@ "c74ad830e6b2586be1a13f0eec4a7e655b288da4", "reftest" ], + "css/css-flexbox/flexbox_align-items-stretch-3.html": [ + "09ef2eba0a18de13f91500a8f24baf70043b9978", + "reftest" + ], "css/css-flexbox/flexbox_align-items-stretch-ref.html": [ "540724211bc1cd615bb9359db0615182639a2886", "support" @@ -549720,6 +552529,26 @@ "d47cbce32bb31ff1ea4df81f122c673d7f942677", "reftest" ], + "css/css-fonts/animations/font-size-adjust-interpolation.html": [ + "fd89da3b969c2ad2f8fb522c600bddc740d8146b", + "testharness" + ], + "css/css-fonts/animations/font-size-interpolation-001.html": [ + "0f60018c2e1ce453fe87b3854ffb25c4eb26f924", + "testharness" + ], + "css/css-fonts/animations/font-size-interpolation-002.html": [ + "d6f2f19ab1e585b802dc9b2214558bf6ae643022", + "testharness" + ], + "css/css-fonts/animations/font-size-interpolation-003.html": [ + "d84ff7e5dfe3f4c86ed4b9bf30914ed3d11b156c", + "testharness" + ], + "css/css-fonts/animations/font-variation-settings-interpolation.html": [ + "e11079cfc012ce8937b504662e1f0f6f92351fe2", + "testharness" + ], "css/css-fonts/calc-in-font-variation-settings.html": [ "1a7c59abd5ddebfc6cd1f972ee6a186bdb7b97df", "testharness" @@ -550144,6 +552973,10 @@ "cae02b35af82db73522cfd8a3800f33506e47b80", "reftest" ], + "css/css-fonts/font-size-relative-across-calc-ff-bug-001.html": [ + "167de8888725ca55090ac80cda43cddb299b7c7d", + "testharness" + ], "css/css-fonts/font-stretch-01.html": [ "4d7dcd8d577da18b5aa81af6d143a3e808028228", "reftest" @@ -561228,6 +564061,74 @@ "5f175100e55ba48fa8cda6f2cd626affee0e3b09", "testharness" ], + "css/css-layout-api/edges/all-ref.html": [ + "2a04f96e7325e98c51fd4774e316e0c766b62ae6", + "support" + ], + "css/css-layout-api/edges/all.https.html": [ + "e38d3666b87296df160ef19f94927760f66d53f7", + "reftest" + ], + "css/css-layout-api/edges/border-htb-rtl.https.html": [ + "cb200a76758c48d955bc001262d05d445c4451ef", + "reftest" + ], + "css/css-layout-api/edges/border-htb.https.html": [ + "67a38588303793d0b7705de2c6d938a6754e3de8", + "reftest" + ], + "css/css-layout-api/edges/border-vlr-rtl.https.html": [ + "8da84e9acc9d722976c5aa277c9902bf0fc4c25e", + "reftest" + ], + "css/css-layout-api/edges/border-vlr.https.html": [ + "b514b2f22ff485d560bc6508f4c2d70a630633ba", + "reftest" + ], + "css/css-layout-api/edges/border-vrl-rtl.https.html": [ + "38c8c3f0463b2b3dbe1b56aa6422a2141e7613ea", + "reftest" + ], + "css/css-layout-api/edges/border-vrl.https.html": [ + "94c5353eb93eff80c3734b17cf86959bbf28fd97", + "reftest" + ], + "css/css-layout-api/edges/padding-htb-rtl.https.html": [ + "dfbf2bc099da97ff787ae9ba22ad70a7c3787629", + "reftest" + ], + "css/css-layout-api/edges/padding-htb.https.html": [ + "ebad66594c634675c1bb6eca1bfb69bb56a9eacb", + "reftest" + ], + "css/css-layout-api/edges/padding-vlr-rtl.https.html": [ + "86b0ca5425b6cc43f0d6529bb988d995738f852d", + "reftest" + ], + "css/css-layout-api/edges/padding-vlr.https.html": [ + "563884ade3544edc39ea3920be32d7dcdba973bf", + "reftest" + ], + "css/css-layout-api/edges/padding-vrl-rtl.https.html": [ + "bda0a211442e6f37badd576bb4a8ef4eb15ba291", + "reftest" + ], + "css/css-layout-api/edges/padding-vrl.https.html": [ + "a65ecad31152da6c44ca49c0fd81d47a950934fd", + "reftest" + ], + "css/css-layout-api/edges/scrollbar-ref.html": [ + "cc41754c0822f2895f12703cfd809bfc63542e39", + "support" + ], + "css/css-layout-api/edges/scrollbar.https.html": [ + "76bbd4dccd075fe2f6e52aea606414999e1ee0a9", + "reftest" + ], + "css/css-layout-api/edges/support/edges.js": [ + "b70a42f398c34f0d3a7981fec16447ffa8a1e97e", + "support" + ], "css/css-layout-api/fallback-layout/bad-return.https.html": [ "4c90ae7d336682c948a237937c01475a6fa4cdae", "reftest" @@ -562044,6 +564945,10 @@ "2d8f937f075b0d0fbde677e15266f47af5fec3f8", "testharness" ], + "css/css-logical/parsing/margin-block-inline-computed.html": [ + "6ef52bda3b87363942461ddd52ad935abeccc31c", + "testharness" + ], "css/css-logical/parsing/margin-block-inline-invalid.html": [ "a1e0cbf3885b6518266eba0ef23d40f53a0c5c20", "testharness" @@ -562100,6 +565005,10 @@ "fa4ba0d1bb2607d954d3a2ea3272282872704799", "testharness" ], + "css/css-logical/parsing/padding-block-inline-computed.html": [ + "230f18525a0ca4ef9a525081447461c444458bf8", + "testharness" + ], "css/css-logical/parsing/padding-block-inline-invalid.html": [ "56c2adb07827ef54b42b6a797e0f700eeec56165", "testharness" @@ -567085,7 +569994,7 @@ "testharness" ], "css/css-properties-values-api/register-property-syntax-parsing.html": [ - "6d7dbc63a1d38f108a3a10e99b09cddd84b135f7", + "fe2a63a57a168c8e791c6cec9d9d1843ca2c1216", "testharness" ], "css/css-properties-values-api/register-property.html": [ @@ -571896,8 +574805,28 @@ "086e654a8e039f259b5e828d024f808c2e95016b", "support" ], + "css/css-sizing/animation/height-interpolation.html": [ + "10ceed5b2cc0d5511b8020aeaced36be39834c3a", + "testharness" + ], + "css/css-sizing/animation/max-height-interpolation.html": [ + "c4cab0e1cf4534d3705801f3159b6b8724977b66", + "testharness" + ], + "css/css-sizing/animation/max-width-interpolation.html": [ + "111199baa7ed89c6023d43b56313413cc5aeeeeb", + "testharness" + ], + "css/css-sizing/animation/min-height-interpolation.html": [ + "6fd5b4e2f5366f6b18678f60b982e82905558e51", + "testharness" + ], + "css/css-sizing/animation/min-width-interpolation.html": [ + "d11fb3d5cb139f870d1eb40618bf547176f109b1", + "testharness" + ], "css/css-sizing/animation/width-interpolation.html": [ - "33bc1b14c83f45afbea4cdfadbe3959ac829e615", + "16b67c5ed66b769359e24df7c17f9d7baf0a46e9", "testharness" ], "css/css-sizing/aspect-ratio-affects-container-width-when-height-changes.html": [ @@ -572100,6 +575029,10 @@ "204cd645ec4ca0d1ae7d0fb29b1ff4e2bf8d1211", "testharness" ], + "css/css-sizing/parsing/max-height-computed.html": [ + "c4c6703250d3850ff375665c67ffff7b28db5b85", + "testharness" + ], "css/css-sizing/parsing/max-height-invalid.html": [ "3798bb31c52b64dfc18247e4d89da44a024ab42d", "testharness" @@ -572108,6 +575041,10 @@ "3c4aab833f173fb9d33b704baa0e16c1842bd833", "testharness" ], + "css/css-sizing/parsing/max-width-computed.html": [ + "7e1c0fc2388039b4a4d7719c878c25209b39e647", + "testharness" + ], "css/css-sizing/parsing/max-width-invalid.html": [ "86e852833819e2c58e84cb15680e37e989e9f626", "testharness" @@ -572116,6 +575053,10 @@ "4788ccfe6631105e8745b89317298976b1f54557", "testharness" ], + "css/css-sizing/parsing/min-height-computed.html": [ + "c15ee9de772af2023063ef5cb4a35781aba0a7f4", + "testharness" + ], "css/css-sizing/parsing/min-height-invalid.html": [ "0bb939b12be245758dde7ce93e1edab8a19fa0df", "testharness" @@ -572124,6 +575065,10 @@ "debefbe0b82748d3665c0e82566ebea78d0271b0", "testharness" ], + "css/css-sizing/parsing/min-width-computed.html": [ + "0a69352ed772ec3c4507cfb8d6154ba16837f792", + "testharness" + ], "css/css-sizing/parsing/min-width-invalid.html": [ "b4e600900dbb8c722567570caa3629c7c5811461", "testharness" @@ -572981,7 +575926,7 @@ "testharness" ], "css/css-tables/html5-table-formatting-3.html": [ - "a12e1df5d84f709705fc5b1d9176229151bb9894", + "f32e2dd39c03b4a38f859944aae371c68518d5f9", "testharness" ], "css/css-tables/html5-table-formatting-fixed-layout-1.html": [ @@ -574324,6 +577269,18 @@ "e7914c0fc7ff9e6999f8847dc1800968472483f2", "support" ], + "css/css-text/animations/letter-spacing-interpolation.html": [ + "7d4958113915913bb8a3a5af13f5cee90b080825", + "testharness" + ], + "css/css-text/animations/text-indent-interpolation.html": [ + "2269fdfa5b60f6f4a8d63a7f777e6abbf499c4b7", + "testharness" + ], + "css/css-text/animations/word-spacing-interpolation.html": [ + "ffd6bb476ad87976a1183cde70a10892bab77982", + "testharness" + ], "css/css-text/boundary-shaping/boundary-shaping-001.html": [ "d6c8fa2b236f56e11f07b15c491321e062972ca3", "reftest" @@ -582257,7 +585214,7 @@ "testharness" ], "css/css-transforms/parsing/transform-valid.html": [ - "e6f10154cb6a1d8b5c9eddbb8f1e7c3b2756554e", + "18de33f8a7a21be5b337cc02288471d7ba99f9ae", "testharness" ], "css/css-transforms/parsing/translate-parsing-invalid.html": [ @@ -591752,6 +594709,46 @@ "29dc15dfd965c940910ca5c63d6201643277f907", "testharness" ], + "css/css-values/minmax-angle-serialize.html": [ + "3f424589ba6f9806fefc444320301da5a12303ac", + "testharness" + ], + "css/css-values/minmax-integer-computed.html": [ + "b3794acba9c8f5cfdf56b31292f971b4ccc0bb28", + "testharness" + ], + "css/css-values/minmax-length-computed.html": [ + "410884495461508d94b3a11c385ab1afba60d75d", + "testharness" + ], + "css/css-values/minmax-length-invalid.html": [ + "1405c3198128530939d9778642aaab2920bb6e60", + "testharness" + ], + "css/css-values/minmax-number-computed.html": [ + "c72c276625466a193bf8829e3ddbb87d7a565dc0", + "testharness" + ], + "css/css-values/minmax-number-invalid.html": [ + "3f34fde2f23732ed1b9bc540a098e5914ad674bf", + "testharness" + ], + "css/css-values/minmax-percentage-computed.html": [ + "9f9d0a59d12c2642bfea8ca5a3e2f8528067c80e", + "testharness" + ], + "css/css-values/minmax-percentage-invalid.html": [ + "48d2cdabec1bee5cde0d5d6f4c3524f463916db1", + "testharness" + ], + "css/css-values/minmax-time-computed.html": [ + "36bcf601eb808311732562a6c1c6a7c801f33e9d", + "testharness" + ], + "css/css-values/minmax-time-invalid.html": [ + "bebe674cd79565a364253f3290dd60b7073e2af1", + "testharness" + ], "css/css-values/q-unit-case-insensitivity-001.html": [ "b4a08aa117952c6f92e2aec6f57843b46a460104", "reftest" @@ -592997,7 +595994,7 @@ "reftest" ], "css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht": [ - "2af581d865c23e149975dc7a07ef04c4901fdf06", + "0100a9098f510f6f4687e645f1305a0cd662162d", "reftest" ], "css/css-writing-modes/abs-pos-non-replaced-vlr-215.xht": [ @@ -595957,11 +598954,11 @@ "reftest" ], "css/css-writing-modes/reference/available-size-001-ref.html": [ - "84252946946d4e444f8b0dd69381a1bd04554c80", + "d59cde45f6e3be71762ca4acf2711f8d3b0bc50e", "support" ], "css/css-writing-modes/reference/available-size-002-ref.html": [ - "6fdbf9a2e34173722e69e23f17d1e477bfe8b651", + "ddebe938189a6aea77066747cbe537fbd9e87719", "support" ], "css/css-writing-modes/reference/available-size-011-ref.html": [ @@ -599401,23 +602398,23 @@ "manual" ], "css/css-writing-modes/writing-mode-vlr-forms-001-manual.html": [ - "a3878d148b2c9ce87ddf7f622ef8c976fbd58cad", + "a6ce755f712b74cc093eb6accb0c9cf4a71d0656", "manual" ], "css/css-writing-modes/writing-mode-vlr-forms-002-manual.html": [ - "751057dc77c2b9ab6ee2e5041d4232f415ad7e74", + "9f331a0ec87f69c17557f12f986e6a1318f8a284", "manual" ], "css/css-writing-modes/writing-mode-vlr-forms-003-manual.html": [ - "bf3d839ec40febcbac6247e70a80d1278fdb539f", + "624cd242cb5663a555b3e2930c7dd5574950cdb8", "manual" ], "css/css-writing-modes/writing-mode-vlr-forms-004-manual.html": [ - "91f991f5285fc93f90b5e64fba7df9f62aef610f", + "ce11f1fcb6288f22020a777e66152c39e7cd11ab", "manual" ], "css/css-writing-modes/writing-mode-vlr-forms-005-manual.html": [ - "361f9dbec22857e792b61045e3b6b90ed1dae339", + "c2bf8bb00b4c068206d04d947e34c2389bd4b23b", "manual" ], "css/css-writing-modes/writing-mode-vlr-forms-006-manual.html": [ @@ -599477,23 +602474,23 @@ "manual" ], "css/css-writing-modes/writing-mode-vrl-forms-001-manual.html": [ - "20dea4fbc36e93bd6dc80164083096cb2c0ec5cc", + "6963541d38ec93d7c5c3bbb0468b83006e4faabd", "manual" ], "css/css-writing-modes/writing-mode-vrl-forms-002-manual.html": [ - "5d7db3e2a38664862a763b2abe6dd5cdc59bcf44", + "f7c1b0f69a6a5be9acd524afbd3179447a30d54e", "manual" ], "css/css-writing-modes/writing-mode-vrl-forms-003-manual.html": [ - "3dfe1d61bf5166307eacba477ffa7a469b2b7a63", + "6e960b876f8364c2e75789596fd8d618330b3ab8", "manual" ], "css/css-writing-modes/writing-mode-vrl-forms-004-manual.html": [ - "074603d5811d1a653213f1c2c73c6de417a19076", + "bebdf9ca160409904030eba58f4ec80ed669b6d3", "manual" ], "css/css-writing-modes/writing-mode-vrl-forms-005-manual.html": [ - "2ce63cd5664044e6a3f25600fc8586258d84fd99", + "dfad4e00f8b083ccaa1da3ba0b4b2b230f02a236", "manual" ], "css/css-writing-modes/writing-mode-vrl-forms-006-manual.html": [ @@ -600865,7 +603862,7 @@ "support" ], "css/filter-effects/animation/backdrop-filter-interpolation-001.html": [ - "576c6b92630129dc50cdd5dac07d0b0471f71c78", + "d539a36c5a4aeea7886ff9762f5b02393c85582f", "testharness" ], "css/filter-effects/animation/backdrop-filter-interpolation-002.html": [ @@ -600881,15 +603878,15 @@ "testharness" ], "css/filter-effects/animation/filter-interpolation-001.html": [ - "b4a4b3f4bbad00fb76ee731dd9ed2ac7c2be41bc", + "62fcbf0a5de51b6483d3d70b9f411831e2e3afb8", "testharness" ], "css/filter-effects/animation/filter-interpolation-002.html": [ - "1b66c2751d417438bee5c8349cf1359dd2042f4a", + "6ef25a7dafec17a3f2a4440f82da03658da91986", "testharness" ], "css/filter-effects/animation/filter-interpolation-003.html": [ - "5ca1229e297fc65c3a9f4127913d8cc8813de66e", + "1d512487de9693b2f8143a46e465cf672709b80b", "testharness" ], "css/filter-effects/animation/filter-interpolation-004.html": [ @@ -604417,7 +607414,7 @@ "support" ], "css/selectors/selectors-empty-001.xml": [ - "baf6bddef632e030ebe3a86f3feb9cb3ec660de3", + "3b882debcc717c3e85de8695476eca3fd5238e8a", "reftest" ], "css/selectors/selectors-namespace-001-ref.xml": [ @@ -614737,7 +617734,7 @@ "support" ], "docs/writing-tests/testdriver-tutorial.md": [ - "a8ef3e07a0da92f167d3dcf8ca7416748f1710dd", + "275c813355c6cb8e6b5e2e6c1595f40bde28e7ec", "support" ], "docs/writing-tests/testdriver.md": [ @@ -616209,7 +619206,7 @@ "testharness" ], "dom/nodes/selectors.js": [ - "553e62f2587dc904f92eb1899a29e0c8a9e16f10", + "c1680cedd708d3228603598d157883e6e8a77222", "support" ], "dom/ranges/Range-attributes.html": [ @@ -617300,6 +620297,10 @@ "2fa24769729f705547aa526cf4eca16c483cad78", "support" ], + "element-timing/resources/iframe-with-content.html": [ + "ab8cdfde0111206a44397e0911153063078b3078", + "support" + ], "element-timing/resources/iframe-with-square-sends-entry.html": [ "b8af505d32bc68d7f98b79bf2d2575778a49b26e", "support" @@ -618581,7 +621582,7 @@ "testharness" ], "encoding/textdecoder-ignorebom.any.js": [ - "1f5dabd7b51547d605c72218738b91cd169d4562", + "81f210eec89b4ec074040e081b82ca29439a212d", "testharness" ], "encoding/textdecoder-labels.any.js": [ @@ -619909,7 +622910,7 @@ "support" ], "feature-policy/META.yml": [ - "a4136f77e3fbd8524939de235eaff9c0211bfdba", + "5fb6249c67a2c67ce692cd0345ea214feaa8cd95", "support" ], "feature-policy/README.md": [ @@ -620009,7 +623010,7 @@ "support" ], "feature-policy/experimental-features/resources/common.js": [ - "cbd0518ff21521ba40422b2f06f36f745dc2bdb0", + "c6bea8175129f158f9d2c90c5463cd54f4919a2a", "support" ], "feature-policy/experimental-features/resources/defer-script.js": [ @@ -621049,7 +624050,7 @@ "support" ], "fetch/api/policies/referrer-no-referrer-service-worker.https.html": [ - "0d30ef9e385060477ff3fb862b83a7548ca64e18", + "af898aa29f5f6e9ed832113a043980e89b03b88f", "testharness" ], "fetch/api/policies/referrer-no-referrer-worker.html": [ @@ -621121,7 +624122,7 @@ "support" ], "fetch/api/policies/referrer-unsafe-url-service-worker.https.html": [ - "39a65b0e333af2fc99969794b5bdd9a0555d1910", + "634877edae8764c0f2017f512a41b0ef0859a09f", "testharness" ], "fetch/api/policies/referrer-unsafe-url-worker.html": [ @@ -623897,7 +626898,7 @@ "testharness" ], "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html": [ - "4b81c7c44f94c42680a812e9bf5b8eddbe7055a7", + "fec801e94babfcb3b2072842394547f1f3a8c5f9", "testharness" ], "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-samedoc.html": [ @@ -626044,6 +629045,10 @@ "49247179738f68be143e0dc6e6c332f117945029", "testharness" ], + "html/browsers/the-window-object/window-open-defaults.window.js": [ + "1b2d68a4626ef984025587e16a4dbe61c6069145", + "testharness" + ], "html/browsers/the-window-object/window-open-noopener.html": [ "c3c706605492c5c81bc296054eb98c280492527f", "testharness" @@ -626444,6 +629449,18 @@ "6604450991a122e3e241e40b1b9e0516c525389d", "support" ], + "html/cross-origin-embedder-policy/none-sw-from-none.https.html": [ + "5298347fd9d3f36220c03149d49d9f7ea63615cb", + "testharness" + ], + "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html": [ + "1dec25fadadb8f996e7d3b725b1a3537be52e332", + "testharness" + ], + "html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers": [ + "8df98474b589d070992677cb0134bd47bd0509c4", + "support" + ], "html/cross-origin-embedder-policy/none.https.html": [ "b1bb6fefc6cfa45a217cc3b04534df8065fa1579", "testharness" @@ -626452,6 +629469,18 @@ "43c44cffd64e01f12a8d0dc22bbddfdd05a79a90", "support" ], + "html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html": [ + "896ea46ff08000dae262187268b7d8f57ccd1573", + "testharness" + ], + "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html": [ + "e62184b7b6aa4dc4084516eb8195e8eb6b055c5a", + "testharness" + ], + "html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers": [ + "8df98474b589d070992677cb0134bd47bd0509c4", + "support" + ], "html/cross-origin-embedder-policy/require-corp.https.html": [ "0bd6aab729533ba90ffaefccd4ea06e192b1e6b7", "testharness" @@ -626500,6 +629529,10 @@ "9db755226020479fd87e87f42ea622c999b38f7d", "support" ], + "html/cross-origin-embedder-policy/resources/sw.js": [ + "57f0b41ba5b5ff6318e1e4913dfd13bdb1f237a4", + "support" + ], "html/cross-origin-embedder-policy/sandbox.https.html": [ "1e3f80a9186107350c307a3ff16fd5ad84e11ead", "testharness" @@ -632165,10 +635198,10 @@ "testharness" ], "html/interaction/focus/document-level-focus-apis/document-level-apis.html": [ - "2d8c49c7f6127fdca7e29800dde3c3096be44aca", + "4a8a9a291a9fab7bfa67df1887c53bd5e34aadec", "testharness" ], - "html/interaction/focus/document-level-focus-apis/test.html": [ + "html/interaction/focus/document-level-focus-apis/support/test.html": [ "90d63e51e931b147b23e8e1941324f8fb4237c94", "support" ], @@ -632232,6 +635265,14 @@ "bda7c846878833fd50daf1a877ba068a18bc7833", "testharness" ], + "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html": [ + "e3aedea246e6f38904a4835c99c530a4777f41a6", + "support" + ], + "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html": [ + "27a92f76ab7b3a2030d31ed845f97fd507efbf8e", + "testharness" + ], "html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter.html": [ "773739804b3aeaea268080317cd0cb79fba486d7", "testharness" @@ -633420,6 +636461,10 @@ "3f457eb492f0b72b2a9c5891e8784d0b69958b38", "testharness" ], + "html/rendering/widgets/appearance/default-styles.html": [ + "8869808696e39b3d2067f8551e6a41256c37e7bd", + "testharness" + ], "html/rendering/widgets/button-layout/abspos.html": [ "c3089b1e39749e003fcadd7d822a8343575be212", "testharness" @@ -636840,6 +639885,10 @@ "f6ae65708c661c5ff1a957c3a8606d75a44827fb", "testharness" ], + "html/semantics/embedded-content/the-img-element/historical-progress-event.window.js": [ + "7c4e121b7c34741fa3fd64e323b65a1388790b5a", + "testharness" + ], "html/semantics/embedded-content/the-img-element/image-1.jpg": [ "2fb0255609adc25a3394ae3edbd75ce4a43cb06d", "support" @@ -636949,7 +639998,7 @@ "support" ], "html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html": [ - "c564a5845d5d44c477e57c6f1d8eb6e8c0f457b0", + "ab1b2b25091a5cadc1598529f5a9594c24d03720", "support" ], "html/semantics/embedded-content/the-img-element/srcset/avoid-reload-on-resize.html": [ @@ -637144,8 +640193,8 @@ "de56cf74eda506c55460cc6da85923b5b7001381", "testharness" ], - "html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html": [ - "cc018814c922534d57e3945bd3990444853a5131", + "html/semantics/forms/autofocus/no-cross-origin-autofocus.html": [ + "c3974bd02a3655cef5513258e81f65e2f86e07d3", "testharness" ], "html/semantics/forms/autofocus/not-on-first-task.html": [ @@ -639549,7 +642598,7 @@ "support" ], "html/semantics/scripting-1/the-script-element/json-module/non-object.any.js": [ - "398da56595f0f16210dac4f3deeddb2cd7473d65", + "dcbe60f2c2f9dc8478711a1cb4ed2e82defe7107", "testharness" ], "html/semantics/scripting-1/the-script-element/json-module/null.json": [ @@ -643301,7 +646350,7 @@ "testharness" ], "idle-detection/mock.js": [ - "d88d1ad1c55afaee243e1e9146827b073c380613", + "cb67ce02c313443ef3cdf39340531c9d9e860c03", "support" ], "idle-detection/resources/idle-detection-allowed-by-feature-policy-worker.js": [ @@ -643697,15 +646746,15 @@ "testharness" ], "import-maps/data.sub.tentative.html": [ - "1c7172bf7c6f21aeb22948f9d3eb05d9b3c11b86", + "634948942eea674ec923a4cb718cb92d5aab9021", "testharness" ], "import-maps/fallback-disallowed.sub.tentative.html": [ - "3f89e8f12dfe04b214b36ef89a89eeccdbea935b", + "280d02d847314f97bb88e02618aa46256e055f04", "testharness" ], "import-maps/fallback.sub.tentative.html": [ - "4cf3e18182a11a75d682106d88c532d069b6e77d", + "3f4f2887da8208e8f65df41735e5b95e6bf59d4f", "testharness" ], "import-maps/http.sub.tentative.html": [ @@ -644393,7 +647442,7 @@ "support" ], "interfaces/appmanifest.idl": [ - "fd26c9ba71e93c7e0350115de745b8e45fc56a30", + "ddfe82dc34d31868ea044befa667a8c9987e5678", "support" ], "interfaces/audio-output.idl": [ @@ -644413,7 +647462,7 @@ "support" ], "interfaces/clipboard-apis.idl": [ - "99d1155a3e36519633aa12351990723e3caed581", + "9e35287696b94cb4aad99292bf11e398f1d71f2b", "support" ], "interfaces/compat.idl": [ @@ -644441,7 +647490,7 @@ "support" ], "interfaces/css-animations.idl": [ - "cd5f6016e5353f5c5cd74171d5b4c5d158ee2db0", + "f87015f6a87fccc0accab30920cd8371eee99e63", "support" ], "interfaces/css-conditional.idl": [ @@ -644493,15 +647542,15 @@ "support" ], "interfaces/css-transitions.idl": [ - "129f1463ed86523f9dedfaaf1dd0d460178c414c", + "be5a635112b83cb4315006ac5a86ae7edc7fa43c", "support" ], "interfaces/css-typed-om.idl": [ - "be2946bc20f7689577c43635cc10ba635cc9c7df", + "b54a16338ec7f9397e1d3f97cc43569acc753709", "support" ], "interfaces/cssom-view.idl": [ - "9567b134cf9b4b183c75c63666eb48e2dd20b5ca", + "5d30ede1e40debc56ab71ba58a7ddec0ba5b40cf", "support" ], "interfaces/cssom.idl": [ @@ -644793,7 +647842,7 @@ "support" ], "interfaces/shape-detection-api.idl": [ - "83b7f893552e8f290f677e63547b2c133abf1404", + "0144f04e046720d20f91a98af9d5c651e95b06fd", "support" ], "interfaces/speech-api.idl": [ @@ -644849,11 +647898,11 @@ "support" ], "interfaces/web-bluetooth.idl": [ - "183f77326051ad116785e3a5c371435afd9f7b65", + "f515dda1a814ee1121623033684b3020c355f9ec", "support" ], "interfaces/web-nfc.idl": [ - "769eb7dd2f514d8c3e26b355b851588740ee63ee", + "ff28d84de3d7f5387b39cc281c5ca1c7e041769f", "support" ], "interfaces/web-share.idl": [ @@ -644909,7 +647958,7 @@ "support" ], "interfaces/worklets.idl": [ - "22d04d15b0614eeb1cda161684edb0c1449d4f68", + "16187664b3b4124758c84d054b02b8ddbf585508", "support" ], "interfaces/xhr.idl": [ @@ -645416,6 +648465,10 @@ "273fef80ce2d855075781512a9a8ab0a736af420", "testharness" ], + "largest-contentful-paint/iframe-content-not-observed.html": [ + "7cb23ddbd2058b0079af7980a01781bb1561a3e7", + "testharness" + ], "largest-contentful-paint/image-TAO.sub.html": [ "9409fd8fc05c338dc74a3c7bf8fe94d356679633", "testharness" @@ -645424,6 +648477,18 @@ "84a49f7ea2220c43c083f91057763ae161035532", "testharness" ], + "largest-contentful-paint/invisible-images.html": [ + "cd71f30ae45cb438950ca94ecb39a6382b97d48f", + "testharness" + ], + "largest-contentful-paint/larger-image.html": [ + "7ff38cf2be10c6e20fc5f2ad3d1578755cfbb903", + "testharness" + ], + "largest-contentful-paint/larger-text.html": [ + "973832ca6c864aff084b7db7880efb981c2bfecf", + "testharness" + ], "largest-contentful-paint/loadTime-after-appendChild.html": [ "43ec9f6085d605098faeddce311b5ccbc626b073", "testharness" @@ -645537,7 +648602,7 @@ "testharness" ], "lint.whitelist": [ - "669038166ab38e540f817a760d8346088f2219b9", + "a6aa9466810d226208051c597a8c6c3c24337c1e", "support" ], "loading/lazyload/common.js": [ @@ -646200,6 +649265,46 @@ "f32a15ec01ac808d2e32ecb8cb232c12a5e0aa19", "reftest" ], + "mathml/relations/css-styling/displaystyle-011-ref.html": [ + "400c46a2456d0e1d4d48860e3ad557fa5d2990ee", + "support" + ], + "mathml/relations/css-styling/displaystyle-011.html": [ + "9a85a17dd0f6bd0938199aaa6ce26fc216e11069", + "reftest" + ], + "mathml/relations/css-styling/displaystyle-012-ref.html": [ + "96042b696ff23756da7d507d5b467519c321a35a", + "support" + ], + "mathml/relations/css-styling/displaystyle-012.html": [ + "150443f25276d7b5548523ae8912fef27ca1da30", + "reftest" + ], + "mathml/relations/css-styling/displaystyle-013-ref.html": [ + "9a580350de93632e50334c02f51141afad33f682", + "support" + ], + "mathml/relations/css-styling/displaystyle-013.html": [ + "60bc906452b670ff2edbed125172ca589234d4c3", + "reftest" + ], + "mathml/relations/css-styling/displaystyle-014-ref.html": [ + "085e2c429da98ab17c821859e52c4ac0492f8cce", + "support" + ], + "mathml/relations/css-styling/displaystyle-014.html": [ + "5f30f534e5eb51efa3738a41d3221aa67aa03786", + "reftest" + ], + "mathml/relations/css-styling/displaystyle-015-ref.html": [ + "2e375c68865ee3f3951f5f00922b958a21eefe82", + "support" + ], + "mathml/relations/css-styling/displaystyle-015.html": [ + "df25171dbd621ae64ae537ceb256b0dd6f80d7f5", + "reftest" + ], "mathml/relations/css-styling/displaystyle-1.html": [ "73e5020e74ce3c77c38b0b7224ed4a0245f5f1b0", "testharness" @@ -646228,6 +649333,78 @@ "22fc40156f177564beb0eb0907637a6bce6e60ca", "testharness" ], + "mathml/relations/css-styling/mathbackground-001-notref.html": [ + "65e2781c5e13ac75127703b2b7a601882b7a9b02", + "support" + ], + "mathml/relations/css-styling/mathbackground-001.html": [ + "48318bc6c6def7cbb52aa18fc841805291e6ee96", + "reftest" + ], + "mathml/relations/css-styling/mathbackground-002-notref.html": [ + "8c984c26191d53eec2164e0d1073c3354c051cb7", + "support" + ], + "mathml/relations/css-styling/mathbackground-002.html": [ + "425488132c8bffffa2532c1c5154b6bf15e2f391", + "reftest" + ], + "mathml/relations/css-styling/mathbackground-003-notref.html": [ + "b6adaa8d4e6d686376f0da457a680920656b0f43", + "support" + ], + "mathml/relations/css-styling/mathbackground-003.html": [ + "780fdc4a7b6474f1ef734a7349c4f8b9d1a6f607", + "reftest" + ], + "mathml/relations/css-styling/mathbackground-004-notref.html": [ + "75465a6c382a6b12f03f4c22e441d0dc91c0c9d0", + "support" + ], + "mathml/relations/css-styling/mathbackground-004.html": [ + "3af508560150bb5e57ac0a90b79c7241a2c2bbaf", + "reftest" + ], + "mathml/relations/css-styling/mathcolor-001-notref.html": [ + "9bc1ba543637015fb73ee4772f8cc20e64be5ac5", + "support" + ], + "mathml/relations/css-styling/mathcolor-001.html": [ + "5c23ff4f4a3ebafd3451d8120ab78d2ab01c51b2", + "reftest" + ], + "mathml/relations/css-styling/mathcolor-002-notref.html": [ + "5f9fd2bb9b693837a9d9c8b57a17d3d45d7c21b8", + "support" + ], + "mathml/relations/css-styling/mathcolor-002.html": [ + "e0c1f3883a0e17292f0393adcad63d26bf680ebc", + "reftest" + ], + "mathml/relations/css-styling/mathcolor-003-notref.html": [ + "11e018ebc17043d823c84a970ead2e3d29f89f5e", + "support" + ], + "mathml/relations/css-styling/mathcolor-003.html": [ + "8b1ed83d6cd57bef8961e08eb7c81b51160926c3", + "reftest" + ], + "mathml/relations/css-styling/mathcolor-004-notref.html": [ + "67a45249e5264989bb3bda142ff32df43c75222d", + "support" + ], + "mathml/relations/css-styling/mathcolor-004.html": [ + "36ce0a4252e4931ef0cbe7771ad9ad9c7cfc26d1", + "reftest" + ], + "mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html": [ + "d24fbf041afe481c8cab8cb3ffcbe154357b6955", + "support" + ], + "mathml/relations/css-styling/mathsize-attribute-css-keywords.html": [ + "9b3852d0b379ef1959fe0f90d04bc27b78a1db5f", + "reftest" + ], "mathml/relations/css-styling/mathsize-attribute-legacy-values-ref.html": [ "687efa49bebdda625ccbf13f100e870d45f78f7b", "support" @@ -650405,15 +653582,15 @@ "testharness" ], "native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js": [ - "a4eb2871104f924347f9ec8791a6381313a54483", + "fd2ff888e371f383aa1ee87288dd983add46f662", "testharness" ], "native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js": [ - "2064fc46f05f5e30c14f77c14c5751b411d1c5e0", + "79154b058ff0864032c80b09aef9b8b8c760a105", "testharness" ], "native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js": [ - "473cad4c9c36660584c07d7b53dfc68c7f734cb4", + "fa38abbc5447625cd8396a76c420259840b264f3", "testharness" ], "native-file-system/FileSystemWriter.tentative.https.window.js": [ @@ -657849,7 +661026,7 @@ "testharness" ], "payment-request/MerchantValidationEvent/constructor.https.html": [ - "2978226f3cc31cc7433d3fb94927a04eb5b83f0d", + "da30fef00198800f369b0f8bf9dbddb5df425321", "testharness" ], "payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html": [ @@ -669341,7 +672518,7 @@ "support" ], "resources/chromium/nfc-mock.js": [ - "83bd6b8a0dea2d2434728b9ed52027e6b79b798a", + "9722f8ee57009254b9186bce2b195f02356a4f1b", "support" ], "resources/chromium/sensor.mojom.js": [ @@ -669365,7 +672542,7 @@ "support" ], "resources/chromium/web-bluetooth-test.js": [ - "4c89463dcd2fcf902f9072b656316c8ade3bf824", + "ee8f082b874656fea9f0d83faed83fbb433971ea", "support" ], "resources/chromium/web-bluetooth-test.js.headers": [ @@ -669397,7 +672574,7 @@ "support" ], "resources/chromium/webxr-test.js": [ - "19b207ff4284af82e1c36cf9f584df793e8238f0", + "bb6b0c1be55067641f57d039f8fcc930e9decc46", "support" ], "resources/chromium/webxr-test.js.headers": [ @@ -669912,6 +673089,14 @@ "0320210f8394c7439353a6e1efd0eba339b27e20", "testharness" ], + "scroll-to-text-fragment/scroll-to-text-fragment-target.html": [ + "724132fab29bf75c3e2d0bd4cc20d53aa04c5456", + "support" + ], + "scroll-to-text-fragment/scroll-to-text-fragment.html": [ + "eaab18437063dce8621a49a8b1cecb10390114a7", + "testharness" + ], "secure-contexts/META.yml": [ "e6537166280091c062a8894508f3f0ab9a33a8bf", "support" @@ -670176,6 +673361,10 @@ "42b982324b4e37633be7bccb037cff8f534b5712", "support" ], + "selection/toString-ff-bug-001.html": [ + "985be73b5ca2baba2e8f85d12b806805dbf556ff", + "testharness" + ], "selection/type.html": [ "7be8ba61bc20cd2efe262de6b68a43fd3310b59e", "testharness" @@ -671388,6 +674577,10 @@ "a61c8af70196ac230c4b7085862e1bff8433fe38", "testharness" ], + "service-workers/service-worker/clients-matchall-frozen.https.html": [ + "ef27ac3d372e5d40fb576e2b59020026df8b66bc", + "testharness" + ], "service-workers/service-worker/clients-matchall-include-uncontrolled.https.html": [ "9f34e5709eb3cb607dcd1b91ec80b51c3706dca6", "testharness" @@ -672132,6 +675325,10 @@ "307f7f9ac6ea8a4ffd97b4f781932d65137de32f", "support" ], + "service-workers/service-worker/resources/clients-frame-freeze.html": [ + "7468a660e9085866e8d38ff35f02cf6a50868232", + "support" + ], "service-workers/service-worker/resources/clients-get-client-types-frame-worker.js": [ "0a1461b40e089f684faa00cac56d4491232a1432", "support" @@ -672185,7 +675382,7 @@ "support" ], "service-workers/service-worker/resources/clients-matchall-worker.js": [ - "d6634f4d40ef6ada3440b443faff176e54082a71", + "13e111a2f91464bf17fa8c60fb6f6071443a474f", "support" ], "service-workers/service-worker/resources/cors-approved.txt": [ @@ -680341,11 +683538,11 @@ "support" ], "tools/lint/lint.py": [ - "062c6a42d0f91836aaba5b308854ea6b5896b9aa", + "7397de7fb89b7869b85036bc2f4d098004e758bf", "support" ], "tools/lint/rules.py": [ - "9b78f3495b2291044243170c54af5c3cd6b61046", + "f354a33fa4905573ceef8ee6ae58ed0cd0b67e3b", "support" ], "tools/lint/tests/__init__.py": [ @@ -680485,7 +683682,7 @@ "support" ], "tools/lint/tests/test_file_lints.py": [ - "31456ae8bbca8129bbf1ef0702221a45e09d914a", + "b3a83fe5f30bf2efe8c817c216ad2f8702b3e17b", "support" ], "tools/lint/tests/test_lint.py": [ @@ -685025,7 +688222,7 @@ "support" ], "tools/wpt/browser.py": [ - "0943ee9f3d74fa1e7542712682563f0badfea54d", + "b905379c75442cd1421c7b300f2c132bda462721", "support" ], "tools/wpt/commands.json": [ @@ -685053,7 +688250,7 @@ "support" ], "tools/wpt/run.py": [ - "617ea7282b893fc17e8a794191f3223911d63dde", + "181d6bfdea9b6ba630f672cbe7bd5e5a4ab41fc5", "support" ], "tools/wpt/testfiles.py": [ @@ -685152,6 +688349,10 @@ "d6c7a4ff3983663d088c64f6608e3fcf7de3bbfe", "support" ], + "tools/wptrunner/requirements_android_webview.txt": [ + "470aaf9a93996d0231e13e05cc35557a36d25de9", + "support" + ], "tools/wptrunner/requirements_chrome.txt": [ "470aaf9a93996d0231e13e05cc35557a36d25de9", "support" @@ -685329,7 +688530,11 @@ "support" ], "tools/wptrunner/wptrunner/browsers/__init__.py": [ - "18434e499dc2276d6b23157b854dcc116c664901", + "75ec775658ce5d3b15e919bcd166a4af08ccb868", + "support" + ], + "tools/wptrunner/wptrunner/browsers/android_webview.py": [ + "42ae8b64b142c95124fa392ccd7d0b632297a6db", "support" ], "tools/wptrunner/wptrunner/browsers/base.py": [ @@ -685421,7 +688626,7 @@ "support" ], "tools/wptrunner/wptrunner/executors/base.py": [ - "588e0b2fad6afbe17ed4ba9ea5b8f25cc9b7e055", + "b1e86ff1fd07ee040ed7c905a2462053b9e30a62", "support" ], "tools/wptrunner/wptrunner/executors/executorchrome.py": [ @@ -685569,7 +688774,7 @@ "support" ], "tools/wptrunner/wptrunner/testdriver-extra.js": [ - "e23073dece1f35db632d48ad6036a90a9cc12b46", + "9f97fac9a0cbc99ae8631ac2a1179da8bb9123a8", "support" ], "tools/wptrunner/wptrunner/testdriver-vendor.js": [ @@ -686224,10 +689429,6 @@ "475a264790482aedf714958f63a4d47d69661941", "testharness" ], - "trusted-types/TrustedTypePolicy-exposed.tentative.html": [ - "e671c6fb61dcb58392c9fb0ac3f4fb37a67698bf", - "testharness" - ], "trusted-types/TrustedTypePolicy-name.tentative.html": [ "c121fe4cab50ab52a7159184bfa012e85d555768", "testharness" @@ -686252,18 +689453,14 @@ "1293493ec1f7780b297d2040274150f0aba32adc", "testharness" ], - "trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html": [ - "a6dd2d1317aa4df94e693e1ad7d0d0684ea0bbc2", - "testharness" - ], - "trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html": [ - "137d0f54c8228645aaf184cc64654e1d66ffbaa6", - "testharness" - ], "trusted-types/TrustedTypePolicyFactory-createPolicy-nameTests.tentative.html": [ "6d43e0bafc61f34c17d7d7b751bf69f12d035adf", "testharness" ], + "trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html": [ + "ea00566854d12cbd6d2610aafdac44fd549ffbe7", + "testharness" + ], "trusted-types/TrustedTypePolicyFactory-isXXX.tentative.html": [ "854f69ed1e550bd660b8cf7a18b4a81a666072fd", "testharness" @@ -686385,7 +689582,7 @@ "support" ], "trusted-types/trusted-types-reporting.tentative.https.html": [ - "8dda8b23c8f06bfa375b6c6de874c7de0fbfc3c3", + "16e6d2a7d8d3e01c1cc469ea67b9e0361658495d", "testharness" ], "trusted-types/trusted-types-reporting.tentative.https.html.headers": [ @@ -688921,7 +692118,7 @@ "testharness" ], "web-animations/timing-model/animations/pausing-an-animation.html": [ - "97c7214ac75fd77ad3fc2b3c0df12c3d850a0936", + "5383b520bb47ed2e4f5470d5c66438d1f12d8d75", "testharness" ], "web-animations/timing-model/animations/play-states.html": [ @@ -689105,11 +692302,11 @@ "support" ], "web-nfc/NDEFMessage_constructor.https.html": [ - "24d5046f4839f560c8be2c9e164fd93b3ab86943", + "6515a7fdd0246c23d8193f06593687a4d9bdc658", "testharness" ], "web-nfc/NDEFRecord_constructor.https.html": [ - "2264815780b47107562750c39a2b0152c97ba865", + "4d6ec956eacfe08eb01d244a4b2b77fc7277f428", "testharness" ], "web-nfc/NFCErrorEvent_constructor.https.html": [ @@ -689145,7 +692342,7 @@ "testharness" ], "web-nfc/resources/nfc-helpers.js": [ - "76c878ae094b8c98ad8f44aca335a0f157ea01f7", + "02f348ddf275d5f191e6cf4982c97d84900a59f9", "support" ], "web-share/META.yml": [ @@ -696764,6 +699961,14 @@ "6dc019754d52e508c620fecdf72efd6431eabcb4", "reftest" ], + "webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html": [ + "bcd2dd2942c846f4f56938e842360ccf992eae09", + "support" + ], + "webvtt/rendering/cues-with-video/processing-model/snap-to-line.html": [ + "f3705a1879b61669483ec6c0867d5be48ffa2421", + "reftest" + ], "webvtt/rendering/cues-with-video/processing-model/support/2_cues_overlapping_completely_move_up.vtt": [ "1ca56e56f6a8be9c485cb11081c30108573a1b54", "support" @@ -696940,6 +700145,10 @@ "b165af1533b0cf1688ce3835eeeaccfe348979df", "support" ], + "webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt": [ + "2d102812eeb1a26b1e82161d21974da936195943", + "support" + ], "webvtt/rendering/cues-with-video/processing-model/support/start_alignment.vtt": [ "9a92729381b3d974ef10dabd720d25f05c984717", "support" @@ -697157,7 +700366,7 @@ "support" ], "webxr/resources/webxr_test_constants.js": [ - "a0b0e278a87401702aabf1fd375f3100f20dd7d7", + "e0330b80f53398a9ac0cff9edee7b82cc560a8b5", "support" ], "webxr/resources/webxr_util.js": [ @@ -697181,7 +700390,7 @@ "testharness" ], "webxr/xrBoundedReferenceSpace_updates.https.html": [ - "1d7ad93695adedb538e43084568a80c9b40b7660", + "812acf457c155c64bd47341ba3b710d696993a8c", "testharness" ], "webxr/xrDevice_disconnect_ends.https.html": [ @@ -697273,11 +700482,11 @@ "testharness" ], "webxr/xrReferenceSpace_originOffset.https.html": [ - "516df836b1bb886ea79002e7121dc33b7ce6b7fc", + "fd5fa68e1fc4a837b8bef41876a36278e6bb84fb", "testharness" ], "webxr/xrReferenceSpace_originOffsetBounded.https.html": [ - "d0f91a4630d045c2fc8f3f6dbc588cc769386fd2", + "5e2bd39d2dee2d6c2146b7a421371db0360c0577", "testharness" ], "webxr/xrRigidTransform_constructor.https.html": [ @@ -697293,7 +700502,7 @@ "testharness" ], "webxr/xrRigidTransform_sameObject.https.html": [ - "d014fe6fb56766a636559db67abc06428a88e98c", + "57c7ef1853ea24f9ce8f339e01ce9e929dcaf22f", "testharness" ], "webxr/xrSession_cancelAnimationFrame.https.html": [ @@ -697308,6 +700517,10 @@ "e8c078ead9b7eaf4ed4312f14945ddfa07994614", "testharness" ], + "webxr/xrSession_features_deviceSupport.https.html": [ + "45a68c9df2f09e6905187b48377a39774a933908", + "testharness" + ], "webxr/xrSession_input_events_end.https.html": [ "37e020605a7e88320c42e054f867f611955c5713", "testharness" @@ -697325,7 +700538,7 @@ "testharness" ], "webxr/xrSession_requestAnimationFrame_getViewerPose.https.html": [ - "9ddc36e95b3fae928a3ccb01e0a9a76f3977f38e", + "70e9d6e6e5951aa8c7cfd69e8fcac6e158351153", "testharness" ], "webxr/xrSession_requestAnimationFrame_timestamp.https.html": [ @@ -697344,6 +700557,10 @@ "837fa0a008d6cdfcbd9ee134e7ec78bce7c2b95b", "testharness" ], + "webxr/xrSession_viewer_availability.https.html": [ + "686859166feb773c9f5701a801630359e7abdc4c", + "testharness" + ], "webxr/xrSession_viewer_referenceSpace.https.html": [ "fd6082bc3468f094953152d220fceafa083baf76", "testharness" @@ -697361,11 +700578,11 @@ "testharness" ], "webxr/xrView_match.https.html": [ - "142f272d36f812c49455a78bfc62f285f9e64818", + "9ccad9518b9c580be312be7e605840e24caa12e2", "testharness" ], "webxr/xrView_oneframeupdate.https.html": [ - "9404fcb8aaf33876f2918d3796190f16feafe506", + "4386433788c55dd13bc9a663b6796530e4852368", "testharness" ], "webxr/xrView_sameObject.https.html": [ diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-absent-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-absent-getAvailability.https.window.js.ini new file mode 100644 index 00000000000..2381bf3b21c --- /dev/null +++ b/tests/wpt/metadata/bluetooth/adapter/adapter-absent-getAvailability.https.window.js.ini @@ -0,0 +1,4 @@ +[adapter-absent-getAvailability.https.window.html] + [getAvailability() resolves with false if the system does not have an adapter.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-added-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-added-getAvailability.https.window.js.ini new file mode 100644 index 00000000000..d27675d262d --- /dev/null +++ b/tests/wpt/metadata/bluetooth/adapter/adapter-added-getAvailability.https.window.js.ini @@ -0,0 +1,4 @@ +[adapter-added-getAvailability.https.window.html] + [getAvailability() resolves with true after adapter is inserted into a system with a platform that supports Bluetooth LE.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js.ini new file mode 100644 index 00000000000..4eeb745298f --- /dev/null +++ b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js.ini @@ -0,0 +1,4 @@ +[adapter-powered-off-getAvailability.https.window.html] + [getAvailability() resolves with true if the Bluetooth radio is powered off, but the platform that supports Bluetooth LE.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js.ini new file mode 100644 index 00000000000..4d336bda5b0 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js.ini @@ -0,0 +1,4 @@ +[adapter-powered-on-getAvailability.https.window.html] + [getAvailability() resolves with true if the Bluetooth radio is powered on and the platform supports Bluetooth LE.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js.ini new file mode 100644 index 00000000000..dd3c573439d --- /dev/null +++ b/tests/wpt/metadata/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js.ini @@ -0,0 +1,4 @@ +[adapter-powered-on-off-on-getAvailability.https.window.html] + [getAvailability() is not affected by the powered state of the adapter.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/adapter/adapter-removed-getAvailability.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/adapter-removed-getAvailability.https.window.js.ini new file mode 100644 index 00000000000..0f787434b24 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/adapter/adapter-removed-getAvailability.https.window.js.ini @@ -0,0 +1,4 @@ +[adapter-removed-getAvailability.https.window.html] + [getAvailability() resolves with false after the powered on adapter is removed.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js.ini b/tests/wpt/metadata/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js.ini new file mode 100644 index 00000000000..65bf7c25b5b --- /dev/null +++ b/tests/wpt/metadata/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js.ini @@ -0,0 +1,4 @@ +[cross-origin-iframe-getAvailability.sub.https.window.html] + [getAvailability() resolves with false if called from a unique origin] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js.ini new file mode 100644 index 00000000000..e31590e2b73 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-is-removed.https.window.html] + [Characteristic gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js.ini new file mode 100644 index 00000000000..2d41bb08fa6 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-descriptor-get-same-object.https.window.html] + [Calls to getDescriptor should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js.ini new file mode 100644 index 00000000000..b0d6d6a2908 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed.https.window.html] + [Service is removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..1142802d6d6 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-is-removed-with-uuid.https.window.html] + [Characteristic gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js.ini new file mode 100644 index 00000000000..e31590e2b73 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-is-removed.https.window.html] + [Characteristic gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js.ini new file mode 100644 index 00000000000..2176cf384e8 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-descriptor-get-same-object.https.window.html] + [Calls to getDescriptors should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..f5a0da03571 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed-with-uuid.https.window.html] + [Service is removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js.ini new file mode 100644 index 00000000000..b0d6d6a2908 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed.https.window.html] + [Service is removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js.ini new file mode 100644 index 00000000000..e31590e2b73 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-is-removed.https.window.html] + [Characteristic gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js.ini new file mode 100644 index 00000000000..e31590e2b73 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-is-removed.https.window.html] + [Characteristic gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js.ini new file mode 100644 index 00000000000..e31590e2b73 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-is-removed.https.window.html] + [Characteristic gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js.ini new file mode 100644 index 00000000000..8bc6d5ad998 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed.https.window.html] + [Service gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/descriptor/readValue/read-succeeds.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/readValue/read-succeeds.https.window.js.ini new file mode 100644 index 00000000000..595c74f9adb --- /dev/null +++ b/tests/wpt/metadata/bluetooth/descriptor/readValue/read-succeeds.https.window.js.ini @@ -0,0 +1,4 @@ +[read-succeeds.https.window.html] + [A read request succeeds and returns the descriptor's value.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js.ini new file mode 100644 index 00000000000..900b56a01c7 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js.ini @@ -0,0 +1,4 @@ +[buffer-is-detached.https.window.html] + [writeValue() fails when passed a detached buffer] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js.ini new file mode 100644 index 00000000000..8bc6d5ad998 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed.https.window.html] + [Service gets removed. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js.ini new file mode 100644 index 00000000000..9ed5c89acd2 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js.ini @@ -0,0 +1,4 @@ +[disconnected.https.window.html] + [A device disconnecting while connected should fire the gattserverdisconnected event.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js.ini new file mode 100644 index 00000000000..5fa614818e6 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js.ini @@ -0,0 +1,4 @@ +[disconnected_gc.https.window.html] + [A device disconnecting after the BluetoothDevice object has been GC'ed should not access freed memory.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js.ini new file mode 100644 index 00000000000..17178b457fa --- /dev/null +++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js.ini @@ -0,0 +1,4 @@ +[one-event-per-disconnection.https.window.html] + [If a site disconnects from a device while the platform is disconnecting that device, only one gattserverdisconnected event should fire.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js.ini b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js.ini new file mode 100644 index 00000000000..78fbd8c84a5 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js.ini @@ -0,0 +1,4 @@ +[reconnect-during-disconnected-event.https.window.html] + [A device that reconnects during the gattserverdisconnected event should still receive gattserverdisconnected events after re-connection.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js.ini new file mode 100644 index 00000000000..34036491560 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-before.https.window.html] + [disconnect() called before getPrimaryService. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js.ini new file mode 100644 index 00000000000..4a74d99b1e5 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-during-error.https.window.html] + [disconnect() called during a getPrimaryService call that fails. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js.ini new file mode 100644 index 00000000000..03f447e8462 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-during-success.https.window.html] + [disconnect() called during a getPrimaryService call that succeeds. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js.ini new file mode 100644 index 00000000000..fb3e2c0cf12 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-invalidates-objects.https.window.html] + [Calls on services after we disconnect and connect again. Should reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js.ini new file mode 100644 index 00000000000..4515495540d --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnected-device.https.window.html] + [getPrimaryService called before connecting. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js.ini new file mode 100644 index 00000000000..cb130fb03ef --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-discovery-complete-no-permission-absent-service.https.window.html] + [Request for absent service without permission. Should Reject with SecurityError even if services have been discovered already.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js.ini new file mode 100644 index 00000000000..2eb9fdd84de --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-discovery-complete-service-not-found.https.window.html] + [Request for absent service. Must reject with NotFoundError even when the services have previously been discovered.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js.ini new file mode 100644 index 00000000000..ae1893e83e5 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-error.https.window.html] + [Garbage Collection ran during a getPrimaryService call that failed. Should not crash.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js.ini new file mode 100644 index 00000000000..1aab32c36c3 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-success.https.window.html] + [Garbage Collection ran during a getPrimaryService call that succeeds. Should not crash.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js.ini new file mode 100644 index 00000000000..131f50484b8 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-different-service-after-reconnection.https.window.html] + [Calls to getPrimaryService after a disconnection should return a different object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js.ini new file mode 100644 index 00000000000..a5fbc9e8dc5 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-same-object.https.window.html] + [Calls to getPrimaryService should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js.ini new file mode 100644 index 00000000000..97e4de15dc7 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-invalid-service-name.https.window.html] + [Wrong Service name. Reject with TypeError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js.ini new file mode 100644 index 00000000000..c790eddb45c --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-no-permission-absent-service.https.window.html] + [Request for absent service without permission. Reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js.ini new file mode 100644 index 00000000000..990b50c318b --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-no-permission-for-any-service.https.window.html] + [Request for present service without permission to access any service. Reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js.ini new file mode 100644 index 00000000000..b7033c7aca2 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-no-permission-present-service.https.window.html] + [Request for present service without permission. Reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js.ini new file mode 100644 index 00000000000..7c3074a6086 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-not-found.https.window.html] + [Request for absent service. Reject with NotFoundError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..ceb15fb9158 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-before-with-uuid.https.window.html] + [disconnect() called before getPrimaryServices. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js.ini new file mode 100644 index 00000000000..c306c71a357 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-before.https.window.html] + [disconnect() called before getPrimaryServices. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..24a53520e73 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-during-error-with-uuid.https.window.html] + [disconnect() called during a getPrimaryServices call that fails. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js.ini new file mode 100644 index 00000000000..82c7d94c882 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-during-error.https.window.html] + [disconnect() called during a getPrimaryServices call that fails. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..312f0fbad9a --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-during-success-with-uuid.https.window.html] + [disconnect() called during a getPrimaryServices call that succeeds. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js.ini new file mode 100644 index 00000000000..6c63b12d8b2 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-called-during-success.https.window.html] + [disconnect() called during a getPrimaryServices call that succeeds. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..711bb4c18e7 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-invalidates-objects-with-uuid.https.window.html] + [Calls on services after we disconnect and connect again. Should reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js.ini new file mode 100644 index 00000000000..fb3e2c0cf12 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnect-invalidates-objects.https.window.html] + [Calls on services after we disconnect and connect again. Should reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..e6f7d7885ef --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnected-device-with-uuid.https.window.html] + [getPrimaryServices called before connecting. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js.ini new file mode 100644 index 00000000000..f3339275113 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-disconnected-device.https.window.html] + [getPrimaryServices called before connecting. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..ceb1d394efb --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.html] + [Request for absent service without permission. Should Reject with SecurityError even if services have been discovered already.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..c987da10e00 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-discovery-complete-service-not-found-with-uuid.https.window.html] + [Request for absent service. Must reject with NotFoundError even when the services have previously been discovered.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..81f7a5a79b3 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-error-with-uuid.https.window.html] + [Garbage Collection ran during a getPrimaryServices call that failed. Should not crash.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js.ini new file mode 100644 index 00000000000..f70f0b63124 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-error.https.window.html] + [Garbage Collection ran during a getPrimaryServices call that failed. Should not crash.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..65c5c0eecbf --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-success-with-uuid.https.window.html] + [Garbage Collection ran during a getPrimaryServices call that succeeds. Should not crash.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js.ini new file mode 100644 index 00000000000..7959c977b2a --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-success.https.window.html] + [Garbage Collection ran during a getPrimaryServices call that succeeds. Should not crash.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..aa941fe452c --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-different-service-after-reconnection-with-uuid.https.window.html] + [Calls to getPrimaryServices after a disconnection should return a different object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js.ini new file mode 100644 index 00000000000..c568b1e70b9 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-different-service-after-reconnection.https.window.html] + [Calls to getPrimaryServices after a disconnection should return a different object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..7b33003b1e1 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-same-object-with-uuid.https.window.html] + [Calls to getPrimaryServices should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js.ini new file mode 100644 index 00000000000..f918c020d7b --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-same-object.https.window.html] + [Calls to getPrimaryServices should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js.ini new file mode 100644 index 00000000000..97e4de15dc7 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-invalid-service-name.https.window.html] + [Wrong Service name. Reject with TypeError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..aa0229428b8 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-no-permission-absent-service-with-uuid.https.window.html] + [Request for absent service without permission. Reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..79d9cd78fe4 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-no-permission-for-any-service-with-uuid.https.window.html] + [Request for present service without permission to access any service. Reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js.ini new file mode 100644 index 00000000000..990b50c318b --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-no-permission-for-any-service.https.window.html] + [Request for present service without permission to access any service. Reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..7cbc7d5b499 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-no-permission-present-service-with-uuid.https.window.html] + [Request for present service without permission. Reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..e931f86fd76 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-not-found-with-uuid.https.window.html] + [Request for absent service. Reject with NotFoundError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js.ini new file mode 100644 index 00000000000..2f98d5da0d3 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-blocklisted-characteristic.https.window.html] + [Serial Number String characteristic is blocklisted. Should reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js.ini new file mode 100644 index 00000000000..45d32574c9c --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-not-found.https.window.html] + [Request for absent characteristics with UUID. Reject with NotFoundError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js.ini new file mode 100644 index 00000000000..b8f96bbc75f --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-error.https.window.html] + [Garbage Collection ran during getCharacteristic call that fails. Should not crash] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js.ini new file mode 100644 index 00000000000..76e58651387 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-same-object.https.window.html] + [Calls to getCharacteristic should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js.ini new file mode 100644 index 00000000000..77fe3cb4170 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-invalid-characteristic-name.https.window.html] + [Wrong Characteristic name. Reject with TypeError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js.ini new file mode 100644 index 00000000000..b1651b829bf --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-reconnect-during.https.window.html] + [disconnect() and connect() called during getCharacteristic. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js.ini new file mode 100644 index 00000000000..18c89a7dca4 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed.https.window.html] + [Service is removed before getCharacteristic call. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..de155411237 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-blocklisted-characteristic-with-uuid.https.window.html] + [Serial Number String characteristic is blocklisted. Should reject with SecurityError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..7312e44b568 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-characteristic-not-found-with-uuid.https.window.html] + [Request for absent characteristics with UUID. Reject with NotFoundError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..baa2c60a65f --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-error-with-uuid.https.window.html] + [Garbage Collection ran during getCharacteristics call that fails. Should not crash] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js.ini new file mode 100644 index 00000000000..0bb21aebfd6 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-garbage-collection-ran-during-error.https.window.html] + [Garbage Collection ran during getCharacteristics call that fails. Should not crash] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..9e5eee8d71c --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-same-object-with-uuid.https.window.html] + [Calls to getCharacteristics should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js.ini new file mode 100644 index 00000000000..6b63ba87fef --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-get-same-object.https.window.html] + [Calls to getCharacteristics should return the same object.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js.ini new file mode 100644 index 00000000000..77fe3cb4170 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-invalid-characteristic-name.https.window.html] + [Wrong Characteristic name. Reject with TypeError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..87a6ae1e91a --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-reconnect-during-with-uuid.https.window.html] + [disconnect() and connect() called during getCharacteristics. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js.ini new file mode 100644 index 00000000000..ab2a94dab3c --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-reconnect-during.https.window.html] + [disconnect() and connect() called during getCharacteristics. Reject with NetworkError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js.ini new file mode 100644 index 00000000000..380115923b9 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed-with-uuid.https.window.html] + [Service is removed before getCharacteristics call. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js.ini b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js.ini new file mode 100644 index 00000000000..665b3871e29 --- /dev/null +++ b/tests/wpt/metadata/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js.ini @@ -0,0 +1,4 @@ +[gen-service-is-removed.https.window.html] + [Service is removed before getCharacteristics call. Reject with InvalidStateError.] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-color-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-color-interpolation.html.ini new file mode 100644 index 00000000000..ca374b82142 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-color-interpolation.html.ini @@ -0,0 +1,4 @@ +[background-color-interpolation.html] + [background-color-interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-position-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-interpolation.html.ini new file mode 100644 index 00000000000..cd4abcc999d --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-interpolation.html.ini @@ -0,0 +1,4 @@ +[background-position-interpolation.html] + [background-position-interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-position-origin-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-origin-interpolation.html.ini new file mode 100644 index 00000000000..2a5a51aa646 --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-position-origin-interpolation.html.ini @@ -0,0 +1,4 @@ +[background-position-origin-interpolation.html] + [background-position-origin-interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/animations/background-size-interpolation.html.ini b/tests/wpt/metadata/css/css-backgrounds/animations/background-size-interpolation.html.ini new file mode 100644 index 00000000000..cca534c8bbb --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/animations/background-size-interpolation.html.ini @@ -0,0 +1,4 @@ +[background-size-interpolation.html] + [background-size-interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-backgrounds/background-position-negative-percentage-comparison.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-position-negative-percentage-comparison.html.ini new file mode 100644 index 00000000000..97f5bd10ffd --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/background-position-negative-percentage-comparison.html.ini @@ -0,0 +1,2 @@ +[background-position-negative-percentage-comparison.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/flexbox_align-items-stretch-3.html.ini b/tests/wpt/metadata/css/css-flexbox/flexbox_align-items-stretch-3.html.ini new file mode 100644 index 00000000000..9880266ee58 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/flexbox_align-items-stretch-3.html.ini @@ -0,0 +1,2 @@ +[flexbox_align-items-stretch-3.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-interpolation.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-interpolation.html.ini new file mode 100644 index 00000000000..0d88804e1be --- /dev/null +++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-adjust-interpolation.html.ini @@ -0,0 +1,4 @@ +[font-size-adjust-interpolation.html] + [font-size-adjust interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-001.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-001.html.ini new file mode 100644 index 00000000000..cd3b7660d6c --- /dev/null +++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-001.html.ini @@ -0,0 +1,4 @@ +[font-size-interpolation-001.html] + [font-size interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-002.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-002.html.ini new file mode 100644 index 00000000000..1f20ed1e9a7 --- /dev/null +++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-002.html.ini @@ -0,0 +1,4 @@ +[font-size-interpolation-002.html] + [font-size interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-003.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-003.html.ini new file mode 100644 index 00000000000..724e6c41c63 --- /dev/null +++ b/tests/wpt/metadata/css/css-fonts/animations/font-size-interpolation-003.html.ini @@ -0,0 +1,4 @@ +[font-size-interpolation-003.html] + [font-size interpolation with zoom] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-fonts/animations/font-variation-settings-interpolation.html.ini b/tests/wpt/metadata/css/css-fonts/animations/font-variation-settings-interpolation.html.ini new file mode 100644 index 00000000000..28ab2aa6d51 --- /dev/null +++ b/tests/wpt/metadata/css/css-fonts/animations/font-variation-settings-interpolation.html.ini @@ -0,0 +1,4 @@ +[font-variation-settings-interpolation.html] + [font-variation-settings interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/animations/letter-spacing-interpolation.html.ini b/tests/wpt/metadata/css/css-text/animations/letter-spacing-interpolation.html.ini new file mode 100644 index 00000000000..10720d01e2f --- /dev/null +++ b/tests/wpt/metadata/css/css-text/animations/letter-spacing-interpolation.html.ini @@ -0,0 +1,4 @@ +[letter-spacing-interpolation.html] + [letter-spacing-interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/animations/text-indent-interpolation.html.ini b/tests/wpt/metadata/css/css-text/animations/text-indent-interpolation.html.ini new file mode 100644 index 00000000000..b0f38402877 --- /dev/null +++ b/tests/wpt/metadata/css/css-text/animations/text-indent-interpolation.html.ini @@ -0,0 +1,4 @@ +[text-indent-interpolation.html] + [text-indent-interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-text/animations/word-spacing-interpolation.html.ini b/tests/wpt/metadata/css/css-text/animations/word-spacing-interpolation.html.ini new file mode 100644 index 00000000000..9909c7e9051 --- /dev/null +++ b/tests/wpt/metadata/css/css-text/animations/word-spacing-interpolation.html.ini @@ -0,0 +1,4 @@ +[word-spacing-interpolation.html] + [word-spacing-interpolation] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-transforms/parsing/transform-valid.html.ini b/tests/wpt/metadata/css/css-transforms/parsing/transform-valid.html.ini new file mode 100644 index 00000000000..65097b93460 --- /dev/null +++ b/tests/wpt/metadata/css/css-transforms/parsing/transform-valid.html.ini @@ -0,0 +1,13 @@ +[transform-valid.html] + [e.style['transform'\] = "skewX(2e80deg)" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(2e80deg)" should set the property value] + expected: FAIL + + [e.style['transform'\] = "translateX(2e80px)" should set the property value] + expected: FAIL + + [e.style['transform'\] = "scaleX(2e80)" should set the property value] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-values/minmax-angle-serialize.html.ini b/tests/wpt/metadata/css/css-values/minmax-angle-serialize.html.ini new file mode 100644 index 00000000000..d08c22371d7 --- /dev/null +++ b/tests/wpt/metadata/css/css-values/minmax-angle-serialize.html.ini @@ -0,0 +1,25 @@ +[minmax-angle-serialize.html] + [e.style['transform'\] = "rotate(min(1deg))" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(min(1rad))" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(max(1turn))" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(max(1rad))" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(min(1grad))" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(max(1deg))" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(max(1grad))" should set the property value] + expected: FAIL + + [e.style['transform'\] = "rotate(min(1turn))" should set the property value] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-values/minmax-integer-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-integer-computed.html.ini new file mode 100644 index 00000000000..0b6cc5fc550 --- /dev/null +++ b/tests/wpt/metadata/css/css-values/minmax-integer-computed.html.ini @@ -0,0 +1,31 @@ +[minmax-integer-computed.html] + [Property z-index value 'min(1.1, max(0.4, 0.6))' computes to '1'] + expected: FAIL + + [Property z-index value 'max(1)' computes to '1'] + expected: FAIL + + [Property z-index value 'max(0.4)' computes to '0'] + expected: FAIL + + [Property z-index value 'min(0.6)' computes to '1'] + expected: FAIL + + [Property z-index value 'max(0.3, min(1.1, 0.4))' computes to '0'] + expected: FAIL + + [Property z-index value 'max(0.6)' computes to '1'] + expected: FAIL + + [Property z-index value 'min(1)' computes to '1'] + expected: FAIL + + [Property z-index value 'calc(max(0.3, 0.6) / 2)' computes to '0'] + expected: FAIL + + [Property z-index value 'min(0.4)' computes to '0'] + expected: FAIL + + [Property z-index value 'calc(min(0.3, 0.6) * 2)' computes to '1'] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-values/minmax-length-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-length-computed.html.ini new file mode 100644 index 00000000000..63c4f7864d2 --- /dev/null +++ b/tests/wpt/metadata/css/css-values/minmax-length-computed.html.ini @@ -0,0 +1,238 @@ +[minmax-length-computed.html] + [Property letter-spacing value 'max(1px)' computes to '1px'] + expected: FAIL + + [Property letter-spacing value 'max(15px, 2em)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'min(1Q)' computes to '0.944882px'] + expected: FAIL + + [Property letter-spacing value 'min(1pc)' computes to '16px'] + expected: FAIL + + [Property letter-spacing value 'max(25px, 1em)' computes to '25px'] + expected: FAIL + + [Property letter-spacing value 'min(1em)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(1mm, 2mm)' computes to '7.55906px'] + expected: FAIL + + [Property letter-spacing value 'min(1vh)' computes to '7.4px'] + expected: FAIL + + [Property letter-spacing value 'max(1cm, 2cm)' computes to '75.5906px'] + expected: FAIL + + [Property letter-spacing value 'max(1pt)' computes to '1.33333px'] + expected: FAIL + + [Property letter-spacing value 'min(1em, 2em)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(1in, 2in)' computes to '192px'] + expected: FAIL + + [Property letter-spacing value 'max(15px, 1em)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(1vmax)' computes to '10.2333px'] + expected: FAIL + + [Property letter-spacing value 'min(1pc, 2pc)' computes to '16px'] + expected: FAIL + + [Property letter-spacing value 'min(1ex, 2ex)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'max(1vmax, 2vmax)' computes to '20.4667px'] + expected: FAIL + + [Property letter-spacing value 'max(1pc)' computes to '16px'] + expected: FAIL + + [Property letter-spacing value 'min(1ch, 2ch)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'max(1px, 2px)' computes to '2px'] + expected: FAIL + + [Property letter-spacing value 'max(1ch, 2ch)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(1vh)' computes to '7.4px'] + expected: FAIL + + [Property letter-spacing value 'min(15px, 1em)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'min(1vw, 2vw)' computes to '10.2333px'] + expected: FAIL + + [Property letter-spacing value 'min(1cm)' computes to '37.7953px'] + expected: FAIL + + [Property letter-spacing value 'min(1pt, 2pt)' computes to '1.33333px'] + expected: FAIL + + [Property letter-spacing value 'max(1in)' computes to '96px'] + expected: FAIL + + [Property letter-spacing value 'calc(min(1em, 21px) + max(0.9em, 20px))' computes to '40px'] + expected: FAIL + + [Property letter-spacing value 'min(1vh, 2vh)' computes to '7.4px'] + expected: FAIL + + [Property letter-spacing value 'min(15px, 1em)' computes to '15px'] + expected: FAIL + + [Property letter-spacing value 'max(1em)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(1Q)' computes to '0.944882px'] + expected: FAIL + + [Property letter-spacing value 'calc(min(1em, 21px) * 2' computes to '40px'] + expected: FAIL + + [Property letter-spacing value 'max(1vmin, 2vmin)' computes to '14.8px'] + expected: FAIL + + [Property letter-spacing value 'calc(min(1em, 21px) - 10px)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'min(1in, 2in)' computes to '96px'] + expected: FAIL + + [Property letter-spacing value 'min(1cm, 2cm)' computes to '37.7953px'] + expected: FAIL + + [Property letter-spacing value 'calc(max(1em, 19px) + 10px)' computes to '30px'] + expected: FAIL + + [Property letter-spacing value 'min(1ch)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'calc(min(1em, 21px) / 2' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'calc(max(1em, 19px) - 10px)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'max(1vmin)' computes to '7.4px'] + expected: FAIL + + [Property letter-spacing value 'min(1mm, 2mm)' computes to '3.77953px'] + expected: FAIL + + [Property letter-spacing value 'calc(min(1em, 21px) + 10px)' computes to '30px'] + expected: FAIL + + [Property letter-spacing value 'min(1rem)' computes to '16px'] + expected: FAIL + + [Property letter-spacing value 'min(1px, 2px)' computes to '1px'] + expected: FAIL + + [Property letter-spacing value 'min(25px, 1em)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'min(1vmin, 2vmin)' computes to '7.4px'] + expected: FAIL + + [Property letter-spacing value 'min(1ex)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'min(1vmax)' computes to '10.2333px'] + expected: FAIL + + [Property letter-spacing value 'max(1vw)' computes to '10.2333px'] + expected: FAIL + + [Property letter-spacing value 'max(1pc, 2pc)' computes to '32px'] + expected: FAIL + + [Property letter-spacing value 'min(1Q, 2Q)' computes to '0.944882px'] + expected: FAIL + + [Property letter-spacing value 'min(25px, max(15px, 1em))' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(95px, 1in)' computes to '96px'] + expected: FAIL + + [Property letter-spacing value 'max(1rem, 2rem)' computes to '32px'] + expected: FAIL + + [Property letter-spacing value 'min(1vmax, 2vmax)' computes to '10.2333px'] + expected: FAIL + + [Property letter-spacing value 'min(1pt)' computes to '1.33333px'] + expected: FAIL + + [Property letter-spacing value 'max(1Q, 2Q)' computes to '1.88976px'] + expected: FAIL + + [Property letter-spacing value 'min(1rem, 2rem)' computes to '16px'] + expected: FAIL + + [Property letter-spacing value 'max(1cm)' computes to '37.7953px'] + expected: FAIL + + [Property letter-spacing value 'max(1em, 2em)' computes to '40px'] + expected: FAIL + + [Property letter-spacing value 'min(1vw)' computes to '10.2333px'] + expected: FAIL + + [Property letter-spacing value 'calc(max(1em, 19px) / 2' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'max(1ex)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'max(15px, min(25px, 1em))' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(1rem)' computes to '16px'] + expected: FAIL + + [Property letter-spacing value 'min(95px, 1in)' computes to '95px'] + expected: FAIL + + [Property letter-spacing value 'min(1vmin)' computes to '7.4px'] + expected: FAIL + + [Property letter-spacing value 'max(1vh, 2vh)' computes to '14.8px'] + expected: FAIL + + [Property letter-spacing value 'max(1mm)' computes to '3.77953px'] + expected: FAIL + + [Property letter-spacing value 'max(1ex, 2ex)' computes to '20px'] + expected: FAIL + + [Property letter-spacing value 'max(1ch)' computes to '10px'] + expected: FAIL + + [Property letter-spacing value 'min(1mm)' computes to '3.77953px'] + expected: FAIL + + [Property letter-spacing value 'max(1vw, 2vw)' computes to '20.4667px'] + expected: FAIL + + [Property letter-spacing value 'min(1px)' computes to '1px'] + expected: FAIL + + [Property letter-spacing value 'max(1pt, 2pt)' computes to '2.66667px'] + expected: FAIL + + [Property letter-spacing value 'min(1in)' computes to '96px'] + expected: FAIL + + [Property letter-spacing value 'calc(max(1em, 19px) * 2' computes to '40px'] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-values/minmax-number-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-number-computed.html.ini new file mode 100644 index 00000000000..b18a8cc2b58 --- /dev/null +++ b/tests/wpt/metadata/css/css-values/minmax-number-computed.html.ini @@ -0,0 +1,37 @@ +[minmax-number-computed.html] + [Property opacity value 'calc(max(0.1, 0.2) * 2)' computes to '0.4'] + expected: FAIL + + [Property opacity value 'calc(min(0.1, 0.2) / 2)' computes to '0.05'] + expected: FAIL + + [Property opacity value 'calc(max(0.1, 0.2) - 0.05)' computes to '0.15'] + expected: FAIL + + [Property opacity value 'calc(min(0.1, 0.2) * 2)' computes to '0.2'] + expected: FAIL + + [Property opacity value 'max(0.1, min(0.2, 0.15))' computes to '0.15'] + expected: FAIL + + [Property opacity value 'calc(min(0.1, 0.2) - 0.05)' computes to '0.05'] + expected: FAIL + + [Property opacity value 'calc(max(0.1, 0.2) + 0.05)' computes to '0.25'] + expected: FAIL + + [Property opacity value 'min(0.2, max(0.1, 0.15))' computes to '0.15'] + expected: FAIL + + [Property opacity value 'calc(max(0.1, 0.2) / 2)' computes to '0.1'] + expected: FAIL + + [Property opacity value 'calc(min(0.1, 0.2) + 0.05)' computes to '0.15'] + expected: FAIL + + [Property opacity value 'calc(min(0.1, 0.2) + max(0.1, 0.05))' computes to '0.2'] + expected: FAIL + + [Property opacity value 'calc(min(0.1, 0.2) - max(0.1, 0.05))' computes to '0'] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-values/minmax-percentage-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-percentage-computed.html.ini new file mode 100644 index 00000000000..b1c6d348dfa --- /dev/null +++ b/tests/wpt/metadata/css/css-values/minmax-percentage-computed.html.ini @@ -0,0 +1,40 @@ +[minmax-percentage-computed.html] + [Property margin-left value 'calc(min(10%, 20%) / 2)' computes to '20px'] + expected: FAIL + + [Property margin-left value 'calc(max(10%, 20%) * 2)' computes to '160px'] + expected: FAIL + + [Property margin-left value 'min(1%)' computes to '4px'] + expected: FAIL + + [Property margin-left value 'max(1%)' computes to '4px'] + expected: FAIL + + [Property margin-left value 'min(20%, max(10%, 15%))' computes to '60px'] + expected: FAIL + + [Property margin-left value 'calc(min(10%, 20%) * 2)' computes to '80px'] + expected: FAIL + + [Property margin-left value 'calc(max(10%, 20%) - 5%)' computes to '60px'] + expected: FAIL + + [Property margin-left value 'calc(max(10%, 20%) / 2)' computes to '40px'] + expected: FAIL + + [Property margin-left value 'calc(min(10%, 20%) - 5%)' computes to '20px'] + expected: FAIL + + [Property margin-left value 'calc(min(10%, 20%) + 5%)' computes to '60px'] + expected: FAIL + + [Property margin-left value 'calc(min(10%, 20%) + max(10%, 5%))' computes to '80px'] + expected: FAIL + + [Property margin-left value 'max(10%, min(20%, 15%))' computes to '60px'] + expected: FAIL + + [Property margin-left value 'calc(max(10%, 20%) + 5%)' computes to '100px'] + expected: FAIL + diff --git a/tests/wpt/metadata/css/css-values/minmax-time-computed.html.ini b/tests/wpt/metadata/css/css-values/minmax-time-computed.html.ini new file mode 100644 index 00000000000..4b4b684fdc3 --- /dev/null +++ b/tests/wpt/metadata/css/css-values/minmax-time-computed.html.ini @@ -0,0 +1,58 @@ +[minmax-time-computed.html] + [Property transition-delay value 'min(1ms)' computes to '0.001s'] + expected: FAIL + + [Property transition-delay value 'calc(max(0.5s, 400ms) * 2)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'min(1ms, 2ms)' computes to '0.001s'] + expected: FAIL + + [Property transition-delay value 'calc(max(0.5s, 400ms) + 500ms)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'calc(min(0.5s, 600ms) * 2)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'max(1000ms, min(2000ms, 1.5s))' computes to '1.5s'] + expected: FAIL + + [Property transition-delay value 'max(0.9s, 1000ms)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'calc(min(0.5s, 600ms) / 2)' computes to '0.25s'] + expected: FAIL + + [Property transition-delay value 'calc(min(0.5s, 600ms) + 500ms)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'calc(max(0.5s, 400ms) / 2)' computes to '0.25s'] + expected: FAIL + + [Property transition-delay value 'max(1ms)' computes to '0.001s'] + expected: FAIL + + [Property transition-delay value 'max(1s, 2s)' computes to '2s'] + expected: FAIL + + [Property transition-delay value 'max(1ms, 2ms)' computes to '0.002s'] + expected: FAIL + + [Property transition-delay value 'max(1s)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'calc(min(0.5s, 600ms) + max(500ms, 0.4s))' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'min(2s, max(1s, 1500ms))' computes to '1.5s'] + expected: FAIL + + [Property transition-delay value 'min(1s, 1100ms)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'min(1s)' computes to '1s'] + expected: FAIL + + [Property transition-delay value 'min(1s, 2s)' computes to '1s'] + 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 f950aa53ba3..fc6f6c144f3 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -312,15 +312,9 @@ [<iframe>: separate response Content-Type: */* text/html] expected: FAIL - [<iframe>: combined response Content-Type: */* text/html] - expected: FAIL - [<iframe>: combined response Content-Type: text/html */*] expected: FAIL - [<iframe>: combined response Content-Type: text/html;" text/plain] - expected: FAIL - [<iframe>: separate response Content-Type: text/html;" text/plain] expected: FAIL @@ -330,6 +324,9 @@ [<iframe>: combined response Content-Type: text/html;" \\" text/plain] expected: FAIL - [<iframe>: separate response Content-Type: text/plain */*;charset=gbk] + [<iframe>: combined response Content-Type: text/html */*;charset=gbk] + expected: FAIL + + [<iframe>: combined response Content-Type: text/html;x=" text/plain] expected: FAIL diff --git a/tests/wpt/metadata/fetch/content-type/script.window.js.ini b/tests/wpt/metadata/fetch/content-type/script.window.js.ini index d2df9b78483..2638e2f8172 100644 --- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini @@ -56,3 +56,12 @@ [separate text/javascript x/x] expected: FAIL + [separate text/javascript;charset=windows-1252 error text/javascript] + expected: FAIL + + [separate text/javascript error] + expected: FAIL + + [separate text/javascript;charset=windows-1252 text/javascript] + expected: FAIL + diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini index 4aa76db6401..f193b47347d 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html.ini @@ -1,5 +1,6 @@ [scroll-restoration-fragment-scrolling-cross-origin.html] type: testharness + expected: TIMEOUT [Manual scroll restoration should take precedent over scrolling to fragment in cross origin navigation] expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini deleted file mode 100644 index 87b07c3e670..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_1.html] - [Multiple history traversals from the same task] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini deleted file mode 100644 index 385376c7321..00000000000 --- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_4.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[traverse_the_history_4.html] - [Multiple history traversals, last would be aborted] - expected: FAIL - diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini index dec4c579137..16fa2c5cfc1 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/creating_browsing_context_test_01.html.ini @@ -1,5 +1,4 @@ [creating_browsing_context_test_01.html] - expected: TIMEOUT [first argument: absolute url] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini index e150c9d848f..23eefb8eaf9 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-screenx-screeny.html.ini @@ -1,5 +1,24 @@ [open-features-negative-screenx-screeny.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: negative values for legacy `screenx`, `screeny`] expected: FAIL + [features "screenx=-204" should NOT set "left=204"] + expected: TIMEOUT + + [features "screeny=-204" should NOT set "top=204"] + expected: TIMEOUT + + [features "screeny=-204.5" should NOT set "top=204"] + expected: TIMEOUT + + [features "screeny=-0" should NOT set "top=204"] + expected: TIMEOUT + + [features "screenx=-0" should NOT set "left=204"] + expected: TIMEOUT + + [features "screenx=-204.5" should NOT set "left=204"] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini index ad8840fbb68..940516ddd33 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-top-left.html.ini @@ -1,5 +1,24 @@ [open-features-negative-top-left.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: negative values for `top`, `left`] expected: FAIL + [features "top=-204" should NOT set "top=204"] + expected: TIMEOUT + + [features "top=-204.5" should NOT set "top=204"] + expected: TIMEOUT + + [features "left=-204" should NOT set "left=204"] + expected: TIMEOUT + + [features "top=-0" should NOT set "top=204"] + expected: TIMEOUT + + [features "left=-204.5" should NOT set "left=204"] + expected: TIMEOUT + + [features "left=-0" should NOT set "left=204"] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini index d1ed9088b2b..9027336b453 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-negative-width-height.html.ini @@ -1,5 +1,24 @@ [open-features-negative-width-height.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: negative values for `width`, `height`] expected: FAIL + [features "height=-404" should NOT set "height=404"] + expected: TIMEOUT + + [features "height=-404e1" should NOT set "height=404"] + expected: TIMEOUT + + [features "height=-404.5" should NOT set "height=404"] + expected: TIMEOUT + + [features "width=-404" should NOT set "width=404"] + expected: TIMEOUT + + [features "width=-404e1" should NOT set "width=404"] + expected: TIMEOUT + + [features "width=-404.5" should NOT set "width=404"] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini index a70e9dbad4d..4e44584b123 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-height.html.ini @@ -1,32 +1,48 @@ [open-features-non-integer-height.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: non-integer values for feature `height`] expected: FAIL [features "height=405*3" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405.32" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405e1" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405/5" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405^4" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405.5" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405e-1" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405 " should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "height=405LLl" should set "height=405"] - expected: FAIL + expected: TIMEOUT + + [features "height=/404" should NOT set "height=404"] + expected: TIMEOUT + + [top=0,left=0,width=401,: absence of feature "height" should be treated same as "height=0"] + expected: TIMEOUT + + [top=0,left=0: absence of feature "height" should be treated same as "height=0"] + expected: TIMEOUT + + [features "height=_404" should NOT set "height=404"] + expected: TIMEOUT + + [features "height=L404" should NOT set "height=404"] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini index 779531b4a98..fcaeae5336d 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerheight.html.ini @@ -1,32 +1,42 @@ [open-features-non-integer-innerheight.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: non-integer values for legacy feature `innerheight`] expected: FAIL [features "innerheight=405e-1" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405LLl" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405^4" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405e1" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405 " should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405/5" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405.32" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405.5" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "innerheight=405*3" should set "height=405"] - expected: FAIL + expected: TIMEOUT + + [features "innerheight=_404" should NOT set "height=404"] + expected: TIMEOUT + + [features "innerheight=L404" should NOT set "height=404"] + expected: TIMEOUT + + [features "innerheight=/404" should NOT set "height=404"] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini index 7a1b258d52e..42327fedd27 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-innerwidth.html.ini @@ -1,32 +1,42 @@ [open-features-non-integer-innerwidth.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: non-integer values for legacy feature `innerwidth`] expected: FAIL [features "innerwidth=405e-1" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405*3" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405.5" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405e1" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405.32" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405 " should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405LLl" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405/5" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "innerwidth=405^4" should set "width=405"] - expected: FAIL + expected: TIMEOUT + + [features "innerwidth=/404" should NOT set "width=404"] + expected: TIMEOUT + + [features "innerwidth=_404" should NOT set "width=404"] + expected: TIMEOUT + + [features "innerwidth=L404" should NOT set "width=404"] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini index 9ace8a4cbdb..64a08faf0e6 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screenx.html.ini @@ -1,32 +1,42 @@ [open-features-non-integer-screenx.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: non-integer values for legacy feature `screenx`] expected: FAIL [features "screenx=105.5" should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105e1" should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105 " should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105*3" should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105e-1" should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105^4" should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105LLl" should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105/5" should set "left=105"] - expected: FAIL + expected: TIMEOUT [features "screenx=105.32" should set "left=105"] - expected: FAIL + expected: TIMEOUT + + [features "screenx=_104" should NOT set "left=104"] + expected: TIMEOUT + + [features "screenx=L104" should NOT set "left=104"] + expected: TIMEOUT + + [features "screenx=/104" should NOT set "left=104"] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini index a82bd0f981a..4f22ef4ef29 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-screeny.html.ini @@ -1,32 +1,42 @@ [open-features-non-integer-screeny.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: non-integer values for legacy feature `screeny`] expected: FAIL [features "screeny=405^4" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405e-1" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405LLl" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405e1" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405 " should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405/5" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405*3" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405.32" should set "height=405"] - expected: FAIL + expected: TIMEOUT [features "screeny=405.5" should set "height=405"] - expected: FAIL + expected: TIMEOUT + + [features "screeny=_404" should NOT set "height=404"] + expected: TIMEOUT + + [features "screeny=L404" should NOT set "height=404"] + expected: TIMEOUT + + [features "screeny=/404" should NOT set "height=404"] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini index 10f617db69e..8540f53d8d6 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-top.html.ini @@ -1,32 +1,42 @@ [open-features-non-integer-top.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: non-integer values for feature `top`] expected: FAIL [features "top=105/5" should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105*3" should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105LLl" should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105e-1" should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105.32" should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105e1" should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105 " should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105^4" should set "top=105"] - expected: FAIL + expected: TIMEOUT [features "top=105.5" should set "top=105"] - expected: FAIL + expected: TIMEOUT + + [features "top=/104" should NOT set "top=104"] + expected: TIMEOUT + + [features "top=_104" should NOT set "top=104"] + expected: TIMEOUT + + [features "top=L104" should NOT set "top=104"] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini index 28f93ee71b5..9d841e61bc0 100644 --- a/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini +++ b/tests/wpt/metadata/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-non-integer-width.html.ini @@ -1,32 +1,48 @@ [open-features-non-integer-width.html] type: testharness + expected: TIMEOUT [HTML: window.open `features`: non-integer values for feature `width`] expected: FAIL [features "width=405^4" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405.5" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405e1" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405 " should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405.32" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405LLl" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405*3" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405e-1" should set "width=405"] - expected: FAIL + expected: TIMEOUT [features "width=405/5" should set "width=405"] - expected: FAIL + expected: TIMEOUT + + [top=0,left=0: absence of feature "width" should be treated same as "width=0"] + expected: TIMEOUT + + [features "width=_404" should NOT set "width=404"] + expected: TIMEOUT + + [top=0,left=0,height=401,: absence of feature "width" should be treated same as "width=0"] + expected: TIMEOUT + + [features "width=/404" should NOT set "width=404"] + expected: TIMEOUT + + [features "width=L404" should NOT set "width=404"] + expected: TIMEOUT diff --git a/tests/wpt/metadata/html/browsers/the-window-object/window-open-defaults.window.js.ini b/tests/wpt/metadata/html/browsers/the-window-object/window-open-defaults.window.js.ini new file mode 100644 index 00000000000..8e1733fed8b --- /dev/null +++ b/tests/wpt/metadata/html/browsers/the-window-object/window-open-defaults.window.js.ini @@ -0,0 +1,4 @@ +[window-open-defaults.window.html] + [window.open()'s url parameter default] + expected: FAIL + diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-none.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-none.https.html.ini new file mode 100644 index 00000000000..015d5bb6dbe --- /dev/null +++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-none.https.html.ini @@ -0,0 +1,10 @@ +[none-sw-from-none.https.html] + [making a cross-origin request for CORP: same-origin [PASS THROUGH\]] + expected: FAIL + + [making a cross-origin request for CORP: same-origin] + expected: FAIL + + [setting up] + expected: FAIL + diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.ini new file mode 100644 index 00000000000..fa3a4cf489a --- /dev/null +++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.ini @@ -0,0 +1,16 @@ +[none-sw-from-require-corp.https.html] + [making a cross-origin request for CORP: same-origin [PASS THROUGH\]] + expected: FAIL + + [making a cross-origin request for CORP: same-origin] + expected: FAIL + + [making a cross-origin request for no CORP] + expected: FAIL + + [making a cross-origin request for no CORP [PASS THROUGH\]] + expected: FAIL + + [setting up] + expected: FAIL + diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html.ini new file mode 100644 index 00000000000..28d8ce64692 --- /dev/null +++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html.ini @@ -0,0 +1,13 @@ +[require-corp-sw-from-none.https.html] + [making a cross-origin request for CORP: same-origin [PASS THROUGH\]] + expected: FAIL + + [making a cross-origin request for CORP: same-origin] + expected: FAIL + + [making a cross-origin request for no CORP] + expected: FAIL + + [setting up] + expected: FAIL + diff --git a/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.ini b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.ini new file mode 100644 index 00000000000..7f31eda83ad --- /dev/null +++ b/tests/wpt/metadata/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.ini @@ -0,0 +1,16 @@ +[require-corp-sw-from-require-corp.https.html] + [making a cross-origin request for CORP: same-origin [PASS THROUGH\]] + expected: FAIL + + [making a cross-origin request for CORP: same-origin] + expected: FAIL + + [making a cross-origin request for no CORP] + expected: FAIL + + [making a cross-origin request for no CORP [PASS THROUGH\]] + expected: FAIL + + [setting up] + expected: FAIL + diff --git a/tests/wpt/metadata/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html.ini b/tests/wpt/metadata/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html.ini new file mode 100644 index 00000000000..76ade2d0575 --- /dev/null +++ b/tests/wpt/metadata/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html.ini @@ -0,0 +1,25 @@ +[tabindex-getter-frame.html] + [connected frame element inside frameset .tabIndex should return 1 when set to 1] + expected: FAIL + + [disconnected frame element .tabIndex should return 1 when set to 1] + expected: FAIL + + [disconnected frame element .tabIndex should return 0 when set to 0] + expected: FAIL + + [connected frame element inside frameset .tabIndex should return -1 when set to -1] + expected: FAIL + + [connected frame element inside frameset .tabIndex should return 0 when set to 0] + expected: FAIL + + [connected frame element inside frameset .tabIndex should return 0 by default] + expected: FAIL + + [disconnected frame element .tabIndex should return 0 by default] + expected: FAIL + + [disconnected frame element .tabIndex should return -1 when set to -1] + expected: FAIL + diff --git a/tests/wpt/metadata/html/rendering/widgets/appearance/default-styles.html.ini b/tests/wpt/metadata/html/rendering/widgets/appearance/default-styles.html.ini new file mode 100644 index 00000000000..f3ef2b2aaae --- /dev/null +++ b/tests/wpt/metadata/html/rendering/widgets/appearance/default-styles.html.ini @@ -0,0 +1,136 @@ +[default-styles.html] + [<marquee>] + expected: FAIL + + [<input type="HIDDEN">] + expected: FAIL + + [<summary>] + expected: FAIL + + [<input type="button">] + expected: FAIL + + [<input> (namespace: null)] + expected: FAIL + + [<keygen>] + expected: FAIL + + [<textarea>] + expected: FAIL + + [<input type="month">] + expected: FAIL + + [<input type="radio">] + expected: FAIL + + [<select multiple="">] + expected: FAIL + + [<video>] + expected: FAIL + + [The body element] + expected: FAIL + + [<input type="text">] + expected: FAIL + + [<input>] + expected: FAIL + + [<input type="TEXT">] + expected: FAIL + + [<meter>] + expected: FAIL + + [<input type="color">] + expected: FAIL + + [<button>] + expected: FAIL + + [<input type="range">] + expected: FAIL + + [<select>] + expected: FAIL + + [<progress>] + expected: FAIL + + [<input> (namespace: http://www.w3.org/2000/svg)] + expected: FAIL + + [<input type="checkbox">] + expected: FAIL + + [<input type="datetime-local">] + expected: FAIL + + [<input type="week">] + expected: FAIL + + [<input type="unknowntype">] + expected: FAIL + + [<input type="file">] + expected: FAIL + + [<input type="email">] + expected: FAIL + + [<input type="image">] + expected: FAIL + + [<input type="search">] + expected: FAIL + + [<select size="2">] + expected: FAIL + + [<input type="submit">] + expected: FAIL + + [<details>] + expected: FAIL + + [<input type="date">] + expected: FAIL + + [<input type="time">] + expected: FAIL + + [<input type="tel">] + expected: FAIL + + [<input type="reset">] + expected: FAIL + + [<input type="number">] + expected: FAIL + + [<menuitem>] + expected: FAIL + + [<video controls="">] + expected: FAIL + + [<input type="hidden">] + expected: FAIL + + [<input type="url">] + expected: FAIL + + [<input type="password">] + expected: FAIL + + [<div>] + expected: FAIL + + [The html element] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js.ini new file mode 100644 index 00000000000..d691ef02bd6 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js.ini @@ -0,0 +1,4 @@ +[historical-progress-event.window.html] + [<img> does not support ProgressEvent or loadstart/progress/loadend] + expected: FAIL + diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini index 702af61a3c4..127392316de 100644 --- a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini +++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submission-algorithm.html.ini @@ -1,11 +1,7 @@ [form-submission-algorithm.html] - expected: TIMEOUT [If form's firing submission events is true, then return; 'submit' event] expected: FAIL [If form's firing submission events is true, then return; 'invalid' event] expected: FAIL - [Cannot navigate (after constructing the entry list)] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini index 496bad988c6..034d9baebfa 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-events.html.ini @@ -1,4 +1,5 @@ [promise-rejection-events.html] + expected: TIMEOUT [delayed handling: delaying handling rejected promise created from createImageBitmap will cause both events to fire] expected: FAIL @@ -8,3 +9,6 @@ [no unhandledrejection/rejectionhandled: rejection handler attached synchronously to a promise created from createImageBitmap] expected: FAIL + [rejectionhandled is dispatched from a queued task, and not immediately] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini b/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini index 494f0d4a752..aa36a14c6a6 100644 --- a/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini +++ b/tests/wpt/metadata/resource-timing/resource_TAO_zero.htm.ini @@ -20,3 +20,6 @@ [domainLookupStart should be 0 in cross-origin request.] expected: FAIL + [responseEnd should be greater than 0 in cross-origin request.] + expected: FAIL + diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini index 66bd350083b..a56bad443a2 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini @@ -1,4 +1,5 @@ [realtimeanalyser-fft-scaling.html] + expected: TIMEOUT [X 2048-point FFT peak position is not equal to 64. Got 0.] expected: FAIL diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini index 79c5a0136a6..628a484d456 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini @@ -11,3 +11,9 @@ [X SNR (19.41940600838733 dB) is not greater than or equal to 65.737. Got 19.41940600838733.] expected: FAIL + [X SNR (19.516378895136103 dB) is not greater than or equal to 65.737. Got 19.516378895136103.] + expected: FAIL + + [X Stitched sine-wave buffers at sample rate 43800 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...\] with an element-wise tolerance of {"absoluteThreshold":0.0038986,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[30\]\t1.9724091887474060e-1\t9.5236867666244507e-1\t7.5512775778770447e-1\t7.9289436569253091e-1\t3.8985999999999999e-3\n\t[60\]\t-2.2450675070285797e-1\t-5.8084785938262939e-1\t3.5634110867977142e-1\t6.1348441407448528e-1\t3.8985999999999999e-3\n\t[90\]\t-3.7808802723884583e-1\t-5.9811043739318848e-1\t2.2002241015434265e-1\t3.6786251568070089e-1\t3.8985999999999999e-3\n\t[120\]\t7.6881676912307739e-1\t9.4563448429107666e-1\t1.7681771516799927e-1\t1.8698315057805445e-1\t3.8985999999999999e-3\n\t[151\]\t5.4644601186737418e-4\t-4.1306272149085999e-2\t4.1852718160953373e-2\t1.0132291292202573e+0\t3.8985999999999999e-3\n\t...and 1419 more errors.\n\tMax AbsError of 9.8619294445961714e-1 at index of 1178.\n\t[1178\]\t-1.3593670912086964e-2\t-9.9978661537170410e-1\t9.8619294445961714e-1\t9.8640342778840562e-1\t3.8985999999999999e-3\n\tMax RelError of 1.0132291292202573e+0 at index of 151.\n] + expected: FAIL + diff --git a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini index 6ff00c31bef..27f6c5ed7a2 100644 --- a/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini +++ b/tests/wpt/metadata/webxr/xrBoundedReferenceSpace_updates.https.html.ini @@ -1,5 +1,5 @@ [xrBoundedReferenceSpace_updates.https.html] - expected: TIMEOUT + expected: ERROR ['XRBoundedReferenceSpace updates properly when the changes are applied] expected: TIMEOUT diff --git a/tests/wpt/metadata/webxr/xrSession_features_deviceSupport.https.html.ini b/tests/wpt/metadata/webxr/xrSession_features_deviceSupport.https.html.ini new file mode 100644 index 00000000000..c2051682335 --- /dev/null +++ b/tests/wpt/metadata/webxr/xrSession_features_deviceSupport.https.html.ini @@ -0,0 +1,4 @@ +[xrSession_features_deviceSupport.https.html] + [Immersive XRSession requests with no supported device should reject] + expected: FAIL + diff --git a/tests/wpt/metadata/webxr/xrSession_viewer_availability.https.html.ini b/tests/wpt/metadata/webxr/xrSession_viewer_availability.https.html.ini new file mode 100644 index 00000000000..f7184958179 --- /dev/null +++ b/tests/wpt/metadata/webxr/xrSession_viewer_availability.https.html.ini @@ -0,0 +1,4 @@ +[xrSession_viewer_availability.https.html] + [Inline viewer support wtih no device] + expected: FAIL + diff --git a/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini b/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini index 650c91da4a6..333edb3a26e 100644 --- a/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini +++ b/tests/wpt/metadata/workers/baseurl/alpha/sharedworker-in-worker.html.ini @@ -1,5 +1,4 @@ [sharedworker-in-worker.html] - expected: ERROR [Base URL in workers: new SharedWorker()] expected: FAIL diff --git a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini new file mode 100644 index 00000000000..80f9a4f15b8 --- /dev/null +++ b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini @@ -0,0 +1,2 @@ +[Worker-constructor.html] + expected: ERROR diff --git a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini b/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini deleted file mode 100644 index dbea4f293ad..00000000000 --- a/tests/wpt/mozilla/meta/css/transition_calc_implicit.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[transition_calc_implicit.html] - expected: TIMEOUT diff --git a/tests/wpt/web-platform-tests/.azure-pipelines.yml b/tests/wpt/web-platform-tests/.azure-pipelines.yml index 5799d624b4e..1884272c4fc 100644 --- a/tests/wpt/web-platform-tests/.azure-pipelines.yml +++ b/tests/wpt/web-platform-tests/.azure-pipelines.yml @@ -247,9 +247,8 @@ jobs: condition: | or(eq(variables['Build.Reason'], 'Schedule'), and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_dev'])) - # There are 12 agents in the pool, but use more jobs so that each takes <1h. strategy: - parallel: 20 + parallel: 10 # chosen to make runtime ~2h timeoutInMinutes: 360 pool: name: 'Hosted Windows Client' @@ -283,9 +282,8 @@ jobs: condition: | or(eq(variables['Build.Reason'], 'Schedule'), and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_canary'])) - # There are 12 agents in the pool, but use more jobs so that each takes <1h. strategy: - parallel: 20 + parallel: 10 # chosen to make runtime ~2h timeoutInMinutes: 360 pool: name: 'Hosted Windows Client' @@ -336,10 +334,8 @@ jobs: channel: stable - template: tools/ci/azure/update_hosts.yml - template: tools/ci/azure/update_manifest.yml - - script: | - # TODO: drop this when `safaridriver --version` is supported. - SAFARI_VERSION="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' /Applications/Safari.app/Contents/Info.plist) ($(/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' /Applications/Safari.app/Contents/Info.plist))" - no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --browser-version "$SAFARI_VERSION" safari + # --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/16229 + - script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info safari --exclude /inert/inert-retargeting.tentative.html --exclude /inert/inert-retargeting-iframe.tentative.html displayName: 'Run tests' - task: PublishBuildArtifacts@1 displayName: 'Publish results' @@ -370,7 +366,8 @@ jobs: - template: tools/ci/azure/install_safari.yml - template: tools/ci/azure/update_hosts.yml - template: tools/ci/azure/update_manifest.yml - - script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --channel preview safari + # --exclude is a workaround for https://github.com/web-platform-tests/wpt/issues/16229 + - script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --channel preview safari --exclude /inert/inert-retargeting.tentative.html --exclude /inert/inert-retargeting-iframe.tentative.html --exclude /payment-request/ displayName: 'Run tests' - task: PublishBuildArtifacts@1 displayName: 'Publish results' diff --git a/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml b/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml index 0bedfe3d42c..8f3940a291b 100644 --- a/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml +++ b/tests/wpt/web-platform-tests/.github/workflows/pull_request.yml @@ -4,7 +4,10 @@ jobs: update-pr-preview: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v1.0.0 + with: + ref: refs/heads/master + fetch-depth: 1 - name: update-pr-preview uses: ./tools/docker/github env: diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/no-coop-coep.https.window.js b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/no-coop-coep.https.window.js new file mode 100644 index 00000000000..5295f1e10cf --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/no-coop-coep.https.window.js @@ -0,0 +1,50 @@ +// META: script=/common/utils.js +// META: script=/common/get-host-info.sub.js + +function taintedImageBitmap(t) { + return new Promise(resolve => { + const img = new Image(); + img.src = `${get_host_info().HTTPS_REMOTE_ORIGIN}/images/blue.png`; + img.onload = t.step_func(() => { + resolve(createImageBitmap(img)); + }); + img.onerror = t.unreached_func(); + }); +} + +async_test(t => { + const bc = new BroadcastChannel(token()); + const popup = window.open(`resources/coop-coep-popup.html?channel=${bc.name}`); + const popupReady = new Promise(resolve => { + bc.onmessage = t.step_func(resolve); + }); + const imageReady = taintedImageBitmap(t); + Promise.all([popupReady, imageReady]).then(t.step_func(([, bitmap]) => { + bc.onmessage = t.step_func_done(e => { + assert_equals(e.data, "Got failure as expected."); + }); + bc.postMessage(bitmap); + })); +}, "BroadcastChannel'ing a tainted ImageBitmap to a COOP+COEP popup"); + +[ + { + "type": "serialize/deserialize", + "message": (port, bitmap) => port.postMessage(bitmap) + }, + { + "type": "transfer", + "message": (port, bitmap) => port.postMessage(bitmap, [bitmap]) + } +].forEach(({ type, message }) => { + async_test(t => { + const sw = new SharedWorker("resources/coop-coep-worker.js"); + const imageReady = taintedImageBitmap(t); + imageReady.then(t.step_func(bitmap => { + sw.port.onmessage = t.step_func_done(e => { + assert_equals(e.data, "Got failure as expected."); + }); + message(sw.port, bitmap); + })); + }, `Messaging a tainted ImageBitMap via ${type} to a COEP shared worker`); +}); diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html new file mode 100644 index 00000000000..f0228503ffa --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html @@ -0,0 +1,11 @@ +<script> +const channel = new URLSearchParams(location.search).get("channel"); +const bc = new BroadcastChannel(channel); +bc.onmessageerror = e => { + bc.postMessage("Got failure as expected."); +} +bc.onmessage = e => { + bc.postMessage("Got message, expected failure."); +} +bc.postMessage("Initialize"); +</script> diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html.headers b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html.headers new file mode 100644 index 00000000000..63b60e490f4 --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-popup.html.headers @@ -0,0 +1,2 @@ +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js new file mode 100644 index 00000000000..a6e9cc58935 --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js @@ -0,0 +1,9 @@ +onconnect = e => { + const port = e.source; + port.onmessageerror = e => { + port.postMessage("Got failure as expected."); + } + port.onmessage = e => { + port.postMessage("Got message, expected failure."); + } +} diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js.headers b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js.headers new file mode 100644 index 00000000000..6604450991a --- /dev/null +++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/resources/coop-coep-worker.js.headers @@ -0,0 +1 @@ +Cross-Origin-Embedder-Policy: require-corp diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js new file mode 100644 index 00000000000..cec09c38b13 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-absent-getAvailability.https.window.js @@ -0,0 +1,16 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'getAvailability() resolves with false if the system does ' + + 'not have an adapter.'; + +bluetooth_test(async () => { + await navigator.bluetooth.test.simulateCentral({state: 'absent'}); + let availability = await navigator.bluetooth.getAvailability(); + assert_false( + availability, + 'getAvailability() resolves promise with false when adapter is absent.'); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js new file mode 100644 index 00000000000..d5e9d1f2b6f --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-added-getAvailability.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'getAvailability() resolves with true after adapter is ' + + 'inserted into a system with a platform that supports Bluetooth LE.'; + +bluetooth_test(async () => { + const fake_central = + await navigator.bluetooth.test.simulateCentral({state: 'absent'}); + let availability = await navigator.bluetooth.getAvailability(); + assert_false( + availability, + 'getAvailability() resolves promise with false when adapter is absent.'); + + await fake_central.setState('powered-on'); + availability = await navigator.bluetooth.getAvailability(); + assert_true( + availability, + 'getAvailability() resolves promise with true after Bluetooth LE ' + + 'capable adapter has been has been added.'); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js new file mode 100644 index 00000000000..8fe9265a46e --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-off-getAvailability.https.window.js @@ -0,0 +1,17 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'getAvailability() resolves with true if the Bluetooth ' + + 'radio is powered off, but the platform that supports Bluetooth LE.'; + +bluetooth_test(async () => { + await navigator.bluetooth.test.simulateCentral({state: 'powered-off'}); + let availability = await navigator.bluetooth.getAvailability(); + assert_true( + availability, + 'getAvailability() resolves promise with true when adapter is powered ' + + 'off.'); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js new file mode 100644 index 00000000000..8b9256a4c35 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-getAvailability.https.window.js @@ -0,0 +1,17 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'getAvailability() resolves with true if the Bluetooth ' + + 'radio is powered on and the platform supports Bluetooth LE.'; + +bluetooth_test(async () => { + await navigator.bluetooth.test.simulateCentral({state: 'powered-on'}); + let availability = await navigator.bluetooth.getAvailability(); + assert_true( + availability, + 'getAvailability() resolves promise with true when adapter is powered ' + + 'on and it supports Bluetooth Low-Energy.'); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js new file mode 100644 index 00000000000..b8b49121fc0 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-powered-on-off-on-getAvailability.https.window.js @@ -0,0 +1,38 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'getAvailability() is not affected by the powered state of ' + + 'the adapter.'; + +bluetooth_test(async () => { + const fake_central = + await navigator.bluetooth.test.simulateCentral({state: 'powered-on'}); + { + const availability = await navigator.bluetooth.getAvailability(); + assert_true( + availability, + 'getAvailability() resolves promise with true when adapter is ' + + 'powered on and it supports Bluetooth Low-Energy.'); + } + + { + await fake_central.setState('powered-off'); + const availability = await navigator.bluetooth.getAvailability(); + assert_true( + availability, + 'getAvailability() resolves promise with true after adapter powered ' + + 'off.'); + } + + { + await fake_central.setState('powered-on'); + const availability = await navigator.bluetooth.getAvailability(); + assert_true( + availability, + 'getAvailability() resolves promise with true when adapter is ' + + 'powered back on.'); + } +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js new file mode 100644 index 00000000000..cc2c33d1d4c --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/adapter-removed-getAvailability.https.window.js @@ -0,0 +1,25 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'getAvailability() resolves with false after the powered ' + + 'on adapter is removed.'; + +bluetooth_test(async () => { + const fake_central = + await navigator.bluetooth.test.simulateCentral({state: 'powered-on'}); + let availability = await navigator.bluetooth.getAvailability(); + assert_true( + availability, + 'getAvailability() resolves promise with true when adapter is powered ' + + 'on and it supports Bluetooth Low-Energy.'); + + await fake_central.setState('absent'); + availability = await navigator.bluetooth.getAvailability(); + assert_false( + availability, + 'getAvailability() resolves promise with false after adapter has been ' + + 'has been removed.'); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js b/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js new file mode 100644 index 00000000000..bf5e4226e08 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/adapter/cross-origin-iframe-getAvailability.sub.https.window.js @@ -0,0 +1,32 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'getAvailability() resolves with false if called from a ' + + 'unique origin'; +const cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' + + '/bluetooth/resources/health-thermometer-iframe.html' +let iframe = document.createElement('iframe'); + +bluetooth_test(async () => { + await navigator.bluetooth.test.simulateCentral({state: 'powered-on'}); + await new Promise(resolve => { + iframe.src = cross_origin_src; + document.body.appendChild(iframe); + iframe.addEventListener('load', resolve); + }); + await new Promise(resolve => { + callWithTrustedClick( + () => iframe.contentWindow.postMessage({type: 'GetAvailability'}, '*')); + + window.onmessage = messageEvent => { + assert_equals( + messageEvent.data, false, + 'getAvailability resolves to false when called from a unique ' + + 'origin.'); + resolve(); + }; + }); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html deleted file mode 100644 index 02aaeccb022..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Characteristic no longer exists.', - 'InvalidStateError'); -let fake_peripheral, characteristic, fake_characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _)) - .then(() => characteristic.getDescriptor(user_description.name)) - .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e)) - .then(() => fake_characteristic.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.getDescriptor(user_description.name), expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js new file mode 100644 index 00000000000..97256a45330 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-characteristic-is-removed.https.window.js @@ -0,0 +1,29 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; +const expected = new DOMException( + 'GATT Characteristic no longer exists.', 'InvalidStateError'); +let fake_peripheral, characteristic, fake_characteristic; + +bluetooth_test( + () => + getMeasurementIntervalCharacteristic() + .then( + _ => ( + {fake_peripheral, characteristic, fake_characteristic} = _)) + .then(() => characteristic.getDescriptor(user_description.name)) + .then( + () => null, + (e) => assert_unreached('Caught error unexpectedly.', e)) + .then(() => fake_characteristic.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.getDescriptor(user_description.name), + expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html deleted file mode 100644 index 52b39c1e0cb..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.html +++ /dev/null @@ -1,39 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getDescriptor should return the same object.'; -let characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({characteristic} = _)) - .then(() => Promise.all([ - characteristic.getDescriptor(user_description.alias), - characteristic.getDescriptor(user_description.name), - characteristic.getDescriptor(user_description.uuid) - ])) - .then(descriptors_arrays => { - assert_true(descriptors_arrays.length > 0) - - // Convert to arrays if necessary. - for (let i = 0; i < descriptors_arrays.length; i++) { - descriptors_arrays[i] = [].concat(descriptors_arrays[i]); - } - - for (let i = 1; i < descriptors_arrays.length; i++) { - assert_equals(descriptors_arrays[0].length, - descriptors_arrays[i].length); - } - - let base_set = new Set(descriptors_arrays[0]); - for (let descriptors of descriptors_arrays) { - descriptors.forEach(descriptor => assert_true(base_set.has(descriptor))); - } - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js new file mode 100644 index 00000000000..8847efab3c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-descriptor-get-same-object.https.window.js @@ -0,0 +1,39 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getDescriptor should return the same object.'; +let characteristic; + +bluetooth_test( + () => getMeasurementIntervalCharacteristic() + .then(_ => ({characteristic} = _)) + .then(() => Promise.all([ + characteristic.getDescriptor(user_description.alias), + characteristic.getDescriptor(user_description.name), + characteristic.getDescriptor(user_description.uuid) + ])) + .then(descriptors_arrays => { + assert_true(descriptors_arrays.length > 0) + + // Convert to arrays if necessary. + for (let i = 0; i < descriptors_arrays.length; i++) { + descriptors_arrays[i] = [].concat(descriptors_arrays[i]); + } + + for (let i = 1; i < descriptors_arrays.length; i++) { + assert_equals( + descriptors_arrays[0].length, + descriptors_arrays[i].length); + } + + let base_set = new Set(descriptors_arrays[0]); + for (let descriptors of descriptors_arrays) { + descriptors.forEach( + descriptor => assert_true(base_set.has(descriptor))); + } + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html deleted file mode 100644 index bfb4c8dcf6a..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.html +++ /dev/null @@ -1,27 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -// TODO(https://crbug.com/672127) Use this test case to test the rest of -// characteristic functions. -'use strict'; -const test_desc = 'Service is removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let characteristic, fake_peripheral, fake_service; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({characteristic, fake_peripheral, fake_service} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.getDescriptor(user_description.name), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js new file mode 100644 index 00000000000..b9dc92482ab --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptor/gen-service-is-removed.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +// TODO(https://crbug.com/672127) Use this test case to test the rest of +// characteristic functions. +'use strict'; +const test_desc = 'Service is removed. Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let characteristic, fake_peripheral, fake_service; + +bluetooth_test( + () => getMeasurementIntervalCharacteristic() + .then(_ => ({characteristic, fake_peripheral, fake_service} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.getDescriptor(user_description.name), + expected, 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html deleted file mode 100644 index c00d4cf5783..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Characteristic no longer exists.', - 'InvalidStateError'); -let fake_peripheral, characteristic, fake_characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _)) - .then(() => characteristic.getDescriptor(user_description.name)) - .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e)) - .then(() => fake_characteristic.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.getDescriptors(user_description.name), expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js new file mode 100644 index 00000000000..25bde7cecc5 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed-with-uuid.https.window.js @@ -0,0 +1,29 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; +const expected = new DOMException( + 'GATT Characteristic no longer exists.', 'InvalidStateError'); +let fake_peripheral, characteristic, fake_characteristic; + +bluetooth_test( + () => + getMeasurementIntervalCharacteristic() + .then( + _ => ( + {fake_peripheral, characteristic, fake_characteristic} = _)) + .then(() => characteristic.getDescriptor(user_description.name)) + .then( + () => null, + (e) => assert_unreached('Caught error unexpectedly.', e)) + .then(() => fake_characteristic.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.getDescriptors(user_description.name), + expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html deleted file mode 100644 index a29548f3656..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Characteristic no longer exists.', - 'InvalidStateError'); -let fake_peripheral, characteristic, fake_characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _)) - .then(() => characteristic.getDescriptor(user_description.name)) - .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e)) - .then(() => fake_characteristic.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.getDescriptors(), expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js new file mode 100644 index 00000000000..c3ff9f6a05c --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-characteristic-is-removed.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; +const expected = new DOMException( + 'GATT Characteristic no longer exists.', 'InvalidStateError'); +let fake_peripheral, characteristic, fake_characteristic; + +bluetooth_test( + () => + getMeasurementIntervalCharacteristic() + .then( + _ => ( + {fake_peripheral, characteristic, fake_characteristic} = _)) + .then(() => characteristic.getDescriptor(user_description.name)) + .then( + () => null, + (e) => assert_unreached('Caught error unexpectedly.', e)) + .then(() => fake_characteristic.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.getDescriptors(), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html deleted file mode 100644 index 20df1d08002..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.html +++ /dev/null @@ -1,39 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getDescriptors should return the same object.'; -let characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({characteristic} = _)) - .then(() => Promise.all([ - characteristic.getDescriptors(user_description.alias), - characteristic.getDescriptors(user_description.name), - characteristic.getDescriptors(user_description.uuid) - ])) - .then(descriptors_arrays => { - assert_true(descriptors_arrays.length > 0) - - // Convert to arrays if necessary. - for (let i = 0; i < descriptors_arrays.length; i++) { - descriptors_arrays[i] = [].concat(descriptors_arrays[i]); - } - - for (let i = 1; i < descriptors_arrays.length; i++) { - assert_equals(descriptors_arrays[0].length, - descriptors_arrays[i].length); - } - - let base_set = new Set(descriptors_arrays[0]); - for (let descriptors of descriptors_arrays) { - descriptors.forEach(descriptor => assert_true(base_set.has(descriptor))); - } - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js new file mode 100644 index 00000000000..c997d7afda2 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-descriptor-get-same-object.https.window.js @@ -0,0 +1,39 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getDescriptors should return the same object.'; +let characteristic; + +bluetooth_test( + () => getMeasurementIntervalCharacteristic() + .then(_ => ({characteristic} = _)) + .then(() => Promise.all([ + characteristic.getDescriptors(user_description.alias), + characteristic.getDescriptors(user_description.name), + characteristic.getDescriptors(user_description.uuid) + ])) + .then(descriptors_arrays => { + assert_true(descriptors_arrays.length > 0) + + // Convert to arrays if necessary. + for (let i = 0; i < descriptors_arrays.length; i++) { + descriptors_arrays[i] = [].concat(descriptors_arrays[i]); + } + + for (let i = 1; i < descriptors_arrays.length; i++) { + assert_equals( + descriptors_arrays[0].length, + descriptors_arrays[i].length); + } + + let base_set = new Set(descriptors_arrays[0]); + for (let descriptors of descriptors_arrays) { + descriptors.forEach( + descriptor => assert_true(base_set.has(descriptor))); + } + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html deleted file mode 100644 index de83400b208..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.html +++ /dev/null @@ -1,27 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -// TODO(https://crbug.com/672127) Use this test case to test the rest of -// characteristic functions. -'use strict'; -const test_desc = 'Service is removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let characteristic, fake_peripheral, fake_service; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({characteristic, fake_peripheral, fake_service} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.getDescriptors(user_description.uuid), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js new file mode 100644 index 00000000000..03bb51239dc --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed-with-uuid.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +// TODO(https://crbug.com/672127) Use this test case to test the rest of +// characteristic functions. +'use strict'; +const test_desc = 'Service is removed. Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let characteristic, fake_peripheral, fake_service; + +bluetooth_test( + () => getMeasurementIntervalCharacteristic() + .then(_ => ({characteristic, fake_peripheral, fake_service} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.getDescriptors(user_description.uuid), + expected, 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html deleted file mode 100644 index c9056dd3b3c..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.html +++ /dev/null @@ -1,27 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -// TODO(https://crbug.com/672127) Use this test case to test the rest of -// characteristic functions. -'use strict'; -const test_desc = 'Service is removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let characteristic, fake_peripheral, fake_service; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({characteristic, fake_peripheral, fake_service} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.getDescriptors(user_description.name), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js new file mode 100644 index 00000000000..762f9cc9955 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/getDescriptors/gen-service-is-removed.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +// TODO(https://crbug.com/672127) Use this test case to test the rest of +// characteristic functions. +'use strict'; +const test_desc = 'Service is removed. Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let characteristic, fake_peripheral, fake_service; + +bluetooth_test( + () => getMeasurementIntervalCharacteristic() + .then(_ => ({characteristic, fake_peripheral, fake_service} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.getDescriptors(user_description.name), + expected, 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html deleted file mode 100644 index a80bccfe469..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Characteristic no longer exists.', - 'InvalidStateError'); -let fake_peripheral, characteristic, fake_characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _)) - .then(() => characteristic.getDescriptor(user_description.name)) - .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e)) - .then(() => fake_characteristic.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.readValue(), expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js new file mode 100644 index 00000000000..a2de3c39e20 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/readValue/gen-characteristic-is-removed.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; +const expected = new DOMException( + 'GATT Characteristic no longer exists.', 'InvalidStateError'); +let fake_peripheral, characteristic, fake_characteristic; + +bluetooth_test( + () => + getMeasurementIntervalCharacteristic() + .then( + _ => ( + {fake_peripheral, characteristic, fake_characteristic} = _)) + .then(() => characteristic.getDescriptor(user_description.name)) + .then( + () => null, + (e) => assert_unreached('Caught error unexpectedly.', e)) + .then(() => fake_characteristic.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.readValue(), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html deleted file mode 100644 index d9a9594320d..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Characteristic no longer exists.', - 'InvalidStateError'); -let fake_peripheral, characteristic, fake_characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _)) - .then(() => characteristic.getDescriptor(user_description.name)) - .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e)) - .then(() => fake_characteristic.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.startNotifications(), expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js new file mode 100644 index 00000000000..76b2d42a481 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/startNotifications/gen-characteristic-is-removed.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; +const expected = new DOMException( + 'GATT Characteristic no longer exists.', 'InvalidStateError'); +let fake_peripheral, characteristic, fake_characteristic; + +bluetooth_test( + () => + getMeasurementIntervalCharacteristic() + .then( + _ => ( + {fake_peripheral, characteristic, fake_characteristic} = _)) + .then(() => characteristic.getDescriptor(user_description.name)) + .then( + () => null, + (e) => assert_unreached('Caught error unexpectedly.', e)) + .then(() => fake_characteristic.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.startNotifications(), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html deleted file mode 100644 index 16520704630..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Characteristic no longer exists.', - 'InvalidStateError'); -let fake_peripheral, characteristic, fake_characteristic; - -bluetooth_test(() => getMeasurementIntervalCharacteristic() - .then(_ => ({fake_peripheral, characteristic, fake_characteristic} = _)) - .then(() => characteristic.getDescriptor(user_description.name)) - .then(() => null, (e) => assert_unreached('Caught error unexpectedly.', e)) - .then(() => fake_characteristic.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - characteristic.writeValue(new Uint8Array(1)), expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js new file mode 100644 index 00000000000..00c50894e5b --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/characteristic/writeValue/gen-characteristic-is-removed.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Characteristic gets removed. Reject with InvalidStateError.'; +const expected = new DOMException( + 'GATT Characteristic no longer exists.', 'InvalidStateError'); +let fake_peripheral, characteristic, fake_characteristic; + +bluetooth_test( + () => + getMeasurementIntervalCharacteristic() + .then( + _ => ( + {fake_peripheral, characteristic, fake_characteristic} = _)) + .then(() => characteristic.getDescriptor(user_description.name)) + .then( + () => null, + (e) => assert_unreached('Caught error unexpectedly.', e)) + .then(() => fake_characteristic.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + characteristic.writeValue(new Uint8Array(1)), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.html deleted file mode 100644 index e453c806374..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Service gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let descriptor, fake_peripheral, fake_service; - -bluetooth_test(() => getUserDescriptionDescriptor() - .then(_ => ({descriptor, fake_peripheral, fake_service} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - descriptor.readValue(), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js new file mode 100644 index 00000000000..3b6c78a97c5 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/gen-service-is-removed.https.window.js @@ -0,0 +1,22 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Service gets removed. Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let descriptor, fake_peripheral, fake_service; + +bluetooth_test( + () => + getUserDescriptionDescriptor() + .then(_ => ({descriptor, fake_peripheral, fake_service} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + descriptor.readValue(), expected, 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.html deleted file mode 100644 index 35ff057cbad..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'A read request succeeds and returns the descriptor\'s value.'; -const EXPECTED_VALUE = [0, 1, 2]; -let descriptor, fake_descriptor; - -bluetooth_test(() => getUserDescriptionDescriptor() - .then(_ => ({descriptor, fake_descriptor} = _)) - .then(() => - fake_descriptor.setNextReadResponse(GATT_SUCCESS, EXPECTED_VALUE)) - .then(() => descriptor.readValue()) - .then(value => assert_array_equals(Array.from(new Uint8Array( - value.buffer)), EXPECTED_VALUE)), - test_desc); -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js new file mode 100644 index 00000000000..5f3c5f8f084 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/readValue/read-succeeds.https.window.js @@ -0,0 +1,17 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = `A read request succeeds and returns the descriptor's value.`; + +bluetooth_test(async () => { + const {descriptor, fake_descriptor} = await getUserDescriptionDescriptor(); + + const EXPECTED_VALUE = [0, 1, 2]; + await fake_descriptor.setNextReadResponse(GATT_SUCCESS, EXPECTED_VALUE); + + const value = await descriptor.readValue(); + assert_array_equals(Array.from(new Uint8Array(value.buffer)), EXPECTED_VALUE); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.html deleted file mode 100644 index 2ab990de61c..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; - -function detachBuffer(buffer) { - window.postMessage('', '*', [buffer]); -} - -bluetooth_test(async (t) => { - let {descriptor, fake_descriptor} = - await getUserDescriptionDescriptor(); - - let typed_array = Uint8Array.of(1, 2); - detachBuffer(typed_array.buffer); - await promise_rejects( - t, 'InvalidStateError', descriptor.writeValue(typed_array)); - - let array_buffer = Uint8Array.of(3, 4).buffer; - detachBuffer(array_buffer); - await promise_rejects( - t, 'InvalidStateError', descriptor.writeValue(array_buffer)); -}, 'writeValue() fails when passed a detached buffer'); -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js new file mode 100644 index 00000000000..23ea2329a64 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/buffer-is-detached.https.window.js @@ -0,0 +1,25 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'writeValue() fails when passed a detached buffer'; + +function detachBuffer(buffer) { + window.postMessage('', '*', [buffer]); +} + +bluetooth_test(async (t) => { + const {descriptor, fake_descriptor} = await getUserDescriptionDescriptor(); + + const typed_array = Uint8Array.of(1, 2); + detachBuffer(typed_array.buffer); + await promise_rejects( + t, 'InvalidStateError', descriptor.writeValue(typed_array)); + + const array_buffer = Uint8Array.of(3, 4).buffer; + detachBuffer(array_buffer); + await promise_rejects( + t, 'InvalidStateError', descriptor.writeValue(array_buffer)); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html deleted file mode 100644 index acd56c3aa45..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.html +++ /dev/null @@ -1,25 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Service gets removed. Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let descriptor, fake_peripheral, fake_service; - -bluetooth_test(() => getUserDescriptionDescriptor() - .then(_ => ({descriptor, fake_peripheral, fake_service} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - descriptor.writeValue(new ArrayBuffer(1 /* length */)), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js new file mode 100644 index 00000000000..ca75ebaba88 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/descriptor/writeValue/gen-service-is-removed.https.window.js @@ -0,0 +1,22 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Service gets removed. Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let descriptor, fake_peripheral, fake_service; + +bluetooth_test( + () => getUserDescriptionDescriptor() + .then(_ => ({descriptor, fake_peripheral, fake_service} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + descriptor.writeValue(new ArrayBuffer(1 /* length */)), + expected, 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.html deleted file mode 100644 index c406e50c199..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.html +++ /dev/null @@ -1,19 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'A device disconnecting while connected should fire the ' + - 'gattserverdisconnected event.'; - -bluetooth_test(() => getConnectedHealthThermometerDevice() - .then(({device, fake_peripheral}) => { - fake_peripheral.simulateGATTDisconnection(); - return eventPromise(device, 'gattserverdisconnected'); - }) - .then(e => assert_true(e.bubbles)), - test_desc); -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js new file mode 100644 index 00000000000..245e43d3150 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected.https.window.js @@ -0,0 +1,17 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'A device disconnecting while connected should fire the ' + + 'gattserverdisconnected event.'; + +bluetooth_test(async () => { + const {device, fake_peripheral} = await getConnectedHealthThermometerDevice(); + const disconnectPromise = eventPromise(device, 'gattserverdisconnected'); + + await fake_peripheral.simulateGATTDisconnection(); + let disconnectEvent = await disconnectPromise; + assert_true(disconnectEvent.bubbles); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html deleted file mode 100644 index 8208231bf55..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.html +++ /dev/null @@ -1,24 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'A device disconnecting after the BluetoothDevice object ' + - 'has been GC\'ed should not access freed memory.'; - -bluetooth_test(() => getConnectedHealthThermometerDevice() - .then(({fake_peripheral}) => { - // 1. Disconnect. - fake_peripheral.simulateGATTDisconnection(); - // 2. Run garbage collection. - fake_peripheral = undefined; - runGarbageCollection(); - }) - // 3. Wait 50ms after the GC runs for the disconnection event to come back. - // There's nothing to assert other than that only valid memory is used. - .then(() => new Promise(resolve => step_timeout(resolve, 50))), - test_desc); -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js new file mode 100644 index 00000000000..69e30443ee6 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/disconnected_gc.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'A device disconnecting after the BluetoothDevice object ' + + 'has been GC\'ed should not access freed memory.'; + +bluetooth_test(async () => { + let {fake_peripheral} = await getConnectedHealthThermometerDevice(); + + // 1. Disconnect. + await fake_peripheral.simulateGATTDisconnection(); + + // 2. Run garbage collection. + fake_peripheral = undefined; + await runGarbageCollection(); + + // 3. Wait 50ms after the GC runs for the disconnection event to come back. + // There's nothing to assert other than that only valid memory is used. + await new Promise(resolve => step_timeout(resolve, 50)); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html deleted file mode 100644 index 92be9c35039..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.html +++ /dev/null @@ -1,32 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'If a site disconnects from a device while the platform is ' + - 'disconnecting that device, only one gattserverdisconnected event should ' + - 'fire.'; -let device, fake_peripheral; -let num_events = 0; - -bluetooth_test(() => getConnectedHealthThermometerDevice() - .then(_ => ({device, fake_peripheral} = _)) - // 1. Listen for disconnections. - .then(() => - device.addEventListener('gattserverdisconnected', () => num_events++)) - // 2. Disconnect several times. - .then(() => Promise.all([ - eventPromise(device, 'gattserverdisconnected'), - fake_peripheral.simulateGATTDisconnection(), - device.gatt.disconnect(), - device.gatt.disconnect(), - ])) - // 3. Wait to catch disconnect events. - .then(() => new Promise(resolve => step_timeout(resolve, 50))) - // 4. Ensure there is exactly 1 disconnection recorded. - .then(() => assert_equals(num_events, 1)), - test_desc); -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js new file mode 100644 index 00000000000..317eddee9ba --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/one-event-per-disconnection.https.window.js @@ -0,0 +1,31 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'If a site disconnects from a device while the platform is ' + + 'disconnecting that device, only one gattserverdisconnected event should ' + + 'fire.'; + +bluetooth_test(async () => { + const {device, fake_peripheral} = await getConnectedHealthThermometerDevice(); + let num_events = 0; + + // 1. Listen for disconnections. + device.addEventListener('gattserverdisconnected', () => num_events++); + + // 2. Disconnect several times. + await Promise.all([ + eventPromise(device, 'gattserverdisconnected'), + fake_peripheral.simulateGATTDisconnection(), + device.gatt.disconnect(), + device.gatt.disconnect(), + ]); + + // 3. Wait to catch disconnect events. + await new Promise(resolve => step_timeout(resolve, 50)); + + // 4. Ensure there is exactly 1 disconnection recorded. + assert_equals(num_events, 1); +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html deleted file mode 100644 index 6d0c8e28c5d..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.html +++ /dev/null @@ -1,34 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -let test_desc = 'A device that reconnects during the gattserverdisconnected ' + - 'event should still receive gattserverdisconnected events after ' + - 're-connection.'; -let device, fake_peripheral; -bluetooth_test(() => getConnectedHealthThermometerDevice() - .then(_ => ({device, fake_peripheral} = _)) - // 1. Disconnect. - .then(() => new Promise(resolve => { - fake_peripheral.simulateGATTDisconnection(); - device.addEventListener( - 'gattserverdisconnected', function onDisconnected() { - device.removeEventListener('gattserverdisconnected', onDisconnected); - // 2. Reconnect. - fake_peripheral.setNextGATTConnectionResponse({ - code: HCI_SUCCESS, - }) - .then(() => device.gatt.connect()) - .then(() => resolve()); - }); - })) - // 3. Disconnect after reconnecting. - .then(() => { - fake_peripheral.simulateGATTDisconnection(); - return eventPromise(device, 'gattserverdisconnected') - }), test_desc); -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js new file mode 100644 index 00000000000..93a46eeb934 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/device/gattserverdisconnected-event/reconnect-during-disconnected-event.https.window.js @@ -0,0 +1,32 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +'use strict'; +const test_desc = 'A device that reconnects during the ' + + 'gattserverdisconnected event should still receive ' + + 'gattserverdisconnected events after re-connection.'; + +bluetooth_test(async () => { + const {device, fake_peripheral} = await getConnectedHealthThermometerDevice(); + + const reconnectPromise = new Promise(async (resolve) => { + device.addEventListener('gattserverdisconnected', async () => { + // 2. Reconnect. + await fake_peripheral.setNextGATTConnectionResponse({ + code: HCI_SUCCESS, + }); + await device.gatt.connect(); + + // 3. Disconnect after reconnecting. + const disconnectPromise = eventPromise(device, 'gattserverdisconnected'); + fake_peripheral.simulateGATTDisconnection(); + resolve(disconnectPromise); + }, {once: true}); + }); + + // 1. Disconnect. + await fake_peripheral.simulateGATTDisconnection(); + await reconnectPromise; +}, test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/generate.py b/tests/wpt/web-platform-tests/bluetooth/generate.py index 034ca22c619..f7fffddbc30 100644 --- a/tests/wpt/web-platform-tests/bluetooth/generate.py +++ b/tests/wpt/web-platform-tests/bluetooth/generate.py @@ -8,9 +8,9 @@ For each script-tests/X.js creates the following test files depending on the contents of X.js -- getPrimaryService/X.html -- getPrimaryServices/X.html -- getPrimaryServices/X-with-uuid.html +- getPrimaryService/X.https.window.js +- getPrimaryServices/X.https.window.js +- getPrimaryServices/X-with-uuid.https.window.js script-tests/X.js files should contain "CALLS([variation1 | variation2 | ...])" tokens that indicate what files to generate. Each variation in CALLS([...]) @@ -36,14 +36,14 @@ promise_test(() => { this script will generate: -// getPrimaryService/example.html +// getPrimaryService/example.https.window.js promise_test(() => { return navigator.bluetooth.requestDevice(...) .then(device => device.gatt.getPrimaryService('heart_rate')) .then(device => device.gatt.getPrimaryService('heart_rate')); }, 'example test for getPrimaryService'); -// getPrimaryServices/example-with-uuid.html +// getPrimaryServices/example-with-uuid.https.window.js promise_test(() => { return navigator.bluetooth.requestDevice(...) .then(device => device.gatt.getPrimaryServices('heart_rate')) @@ -81,7 +81,7 @@ def GetGeneratedTests(): os.path.join( bluetooth_tests_dir, TEMPLATES_DIR, - 'base_test_html.template' + 'base_test_js.template' ), 'r') base_template_file_data = base_template_file_handle.read().decode('utf-8') base_template_file_handle.close() @@ -140,7 +140,7 @@ def GetGeneratedTests(): # Get test file name group_dir = os.path.basename(os.path.abspath(os.path.join(template, os.pardir))) - call_test_file_name = 'gen-{}{}.https.html'.format(template_name, '-with-uuid' if uuid_suffix else '') + call_test_file_name = 'gen-{}{}.https.window.js'.format(template_name, '-with-uuid' if uuid_suffix else '') call_test_file_path = os.path.join(bluetooth_tests_dir, group_dir, function_name, call_test_file_name) yield GeneratedTest(call_test_file_data, call_test_file_path, template) @@ -150,7 +150,7 @@ def main(): previous_generated_files = set() current_path = os.path.dirname(os.path.realpath(__file__)) for root, _, filenames in os.walk(current_path): - for filename in fnmatch.filter(filenames, 'gen-*.https.html'): + for filename in fnmatch.filter(filenames, 'gen-*.https.window.js'): previous_generated_files.add(os.path.join(root, filename)) generated_files = set() diff --git a/tests/wpt/web-platform-tests/bluetooth/generate_test.py b/tests/wpt/web-platform-tests/bluetooth/generate_test.py index 881f7dbcb73..8cb61dda8fa 100755 --- a/tests/wpt/web-platform-tests/bluetooth/generate_test.py +++ b/tests/wpt/web-platform-tests/bluetooth/generate_test.py @@ -42,7 +42,7 @@ def main(): previous_generated_files = set() current_path = os.path.dirname(os.path.realpath(__file__)) for root, _, filenames in os.walk(current_path): - for filename in fnmatch.filter(filenames, 'gen-*.https.html'): + for filename in fnmatch.filter(filenames, 'gen-*.https.window.js'): previous_generated_files.add(os.path.join(root, filename)) if previous_generated_files != generated_files: diff --git a/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html b/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html index 1545a513960..367b778c454 100644 --- a/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html +++ b/tests/wpt/web-platform-tests/bluetooth/resources/health-thermometer-iframe.html @@ -9,6 +9,10 @@ function requestDeviceWithOptionsAndConnect(options) { window.addEventListener('message', (messageEvent) => { switch (messageEvent.data.type) { + case 'GetAvailability': + navigator.bluetooth.getAvailability().then( + availability => parent.postMessage(availability, '*')); + break; case 'RequestDevice': navigator.bluetooth .requestDevice({filters: [{services: ['generic_access']}]}) diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template deleted file mode 100644 index 714333c5e13..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_html.template +++ /dev/null @@ -1,10 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -TEST -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template new file mode 100644 index 00000000000..56971d2c6c9 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/script-tests/base_test_js.template @@ -0,0 +1,7 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +TEST diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html deleted file mode 100644 index af00c66d789..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called before getPrimaryService. ' + - 'Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); -let device; - -bluetooth_test(() => getConnectedHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.disconnect()) - .then(() => assert_promise_rejects_with_message( - device.gatt.getPrimaryService('health_thermometer'), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js new file mode 100644 index 00000000000..2d94b41e020 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-before.https.window.js @@ -0,0 +1,27 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called before getPrimaryService. ' + + 'Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => getConnectedHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.disconnect()) + .then( + () => assert_promise_rejects_with_message( + device.gatt.getPrimaryService('health_thermometer'), + expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html deleted file mode 100644 index 6656ff16a14..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.html +++ /dev/null @@ -1,28 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called during a getPrimaryService ' + - 'call that fails. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', 'NetworkError'); -let device; - -bluetooth_test(() => getEmptyHealthThermometerDevice() - .then(_ => ({device} = _)) - .then(() => { - let promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryService('health_thermometer'), - expected) - device.gatt.disconnect(); - return promise; - }), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js new file mode 100644 index 00000000000..0d6e8a7a179 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-error.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called during a getPrimaryService ' + + 'call that fails. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => + getEmptyHealthThermometerDevice().then(_ => ({device} = _)).then(() => { + let promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryService('health_thermometer'), expected) + device.gatt.disconnect(); + return promise; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html deleted file mode 100644 index 760be97ebd8..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called during a getPrimaryService call that ' + - 'succeeds. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(({device}) => { - let promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryService('health_thermometer'), - expected); - device.gatt.disconnect(); - return promise; - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js new file mode 100644 index 00000000000..18af59d7f80 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-called-during-success.https.window.js @@ -0,0 +1,25 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called during a getPrimaryService call that ' + + 'succeeds. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }).then(({device}) => { + let promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryService('health_thermometer'), expected); + device.gatt.disconnect(); + return promise; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html deleted file mode 100644 index 4c3c577fcc5..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.html +++ /dev/null @@ -1,46 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls on services after we disconnect and connect again. '+ - 'Should reject with InvalidStateError.'; -let device, services; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryService('health_thermometer')) - // Convert to array if necessary. - .then(s => services = [].concat(s)) - .then(() => device.gatt.disconnect()) - .then(() => device.gatt.connect()) - .then(() => { - let promises = Promise.resolve(); - for (let service of services) { - let error = new DOMException( - `Service with UUID ${service.uuid} is no longer valid. Remember ` + - `to retrieve the service again after reconnecting.`, - 'InvalidStateError'); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristic('measurement_interval'), - error)); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristics(), - error)); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristics('measurement_interval'), - error)); - } - return promises; - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js new file mode 100644 index 00000000000..5cfe893f5d8 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnect-invalidates-objects.https.window.js @@ -0,0 +1,43 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls on services after we disconnect and connect again. ' + + 'Should reject with InvalidStateError.'; +let device, services; + +bluetooth_test( + () => getHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryService('health_thermometer')) + // Convert to array if necessary. + .then(s => services = [].concat(s)) + .then(() => device.gatt.disconnect()) + .then(() => device.gatt.connect()) + .then(() => { + let promises = Promise.resolve(); + for (let service of services) { + let error = new DOMException( + `Service with UUID ${ + service.uuid} is no longer valid. Remember ` + + `to retrieve the service again after reconnecting.`, + 'InvalidStateError'); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristic('measurement_interval'), + error)); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristics(), error)); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristics('measurement_interval'), + error)); + } + return promises; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html deleted file mode 100644 index abfd1a9c2da..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'getPrimaryService called before connecting. Reject with ' + - 'NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); - -bluetooth_test(() => getDiscoveredHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryService('health_thermometer'), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js new file mode 100644 index 00000000000..622f2cf3212 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-disconnected-device.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'getPrimaryService called before connecting. Reject with ' + + 'NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); + +bluetooth_test( + () => getDiscoveredHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryService('health_thermometer'), + expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html deleted file mode 100644 index 098eec4113b..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.html +++ /dev/null @@ -1,32 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service without permission. Should ' + - 'Reject with SecurityError even if services have been discovered already.'; -const expected = new DOMException( - 'Origin is not allowed to access the service. Tip: Add the service ' + - 'UUID to \'optionalServices\' in requestDevice() options. ' + - 'https://goo.gl/HxfxSQ', - 'SecurityError'); -let device; - -bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({ - filters: [{services: ['health_thermometer']}] - }) - .then(_ => ({device} = _)) - .then(() => Promise.all([ - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(glucose.alias), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(glucose.name), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(glucose.uuid), expected)])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js new file mode 100644 index 00000000000..5afb0262658 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-no-permission-absent-service.https.window.js @@ -0,0 +1,29 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service without permission. Should ' + + 'Reject with SecurityError even if services have been discovered already.'; +const expected = new DOMException( + 'Origin is not allowed to access the service. Tip: Add the service ' + + 'UUID to \'optionalServices\' in requestDevice() options. ' + + 'https://goo.gl/HxfxSQ', + 'SecurityError'); +let device; + +bluetooth_test( + () => getHealthThermometerDeviceWithServicesDiscovered( + {filters: [{services: ['health_thermometer']}]}) + .then(_ => ({device} = _)) + .then(() => Promise.all([ + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(glucose.alias), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(glucose.name), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(glucose.uuid), expected) + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html deleted file mode 100644 index 233a45adf06..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.html +++ /dev/null @@ -1,23 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service. Must reject with ' + - 'NotFoundError even when the services have previously been discovered.'; - -bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['glucose']}) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryService('glucose'), - new DOMException( - `No Services matching UUID ${glucose.uuid} found in Device.`, - 'NotFoundError'))), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js new file mode 100644 index 00000000000..86fa5e9b011 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-discovery-complete-service-not-found.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service. Must reject with ' + + 'NotFoundError even when the services have previously been discovered.'; + +bluetooth_test( + () => getHealthThermometerDeviceWithServicesDiscovered({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['glucose'] + }) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryService('glucose'), + new DOMException( + `No Services matching UUID ${ + glucose.uuid} found in Device.`, + 'NotFoundError'))), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html deleted file mode 100644 index ab93d334818..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during a getPrimaryService ' + - 'call that failed. Should not crash.' -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' + - 'with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getEmptyHealthThermometerDevice() - .then(({device}) => { - promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryService('health_thermometer'), - expected); - // Disconnect called to clear attributeInstanceMap and allow the - // object to get garbage collected. - device.gatt.disconnect(); - return runGarbageCollection(); - }) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js new file mode 100644 index 00000000000..2c35c1b7556 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-error.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Garbage Collection ran during a getPrimaryService ' + + 'call that failed. Should not crash.' +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' + + 'with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getEmptyHealthThermometerDevice() + .then(({device}) => { + promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryService('health_thermometer'), + expected); + // Disconnect called to clear attributeInstanceMap and allow the + // object to get garbage collected. + device.gatt.disconnect(); + return runGarbageCollection(); + }) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html deleted file mode 100644 index 647aa504a20..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during a getPrimaryService call that ' + - 'succeeds. Should not crash.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(({device}) => { - promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryService('health_thermometer'), - expected); - device.gatt.disconnect(); - return runGarbageCollection(); - }) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js new file mode 100644 index 00000000000..cca8c2c5d2f --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-garbage-collection-ran-during-success.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = + 'Garbage Collection ran during a getPrimaryService call that ' + + 'succeeds. Should not crash.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(({device}) => { + promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryService('health_thermometer'), + expected); + device.gatt.disconnect(); + return runGarbageCollection(); + }) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html deleted file mode 100644 index f09e4e65c27..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getPrimaryService after a disconnection should return ' + - 'a different object.'; -let device, services_first_connection, services_second_connection; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryService('health_thermometer')) - .then(services => services_first_connection = services) - .then(() => device.gatt.disconnect()) - .then(() => device.gatt.connect()) - .then(() => device.gatt.getPrimaryService('health_thermometer')) - .then(services => services_second_connection = services) - .then(() => { - // Convert to arrays if necessary. - services_first_connection = [].concat(services_first_connection); - services_second_connection = [].concat(services_second_connection); - - assert_equals(services_first_connection.length, - services_second_connection.length); - - let first_connection_set = new Set(services_first_connection); - let second_connection_set = new Set(services_second_connection); - - // The two sets should be disjoint. - let common_services = services_first_connection.filter( - val => second_connection_set.has(val)); - assert_equals(common_services.length, 0); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js new file mode 100644 index 00000000000..a0f073d8a31 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-different-service-after-reconnection.https.window.js @@ -0,0 +1,44 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = + 'Calls to getPrimaryService after a disconnection should return ' + + 'a different object.'; +let device, services_first_connection, services_second_connection; + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryService('health_thermometer')) + .then(services => services_first_connection = services) + .then(() => device.gatt.disconnect()) + .then(() => device.gatt.connect()) + .then(() => device.gatt.getPrimaryService('health_thermometer')) + .then(services => services_second_connection = services) + .then(() => { + // Convert to arrays if necessary. + services_first_connection = + [].concat(services_first_connection); + services_second_connection = + [].concat(services_second_connection); + + assert_equals( + services_first_connection.length, + services_second_connection.length); + + let first_connection_set = new Set(services_first_connection); + let second_connection_set = new Set(services_second_connection); + + // The two sets should be disjoint. + let common_services = services_first_connection.filter( + val => second_connection_set.has(val)); + assert_equals(common_services.length, 0); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html deleted file mode 100644 index 35893d24a60..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.html +++ /dev/null @@ -1,40 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getPrimaryService should return the same object.'; -let device; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access']}) - .then(({device}) => Promise.all([ - device.gatt.getPrimaryService('health_thermometer'), - device.gatt.getPrimaryService('health_thermometer')])) - .then(([services_first_call, services_second_call]) => { - // Convert to arrays if necessary. - services_first_call = [].concat(services_first_call); - services_second_call = [].concat(services_second_call); - - assert_equals(services_first_call.length, services_second_call.length); - - let first_call_set = new Set(services_first_call); - assert_equals(services_first_call.length, first_call_set.size); - let second_call_set = new Set(services_second_call); - assert_equals(services_second_call.length, second_call_set.size); - - services_first_call.forEach(service => { - assert_true(second_call_set.has(service)) - }); - - services_second_call.forEach(service => { - assert_true(first_call_set.has(service)); - }); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js new file mode 100644 index 00000000000..3deb387406e --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-get-same-object.https.window.js @@ -0,0 +1,41 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getPrimaryService should return the same object.'; +let device; + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(({device}) => Promise.all([ + device.gatt.getPrimaryService('health_thermometer'), + device.gatt.getPrimaryService('health_thermometer') + ])) + .then(([services_first_call, services_second_call]) => { + // Convert to arrays if necessary. + services_first_call = [].concat(services_first_call); + services_second_call = [].concat(services_second_call); + + assert_equals( + services_first_call.length, services_second_call.length); + + let first_call_set = new Set(services_first_call); + assert_equals(services_first_call.length, first_call_set.size); + let second_call_set = new Set(services_second_call); + assert_equals( + services_second_call.length, second_call_set.size); + + services_first_call.forEach( + service => {assert_true(second_call_set.has(service))}); + + services_second_call.forEach(service => { + assert_true(first_call_set.has(service)); + }); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html deleted file mode 100644 index 40777eee906..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Wrong Service name. Reject with TypeError.'; -const expected = new DOMException( - "Failed to execute 'getPrimaryService' on " + - "'BluetoothRemoteGATTServer': Invalid Service name: " + - "'wrong_name'. It must be a valid UUID alias (e.g. 0x1234), " + - "UUID (lowercase hex characters e.g. " + - "'00001234-0000-1000-8000-00805f9b34fb'), " + - "or recognized standard name from " + - "https://www.bluetooth.com/specifications/gatt/services" + - " e.g. 'alert_notification'.", - 'TypeError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice() - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryService('wrong_name'), - expected, - 'Wrong Service name passed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js new file mode 100644 index 00000000000..d59e202d71c --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-invalid-service-name.https.window.js @@ -0,0 +1,25 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Wrong Service name. Reject with TypeError.'; +const expected = new DOMException( + 'Failed to execute \'getPrimaryService\' on ' + + '\'BluetoothRemoteGATTServer\': Invalid Service name: ' + + '\'wrong_name\'. It must be a valid UUID alias (e.g. 0x1234), ' + + 'UUID (lowercase hex characters e.g. ' + + '\'00001234-0000-1000-8000-00805f9b34fb\'), ' + + 'or recognized standard name from ' + + 'https://www.bluetooth.com/specifications/gatt/services' + + ' e.g. \'alert_notification\'.', + 'TypeError'); + +bluetooth_test( + () => getConnectedHealthThermometerDevice().then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryService('wrong_name'), expected, + 'Wrong Service name passed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html deleted file mode 100644 index 7883ef36d4e..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.html +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service without permission. ' + - 'Reject with SecurityError.'; -const expected = new DOMException( - 'Origin is not allowed to access the service. Tip: Add the service UUID ' + - 'to \'optionalServices\' in requestDevice() options. ' + - 'https://goo.gl/HxfxSQ', - 'SecurityError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(({device}) => Promise.all([ - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(glucose.alias), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(glucose.name), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(glucose.uuid), expected)])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js new file mode 100644 index 00000000000..89ca4688447 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-absent-service.https.window.js @@ -0,0 +1,27 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service without permission. ' + + 'Reject with SecurityError.'; +const expected = new DOMException( + 'Origin is not allowed to access the service. Tip: Add the service UUID ' + + 'to \'optionalServices\' in requestDevice() options. ' + + 'https://goo.gl/HxfxSQ', + 'SecurityError'); + +bluetooth_test( + () => getConnectedHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(({device}) => Promise.all([ + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(glucose.alias), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(glucose.name), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(glucose.uuid), expected) + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html deleted file mode 100644 index 566a9fbe091..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.html +++ /dev/null @@ -1,24 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for present service without permission to access ' + - 'any service. Reject with SecurityError.'; -const expected = new DOMException( - 'Origin is not allowed to access any service. Tip: Add the service ' + - 'UUID to \'optionalServices\' in requestDevice() options. ' + - 'https://goo.gl/HxfxSQ', - 'SecurityError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice({acceptAllDevices: true}) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryService('heart_rate'), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js new file mode 100644 index 00000000000..fec0055dcdb --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-for-any-service.https.window.js @@ -0,0 +1,21 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for present service without permission to access ' + + 'any service. Reject with SecurityError.'; +const expected = new DOMException( + 'Origin is not allowed to access any service. Tip: Add the service ' + + 'UUID to \'optionalServices\' in requestDevice() options. ' + + 'https://goo.gl/HxfxSQ', + 'SecurityError'); + +bluetooth_test( + () => getConnectedHealthThermometerDevice({acceptAllDevices: true}) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryService('heart_rate'), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html deleted file mode 100644 index c9ce1b80aa4..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for present service without permission. ' + - 'Reject with SecurityError.'; -const expected = new DOMException( - 'Origin is not allowed to access the service. Tip: Add the service UUID ' + - 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ', - 'SecurityError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(({device}) => Promise.all([ - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(generic_access.alias), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(generic_access.name), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryService(generic_access.uuid), expected)])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js new file mode 100644 index 00000000000..a0161a0446b --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-no-permission-present-service.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for present service without permission. ' + + 'Reject with SecurityError.'; +const expected = new DOMException( + 'Origin is not allowed to access the service. Tip: Add the service UUID ' + + 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ', + 'SecurityError'); + +bluetooth_test( + () => + getConnectedHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(({device}) => Promise.all([ + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(generic_access.alias), + expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(generic_access.name), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryService(generic_access.uuid), expected) + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html deleted file mode 100644 index aca14c5fd40..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.html +++ /dev/null @@ -1,23 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service. Reject with NotFoundError.'; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['glucose'] - }) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryService('glucose'), - new DOMException( - `No Services matching UUID ${glucose.uuid} found in Device.`, - 'NotFoundError'))), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js new file mode 100644 index 00000000000..60fb4f2c529 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryService/gen-service-not-found.https.window.js @@ -0,0 +1,22 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service. Reject with NotFoundError.'; + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['glucose'] + }) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryService('glucose'), + new DOMException( + `No Services matching UUID ${ + glucose.uuid} found in Device.`, + 'NotFoundError'))), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html deleted file mode 100644 index 4449d2ebbd4..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called before getPrimaryServices. ' + - 'Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); -let device; - -bluetooth_test(() => getConnectedHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.disconnect()) - .then(() => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('health_thermometer'), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js new file mode 100644 index 00000000000..86a346d1483 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before-with-uuid.https.window.js @@ -0,0 +1,27 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called before getPrimaryServices. ' + + 'Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => getConnectedHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.disconnect()) + .then( + () => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('health_thermometer'), + expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html deleted file mode 100644 index 3bf4ed6dccb..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called before getPrimaryServices. ' + - 'Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); -let device; - -bluetooth_test(() => getConnectedHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.disconnect()) - .then(() => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js new file mode 100644 index 00000000000..97e9f77d12e --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-before.https.window.js @@ -0,0 +1,26 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called before getPrimaryServices. ' + + 'Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => getConnectedHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.disconnect()) + .then( + () => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html deleted file mode 100644 index d7cb43725ed..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.html +++ /dev/null @@ -1,28 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called during a getPrimaryServices ' + - 'call that fails. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', 'NetworkError'); -let device; - -bluetooth_test(() => getEmptyHealthThermometerDevice() - .then(_ => ({device} = _)) - .then(() => { - let promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('health_thermometer'), - expected) - device.gatt.disconnect(); - return promise; - }), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js new file mode 100644 index 00000000000..37394075d80 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error-with-uuid.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called during a getPrimaryServices ' + + 'call that fails. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => + getEmptyHealthThermometerDevice().then(_ => ({device} = _)).then(() => { + let promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('health_thermometer'), expected) + device.gatt.disconnect(); + return promise; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html deleted file mode 100644 index 27440af9162..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.html +++ /dev/null @@ -1,28 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called during a getPrimaryServices ' + - 'call that fails. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', 'NetworkError'); -let device; - -bluetooth_test(() => getEmptyHealthThermometerDevice() - .then(_ => ({device} = _)) - .then(() => { - let promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(), - expected) - device.gatt.disconnect(); - return promise; - }), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js new file mode 100644 index 00000000000..9c7aac67a4a --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-error.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called during a getPrimaryServices ' + + 'call that fails. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => + getEmptyHealthThermometerDevice().then(_ => ({device} = _)).then(() => { + let promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(), expected) + device.gatt.disconnect(); + return promise; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html deleted file mode 100644 index 7b9955ade44..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called during a getPrimaryServices call that ' + - 'succeeds. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(({device}) => { - let promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('health_thermometer'), - expected); - device.gatt.disconnect(); - return promise; - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js new file mode 100644 index 00000000000..bffcea4e9fb --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success-with-uuid.https.window.js @@ -0,0 +1,25 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called during a getPrimaryServices call that ' + + 'succeeds. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }).then(({device}) => { + let promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('health_thermometer'), expected); + device.gatt.disconnect(); + return promise; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html deleted file mode 100644 index 4b09bce4eee..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() called during a getPrimaryServices call that ' + - 'succeeds. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(({device}) => { - let promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(), - expected); - device.gatt.disconnect(); - return promise; - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js new file mode 100644 index 00000000000..162a61f3eb5 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-called-during-success.https.window.js @@ -0,0 +1,25 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() called during a getPrimaryServices call that ' + + 'succeeds. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }).then(({device}) => { + let promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(), expected); + device.gatt.disconnect(); + return promise; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html deleted file mode 100644 index 2ef6b5904ac..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.html +++ /dev/null @@ -1,46 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls on services after we disconnect and connect again. '+ - 'Should reject with InvalidStateError.'; -let device, services; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryServices('health_thermometer')) - // Convert to array if necessary. - .then(s => services = [].concat(s)) - .then(() => device.gatt.disconnect()) - .then(() => device.gatt.connect()) - .then(() => { - let promises = Promise.resolve(); - for (let service of services) { - let error = new DOMException( - `Service with UUID ${service.uuid} is no longer valid. Remember ` + - `to retrieve the service again after reconnecting.`, - 'InvalidStateError'); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristic('measurement_interval'), - error)); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristics(), - error)); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristics('measurement_interval'), - error)); - } - return promises; - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js new file mode 100644 index 00000000000..05dce42424d --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects-with-uuid.https.window.js @@ -0,0 +1,43 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls on services after we disconnect and connect again. ' + + 'Should reject with InvalidStateError.'; +let device, services; + +bluetooth_test( + () => getHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryServices('health_thermometer')) + // Convert to array if necessary. + .then(s => services = [].concat(s)) + .then(() => device.gatt.disconnect()) + .then(() => device.gatt.connect()) + .then(() => { + let promises = Promise.resolve(); + for (let service of services) { + let error = new DOMException( + `Service with UUID ${ + service.uuid} is no longer valid. Remember ` + + `to retrieve the service again after reconnecting.`, + 'InvalidStateError'); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristic('measurement_interval'), + error)); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristics(), error)); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristics('measurement_interval'), + error)); + } + return promises; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html deleted file mode 100644 index bc21ea1f2db..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.html +++ /dev/null @@ -1,46 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls on services after we disconnect and connect again. '+ - 'Should reject with InvalidStateError.'; -let device, services; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryServices()) - // Convert to array if necessary. - .then(s => services = [].concat(s)) - .then(() => device.gatt.disconnect()) - .then(() => device.gatt.connect()) - .then(() => { - let promises = Promise.resolve(); - for (let service of services) { - let error = new DOMException( - `Service with UUID ${service.uuid} is no longer valid. Remember ` + - `to retrieve the service again after reconnecting.`, - 'InvalidStateError'); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristic('measurement_interval'), - error)); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristics(), - error)); - promises = promises.then(() => - assert_promise_rejects_with_message( - service.getCharacteristics('measurement_interval'), - error)); - } - return promises; - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js new file mode 100644 index 00000000000..e17162a7198 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnect-invalidates-objects.https.window.js @@ -0,0 +1,43 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls on services after we disconnect and connect again. ' + + 'Should reject with InvalidStateError.'; +let device, services; + +bluetooth_test( + () => getHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryServices()) + // Convert to array if necessary. + .then(s => services = [].concat(s)) + .then(() => device.gatt.disconnect()) + .then(() => device.gatt.connect()) + .then(() => { + let promises = Promise.resolve(); + for (let service of services) { + let error = new DOMException( + `Service with UUID ${ + service.uuid} is no longer valid. Remember ` + + `to retrieve the service again after reconnecting.`, + 'InvalidStateError'); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristic('measurement_interval'), + error)); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristics(), error)); + promises = promises.then( + () => assert_promise_rejects_with_message( + service.getCharacteristics('measurement_interval'), + error)); + } + return promises; + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html deleted file mode 100644 index 0a87bce2d03..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'getPrimaryServices called before connecting. Reject with ' + - 'NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); - -bluetooth_test(() => getDiscoveredHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('health_thermometer'), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js new file mode 100644 index 00000000000..3bfa60d8ccb --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device-with-uuid.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'getPrimaryServices called before connecting. Reject with ' + + 'NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); + +bluetooth_test( + () => getDiscoveredHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('health_thermometer'), + expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html deleted file mode 100644 index dbc4428665c..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'getPrimaryServices called before connecting. Reject with ' + - 'NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + - 'first with `device.gatt.connect`.', - 'NetworkError'); - -bluetooth_test(() => getDiscoveredHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js new file mode 100644 index 00000000000..7072b3efb1f --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-disconnected-device.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'getPrimaryServices called before connecting. Reject with ' + + 'NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect ' + + 'first with `device.gatt.connect`.', + 'NetworkError'); + +bluetooth_test( + () => getDiscoveredHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html deleted file mode 100644 index 460b94d2565..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.html +++ /dev/null @@ -1,32 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service without permission. Should ' + - 'Reject with SecurityError even if services have been discovered already.'; -const expected = new DOMException( - 'Origin is not allowed to access the service. Tip: Add the service ' + - 'UUID to \'optionalServices\' in requestDevice() options. ' + - 'https://goo.gl/HxfxSQ', - 'SecurityError'); -let device; - -bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({ - filters: [{services: ['health_thermometer']}] - }) - .then(_ => ({device} = _)) - .then(() => Promise.all([ - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(glucose.alias), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(glucose.name), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(glucose.uuid), expected)])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js new file mode 100644 index 00000000000..589ebe38644 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-no-permission-absent-service-with-uuid.https.window.js @@ -0,0 +1,29 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service without permission. Should ' + + 'Reject with SecurityError even if services have been discovered already.'; +const expected = new DOMException( + 'Origin is not allowed to access the service. Tip: Add the service ' + + 'UUID to \'optionalServices\' in requestDevice() options. ' + + 'https://goo.gl/HxfxSQ', + 'SecurityError'); +let device; + +bluetooth_test( + () => getHealthThermometerDeviceWithServicesDiscovered( + {filters: [{services: ['health_thermometer']}]}) + .then(_ => ({device} = _)) + .then(() => Promise.all([ + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(glucose.alias), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(glucose.name), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(glucose.uuid), expected) + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html deleted file mode 100644 index 38e0d455b46..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.html +++ /dev/null @@ -1,23 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service. Must reject with ' + - 'NotFoundError even when the services have previously been discovered.'; - -bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['glucose']}) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('glucose'), - new DOMException( - `No Services matching UUID ${glucose.uuid} found in Device.`, - 'NotFoundError'))), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js new file mode 100644 index 00000000000..15b8b978040 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-discovery-complete-service-not-found-with-uuid.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service. Must reject with ' + + 'NotFoundError even when the services have previously been discovered.'; + +bluetooth_test( + () => getHealthThermometerDeviceWithServicesDiscovered({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['glucose'] + }) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('glucose'), + new DOMException( + `No Services matching UUID ${ + glucose.uuid} found in Device.`, + 'NotFoundError'))), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html deleted file mode 100644 index 31ab862e82c..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during a getPrimaryServices ' + - 'call that failed. Should not crash.' -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' + - 'with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getEmptyHealthThermometerDevice() - .then(({device}) => { - promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('health_thermometer'), - expected); - // Disconnect called to clear attributeInstanceMap and allow the - // object to get garbage collected. - device.gatt.disconnect(); - return runGarbageCollection(); - }) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js new file mode 100644 index 00000000000..17495d24eba --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error-with-uuid.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Garbage Collection ran during a getPrimaryServices ' + + 'call that failed. Should not crash.' +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' + + 'with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getEmptyHealthThermometerDevice() + .then(({device}) => { + promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('health_thermometer'), + expected); + // Disconnect called to clear attributeInstanceMap and allow the + // object to get garbage collected. + device.gatt.disconnect(); + return runGarbageCollection(); + }) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html deleted file mode 100644 index a79060adc56..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during a getPrimaryServices ' + - 'call that failed. Should not crash.' -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' + - 'with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getEmptyHealthThermometerDevice() - .then(({device}) => { - promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(), - expected); - // Disconnect called to clear attributeInstanceMap and allow the - // object to get garbage collected. - device.gatt.disconnect(); - return runGarbageCollection(); - }) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js new file mode 100644 index 00000000000..741cd2171f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-error.https.window.js @@ -0,0 +1,27 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Garbage Collection ran during a getPrimaryServices ' + + 'call that failed. Should not crash.' +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. (Re)connect first ' + + 'with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getEmptyHealthThermometerDevice() + .then(({device}) => { + promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(), expected); + // Disconnect called to clear attributeInstanceMap and allow the + // object to get garbage collected. + device.gatt.disconnect(); + return runGarbageCollection(); + }) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html deleted file mode 100644 index b6f0e4a3eef..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during a getPrimaryServices call that ' + - 'succeeds. Should not crash.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(({device}) => { - promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('health_thermometer'), - expected); - device.gatt.disconnect(); - return runGarbageCollection(); - }) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js new file mode 100644 index 00000000000..1ee4f21ccba --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success-with-uuid.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = + 'Garbage Collection ran during a getPrimaryServices call that ' + + 'succeeds. Should not crash.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(({device}) => { + promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('health_thermometer'), + expected); + device.gatt.disconnect(); + return runGarbageCollection(); + }) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html deleted file mode 100644 index baf7865b2f5..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during a getPrimaryServices call that ' + - 'succeeds. Should not crash.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve services. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(({device}) => { - promise = assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(), - expected); - device.gatt.disconnect(); - return runGarbageCollection(); - }) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js new file mode 100644 index 00000000000..285b774c4e7 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-garbage-collection-ran-during-success.https.window.js @@ -0,0 +1,27 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = + 'Garbage Collection ran during a getPrimaryServices call that ' + + 'succeeds. Should not crash.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve services. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(({device}) => { + promise = assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(), expected); + device.gatt.disconnect(); + return runGarbageCollection(); + }) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html deleted file mode 100644 index b87a24a5e0e..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getPrimaryServices after a disconnection should return ' + - 'a different object.'; -let device, services_first_connection, services_second_connection; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryServices('health_thermometer')) - .then(services => services_first_connection = services) - .then(() => device.gatt.disconnect()) - .then(() => device.gatt.connect()) - .then(() => device.gatt.getPrimaryServices('health_thermometer')) - .then(services => services_second_connection = services) - .then(() => { - // Convert to arrays if necessary. - services_first_connection = [].concat(services_first_connection); - services_second_connection = [].concat(services_second_connection); - - assert_equals(services_first_connection.length, - services_second_connection.length); - - let first_connection_set = new Set(services_first_connection); - let second_connection_set = new Set(services_second_connection); - - // The two sets should be disjoint. - let common_services = services_first_connection.filter( - val => second_connection_set.has(val)); - assert_equals(common_services.length, 0); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js new file mode 100644 index 00000000000..eb20e6f4b2f --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection-with-uuid.https.window.js @@ -0,0 +1,44 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = + 'Calls to getPrimaryServices after a disconnection should return ' + + 'a different object.'; +let device, services_first_connection, services_second_connection; + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryServices('health_thermometer')) + .then(services => services_first_connection = services) + .then(() => device.gatt.disconnect()) + .then(() => device.gatt.connect()) + .then(() => device.gatt.getPrimaryServices('health_thermometer')) + .then(services => services_second_connection = services) + .then(() => { + // Convert to arrays if necessary. + services_first_connection = + [].concat(services_first_connection); + services_second_connection = + [].concat(services_second_connection); + + assert_equals( + services_first_connection.length, + services_second_connection.length); + + let first_connection_set = new Set(services_first_connection); + let second_connection_set = new Set(services_second_connection); + + // The two sets should be disjoint. + let common_services = services_first_connection.filter( + val => second_connection_set.has(val)); + assert_equals(common_services.length, 0); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html deleted file mode 100644 index 9ed3c50e6be..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getPrimaryServices after a disconnection should return ' + - 'a different object.'; -let device, services_first_connection, services_second_connection; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access'] - }) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryServices()) - .then(services => services_first_connection = services) - .then(() => device.gatt.disconnect()) - .then(() => device.gatt.connect()) - .then(() => device.gatt.getPrimaryServices()) - .then(services => services_second_connection = services) - .then(() => { - // Convert to arrays if necessary. - services_first_connection = [].concat(services_first_connection); - services_second_connection = [].concat(services_second_connection); - - assert_equals(services_first_connection.length, - services_second_connection.length); - - let first_connection_set = new Set(services_first_connection); - let second_connection_set = new Set(services_second_connection); - - // The two sets should be disjoint. - let common_services = services_first_connection.filter( - val => second_connection_set.has(val)); - assert_equals(common_services.length, 0); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js new file mode 100644 index 00000000000..14fc656c70d --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-different-service-after-reconnection.https.window.js @@ -0,0 +1,44 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = + 'Calls to getPrimaryServices after a disconnection should return ' + + 'a different object.'; +let device, services_first_connection, services_second_connection; + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryServices()) + .then(services => services_first_connection = services) + .then(() => device.gatt.disconnect()) + .then(() => device.gatt.connect()) + .then(() => device.gatt.getPrimaryServices()) + .then(services => services_second_connection = services) + .then(() => { + // Convert to arrays if necessary. + services_first_connection = + [].concat(services_first_connection); + services_second_connection = + [].concat(services_second_connection); + + assert_equals( + services_first_connection.length, + services_second_connection.length); + + let first_connection_set = new Set(services_first_connection); + let second_connection_set = new Set(services_second_connection); + + // The two sets should be disjoint. + let common_services = services_first_connection.filter( + val => second_connection_set.has(val)); + assert_equals(common_services.length, 0); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html deleted file mode 100644 index 9d213d5dfd8..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.html +++ /dev/null @@ -1,40 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getPrimaryServices should return the same object.'; -let device; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access']}) - .then(({device}) => Promise.all([ - device.gatt.getPrimaryServices('health_thermometer'), - device.gatt.getPrimaryServices('health_thermometer')])) - .then(([services_first_call, services_second_call]) => { - // Convert to arrays if necessary. - services_first_call = [].concat(services_first_call); - services_second_call = [].concat(services_second_call); - - assert_equals(services_first_call.length, services_second_call.length); - - let first_call_set = new Set(services_first_call); - assert_equals(services_first_call.length, first_call_set.size); - let second_call_set = new Set(services_second_call); - assert_equals(services_second_call.length, second_call_set.size); - - services_first_call.forEach(service => { - assert_true(second_call_set.has(service)) - }); - - services_second_call.forEach(service => { - assert_true(first_call_set.has(service)); - }); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js new file mode 100644 index 00000000000..f3fc4906b44 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object-with-uuid.https.window.js @@ -0,0 +1,41 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getPrimaryServices should return the same object.'; +let device; + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(({device}) => Promise.all([ + device.gatt.getPrimaryServices('health_thermometer'), + device.gatt.getPrimaryServices('health_thermometer') + ])) + .then(([services_first_call, services_second_call]) => { + // Convert to arrays if necessary. + services_first_call = [].concat(services_first_call); + services_second_call = [].concat(services_second_call); + + assert_equals( + services_first_call.length, services_second_call.length); + + let first_call_set = new Set(services_first_call); + assert_equals(services_first_call.length, first_call_set.size); + let second_call_set = new Set(services_second_call); + assert_equals( + services_second_call.length, second_call_set.size); + + services_first_call.forEach( + service => {assert_true(second_call_set.has(service))}); + + services_second_call.forEach(service => { + assert_true(first_call_set.has(service)); + }); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html deleted file mode 100644 index 258bda0ec68..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.html +++ /dev/null @@ -1,40 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getPrimaryServices should return the same object.'; -let device; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['generic_access']}) - .then(({device}) => Promise.all([ - device.gatt.getPrimaryServices(), - device.gatt.getPrimaryServices()])) - .then(([services_first_call, services_second_call]) => { - // Convert to arrays if necessary. - services_first_call = [].concat(services_first_call); - services_second_call = [].concat(services_second_call); - - assert_equals(services_first_call.length, services_second_call.length); - - let first_call_set = new Set(services_first_call); - assert_equals(services_first_call.length, first_call_set.size); - let second_call_set = new Set(services_second_call); - assert_equals(services_second_call.length, second_call_set.size); - - services_first_call.forEach(service => { - assert_true(second_call_set.has(service)) - }); - - services_second_call.forEach(service => { - assert_true(first_call_set.has(service)); - }); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js new file mode 100644 index 00000000000..c7c488a18b9 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-get-same-object.https.window.js @@ -0,0 +1,40 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getPrimaryServices should return the same object.'; +let device; + +bluetooth_test( + () => + getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['generic_access'] + }) + .then(({device}) => Promise.all([ + device.gatt.getPrimaryServices(), device.gatt.getPrimaryServices() + ])) + .then(([services_first_call, services_second_call]) => { + // Convert to arrays if necessary. + services_first_call = [].concat(services_first_call); + services_second_call = [].concat(services_second_call); + + assert_equals( + services_first_call.length, services_second_call.length); + + let first_call_set = new Set(services_first_call); + assert_equals(services_first_call.length, first_call_set.size); + let second_call_set = new Set(services_second_call); + assert_equals(services_second_call.length, second_call_set.size); + + services_first_call.forEach( + service => {assert_true(second_call_set.has(service))}); + + services_second_call.forEach(service => { + assert_true(first_call_set.has(service)); + }); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html deleted file mode 100644 index 969ad61ea65..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Wrong Service name. Reject with TypeError.'; -const expected = new DOMException( - "Failed to execute 'getPrimaryServices' on " + - "'BluetoothRemoteGATTServer': Invalid Service name: " + - "'wrong_name'. It must be a valid UUID alias (e.g. 0x1234), " + - "UUID (lowercase hex characters e.g. " + - "'00001234-0000-1000-8000-00805f9b34fb'), " + - "or recognized standard name from " + - "https://www.bluetooth.com/specifications/gatt/services" + - " e.g. 'alert_notification'.", - 'TypeError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice() - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('wrong_name'), - expected, - 'Wrong Service name passed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js new file mode 100644 index 00000000000..025f1ccdf7c --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-invalid-service-name.https.window.js @@ -0,0 +1,25 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Wrong Service name. Reject with TypeError.'; +const expected = new DOMException( + 'Failed to execute \'getPrimaryServices\' on ' + + '\'BluetoothRemoteGATTServer\': Invalid Service name: ' + + '\'wrong_name\'. It must be a valid UUID alias (e.g. 0x1234), ' + + 'UUID (lowercase hex characters e.g. ' + + '\'00001234-0000-1000-8000-00805f9b34fb\'), ' + + 'or recognized standard name from ' + + 'https://www.bluetooth.com/specifications/gatt/services' + + ' e.g. \'alert_notification\'.', + 'TypeError'); + +bluetooth_test( + () => getConnectedHealthThermometerDevice().then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('wrong_name'), expected, + 'Wrong Service name passed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html deleted file mode 100644 index 696b1f9471d..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.html +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service without permission. ' + - 'Reject with SecurityError.'; -const expected = new DOMException( - 'Origin is not allowed to access the service. Tip: Add the service UUID ' + - 'to \'optionalServices\' in requestDevice() options. ' + - 'https://goo.gl/HxfxSQ', - 'SecurityError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(({device}) => Promise.all([ - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(glucose.alias), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(glucose.name), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(glucose.uuid), expected)])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js new file mode 100644 index 00000000000..6f1bb251723 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-absent-service-with-uuid.https.window.js @@ -0,0 +1,27 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service without permission. ' + + 'Reject with SecurityError.'; +const expected = new DOMException( + 'Origin is not allowed to access the service. Tip: Add the service UUID ' + + 'to \'optionalServices\' in requestDevice() options. ' + + 'https://goo.gl/HxfxSQ', + 'SecurityError'); + +bluetooth_test( + () => getConnectedHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(({device}) => Promise.all([ + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(glucose.alias), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(glucose.name), expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(glucose.uuid), expected) + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html deleted file mode 100644 index 41bbf6eecd0..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.html +++ /dev/null @@ -1,24 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for present service without permission to access ' + - 'any service. Reject with SecurityError.'; -const expected = new DOMException( - 'Origin is not allowed to access any service. Tip: Add the service ' + - 'UUID to \'optionalServices\' in requestDevice() options. ' + - 'https://goo.gl/HxfxSQ', - 'SecurityError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice({acceptAllDevices: true}) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('heart_rate'), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js new file mode 100644 index 00000000000..4bbddeae56e --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service-with-uuid.https.window.js @@ -0,0 +1,21 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for present service without permission to access ' + + 'any service. Reject with SecurityError.'; +const expected = new DOMException( + 'Origin is not allowed to access any service. Tip: Add the service ' + + 'UUID to \'optionalServices\' in requestDevice() options. ' + + 'https://goo.gl/HxfxSQ', + 'SecurityError'); + +bluetooth_test( + () => getConnectedHealthThermometerDevice({acceptAllDevices: true}) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('heart_rate'), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html deleted file mode 100644 index 58bea882946..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.html +++ /dev/null @@ -1,24 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for present service without permission to access ' + - 'any service. Reject with SecurityError.'; -const expected = new DOMException( - 'Origin is not allowed to access any service. Tip: Add the service ' + - 'UUID to \'optionalServices\' in requestDevice() options. ' + - 'https://goo.gl/HxfxSQ', - 'SecurityError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice({acceptAllDevices: true}) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(), - expected)), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js new file mode 100644 index 00000000000..40b8b576ff4 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-for-any-service.https.window.js @@ -0,0 +1,21 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for present service without permission to access ' + + 'any service. Reject with SecurityError.'; +const expected = new DOMException( + 'Origin is not allowed to access any service. Tip: Add the service ' + + 'UUID to \'optionalServices\' in requestDevice() options. ' + + 'https://goo.gl/HxfxSQ', + 'SecurityError'); + +bluetooth_test( + () => getConnectedHealthThermometerDevice({acceptAllDevices: true}) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(), expected)), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html deleted file mode 100644 index 4f8254ad86e..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.html +++ /dev/null @@ -1,29 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for present service without permission. ' + - 'Reject with SecurityError.'; -const expected = new DOMException( - 'Origin is not allowed to access the service. Tip: Add the service UUID ' + - 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ', - 'SecurityError'); - -bluetooth_test(() => getConnectedHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}] - }) - .then(({device}) => Promise.all([ - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(generic_access.alias), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(generic_access.name), expected), - assert_promise_rejects_with_message( - device.gatt.getPrimaryServices(generic_access.uuid), expected)])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js new file mode 100644 index 00000000000..6f737ecf889 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-no-permission-present-service-with-uuid.https.window.js @@ -0,0 +1,29 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for present service without permission. ' + + 'Reject with SecurityError.'; +const expected = new DOMException( + 'Origin is not allowed to access the service. Tip: Add the service UUID ' + + 'to \'optionalServices\' in requestDevice() options. https://goo.gl/HxfxSQ', + 'SecurityError'); + +bluetooth_test( + () => + getConnectedHealthThermometerDevice( + {filters: [{services: ['health_thermometer']}]}) + .then(({device}) => Promise.all([ + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(generic_access.alias), + expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(generic_access.name), + expected), + assert_promise_rejects_with_message( + device.gatt.getPrimaryServices(generic_access.uuid), expected) + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html deleted file mode 100644 index cb5e0941f66..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.html +++ /dev/null @@ -1,23 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent service. Reject with NotFoundError.'; - -bluetooth_test(() => getHealthThermometerDevice({ - filters: [{services: ['health_thermometer']}], - optionalServices: ['glucose'] - }) - .then(({device}) => assert_promise_rejects_with_message( - device.gatt.getPrimaryServices('glucose'), - new DOMException( - `No Services matching UUID ${glucose.uuid} found in Device.`, - 'NotFoundError'))), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js new file mode 100644 index 00000000000..33946d281bd --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/server/getPrimaryServices/gen-service-not-found-with-uuid.https.window.js @@ -0,0 +1,22 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent service. Reject with NotFoundError.'; + +bluetooth_test( + () => getHealthThermometerDevice({ + filters: [{services: ['health_thermometer']}], + optionalServices: ['glucose'] + }) + .then( + ({device}) => assert_promise_rejects_with_message( + device.gatt.getPrimaryServices('glucose'), + new DOMException( + `No Services matching UUID ${ + glucose.uuid} found in Device.`, + 'NotFoundError'))), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html deleted file mode 100644 index 9e42a469c67..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Serial Number String characteristic is blocklisted. ' + - 'Should reject with SecurityError.'; -const expected = new DOMException( - 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX', - 'SecurityError'); - -bluetooth_test(() => getHIDDevice({ - filters: [{services: ['device_information']}] -}) - .then(({device}) => device.gatt.getPrimaryService('device_information')) - .then(service => assert_promise_rejects_with_message( - service.getCharacteristic('serial_number_string'), - expected, - 'Serial Number String characteristic is blocklisted.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js new file mode 100644 index 00000000000..04176f1ecda --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-blocklisted-characteristic.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Serial Number String characteristic is blocklisted. ' + + 'Should reject with SecurityError.'; +const expected = new DOMException( + 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX', + 'SecurityError'); + +bluetooth_test( + () => + getHIDDevice({filters: [{services: ['device_information']}]}) + .then( + ({device}) => + device.gatt.getPrimaryService('device_information')) + .then( + service => assert_promise_rejects_with_message( + service.getCharacteristic('serial_number_string'), expected, + 'Serial Number String characteristic is blocklisted.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html deleted file mode 100644 index 5fc3ec470ac..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.html +++ /dev/null @@ -1,22 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent characteristics with UUID. ' + - 'Reject with NotFoundError.'; - -bluetooth_test(() => getEmptyHealthThermometerService() - .then(({service}) => assert_promise_rejects_with_message( - service.getCharacteristic('battery_level'), - new DOMException( - `No Characteristics matching UUID ${battery_level.uuid} found ` + - `in Service with UUID ${health_thermometer.uuid}.`, - 'NotFoundError'))), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js new file mode 100644 index 00000000000..cfec509c492 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-characteristic-not-found.https.window.js @@ -0,0 +1,20 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent characteristics with UUID. ' + + 'Reject with NotFoundError.'; + +bluetooth_test( + () => getEmptyHealthThermometerService().then( + ({service}) => assert_promise_rejects_with_message( + service.getCharacteristic('battery_level'), + new DOMException( + `No Characteristics matching UUID ${ + battery_level.uuid} found ` + + `in Service with UUID ${health_thermometer.uuid}.`, + 'NotFoundError'))), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html deleted file mode 100644 index 0b81768d508..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.html +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during getCharacteristic ' + - 'call that fails. Should not crash'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve characteristics. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => { - promise = assert_promise_rejects_with_message( - service.getCharacteristic('measurement_interval'), expected); - // Disconnect called to clear attributeInstanceMap and allow the object to - // get garbage collected. - service.device.gatt.disconnect(); - }) - .then(runGarbageCollection) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js new file mode 100644 index 00000000000..9543a5e5633 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-garbage-collection-ran-during-error.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Garbage Collection ran during getCharacteristic ' + + 'call that fails. Should not crash'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve characteristics. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getHealthThermometerService() + .then(({service}) => { + promise = assert_promise_rejects_with_message( + service.getCharacteristic('measurement_interval'), + expected); + // Disconnect called to clear attributeInstanceMap and allow the + // object to get garbage collected. + service.device.gatt.disconnect(); + }) + .then(runGarbageCollection) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.html deleted file mode 100644 index e8fc6542cce..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getCharacteristic should return the same object.'; - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => Promise.all([ - service.getCharacteristic('measurement_interval'), - service.getCharacteristic('measurement_interval')])) - .then(([characteristics_first_call, characteristics_second_call]) => { - // Convert to arrays if necessary. - characteristics_first_call = [].concat(characteristics_first_call); - characteristics_second_call = [].concat(characteristics_second_call); - - let first_call_set = new Set(characteristics_first_call); - assert_equals(characteristics_first_call.length, first_call_set.size); - let second_call_set = new Set(characteristics_second_call); - assert_equals(characteristics_second_call.length, second_call_set.size); - - characteristics_first_call.forEach(characteristic => { - assert_true(second_call_set.has(characteristic)); - }); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js new file mode 100644 index 00000000000..73691befa52 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-get-same-object.https.window.js @@ -0,0 +1,36 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getCharacteristic should return the same object.'; + +bluetooth_test( + () => + getHealthThermometerService() + .then(({service}) => Promise.all([ + service.getCharacteristic('measurement_interval'), + service.getCharacteristic('measurement_interval') + ])) + .then( + ([characteristics_first_call, characteristics_second_call]) => { + // Convert to arrays if necessary. + characteristics_first_call = + [].concat(characteristics_first_call); + characteristics_second_call = + [].concat(characteristics_second_call); + + let first_call_set = new Set(characteristics_first_call); + assert_equals( + characteristics_first_call.length, first_call_set.size); + let second_call_set = new Set(characteristics_second_call); + assert_equals( + characteristics_second_call.length, second_call_set.size); + + characteristics_first_call.forEach(characteristic => { + assert_true(second_call_set.has(characteristic)); + }); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html deleted file mode 100644 index 08c1352155a..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.html +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Wrong Characteristic name. Reject with TypeError.'; -const expected = new DOMException( - "Failed to execute 'getCharacteristic' on " + - "'BluetoothRemoteGATTService': Invalid Characteristic name: " + - "'wrong_name'. " + - "It must be a valid UUID alias (e.g. 0x1234), " + - "UUID (lowercase hex characters e.g. " + - "'00001234-0000-1000-8000-00805f9b34fb'), " + - "or recognized standard name from " + - "https://www.bluetooth.com/specifications/gatt/characteristics" + - " e.g. 'aerobic_heart_rate_lower_limit'.", - 'TypeError'); - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => assert_promise_rejects_with_message( - service.getCharacteristic('wrong_name'), - expected, - 'Wrong Characteristic name passed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js new file mode 100644 index 00000000000..d21dcf56122 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-invalid-characteristic-name.https.window.js @@ -0,0 +1,26 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Wrong Characteristic name. Reject with TypeError.'; +const expected = new DOMException( + 'Failed to execute \'getCharacteristic\' on ' + + '\'BluetoothRemoteGATTService\': Invalid Characteristic name: ' + + '\'wrong_name\'. ' + + 'It must be a valid UUID alias (e.g. 0x1234), ' + + 'UUID (lowercase hex characters e.g. ' + + '\'00001234-0000-1000-8000-00805f9b34fb\'), ' + + 'or recognized standard name from ' + + 'https://www.bluetooth.com/specifications/gatt/characteristics' + + ' e.g. \'aerobic_heart_rate_lower_limit\'.', + 'TypeError'); + +bluetooth_test( + () => getHealthThermometerService().then( + ({service}) => assert_promise_rejects_with_message( + service.getCharacteristic('wrong_name'), expected, + 'Wrong Characteristic name passed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.html deleted file mode 100644 index 2fe9cd06cf7..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() and connect() called during ' + - 'getCharacteristic. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve characteristics. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let device; - -bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({ - filters: [{services: [health_thermometer.name]}], -}) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryService(health_thermometer.name)) - .then(service => Promise.all([ - // 1. Make a call to service.getCharacteristic, while the service is still - // valid. - assert_promise_rejects_with_message(service.getCharacteristic(measurement_interval.name), expected), - - // 2. disconnect() and connect before the initial call completes. - // This is accomplished by making the calls without waiting for the - // earlier promises to resolve. - // connect() guarantees on OS-level connection, but disconnect() - // only disconnects the current instance. - // getHealthThermometerDeviceWithServicesDiscovered holds another - // connection in an iframe, so disconnect() and connect() are certain to - // reconnect. However, disconnect() will invalidate the service object so - // the subsequent calls made to it will fail, even after reconnecting. - device.gatt.disconnect(), - device.gatt.connect() - ])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js new file mode 100644 index 00000000000..6f862142464 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-reconnect-during.https.window.js @@ -0,0 +1,42 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() and connect() called during ' + + 'getCharacteristic. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve characteristics. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => + getHealthThermometerDeviceWithServicesDiscovered({ + filters: [{services: [health_thermometer.name]}], + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryService(health_thermometer.name)) + .then(service => Promise.all([ + // 1. Make a call to service.getCharacteristic, while the service + // is still valid. + assert_promise_rejects_with_message( + service.getCharacteristic(measurement_interval.name), + expected), + + // 2. disconnect() and connect before the initial call completes. + // This is accomplished by making the calls without waiting for + // the earlier promises to resolve. connect() guarantees on + // OS-level connection, but disconnect() only disconnects the + // current instance. + // getHealthThermometerDeviceWithServicesDiscovered holds another + // connection in an iframe, so disconnect() and connect() are + // certain to reconnect. However, disconnect() will invalidate + // the service object so the subsequent calls made to it will + // fail, even after reconnecting. + device.gatt.disconnect(), device.gatt.connect() + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html deleted file mode 100644 index 391c49a0bab..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Service is removed before getCharacteristic call. ' + - 'Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let service, fake_service, fake_peripheral; - -bluetooth_test(() => getHealthThermometerService() - .then(_ => ({service, fake_service, fake_peripheral} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - service.getCharacteristic('measurement_interval'), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js new file mode 100644 index 00000000000..b6d6a9df96e --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristic/gen-service-is-removed.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Service is removed before getCharacteristic call. ' + + 'Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let service, fake_service, fake_peripheral; + +bluetooth_test( + () => getHealthThermometerService() + .then(_ => ({service, fake_service, fake_peripheral} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + service.getCharacteristic('measurement_interval'), + expected, 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html deleted file mode 100644 index eeaa5b3da30..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Serial Number String characteristic is blocklisted. ' + - 'Should reject with SecurityError.'; -const expected = new DOMException( - 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX', - 'SecurityError'); - -bluetooth_test(() => getHIDDevice({ - filters: [{services: ['device_information']}] -}) - .then(({device}) => device.gatt.getPrimaryService('device_information')) - .then(service => assert_promise_rejects_with_message( - service.getCharacteristics('serial_number_string'), - expected, - 'Serial Number String characteristic is blocklisted.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js new file mode 100644 index 00000000000..3afd294d5b1 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-blocklisted-characteristic-with-uuid.https.window.js @@ -0,0 +1,24 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Serial Number String characteristic is blocklisted. ' + + 'Should reject with SecurityError.'; +const expected = new DOMException( + 'getCharacteristic(s) called with blocklisted UUID. https://goo.gl/4NeimX', + 'SecurityError'); + +bluetooth_test( + () => getHIDDevice({filters: [{services: ['device_information']}]}) + .then( + ({device}) => + device.gatt.getPrimaryService('device_information')) + .then( + service => assert_promise_rejects_with_message( + service.getCharacteristics('serial_number_string'), + expected, + 'Serial Number String characteristic is blocklisted.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html deleted file mode 100644 index 7f32b30b303..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.html +++ /dev/null @@ -1,22 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Request for absent characteristics with UUID. ' + - 'Reject with NotFoundError.'; - -bluetooth_test(() => getEmptyHealthThermometerService() - .then(({service}) => assert_promise_rejects_with_message( - service.getCharacteristics('battery_level'), - new DOMException( - `No Characteristics matching UUID ${battery_level.uuid} found ` + - `in Service with UUID ${health_thermometer.uuid}.`, - 'NotFoundError'))), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js new file mode 100644 index 00000000000..549f6b26719 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-characteristic-not-found-with-uuid.https.window.js @@ -0,0 +1,20 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Request for absent characteristics with UUID. ' + + 'Reject with NotFoundError.'; + +bluetooth_test( + () => getEmptyHealthThermometerService().then( + ({service}) => assert_promise_rejects_with_message( + service.getCharacteristics('battery_level'), + new DOMException( + `No Characteristics matching UUID ${ + battery_level.uuid} found ` + + `in Service with UUID ${health_thermometer.uuid}.`, + 'NotFoundError'))), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html deleted file mode 100644 index 36ef29b6c5b..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.html +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during getCharacteristics ' + - 'call that fails. Should not crash'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve characteristics. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => { - promise = assert_promise_rejects_with_message( - service.getCharacteristics('measurement_interval'), expected); - // Disconnect called to clear attributeInstanceMap and allow the object to - // get garbage collected. - service.device.gatt.disconnect(); - }) - .then(runGarbageCollection) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js new file mode 100644 index 00000000000..643e2f839ef --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error-with-uuid.https.window.js @@ -0,0 +1,28 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Garbage Collection ran during getCharacteristics ' + + 'call that fails. Should not crash'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve characteristics. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getHealthThermometerService() + .then(({service}) => { + promise = assert_promise_rejects_with_message( + service.getCharacteristics('measurement_interval'), + expected); + // Disconnect called to clear attributeInstanceMap and allow the + // object to get garbage collected. + service.device.gatt.disconnect(); + }) + .then(runGarbageCollection) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html deleted file mode 100644 index 5768ff42abc..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.html +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Garbage Collection ran during getCharacteristics ' + - 'call that fails. Should not crash'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve characteristics. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let promise; - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => { - promise = assert_promise_rejects_with_message( - service.getCharacteristics(), expected); - // Disconnect called to clear attributeInstanceMap and allow the object to - // get garbage collected. - service.device.gatt.disconnect(); - }) - .then(runGarbageCollection) - .then(() => promise), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js new file mode 100644 index 00000000000..b7db67f613f --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-garbage-collection-ran-during-error.https.window.js @@ -0,0 +1,27 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Garbage Collection ran during getCharacteristics ' + + 'call that fails. Should not crash'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve characteristics. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let promise; + +bluetooth_test( + () => getHealthThermometerService() + .then(({service}) => { + promise = assert_promise_rejects_with_message( + service.getCharacteristics(), expected); + // Disconnect called to clear attributeInstanceMap and allow the + // object to get garbage collected. + service.device.gatt.disconnect(); + }) + .then(runGarbageCollection) + .then(() => promise), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html deleted file mode 100644 index 917d84df4c7..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getCharacteristics should return the same object.'; - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => Promise.all([ - service.getCharacteristics('measurement_interval'), - service.getCharacteristics('measurement_interval')])) - .then(([characteristics_first_call, characteristics_second_call]) => { - // Convert to arrays if necessary. - characteristics_first_call = [].concat(characteristics_first_call); - characteristics_second_call = [].concat(characteristics_second_call); - - let first_call_set = new Set(characteristics_first_call); - assert_equals(characteristics_first_call.length, first_call_set.size); - let second_call_set = new Set(characteristics_second_call); - assert_equals(characteristics_second_call.length, second_call_set.size); - - characteristics_first_call.forEach(characteristic => { - assert_true(second_call_set.has(characteristic)); - }); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js new file mode 100644 index 00000000000..15b552af491 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object-with-uuid.https.window.js @@ -0,0 +1,36 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getCharacteristics should return the same object.'; + +bluetooth_test( + () => + getHealthThermometerService() + .then(({service}) => Promise.all([ + service.getCharacteristics('measurement_interval'), + service.getCharacteristics('measurement_interval') + ])) + .then( + ([characteristics_first_call, characteristics_second_call]) => { + // Convert to arrays if necessary. + characteristics_first_call = + [].concat(characteristics_first_call); + characteristics_second_call = + [].concat(characteristics_second_call); + + let first_call_set = new Set(characteristics_first_call); + assert_equals( + characteristics_first_call.length, first_call_set.size); + let second_call_set = new Set(characteristics_second_call); + assert_equals( + characteristics_second_call.length, second_call_set.size); + + characteristics_first_call.forEach(characteristic => { + assert_true(second_call_set.has(characteristic)); + }); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.html deleted file mode 100644 index ebdd803efa2..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.html +++ /dev/null @@ -1,31 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Calls to getCharacteristics should return the same object.'; - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => Promise.all([ - service.getCharacteristics(), - service.getCharacteristics()])) - .then(([characteristics_first_call, characteristics_second_call]) => { - // Convert to arrays if necessary. - characteristics_first_call = [].concat(characteristics_first_call); - characteristics_second_call = [].concat(characteristics_second_call); - - let first_call_set = new Set(characteristics_first_call); - assert_equals(characteristics_first_call.length, first_call_set.size); - let second_call_set = new Set(characteristics_second_call); - assert_equals(characteristics_second_call.length, second_call_set.size); - - characteristics_first_call.forEach(characteristic => { - assert_true(second_call_set.has(characteristic)); - }); - }), test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js new file mode 100644 index 00000000000..df30d514f39 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-get-same-object.https.window.js @@ -0,0 +1,35 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Calls to getCharacteristics should return the same object.'; + +bluetooth_test( + () => + getHealthThermometerService() + .then(({service}) => Promise.all([ + service.getCharacteristics(), service.getCharacteristics() + ])) + .then( + ([characteristics_first_call, characteristics_second_call]) => { + // Convert to arrays if necessary. + characteristics_first_call = + [].concat(characteristics_first_call); + characteristics_second_call = + [].concat(characteristics_second_call); + + let first_call_set = new Set(characteristics_first_call); + assert_equals( + characteristics_first_call.length, first_call_set.size); + let second_call_set = new Set(characteristics_second_call); + assert_equals( + characteristics_second_call.length, second_call_set.size); + + characteristics_first_call.forEach(characteristic => { + assert_true(second_call_set.has(characteristic)); + }); + }), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html deleted file mode 100644 index 0bcb25cdf0c..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.html +++ /dev/null @@ -1,30 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Wrong Characteristic name. Reject with TypeError.'; -const expected = new DOMException( - "Failed to execute 'getCharacteristics' on " + - "'BluetoothRemoteGATTService': Invalid Characteristic name: " + - "'wrong_name'. " + - "It must be a valid UUID alias (e.g. 0x1234), " + - "UUID (lowercase hex characters e.g. " + - "'00001234-0000-1000-8000-00805f9b34fb'), " + - "or recognized standard name from " + - "https://www.bluetooth.com/specifications/gatt/characteristics" + - " e.g. 'aerobic_heart_rate_lower_limit'.", - 'TypeError'); - -bluetooth_test(() => getHealthThermometerService() - .then(({service}) => assert_promise_rejects_with_message( - service.getCharacteristics('wrong_name'), - expected, - 'Wrong Characteristic name passed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js new file mode 100644 index 00000000000..f980ac03d5f --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-invalid-characteristic-name.https.window.js @@ -0,0 +1,26 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Wrong Characteristic name. Reject with TypeError.'; +const expected = new DOMException( + 'Failed to execute \'getCharacteristics\' on ' + + '\'BluetoothRemoteGATTService\': Invalid Characteristic name: ' + + '\'wrong_name\'. ' + + 'It must be a valid UUID alias (e.g. 0x1234), ' + + 'UUID (lowercase hex characters e.g. ' + + '\'00001234-0000-1000-8000-00805f9b34fb\'), ' + + 'or recognized standard name from ' + + 'https://www.bluetooth.com/specifications/gatt/characteristics' + + ' e.g. \'aerobic_heart_rate_lower_limit\'.', + 'TypeError'); + +bluetooth_test( + () => getHealthThermometerService().then( + ({service}) => assert_promise_rejects_with_message( + service.getCharacteristics('wrong_name'), expected, + 'Wrong Characteristic name passed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html deleted file mode 100644 index 4226bcbbfa2..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() and connect() called during ' + - 'getCharacteristics. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve characteristics. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let device; - -bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({ - filters: [{services: [health_thermometer.name]}], -}) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryService(health_thermometer.name)) - .then(service => Promise.all([ - // 1. Make a call to service.getCharacteristics, while the service is still - // valid. - assert_promise_rejects_with_message(service.getCharacteristics(measurement_interval.name), expected), - - // 2. disconnect() and connect before the initial call completes. - // This is accomplished by making the calls without waiting for the - // earlier promises to resolve. - // connect() guarantees on OS-level connection, but disconnect() - // only disconnects the current instance. - // getHealthThermometerDeviceWithServicesDiscovered holds another - // connection in an iframe, so disconnect() and connect() are certain to - // reconnect. However, disconnect() will invalidate the service object so - // the subsequent calls made to it will fail, even after reconnecting. - device.gatt.disconnect(), - device.gatt.connect() - ])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js new file mode 100644 index 00000000000..eb4233764aa --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during-with-uuid.https.window.js @@ -0,0 +1,42 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() and connect() called during ' + + 'getCharacteristics. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve characteristics. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => + getHealthThermometerDeviceWithServicesDiscovered({ + filters: [{services: [health_thermometer.name]}], + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryService(health_thermometer.name)) + .then(service => Promise.all([ + // 1. Make a call to service.getCharacteristics, while the service + // is still valid. + assert_promise_rejects_with_message( + service.getCharacteristics(measurement_interval.name), + expected), + + // 2. disconnect() and connect before the initial call completes. + // This is accomplished by making the calls without waiting for + // the earlier promises to resolve. connect() guarantees on + // OS-level connection, but disconnect() only disconnects the + // current instance. + // getHealthThermometerDeviceWithServicesDiscovered holds another + // connection in an iframe, so disconnect() and connect() are + // certain to reconnect. However, disconnect() will invalidate + // the service object so the subsequent calls made to it will + // fail, even after reconnecting. + device.gatt.disconnect(), device.gatt.connect() + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.html deleted file mode 100644 index 9157275640c..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.html +++ /dev/null @@ -1,42 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'disconnect() and connect() called during ' + - 'getCharacteristics. Reject with NetworkError.'; -const expected = new DOMException( - 'GATT Server is disconnected. Cannot retrieve characteristics. ' + - '(Re)connect first with `device.gatt.connect`.', - 'NetworkError'); -let device; - -bluetooth_test(() => getHealthThermometerDeviceWithServicesDiscovered({ - filters: [{services: [health_thermometer.name]}], -}) - .then(_ => ({device} = _)) - .then(() => device.gatt.getPrimaryService(health_thermometer.name)) - .then(service => Promise.all([ - // 1. Make a call to service.getCharacteristics, while the service is still - // valid. - assert_promise_rejects_with_message(service.getCharacteristics(), expected), - - // 2. disconnect() and connect before the initial call completes. - // This is accomplished by making the calls without waiting for the - // earlier promises to resolve. - // connect() guarantees on OS-level connection, but disconnect() - // only disconnects the current instance. - // getHealthThermometerDeviceWithServicesDiscovered holds another - // connection in an iframe, so disconnect() and connect() are certain to - // reconnect. However, disconnect() will invalidate the service object so - // the subsequent calls made to it will fail, even after reconnecting. - device.gatt.disconnect(), - device.gatt.connect() - ])), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js new file mode 100644 index 00000000000..a6d38805973 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-reconnect-during.https.window.js @@ -0,0 +1,41 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'disconnect() and connect() called during ' + + 'getCharacteristics. Reject with NetworkError.'; +const expected = new DOMException( + 'GATT Server is disconnected. Cannot retrieve characteristics. ' + + '(Re)connect first with `device.gatt.connect`.', + 'NetworkError'); +let device; + +bluetooth_test( + () => + getHealthThermometerDeviceWithServicesDiscovered({ + filters: [{services: [health_thermometer.name]}], + }) + .then(_ => ({device} = _)) + .then(() => device.gatt.getPrimaryService(health_thermometer.name)) + .then(service => Promise.all([ + // 1. Make a call to service.getCharacteristics, while the service + // is still valid. + assert_promise_rejects_with_message( + service.getCharacteristics(), expected), + + // 2. disconnect() and connect before the initial call completes. + // This is accomplished by making the calls without waiting for + // the earlier promises to resolve. connect() guarantees on + // OS-level connection, but disconnect() only disconnects the + // current instance. + // getHealthThermometerDeviceWithServicesDiscovered holds another + // connection in an iframe, so disconnect() and connect() are + // certain to reconnect. However, disconnect() will invalidate + // the service object so the subsequent calls made to it will + // fail, even after reconnecting. + device.gatt.disconnect(), device.gatt.connect() + ])), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html deleted file mode 100644 index 62caaad12b5..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Service is removed before getCharacteristics call. ' + - 'Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let service, fake_service, fake_peripheral; - -bluetooth_test(() => getHealthThermometerService() - .then(_ => ({service, fake_service, fake_peripheral} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - service.getCharacteristics('measurement_interval'), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js new file mode 100644 index 00000000000..527eb765276 --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed-with-uuid.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Service is removed before getCharacteristics call. ' + + 'Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let service, fake_service, fake_peripheral; + +bluetooth_test( + () => getHealthThermometerService() + .then(_ => ({service, fake_service, fake_peripheral} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + service.getCharacteristics('measurement_interval'), + expected, 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html deleted file mode 100644 index 4868127465a..00000000000 --- a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.html +++ /dev/null @@ -1,26 +0,0 @@ -<!-- Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py --> -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="/bluetooth/resources/bluetooth-helpers.js"></script> -<script> -'use strict'; -const test_desc = 'Service is removed before getCharacteristics call. ' + - 'Reject with InvalidStateError.'; -const expected = new DOMException('GATT Service no longer exists.', - 'InvalidStateError'); -let service, fake_service, fake_peripheral; - -bluetooth_test(() => getHealthThermometerService() - .then(_ => ({service, fake_service, fake_peripheral} = _)) - .then(() => fake_service.remove()) - .then(() => fake_peripheral.simulateGATTServicesChanged()) - .then(() => assert_promise_rejects_with_message( - service.getCharacteristics(), - expected, - 'Service got removed.')), - test_desc); - -</script> diff --git a/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js new file mode 100644 index 00000000000..466503241ed --- /dev/null +++ b/tests/wpt/web-platform-tests/bluetooth/service/getCharacteristics/gen-service-is-removed.https.window.js @@ -0,0 +1,23 @@ +// META: script=/resources/testharness.js +// META: script=/resources/testharnessreport.js +// META: script=/resources/testdriver.js +// META: script=/resources/testdriver-vendor.js +// META: script=/bluetooth/resources/bluetooth-helpers.js +// Generated by //third_party/WebKit/LayoutTests/bluetooth/generate.py +'use strict'; +const test_desc = 'Service is removed before getCharacteristics call. ' + + 'Reject with InvalidStateError.'; +const expected = + new DOMException('GATT Service no longer exists.', 'InvalidStateError'); +let service, fake_service, fake_peripheral; + +bluetooth_test( + () => getHealthThermometerService() + .then(_ => ({service, fake_service, fake_peripheral} = _)) + .then(() => fake_service.remove()) + .then(() => fake_peripheral.simulateGATTServicesChanged()) + .then( + () => assert_promise_rejects_with_message( + service.getCharacteristics(), expected, + 'Service got removed.')), + test_desc); diff --git a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html index 16df5100b59..92e8f17acd5 100644 --- a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html +++ b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html @@ -10,7 +10,7 @@ document.addEventListener("securitypolicyviolation", t.unreached_func("Should not trigger a security policy violation")); </script> - <link nonce="nonceynonce" href="/content-security-policy/style-src/resources/style-src.css?pipe=sub" rel=stylesheet type=text/css> + <link nonce="nonceynonce" href="/content-security-policy/style-src/resources/style-src.css" rel=stylesheet type=text/css> </head> <body> <div id='log'></div> diff --git a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html index a076eafd559..8a2e17ce8e7 100644 --- a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html +++ b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-stylesheet-nonce-blocked.html @@ -13,7 +13,7 @@ assert_equals("style-src-elem", e.violatedDirective); })); </script> - <link nonce="not-nonceynonce" href="/content-security-policy/style-src/resources/style-src.css?pipe=sub" rel=stylesheet type=text/css> + <link nonce="not-nonceynonce" href="/content-security-policy/style-src/resources/style-src.css" rel=stylesheet type=text/css> </head> <body> <div id='log'></div> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-color-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-color-interpolation.html new file mode 100644 index 00000000000..bb727d8e4ef --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-color-interpolation.html @@ -0,0 +1,122 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-color"> +<meta name="test" content="background-color supports animation as a <color>"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + background-color: #eee; +} +.target { + width: 60px; + height: 60px; + display: inline-block; + border: 2px solid black; + margin-right: 2px; + color: rgba(0, 0, 255, 0.5); + background-color: black; +} +.expected { + margin-right: 15px; +} +</style> + +<body></body> + +<script> +test_interpolation({ + property: 'background-color', + from: neutralKeyframe, + to: 'green', +}, [ + {at: -0.3, expect: 'rgb(0, 0, 0)'}, + {at: 0, expect: 'rgb(0, 0, 0)'}, + {at: 0.3, expect: 'rgb(0, 38, 0)'}, + {at: 0.6, expect: 'rgb(0, 77, 0)'}, + {at: 1, expect: 'rgb(0, 128, 0)'}, + {at: 1.5, expect: 'rgb(0, 192, 0)'}, +]); + +test_interpolation({ + property: 'background-color', + from: 'initial', + to: 'green', +}, [ + {at: -0.3, expect: 'rgba(0, 0, 0, 0)'}, + {at: 0, expect: 'rgba(0, 0, 0, 0)'}, + {at: 0.3, expect: 'rgba(0, 128, 0, 0.3)'}, + {at: 0.6, expect: 'rgba(0, 128, 0, 0.6)'}, + {at: 1, expect: 'rgb(0, 128, 0)'}, + {at: 1.5, expect: 'rgb(0, 192, 0)'}, +]); + +test_interpolation({ + property: 'background-color', + from: 'inherit', + to: 'green', +}, [ + {at: -0.3, expect: 'rgb(255, 255, 255)'}, + {at: 0, expect: 'rgb(238, 238, 238)'}, + {at: 0.3, expect: 'rgb(167, 205, 167)'}, + {at: 0.6, expect: 'rgb(95, 172, 95)'}, + {at: 1, expect: 'rgb(0, 128, 0)'}, + {at: 1.5, expect: 'rgb(0, 73, 0)'}, +]); + +test_interpolation({ + property: 'background-color', + from: 'unset', + to: 'green', +}, [ + {at: -0.3, expect: 'rgba(0, 0, 0, 0)'}, + {at: 0, expect: 'rgba(0, 0, 0, 0)'}, + {at: 0.3, expect: 'rgba(0, 128, 0, 0.3)'}, + {at: 0.6, expect: 'rgba(0, 128, 0, 0.6)'}, + {at: 1, expect: 'rgb(0, 128, 0)'}, + {at: 1.5, expect: 'rgb(0, 192, 0)'}, +]); + +test_interpolation({ + property: 'background-color', + from: 'white', + to: 'orange', +}, [ + {at: -0.3, expect: 'white'}, + {at: 0, expect: 'white'}, + {at: 0.3, expect: 'rgb(255, 228, 179)'}, + {at: 0.6, expect: 'rgb(255, 201, 102)'}, + {at: 1, expect: 'orange'}, + {at: 1.5, expect: 'rgb(255, 120, 0)'}, +]); + +test_interpolation({ + property: 'background-color', + from: 'transparent', + to: 'green', +}, [ + {at: -0.3, expect: 'rgba(0, 0, 0, 0)'}, + {at: 0, expect: 'rgba(0, 0, 0, 0)'}, + {at: 0.3, expect: 'rgba(0, 128, 0, 0.3)'}, + {at: 0.6, expect: 'rgba(0, 128, 0, 0.6)'}, + {at: 1, expect: 'rgb(0, 128, 0)'}, + {at: 1.5, expect: 'rgb(0, 192, 0)'}, +]); + +test_interpolation({ + property: 'background-color', + from: 'currentcolor', + to: 'rgba(0, 255, 0, 0.75)', +}, [ + {at: -0.5, expect: 'rgba(0, 0, 255, 0.38)'}, + {at: 0, expect: 'rgba(0, 0, 255, 0.5)'}, + {at: 0.25, expect: 'rgba(0, 85, 170, 0.56)'}, + {at: 0.5, expect: 'rgba(0, 153, 102, 0.63)'}, + {at: 0.75, expect: 'rgba(0, 208, 47, 0.69)'}, + {at: 1, expect: 'rgba(0, 255, 0, 0.75)'}, + {at: 1.5, expect: 'rgba(0, 255, 0, 0.88)'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html new file mode 100644 index 00000000000..35100fb3362 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-interpolation.html @@ -0,0 +1,134 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-position"> +<meta name="test" content="background-position supports animation as a repeatable list"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + background-position: 60px 60px; +} +.target { + width: 120px; + height: 120px; + display: inline-block; + border: 2px solid black; + background-repeat: no-repeat; + background-image: radial-gradient(20px circle at 20px 20px, red 18px, transparent), + radial-gradient(20px circle at 20px 20px, yellow 18px, transparent), + radial-gradient(20px circle at 20px 20px, lime 18px, transparent), + radial-gradient(20px circle at 20px 20px, blue 18px, transparent); + background-position: 40px 40px; +} +.expected { + margin-right: 10px; +} +</style> + +<body></body> + +<script> +test_interpolation({ + property: 'background-position', + from: neutralKeyframe, + to: '80px 80px, 80px 80px, 80px 80px, 80px 80px', +}, [ + {at: -0.25, expect: '30px 30px, 30px 30px, 30px 30px, 30px 30px'}, + {at: 0, expect: '40px 40px, 40px 40px, 40px 40px, 40px 40px'}, + {at: 0.25, expect: '50px 50px, 50px 50px, 50px 50px, 50px 50px'}, + {at: 0.5, expect: '60px 60px, 60px 60px, 60px 60px, 60px 60px'}, + {at: 0.75, expect: '70px 70px, 70px 70px, 70px 70px, 70px 70px'}, + {at: 1, expect: '80px 80px, 80px 80px, 80px 80px, 80px 80px'}, + {at: 1.25, expect: '90px 90px, 90px 90px, 90px 90px, 90px 90px'}, +]); + +test_interpolation({ + property: 'background-position', + from: 'initial', + to: '80px 80px, 80px 80px, 80px 80px, 80px 80px', +}, [ + {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'}, + {at: 0, expect: ' 0% 0% , 0% 0% , 0% 0% , 0% 0% '}, // TODO(alancutter): Should these be 0px? + {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'}, + {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'}, + {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'}, + {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'}, + {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, +]); + +test_interpolation({ + property: 'background-position', + from: 'inherit', + to: '80px 80px, 80px 80px, 80px 80px, 80px 80px', +}, [ + {at: -0.25, expect: '55px 55px, 55px 55px, 55px 55px, 55px 55px'}, + {at: 0, expect: '60px 60px, 60px 60px, 60px 60px, 60px 60px'}, + {at: 0.25, expect: '65px 65px, 65px 65px, 65px 65px, 65px 65px'}, + {at: 0.5, expect: '70px 70px, 70px 70px, 70px 70px, 70px 70px'}, + {at: 0.75, expect: '75px 75px, 75px 75px, 75px 75px, 75px 75px'}, + {at: 1, expect: '80px 80px, 80px 80px, 80px 80px, 80px 80px'}, + {at: 1.25, expect: '85px 85px, 85px 85px, 85px 85px, 85px 85px'}, +]); + +test_interpolation({ + property: 'background-position', + from: 'unset', + to: '80px 80px, 80px 80px, 80px 80px, 80px 80px', +}, [ + {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'}, + {at: 0, expect: ' 0% 0% , 0% 0% , 0% 0% , 0% 0% '}, + {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'}, + {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'}, + {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'}, + {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'}, + {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, +]); + +// Test equal number of position values as background images. +test_interpolation({ + property: 'background-position', + from: '0px 0px, 0px 0px, 0px 0px, 0px 0px', + to: '80px 80px, 80px 80px, 80px 80px, 80px 80px', +}, [ + {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'}, + {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, + {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'}, + {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'}, + {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'}, + {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'}, + {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, +]); + +// Test single position value repeated over background images. +test_interpolation({ + property: 'background-position', + from: 'top 0px left 0px', + to: 'left 80px top 80px', +}, [ + {at: -0.25, expect: '-20px -20px, -20px -20px, -20px -20px, -20px -20px'}, + {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, + {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'}, + {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'}, + {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'}, + {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'}, + {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, +]); + +// Test mismatched numbers of position values. +test_interpolation({ + property: 'background-position', + from: '0px 0px, 80px 0px', + to: '40px 40px, 80px 80px, 0px 80px', +}, [ + {at: -0.25, expect: '-10px -10px, 80px -20px, 0px -20px, 90px -10px'}, + {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px'}, + {at: 0.25, expect: ' 10px 10px, 80px 20px, 0px 20px, 70px 10px'}, + {at: 0.5, expect: ' 20px 20px, 80px 40px, 0px 40px, 60px 20px'}, + {at: 0.75, expect: ' 30px 30px, 80px 60px, 0px 60px, 50px 30px'}, + {at: 1, expect: ' 40px 40px, 80px 80px, 0px 80px, 40px 40px'}, + {at: 1.25, expect: ' 50px 50px, 80px 100px, 0px 100px, 30px 50px'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-origin-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-origin-interpolation.html new file mode 100644 index 00000000000..c6b84ca2aef --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-position-origin-interpolation.html @@ -0,0 +1,217 @@ +<!doctype html> +<meta charset="utf-8"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-position"> +<meta name="test" content="background-position animation handles origin parameters"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + background-position: 80px 80px; +} +.target { + border: 3px solid skyblue; + width: 100px; + height: 100px; + background-image: linear-gradient(to right, green, green); + background-size: 20px 20px; + background-repeat: no-repeat; + background-position: 10px 10px; + display: inline-block; +} + +.actual { + background-image: linear-gradient(to right, red, red); +} +.expected { + margin-left: -106px; +} +</style> + +<body></body> + +<script> +// neutral +test_interpolation({ + property: 'background-position', + from: neutralKeyframe, + to: 'left 20px top 20px', +}, [ + {at: 0, expect: '10px 10px'}, + {at: 0.25, expect: '12.5px 12.5px'}, + {at: 0.5, expect: '15px 15px'}, + {at: 0.75, expect: '17.5px 17.5px'}, + {at: 1, expect: '20px 20px'}, +]); + +// initial +test_interpolation({ + property: 'background-position', + from: 'initial', + to: 'left 20px top 20px', +}, [ + {at: 0, expect: '0% 0%'}, + {at: 0.25, expect: '5px 5px'}, + {at: 0.5, expect: '10px 10px'}, + {at: 0.75, expect: '15px 15px'}, + {at: 1, expect: '20px 20px'}, +]); + +// inherit +test_interpolation({ + property: 'background-position', + from: 'inherit', + to: 'left 20px top 20px', +}, [ + {at: 0, expect: '80px 80px'}, + {at: 0.25, expect: '65px 65px'}, + {at: 0.5, expect: '50px 50px'}, + {at: 0.75, expect: '35px 35px'}, + {at: 1, expect: '20px 20px'}, +]); + +// unset +test_interpolation({ + property: 'background-position', + from: 'unset', + to: 'left 20px top 20px', +}, [ + {at: 0, expect: '0% 0%'}, + {at: 0.25, expect: '5px 5px'}, + {at: 0.5, expect: '10px 10px'}, + {at: 0.75, expect: '15px 15px'}, + {at: 1, expect: '20px 20px'}, +]); + +// left-top +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'left 20px top 20px', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: 'calc(5px + 37.5%) calc(5px + 37.5%)'}, + {at: 0.5, expect: 'calc(10px + 25%) calc(10px + 25%)'}, + {at: 0.75, expect: 'calc(15px + 12.5%) calc(15px + 12.5%)'}, + {at: 1, expect: '20px 20px'}, +]); + +// center-top +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'center top 20px', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: '50% calc(5px + 37.5%)'}, + {at: 0.5, expect: '50% calc(10px + 25%)'}, + {at: 0.75, expect: '50% calc(15px + 12.5%)'}, + {at: 1, expect: '50% 20px'}, +]); + +// right-top +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'right 20px top 20px', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: 'calc(-5px + 62.5%) calc(5px + 37.5%)'}, + {at: 0.5, expect: 'calc(-10px + 75%) calc(10px + 25%)'}, + {at: 0.75, expect: 'calc(-15px + 87.5%) calc(15px + 12.5%)'}, + {at: 1, expect: 'calc(-20px + 100%) 20px'}, +]); + +// left-center +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'left 20px center', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: 'calc(5px + 37.5%) 50%'}, + {at: 0.5, expect: 'calc(10px + 25%) 50%'}, + {at: 0.75, expect: 'calc(15px + 12.5%) 50%'}, + {at: 1, expect: '20px 50%'}, +]); + +// center-center +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'center center', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: '50% 50%'}, + {at: 0.5, expect: '50% 50%'}, + {at: 0.75, expect: '50% 50%'}, + {at: 1, expect: '50% 50%'}, +]); + +// right-center +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'right 20px center', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: 'calc(-5px + 62.5%) 50%'}, + {at: 0.5, expect: 'calc(-10px + 75%) 50%'}, + {at: 0.75, expect: 'calc(-15px + 87.5%) 50%'}, + {at: 1, expect: 'calc(-20px + 100%) 50%'}, +]); + +// left-bottom +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'left 20px bottom 20px', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: 'calc(5px + 37.5%) calc(-5px + 62.5%)'}, + {at: 0.5, expect: 'calc(10px + 25%) calc(-10px + 75%)'}, + {at: 0.75, expect: 'calc(15px + 12.5%) calc(-15px + 87.5%)'}, + {at: 1, expect: '20px calc(-20px + 100%)'}, +]); + +// center-bottom +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'center bottom 20px', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: '50% calc(-5px + 62.5%)'}, + {at: 0.5, expect: '50% calc(-10px + 75%)'}, + {at: 0.75, expect: '50% calc(-15px + 87.5%)'}, + {at: 1, expect: '50% calc(-20px + 100%)'}, +]); + +// right-bottom +test_interpolation({ + property: 'background-position', + from: 'center center', + to: 'right 20px bottom 20px', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: 'calc(-5px + 62.5%) calc(-5px + 62.5%)'}, + {at: 0.5, expect: 'calc(-10px + 75%) calc(-10px + 75%)'}, + {at: 0.75, expect: 'calc(-15px + 87.5%) calc(-15px + 87.5%)'}, + {at: 1, expect: 'calc(-20px + 100%) calc(-20px + 100%)'}, +]); + +// Single values +test_interpolation({ + property: 'background-position', + from: 'center', + to: 'bottom', +}, [ + {at: 0, expect: '50% 50%'}, + {at: 0.25, expect: '50% 62.5%'}, + {at: 0.5, expect: '50% 75%'}, + {at: 0.75, expect: '50% 87.5%'}, + {at: 1, expect: '50% 100%'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html new file mode 100644 index 00000000000..f6a480c7bd2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/animations/background-size-interpolation.html @@ -0,0 +1,166 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-size"> +<meta name="test" content="background-size supports animation as a repeatable list"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + background-size: 100px 100px; +} +.target { + width: 80px; + height: 100px; + display: inline-block; + border: 10px solid black; + background-repeat: no-repeat; + background-image: url(../resources/stripes-100.png), + url(../resources/stripes-100.png), + url(../resources/blue-100.png), + url(../resources/green-100.png); + background-position: left top, right top, left bottom, right bottom; + background-size: 10px 10px; +} +.expected { + margin-right: 10px; + border-color: green; +} +</style> + +<body></body> + +<script> +// neutral +test_interpolation({ + property: 'background-size', + from: neutralKeyframe, + to: '20px 20px, 0px 0px', +}, [ + {at: -0.25, expect: ' 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px'}, + {at: 0, expect: '10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px, 10.0px 10.0px'}, + {at: 0.25, expect: '12.5px 12.5px, 7.5px 7.5px, 12.5px 12.5px, 7.5px 7.5px'}, + {at: 0.5, expect: '15.0px 15.0px, 5.0px 5.0px, 15.0px 15.0px, 5.0px 5.0px'}, + {at: 0.75, expect: '17.5px 17.5px, 2.5px 2.5px, 17.5px 17.5px, 2.5px 2.5px'}, + {at: 1, expect: '20.0px 20.0px, 0.0px 0.0px, 20.0px 20.0px, 0.0px 0.0px'}, + {at: 1.25, expect: '22.5px 22.5px, 0.0px 0.0px, 22.5px 22.5px, 0.0px 0.0px'}, +]); + +// initial +test_no_interpolation({ + property: 'background-size', + from: 'initial', + to: '20px 20px, 0px 0px', +}); + +// inherit +test_interpolation({ + property: 'background-size', + from: 'inherit', + to: '20px 20px, 0px 0px', +}, [ + {at: -0.25, expect: '120px 120px, 125px 125px, 120px 120px, 125px 125px'}, + {at: 0, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, + {at: 0.25, expect: ' 80px 80px, 75px 75px, 80px 80px, 75px 75px'}, + {at: 0.5, expect: ' 60px 60px, 50px 50px, 60px 60px, 50px 50px'}, + {at: 0.75, expect: ' 40px 40px, 25px 25px, 40px 40px, 25px 25px'}, + {at: 1, expect: ' 20px 20px, 0px 0px, 20px 20px, 0px 0px'}, + {at: 1.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, +]); + +// unset +test_no_interpolation({ + property: 'background-size', + from: 'unset', + to: '20px 20px, 0px 0px', +}); + +// Matched keywords in size value list. +test_interpolation({ + property: 'background-size', + from: '0px auto, 0px 0px, contain, cover', + to: '40px auto, 40px 40px, contain, cover', +}, [ + {at: -0.25, expect: ' 0px auto, 0px 0px, contain, cover'}, + {at: 0, expect: ' 0px auto, 0px 0px, contain, cover'}, + {at: 0.25, expect: '10px auto, 10px 10px, contain, cover'}, + {at: 0.5, expect: '20px auto, 20px 20px, contain, cover'}, + {at: 0.75, expect: '30px auto, 30px 30px, contain, cover'}, + {at: 1, expect: '40px auto, 40px 40px, contain, cover'}, + {at: 1.25, expect: '50px auto, 50px 50px, contain, cover'}, +]); + +// Mismatched keywords in size value list. +test_no_interpolation({ + property: 'background-size', + from: '0px 0px, 0px 0px, contain, cover', + to: '40px 40px, 40px 40px, cover, contain', +}); + +test_no_interpolation({ + property: 'background-size', + from: '0px auto, 0px 0px', + to: 'auto 40px, 40px 40px', +}); + +// Equal number of size values as background images. +test_interpolation({ + property: 'background-size', + from: '0px 0px, 0px 0px, 0px 0px, 0px 0px', + to: '20px 20px, 40px 40px, 60px 60px, 100px 100px', +}, [ + {at: -0.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, + {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, + {at: 0.25, expect: ' 5px 5px, 10px 10px, 15px 15px, 25px 25px'}, + {at: 0.5, expect: '10px 10px, 20px 20px, 30px 30px, 50px 50px'}, + {at: 0.75, expect: '15px 15px, 30px 30px, 45px 45px, 75px 75px'}, + {at: 1, expect: '20px 20px, 40px 40px, 60px 60px, 100px 100px'}, + {at: 1.25, expect: '25px 25px, 50px 50px, 75px 75px, 125px 125px'}, +]); + +// Single size value repeated over background images. +test_interpolation({ + property: 'background-size', + from: '0px 0px', + to: '80px 80px', +}, [ + {at: -0.25, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, + {at: 0, expect: ' 0px 0px, 0px 0px, 0px 0px, 0px 0px'}, + {at: 0.25, expect: ' 20px 20px, 20px 20px, 20px 20px, 20px 20px'}, + {at: 0.5, expect: ' 40px 40px, 40px 40px, 40px 40px, 40px 40px'}, + {at: 0.75, expect: ' 60px 60px, 60px 60px, 60px 60px, 60px 60px'}, + {at: 1, expect: ' 80px 80px, 80px 80px, 80px 80px, 80px 80px'}, + {at: 1.25, expect: '100px 100px, 100px 100px, 100px 100px, 100px 100px'}, +]); + +test_interpolation({ + property: 'background-size', + from: '0px', + to: '80px', +}, [ + {at: -0.25, expect: ' 0px, 0px, 0px, 0px'}, + {at: 0, expect: ' 0px, 0px, 0px, 0px'}, + {at: 0.25, expect: ' 20px, 20px, 20px, 20px'}, + {at: 0.5, expect: ' 40px, 40px, 40px, 40px'}, + {at: 0.75, expect: ' 60px, 60px, 60px, 60px'}, + {at: 1, expect: ' 80px, 80px, 80px, 80px'}, + {at: 1.25, expect: '100px, 100px, 100px, 100px'}, +]); + +// Mismatched numbers of size values. +test_interpolation({ + property: 'background-size', + from: '0px 0px, 80px 0px', + to: '40px 40px, 80px 80px, 0px 80px', +}, [ + {at: -0.25, expect: ' 0px 0px, 80px 0px, 0px 0px, 90px 0px'}, + {at: 0, expect: ' 0px 0px, 80px 0px, 0px 0px, 80px 0px'}, + {at: 0.25, expect: '10px 10px, 80px 20px, 0px 20px, 70px 10px'}, + {at: 0.5, expect: '20px 20px, 80px 40px, 0px 40px, 60px 20px'}, + {at: 0.75, expect: '30px 30px, 80px 60px, 0px 60px, 50px 30px'}, + {at: 1, expect: '40px 40px, 80px 80px, 0px 80px, 40px 40px'}, + {at: 1.25, expect: '50px 50px, 80px 100px, 0px 100px, 30px 50px'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-position-negative-percentage-comparison.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-position-negative-percentage-comparison.html new file mode 100644 index 00000000000..389ee719196 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-position-negative-percentage-comparison.html @@ -0,0 +1,16 @@ +<!doctype html> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#background-position"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="match" href="reference/background-position-negative-percentage-comparison-ref.html"> +<style> +.target { + margin: 50px; + width: 50px; + height: 50px; + border: 1px solid black; + background-image: url("support/100x100-blue-and-orange.png"); + background-position: min(0%, 100%) max(0%, 100%); +} +</style> +<div class="target"></div> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html new file mode 100644 index 00000000000..aa68e23fe09 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/reference/background-position-negative-percentage-comparison-ref.html @@ -0,0 +1,12 @@ +<!doctype html> +<style> +.target { + margin: 50px; + width: 50px; + height: 50px; + border: 1px solid black; + background-image: url("../support/100x100-blue-and-orange.png"); + background-position: right top; +} +</style> +<div class="target"></div> diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html index b80e605a32b..5c8e4f03706 100644 --- a/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012.html @@ -1,10 +1,10 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>CSS Containment Test: Size containment on table</title> +<title>CSS Containment Test: Size containment on display:table</title> <link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> <link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size"> <link rel="match" href="reference/pass_if_pass_below_clipped.html"> -<meta name=assert content="Size containment doesn't apply to table elements."> +<meta name=assert content="Size containment doesn't apply to table boxes."> <style> div { display: table; diff --git a/tests/wpt/web-platform-tests/css/css-contain/contain-size-012b.html b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012b.html new file mode 100644 index 00000000000..e52f3457853 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-contain/contain-size-012b.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Containment Test: Size containment on display:inline-table</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"> +<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size"> +<link rel="match" href="reference/pass_if_pass_below_clipped.html"> +<meta name=assert content="Size containment doesn't apply to inline-table boxes."> +<style> +div { + display: inline-table; + contain: size; + overflow: hidden; +} +</style> + +<p>Test passes if there is the word "PASS" below.</p> +<div>PASS</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-change-simplified-layout.html b/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-change-simplified-layout.html new file mode 100644 index 00000000000..5d15e22c5eb --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/dynamic-change-simplified-layout.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht" /> +<link rel="author" title="Google LLC" href="http://www.google.com" /> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#cross-sizing" /> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=992010" /> +<title>Tests that certain dynamic changes don't lead to a flex item being sized as shrink to fit when it should stretch in the cross axis</title> + +<style> +#flex { + display: flex; + flex-direction: column; + flex-wrap: wrap; + position: absolute; + top: 20px; + width: 100px; +} + +#it1 { + background: green; + flex: none; + height: 100px; + min-height: 0; + position: relative; +} + +#child { + position: absolute; + top: 0; + left: 0; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<div style="position: relative;"> + <div id="flex"> + <div id="it1" style=""><div id="child"></div></div> + <div id="it2"></div> + </div> +</div> + +<script> +var flex = document.getElementById("flex"); +flex.offsetWidth; +var it2 = document.getElementById("it2"); +it2.style.width = "50px"; +flex.offsetWidth; +flex.style.top = "0px"; +var child = document.getElementById("child"); +child.style.top = "1px"; +flex.offsetWidth; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-002.html b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-002.html new file mode 100644 index 00000000000..d10700d242a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-002.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-base-size"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="flags" content="" /> +<meta name="assert" content="A flex container's block cross size of min-content is treated as indefinite when setting fit-content on an item for flex base sizing"> + +<style> +x-flexbox { + display: flex; + height: min-content; +} + +.fit-content-item { + background: green; + width: 100px; + writing-mode: vertical-lr; +} + +.height-setting-item { + height: 100px; +} + +</style> + +<!-- This has to be a row flexbox whose item stretches and has vertical writing + mode to trigger: + * a cross size is needed to determine the main size (row flexbox's cross size + is vertical, which is the item's inline size because it has a vertical + writing mode) + * the flex item’s cross size is [...] not definite (if the item didn't + stretch, the definiteness of the container's cross size wouldn't matter + because the cross size would never be definite and the item would always get + fit-content) +--> + +<p>Test passes if there is a filled green square.</p> + +<x-flexbox> + <div class="fit-content-item"></div> + <div class="height-setting-item"></div> +</x-flexbox> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-003.html b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-003.html new file mode 100644 index 00000000000..45905b16ce3 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-003.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-base-size"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="flags" content="" /> +<meta name="assert" content="A flex container's block cross size of max-content is treated as indefinite when setting fit-content on an item for flex base sizing"> + +<style> +x-flexbox { + display: flex; + height: max-content; +} + +.fit-content-item { + background: green; + width: 100px; + writing-mode: vertical-lr; +} + +.height-setting-item { + height: 100px; +} + +</style> + +<!-- This has to be a row flexbox whose item stretches and has vertical writing + mode to trigger: + * a cross size is needed to determine the main size (row flexbox's cross size + is vertical, which is the item's inline size because it has a vertical + writing mode) + * the flex item’s cross size is [...] not definite (if the item didn't + stretch, the definiteness of the container's cross size wouldn't matter + because the cross size would never be definite and the item would always get + fit-content) +--> + +<p>Test passes if there is a filled green square.</p> + +<x-flexbox> + <div class="fit-content-item"></div> + <div class="height-setting-item"></div> +</x-flexbox> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-004.html b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-004.html new file mode 100644 index 00000000000..b9318c2e180 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/fit-content-item-004.html @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-base-size"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="flags" content="" /> +<meta name="assert" content="A flex container's block cross size of fit-content is treated as indefinite when setting fit-content on an item for flex base sizing"> + +<style> +x-flexbox { + display: flex; + height: fit-content; +} + +.fit-content-item { + background: green; + width: 100px; + writing-mode: vertical-lr; +} + +.height-setting-item { + height: 100px; +} + +</style> + +<!-- This has to be a row flexbox whose item stretches and has vertical writing + mode to trigger: + * a cross size is needed to determine the main size (row flexbox's cross size + is vertical, which is the item's inline size because it has a vertical + writing mode) + * the flex item’s cross size is [...] not definite (if the item didn't + stretch, the definiteness of the container's cross size wouldn't matter + because the cross size would never be definite and the item would always get + fit-content) +--> + +<p>Test passes if there is a filled green square.</p> + +<x-flexbox> + <div class="fit-content-item"></div> + <div class="height-setting-item"></div> +</x-flexbox> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_align-items-stretch-3.html b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_align-items-stretch-3.html new file mode 100644 index 00000000000..09ef2eba0a1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flexbox_align-items-stretch-3.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<title>flex base size and stretched items</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes" title="bullet #1"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="flags" content="" /> +<meta name="assert" content="Item's stretched size is used for laying out descendants when determining flex base size." /> +<style> +x-flexbox { + display: flex; + height: 100px; +} + +x-item { + background: green; + writing-mode: vertical-lr; +} + +x-item > div { + padding-right: 70%; + width: 30px; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<x-flexbox> + <x-item> + <div></div> + </x-item> +</x-flexbox> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html new file mode 100644 index 00000000000..fd89da3b969 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-adjust-interpolation.html @@ -0,0 +1,123 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-size-adjust interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size-adjust"> +<meta name="assert" content="font-size-adjust supports animation as a number"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style type="text/css"> +.container { + font-size: 20px; + line-height: 1; +} + +.parent { + font-size-adjust: 3; +} + +.target { + display: inline-block; + font-size-adjust: 1; +} + +.expected { + color: green; + margin-right: 30px; +} +</style> + +<body> +<template id="target-template"> + <span class="container"> + <div class="target">x</span> + </div> +</template> +</body> + +<script> +test_interpolation({ + property: 'font-size-adjust', + from: neutralKeyframe, + to: '2', +}, [ + {at: -2, expect: '0'}, + {at: -0.3, expect: '0.7'}, + {at: 0, expect: '1'}, + {at: 0.3, expect: '1.3'}, + {at: 0.6, expect: '1.6'}, + {at: 1, expect: '2'}, + {at: 1.5, expect: '2.5'}, +]); + +test_no_interpolation({ + property: 'font-size-adjust', + from: 'initial', + to: '2', +}); + +test_interpolation({ + property: 'font-size-adjust', + from: 'inherit', + to: '2', +}, [ + {at: -2, expect: '5'}, + {at: -0.3, expect: '3.3'}, + {at: 0, expect: '3'}, + {at: 0.3, expect: '2.7'}, + {at: 0.6, expect: '2.4'}, + {at: 1, expect: '2'}, + {at: 1.5, expect: '1.5'}, +]); + +test_interpolation({ + property: 'font-size-adjust', + from: 'unset', + to: '2', +}, [ + {at: -2, expect: '5'}, + {at: -0.3, expect: '3.3'}, + {at: 0, expect: '3'}, + {at: 0.3, expect: '2.7'}, + {at: 0.6, expect: '2.4'}, + {at: 1, expect: '2'}, + {at: 1.5, expect: '1.5'}, +]); + + +test_interpolation({ + property: 'font-size-adjust', + from: '0', + to: '1.2' +}, [ + {at: -2, expect: '0'}, + {at: -0.3, expect: '0'}, + {at: 0, expect: '0'}, + {at: 0.3, expect: '0.36'}, + {at: 0.6, expect: '0.72'}, + {at: 1, expect: '1.2'}, + {at: 1.5, expect: '1.8'}, +]); + +test_no_interpolation({ + property: 'font-size-adjust', + from: 'none', + to: '1.2' +}); + +test_interpolation({ + property: 'font-size-adjust', + from: '0.2', + to: '1.2' +}, [ + {at: -2, expect: '0'}, // CSS font-size-adjust can't be negative. + {at: -0.3, expect: '0'}, + {at: 0, expect: '0.2'}, + {at: 0.3, expect: '0.5'}, + {at: 0.6, expect: '0.8'}, + {at: 1, expect: '1.2'}, + {at: 1.5, expect: '1.7'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html new file mode 100644 index 00000000000..0f60018c2e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-001.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-size interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size"> +<meta name="assert" content="font-size supports animation as length"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + font-size: 30px; +} +.target { + display: inline-block; + font: 10px sans-serif; +} +.expected { + color: green; + margin-right: 30px; +} +</style> + +<body> +<template id="target-template"> + <span> + <div class="target">Test Text</div> + </span> +</template> +</body> + +<script> +test_interpolation({ + property: 'font-size', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -2, expect: '0px'}, + {at: -0.3, expect: '7px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_interpolation({ + property: 'font-size', + from: 'initial', + to: '20px', +}, [ + {at: -2, expect: '8px'}, + {at: -0.3, expect: '14.8px'}, + {at: 0, expect: '16px'}, + {at: 0.3, expect: '17.2px'}, + {at: 0.6, expect: '18.4px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '22px'}, +]); + +test_interpolation({ + property: 'font-size', + from: 'inherit', + to: '20px', +}, [ + {at: -2, expect: '50px'}, + {at: -0.3, expect: '33px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_interpolation({ + property: 'font-size', + from: 'unset', + to: '20px', +}, [ + {at: -2, expect: '50px'}, + {at: -0.3, expect: '33px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_interpolation({ + property: 'font-size', + from: '4px', + to: '14px' +}, [ + {at: -2, expect: '0px'}, // CSS font-size can't be negative. + {at: -0.3, expect: '1px'}, + {at: 0, expect: '4px'}, + {at: 0.3, expect: '7px'}, + {at: 0.6, expect: '10px'}, + {at: 1, expect: '14px'}, + {at: 1.5, expect: '19px'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html new file mode 100644 index 00000000000..d6f2f19ab1e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-002.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-size interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size"> +<meta name="assert" content="font-size supports animation as length"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.container { + font-size: 10px; +} +.target { + display: inline-block; + font: 100px sans-serif; + font-size: 20px; +} +.expected { + color: green; + margin-right: 30px; +} +</style> + +<body> +<template id="target-template"> + <span class="container"> + <div class="target">TT</div> + </span> +</template> +</body> + +<script> +// Test the 'unset' case. +test_interpolation({ + property: 'font-size', + from: 'unset', + to: '20px' +}, [ + {at: -2, expect: '0px'}, // CSS font-size can't be negative. + {at: -0.3, expect: '7px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html new file mode 100644 index 00000000000..d84ff7e5dfe --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-size-interpolation-003.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-size interpolation with zoom</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-3/#propdef-font-size"> +<meta name="assert" content="font-size supports animation as a length, respecting zoom"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.container { + zoom: 2; +} +.target { + display: inline-block; +} +.expected { + color: green; + margin-right: 30px; +} +</style> + +<body> +<template id="target-template"> + <span class="container"> + <div class="target">TT</div> + </span> +</template> +</body> + +<script> +// The container has zoom: 2 applied to it. +test_interpolation({ + property: 'font-size', + from: '10px', + to: '20px' +}, [ + {at: -2, expect: '0px'}, // CSS font-size can't be negative. + {at: -0.3, expect: '7px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html new file mode 100644 index 00000000000..e11079cfc01 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/animations/font-variation-settings-interpolation.html @@ -0,0 +1,132 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>font-variation-settings interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#propdef-font-variation-settings"> +<meta name="assert" content="font-variation-settings supports animation pairwise by 'like' properties"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + font-variation-settings: "test" 30; +} +.target { + font-variation-settings: "test" 10; +} +</style> + +<body></body> + +<script> +test_interpolation({ + property: 'font-variation-settings', + from: neutralKeyframe, + to: '"test" 20', +}, [ + {at: -0.5, expect: "'test' 5"}, + {at: 0, expect: "'test' 10"}, + {at: 0.3, expect: "'test' 13"}, + {at: 0.7, expect: "'test' 17"}, + {at: 1, expect: "'test' 20"}, + {at: 1.5, expect: "'test' 25"}, +]); + +test_no_interpolation({ + property: 'font-variation-settings', + from: 'initial', + to: "'test' 50", +}); + +test_interpolation({ + property: 'font-variation-settings', + from: 'inherit', + to: "'test' 20", +}, [ + {at: -0.5, expect: "'test' 35"}, + {at: 0, expect: "'test' 30"}, + {at: 0.3, expect: "'test' 27"}, + {at: 0.7, expect: "'test' 23"}, + {at: 1, expect: "'test' 20"}, + {at: 1.5, expect: "'test' 15"}, +]); + +test_interpolation({ + property: 'font-variation-settings', + from: 'unset', + to: "'test' 20", +}, [ + {at: -0.5, expect: "'test' 35"}, + {at: 0, expect: "'test' 30"}, + {at: 0.3, expect: "'test' 27"}, + {at: 0.7, expect: "'test' 23"}, + {at: 1, expect: "'test' 20"}, + {at: 1.5, expect: "'test' 15"}, +]); + +test_no_interpolation({ + property: 'font-variation-settings', + from: "'test' 20", + to: "normal", +}); + +test_interpolation({ + property: 'font-variation-settings', + from: "'test' 20", + to: "'test' 30", +}, [ + {at: -0.5, expect: "'test' 15"}, + {at: 0, expect: "'test' 20"}, + {at: 0.3, expect: "'test' 23"}, + {at: 0.7, expect: "'test' 27"}, + {at: 1, expect: "'test' 30"}, + {at: 1.5, expect: "'test' 35"}, +]); + +test_interpolation({ + property: 'font-variation-settings', + from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20", + to: "'aaaa' 10, 'bbbb' 20, 'cccc' 30", +}, [ + {at: -0.5, expect: "'aaaa' -5, 'bbbb' 5, 'cccc' 15"}, + {at: 0, expect: "'aaaa' 0, 'bbbb' 10, 'cccc' 20"}, + {at: 0.3, expect: "'aaaa' 3, 'bbbb' 13, 'cccc' 23"}, + {at: 0.7, expect: "'aaaa' 7, 'bbbb' 17, 'cccc' 27"}, + {at: 1, expect: "'aaaa' 10, 'bbbb' 20, 'cccc' 30"}, + {at: 1.5, expect: "'aaaa' 15, 'bbbb' 25, 'cccc' 35"}, +]); + +test_no_interpolation({ + property: 'font-variation-settings', + from: "'aaaa' 0, 'bbbb' 10", + to: "'aaaa' 10, 'bbbb' 20, 'cccc' 30", +}); + +test_no_interpolation({ + property: 'font-variation-settings', + from: "'aaaa' 10, 'bbbb' 20, 'cccc' 30", + to: "'aaaa' 0, 'bbbb' 10", +}); + +test_no_interpolation({ + property: 'font-variation-settings', + from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20", + to: "'cccc' 10, 'bbbb' 20, 'aaaa' 30", +}); + +test_no_interpolation({ + property: 'font-variation-settings', + from: "'aaaa' 0, 'bbbb' 10, 'cccc' 20", + to: "'dddd' 10, 'eeee' 20, 'ffff' 30", +}); + +// crbug.com/910118: Test that ApplyStandardPropertyValue doesn't overflow. +test_interpolation({ + property: 'font-variation-settings', + from: "'aaaa' 30, 'bbbb' 20", + to: "'aaaa' 20, 'bbbb' 30", +}, [ + {at: 3.40282e+38, expect: "'aaaa' -3.40282e+38, 'bbbb' 3.40282e+38"}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-fonts/font-size-relative-across-calc-ff-bug-001.html b/tests/wpt/web-platform-tests/css/css-fonts/font-size-relative-across-calc-ff-bug-001.html new file mode 100644 index 00000000000..167de888872 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-fonts/font-size-relative-across-calc-ff-bug-001.html @@ -0,0 +1,15 @@ +<!doctype html> +<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-size-prop"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1572738"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1572451"> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<script type="text/javascript" src="/resources/testharness.js"></script> +<script type="text/javascript" src="/resources/testharnessreport.js"></script> +<div style="font-family: something-non-default; font-size: calc(-100em + 1px);"></div> +<div style="font-family: something-non-default; font-size: calc(1em - 100px);"></div> +<script> +test(function() { + for (const element of document.querySelectorAll("div")) + assert_equals(getComputedStyle(element).fontSize, "0px"); +}, "font-size computation isn't messed up when mixing positive and negatives when font-family changes and the parent has a keyword font-size"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/all-ref.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all-ref.html new file mode 100644 index 00000000000..2a04f96e732 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all-ref.html @@ -0,0 +1,161 @@ +<!DOCTYPE html> +<style> +td { text-align: center; } + +.parent { + box-sizing: border-box; + width: 60px; + height: 60px; + border: solid; + border-width: 1px 2px 3px 4px; + padding: 0px 4px 8px 12px; + position: relative; +} + +.child { + position: absolute; + width: 10px; + height: 10px; + background: green; +} + +.top-left { + top: 0; + left: 12px; +} + +.top-right { + top: 0; + right: 4px; +} + +.bottom-left { + bottom: 8px; + left: 12px; +} + +.bottom-right { + bottom: 8px; + right: 4px; +} +</style> + +<table> + <tr> + <td></td> + <td colspan=2>LTR</td> + <td colspan=2>RTL</td> + </tr> + <tr> + <td></td> + <td>Y</td> + <td>X</td> + <td>Y</td> + <td>X</td> + </tr> + <tr> + <td>HTB</td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + </tr> + <tr> + <td>VRL</td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + </tr> + <tr> + <td>VLR</td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + </tr> +</table> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/all.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all.https.html new file mode 100644 index 00000000000..e38d3666b87 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/all.https.html @@ -0,0 +1,194 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="all-ref.html"> +<meta name="assert" content="This test checks that 'all' sizes are passed to the layout correctly." /> +<style> +td { text-align: center; } + +.parent { + box-sizing: border-box; + width: 60px; + height: 60px; + border: solid; + border-width: 1px 2px 3px 4px; + padding: 0px 4px 8px 12px; + position: relative; + background: red; +} + +@supports (display: layout(test)) { + .parent { + display: layout(test); + background: initial; + } +} + +.child { + width: 10px; + height: 10px; + background: green; +} +</style> +<!-- + This test works by placing four children in each corner of the layout using the edges. + The reference to this test uses absolute positioning to achieve the same effect. +--> +<table> + <tr> + <td></td> + <td colspan=2>LTR</td> + <td colspan=2>RTL</td> + </tr> + <tr> + <td></td> + <td>Y</td> + <td>X</td> + <td>Y</td> + <td>X</td> + </tr> + <tr> + <td>HTB</td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + </tr> + <tr> + <td>VRL</td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + </tr> + <tr> + <td>VLR</td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + </tr> +</table> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> +<script id="code" type="text/worklet"> +registerLayout('test', class { + async intrinsicSizes() {} + async layout(children, edges, constraints) { + const topLeftFragment = await children[0].layoutNextFragment(); + const topRightFragment = await children[1].layoutNextFragment(); + const bottomLeftFragment = await children[2].layoutNextFragment(); + const bottomRightFragment = await children[3].layoutNextFragment(); + + topLeftFragment.inlineOffset = edges.inlineStart; + topLeftFragment.blockOffset = edges.blockStart; + + topRightFragment.inlineOffset = + constraints.fixedInlineSize - topRightFragment.inlineSize - edges.inlineEnd; + topRightFragment.blockOffset = edges.blockStart; + + bottomLeftFragment.inlineOffset = edges.inlineStart; + bottomLeftFragment.blockOffset = + constraints.fixedBlockSize - bottomLeftFragment.blockSize - edges.blockEnd; + + bottomRightFragment.inlineOffset = + constraints.fixedInlineSize - bottomRightFragment.inlineSize - edges.inlineEnd; + bottomRightFragment.blockOffset = + constraints.fixedBlockSize - bottomRightFragment.blockSize - edges.blockEnd; + + return {childFragments: [ + topLeftFragment, + topRightFragment, + bottomLeftFragment, + bottomRightFragment + ]}; + } +}); +</script> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, document.getElementById('code').textContent); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb-rtl.https.html new file mode 100644 index 00000000000..cb200a76758 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb-rtl.https.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: horizontal-tb; + direction: rtl; + background: red; + box-sizing: border-box; + width: 100px; + + --edges-inline-start-expected: 8; + --edges-inline-end-expected: 20; + --edges-block-start-expected: 10; + --edges-block-end-expected: 0; + + font-size: 8px; + + border-color: transparent; + border-style: solid; + border-width: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb.https.html new file mode 100644 index 00000000000..67a38588303 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-htb.https.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: horizontal-tb; + background: red; + box-sizing: border-box; + width: 100px; + + --edges-inline-start-expected: 20; + --edges-inline-end-expected: 8; + --edges-block-start-expected: 10; + --edges-block-end-expected: 0; + + font-size: 8px; + + border-color: transparent; + border-style: solid; + border-width: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr-rtl.https.html new file mode 100644 index 00000000000..8da84e9acc9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr-rtl.https.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-lr; + direction: rtl; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 0; + --edges-inline-end-expected: 10; + --edges-block-start-expected: 20; + --edges-block-end-expected: 8; + + font-size: 8px; + + border-color: transparent; + border-style: solid; + border-width: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr.https.html new file mode 100644 index 00000000000..b514b2f22ff --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vlr.https.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-lr; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 10; + --edges-inline-end-expected: 0; + --edges-block-start-expected: 20; + --edges-block-end-expected: 8; + + font-size: 8px; + + border-color: transparent; + border-style: solid; + border-width: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl-rtl.https.html new file mode 100644 index 00000000000..38c8c3f0463 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl-rtl.https.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-rl; + direction: rtl; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 0; + --edges-inline-end-expected: 10; + --edges-block-start-expected: 8; + --edges-block-end-expected: 20; + + font-size: 8px; + + border-color: transparent; + border-style: solid; + border-width: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl.https.html new file mode 100644 index 00000000000..94c5353eb93 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/border-vrl.https.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that border sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-rl; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 10; + --edges-inline-end-expected: 0; + --edges-block-start-expected: 8; + --edges-block-end-expected: 20; + + font-size: 8px; + + border-color: transparent; + border-style: solid; + border-width: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb-rtl.https.html new file mode 100644 index 00000000000..dfbf2bc099d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb-rtl.https.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: horizontal-tb; + direction: rtl; + background: red; + box-sizing: border-box; + width: 100px; + + --edges-inline-start-expected: 8; + --edges-inline-end-expected: 20; + --edges-block-start-expected: 10; + --edges-block-end-expected: 0; + + font-size: 8px; + + padding: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb.https.html new file mode 100644 index 00000000000..ebad66594c6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-htb.https.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: horizontal-tb; + background: red; + box-sizing: border-box; + width: 100px; + + --edges-inline-start-expected: 20; + --edges-inline-end-expected: 8; + --edges-block-start-expected: 10; + --edges-block-end-expected: 0; + + font-size: 8px; + + padding: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr-rtl.https.html new file mode 100644 index 00000000000..86b0ca5425b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr-rtl.https.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-lr; + direction: rtl; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 0; + --edges-inline-end-expected: 10; + --edges-block-start-expected: 20; + --edges-block-end-expected: 8; + + font-size: 8px; + + padding: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr.https.html new file mode 100644 index 00000000000..563884ade35 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vlr.https.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-lr; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 10; + --edges-inline-end-expected: 0; + --edges-block-start-expected: 20; + --edges-block-end-expected: 8; + + font-size: 8px; + + padding: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl-rtl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl-rtl.https.html new file mode 100644 index 00000000000..bda0a211442 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl-rtl.https.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-rl; + direction: rtl; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 0; + --edges-inline-end-expected: 10; + --edges-block-start-expected: 8; + --edges-block-end-expected: 20; + + font-size: 8px; + + padding: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl.https.html new file mode 100644 index 00000000000..a65ecad3115 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/padding-vrl.https.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="../green-square-ref.html"> +<meta name="assert" content="This test checks that padding sizes are passed to the layout correctly." /> +<style> +.test { + writing-mode: vertical-rl; + background: red; + box-sizing: border-box; + height: 100px; + + --edges-inline-start-expected: 10; + --edges-inline-end-expected: 0; + --edges-block-start-expected: 8; + --edges-block-end-expected: 20; + + font-size: 8px; + + padding: 10px 1em 0 20px; +} + +@supports (display: layout(test)) { + .test { + display: layout(test); + background: green; + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> + +<div class="test"></div> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, {url: 'support/edges.js'}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar-ref.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar-ref.html new file mode 100644 index 00000000000..cc41754c082 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar-ref.html @@ -0,0 +1,159 @@ +<!DOCTYPE html> +<style> +td { text-align: center; } + +.parent { + box-sizing: border-box; + width: 50px; + height: 50px; + border: solid; + position: relative; +} + +.child { + position: absolute; + width: 10px; + height: 10px; + background: green; +} + +.top-left { + top: 0; + left: 0; +} + +.top-right { + top: 0; + right: 0; +} + +.bottom-left { + bottom: 0; + left: 0; +} + +.bottom-right { + bottom: 0; + right: 0; +} +</style> + +<table> + <tr> + <td></td> + <td colspan=2>LTR</td> + <td colspan=2>RTL</td> + </tr> + <tr> + <td></td> + <td>Y</td> + <td>X</td> + <td>Y</td> + <td>X</td> + </tr> + <tr> + <td>HTB</td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + </tr> + <tr> + <td>VRL</td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + </tr> + <tr> + <td>VLR</td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;"> + <div class="child top-left"></div> + <div class="child top-right"></div> + <div class="child bottom-left"></div> + <div class="child bottom-right"></div> + </div> + </td> + </tr> +</table> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar.https.html b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar.https.html new file mode 100644 index 00000000000..76bbd4dccd0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/scrollbar.https.html @@ -0,0 +1,192 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#dom-layoutedges"> +<link rel="match" href="scrollbar-ref.html"> +<meta name="assert" content="This test checks that scrollbar sizes are passed to the layout correctly." /> +<style> +td { text-align: center; } + +.parent { + box-sizing: border-box; + width: 50px; + height: 50px; + border: solid; + position: relative; + background: red; +} + +@supports (display: layout(test)) { + .parent { + display: layout(test); + background: initial; + } +} + +.child { + width: 10px; + height: 10px; + background: green; +} +</style> +<!-- + This test works by placing four children in each corner of the layout using the edges. + The reference to this test uses absolute positioning to achieve the same effect. +--> +<table> + <tr> + <td></td> + <td colspan=2>LTR</td> + <td colspan=2>RTL</td> + </tr> + <tr> + <td></td> + <td>Y</td> + <td>X</td> + <td>Y</td> + <td>X</td> + </tr> + <tr> + <td>HTB</td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: ltr; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: horizontal-tb; direction: rtl; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + </tr> + <tr> + <td>VRL</td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: ltr; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-rl; direction: rtl; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + </tr> + <tr> + <td>VLR</td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: ltr; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-y: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + <td> + <div class="parent" style="writing-mode: vertical-lr; direction: rtl; overflow-x: scroll;"> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + <div class="child"></div> + </div> + </td> + </tr> +</table> +<script src="/common/reftest-wait.js"></script> +<script src="/common/worklet-reftest.js"></script> +<script id="code" type="text/worklet"> +registerLayout('test', class { + async intrinsicSizes() {} + async layout(children, edges, constraints) { + const topLeftFragment = await children[0].layoutNextFragment(); + const topRightFragment = await children[1].layoutNextFragment(); + const bottomLeftFragment = await children[2].layoutNextFragment(); + const bottomRightFragment = await children[3].layoutNextFragment(); + + topLeftFragment.inlineOffset = edges.inlineStart; + topLeftFragment.blockOffset = edges.blockStart; + + topRightFragment.inlineOffset = + constraints.fixedInlineSize - topRightFragment.inlineSize - edges.inlineEnd; + topRightFragment.blockOffset = edges.blockStart; + + bottomLeftFragment.inlineOffset = edges.inlineStart; + bottomLeftFragment.blockOffset = + constraints.fixedBlockSize - bottomLeftFragment.blockSize - edges.blockEnd; + + bottomRightFragment.inlineOffset = + constraints.fixedInlineSize - bottomRightFragment.inlineSize - edges.inlineEnd; + bottomRightFragment.blockOffset = + constraints.fixedBlockSize - bottomRightFragment.blockSize - edges.blockEnd; + + return {childFragments: [ + topLeftFragment, + topRightFragment, + bottomLeftFragment, + bottomRightFragment + ]}; + } +}); +</script> +<script> +importWorkletAndTerminateTestAfterAsyncPaint(CSS.layoutWorklet, document.getElementById('code').textContent); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-layout-api/edges/support/edges.js b/tests/wpt/web-platform-tests/css/css-layout-api/edges/support/edges.js new file mode 100644 index 00000000000..b70a42f398c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-layout-api/edges/support/edges.js @@ -0,0 +1,38 @@ +import {areArraysEqual} from '/common/arrays.js'; + +function parseNumber(value) { + const num = parseInt(value.toString()); + if (isNaN(num)) return 0; + return num; +} + +registerLayout('test', class { + static get inputProperties() { + return [ + '--edges-inline-start-expected', + '--edges-inline-end-expected', + '--edges-block-start-expected', + '--edges-block-end-expected', + ]; + } + + async intrinsicSizes() {} + async layout(children, edges, constraints, styleMap) { + const actual = this.constructor.inputProperties.map( + prop => parseNumber(styleMap.get(prop)) + ); + + const expected = [ + edges.inlineStart, + edges.inlineEnd, + edges.blockStart, + edges.blockEnd, + ]; + + if (!areArraysEqual(expected, actual)) { + return {autoBlockSize: 0, childFragments: []}; + } + + return {autoBlockSize: 100, childFragment: []}; + } +}); diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/margin-block-inline-computed.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/margin-block-inline-computed.html new file mode 100644 index 00000000000..6ef52bda3b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/margin-block-inline-computed.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Logical Properties and Values: getComputedStyle().marginBlockStart etc.</title> +<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-margin-block"> +<link rel="help" href="https://drafts.csswg.org/cssom/#resolved-values"> +<meta name="assert" content="margin-block, margin-inline resolved values have absolute length."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<style> + #container { + will-change: transform; /* containing block for #target */ + width: 200px; + } + #parent { + width: 0px; + } + #target { + position: absolute; + font-size: 40px; + } +</style> +</head> +<body> +<div id="container"> + <div id="parent"> + <div id="target"></div> + </div> +</div> +<script> +test_computed_value("margin-block-start", "10px"); +test_computed_value("margin-block-end", "10%", "20px"); +test_computed_value("margin-inline-start", "30px"); +test_computed_value("margin-inline-end", "1em", "40px"); + +test_computed_value('margin-block-start', 'calc(10% + 40px)', '60px'); +test_computed_value('margin-block-end', 'calc(10px + 0.5em)', '30px'); +test_computed_value('margin-inline-start', 'calc(10px + 0.5em)', '30px'); +test_computed_value('margin-inline-end', 'calc(10% + 40px)', '60px'); + +test_computed_value("margin-block", "10px"); +test_computed_value("margin-block", "10px 20px"); +test_computed_value("margin-inline", "30px"); +test_computed_value("margin-inline", "30px 40px"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-logical/parsing/padding-block-inline-computed.html b/tests/wpt/web-platform-tests/css/css-logical/parsing/padding-block-inline-computed.html new file mode 100644 index 00000000000..230f18525a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-logical/parsing/padding-block-inline-computed.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Logical Properties and Values: getComputedStyle().paddingBlockStart etc.</title> +<link rel="help" href="https://drafts.csswg.org/css-logical/#propdef-padding-block"> +<link rel="help" href="https://drafts.csswg.org/cssom/#resolved-values"> +<meta name="assert" content="padding-block, padding-inline resolved values have absolute length."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<style> + #container { + will-change: transform; /* containing block for #target */ + width: 200px; + } + #parent { + width: 0px; + } + #target { + position: absolute; + font-size: 40px; + } +</style> +</head> +<body> +<div id="container"> + <div id="parent"> + <div id="target"></div> + </div> +</div> +<script> +test_computed_value("padding-block-start", "10px"); +test_computed_value("padding-block-end", "10%", "20px"); +test_computed_value("padding-inline-start", "30px"); +test_computed_value("padding-inline-end", "1em", "40px"); + +test_computed_value('padding-block-start', 'calc(10% + 40px)', '60px'); +test_computed_value('padding-block-end', 'calc(10% - 40px)', '0px'); +test_computed_value('padding-inline-start', 'calc(10% - 40px)', '0px'); +test_computed_value('padding-inline-end', 'calc(10% + 40px)', '60px'); + +test_computed_value('padding-block-start', 'calc(10px - 0.5em)', '0px'); +test_computed_value('padding-block-end', 'calc(10px + 0.5em)', '30px'); +test_computed_value('padding-inline-start', 'calc(10px + 0.5em)', '30px'); +test_computed_value('padding-inline-end', 'calc(10px - 0.5em)', '0px'); + +test_computed_value("padding-block", "10px"); +test_computed_value("padding-block", "10px 20px"); +test_computed_value("padding-inline", "30px"); +test_computed_value("padding-inline", "30px 40px"); +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html b/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html index 6d7dbc63a1d..fe2a63a57a1 100644 --- a/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html +++ b/tests/wpt/web-platform-tests/css/css-properties-values-api/register-property-syntax-parsing.html @@ -54,8 +54,6 @@ assert_valid("<percentage>", "-9.3e3%"); assert_valid("<length-percentage>", "-54%"); assert_valid("<length-percentage>", "0"); assert_valid("<length-percentage>", "calc(-11px + 10.4%)"); -assert_valid("<length>", "10vmin"); -assert_valid("<percentage> | <length>+", "calc(100vh - 10px) 30px"); assert_valid("<number>", "-109"); assert_valid("<number>", "2.3e4"); @@ -185,12 +183,14 @@ assert_invalid("<length>", "10%"); assert_invalid("<length>", "calc(5px + 10%)"); assert_invalid("<length>", "calc(5px * 3px / 6px)"); assert_invalid("<length>", "10em"); +assert_invalid("<length>", "10vmin"); assert_invalid("<length>", "calc(4px + 3em)"); assert_invalid("<length>", "calc(4px + calc(8 * 2em))"); assert_invalid("<length>+", "calc(2ex + 16px)"); assert_invalid("<length>+", "10px calc(20px + 4rem)"); assert_invalid("<length>+", ""); assert_invalid("<length>#", ""); +assert_invalid("<percentage> | <length>+", "calc(100vh - 10px) 30px"); assert_invalid("<length>", "10px;"); assert_invalid("<length-percentage>", "calc(2px + 10% + 7ex)"); assert_invalid("<percentage>", "0"); diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/height-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-interpolation.html new file mode 100644 index 00000000000..10ceed5b2cc --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/height-interpolation.html @@ -0,0 +1,81 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>height interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-height"> +<meta name="assert" content="height supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + height: 200px; +} +.target { + width: 100px; + height: 100px; + background-color: black; + display: inline-block; + margin-right: 5px; + height: 10px; +} +.expected { + background-color: green; +} +</style> + +<body></body> + +<script> +test_interpolation({ + property: 'height', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.3, expect: '7px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_no_interpolation({ + property: 'height', + from: 'initial', + to: '20px', +}); + +test_interpolation({ + property: 'height', + from: 'inherit', + to: '20px', +}, [ + {at: -0.3, expect: '254px'}, + {at: 0, expect: '200px'}, + {at: 0.3, expect: '146px'}, + {at: 0.6, expect: '92px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '0px'}, +]); + +test_no_interpolation({ + property: 'height', + from: 'unset', + to: '20px', +}); + +test_interpolation({ + property: 'height', + from: '0px', + to: '100px', +}, [ + {at: -0.3, expect: '0px'}, // CSS height can't be negative. + {at: 0, expect: '0px'}, + {at: 0.3, expect: '30px'}, + {at: 0.6, expect: '60px'}, + {at: 1, expect: '100px'}, + {at: 1.5, expect: '150px'} +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-interpolation.html new file mode 100644 index 00000000000..c4cab0e1cf4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-height-interpolation.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>max-height interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-height"> +<meta name="assert" content="max-height supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + max-height: 30px; +} +.target { + width: 100px; + height: 100px; + background-color: black; + display: inline-block; + max-height: 10px; +} +.expected { + background-color: green; +} + +</style> + +<body> +<template id="target-template"> + <div> + <div class="target"></div> + </div> +</template> +</body> + +<script> +test_interpolation({ + property: 'max-height', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.5, expect: '5px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_no_interpolation({ + property: 'max-height', + from: 'initial', + to: '20px', +}); + +test_interpolation({ + property: 'max-height', + from: 'inherit', + to: '20px', +}, [ + {at: -0.5, expect: '35px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_no_interpolation({ + property: 'max-height', + from: 'unset', + to: '20px', +}); + +test_interpolation({ + property: 'max-height', + from: '0px', + to: '100px', +}, [ + {at: -0.5, expect: '0'}, // CSS max-height can't be negative. + {at: 0, expect: '0'}, + {at: 0.3, expect: '30px'}, + {at: 0.6, expect: '60px'}, + {at: 1, expect: '100px'}, + {at: 1.5, expect: '150px'} +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-interpolation.html new file mode 100644 index 00000000000..111199baa7e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/max-width-interpolation.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>max-width interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-width"> +<meta name="assert" content="max-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + max-width: 100px; +} +.target { + width: 200px; + height: 10px; + background-color: black; + max-width: 10px; +} +.expected { + background-color: green; + margin-bottom: 10px; +} +</style> + +<body></body> + +<script> +test_interpolation({ + property: 'max-width', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.5, expect: '5px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_no_interpolation({ + property: 'max-width', + from: 'initial', + to: '20px', +}); + +test_interpolation({ + property: 'max-width', + from: 'inherit', + to: '20px', +}, [ + {at: -0.5, expect: '140px'}, + {at: 0, expect: '100px'}, + {at: 0.3, expect: '76px'}, + {at: 0.6, expect: '52px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '0px'}, +]); + +test_no_interpolation({ + property: 'max-width', + from: 'unset', + to: '20px', +}); + +test_interpolation({ + property: 'max-width', + from: '0px', + to: '100px', +}, [ + {at: -0.5, expect: '0'}, // CSS max-width can't be negative. + {at: 0, expect: '0'}, + {at: 0.3, expect: '30px'}, + {at: 0.6, expect: '60px'}, + {at: 1, expect: '100px'}, + {at: 1.5, expect: '150px'} +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-interpolation.html new file mode 100644 index 00000000000..6fd5b4e2f53 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-height-interpolation.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>min-height interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-height"> +<meta name="assert" content="min-height supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + min-height: 30px; +} +.target { + width: 10px; + height: 0px; + background-color: black; + display: inline-block; + min-height: 10px; +} +.expected { + background-color: green; +} +</style> + +<body></body> + +<script> +test_interpolation({ + property: 'min-height', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.5, expect: '5px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_no_interpolation({ + property: 'min-height', + from: 'initial', + to: '20px', +}); + +test_interpolation({ + property: 'min-height', + from: 'inherit', + to: '20px', +}, [ + {at: -0.5, expect: '35px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_no_interpolation({ + property: 'min-height', + from: 'unset', + to: '20px', +}); + +test_interpolation({ + property: 'min-height', + from: '0px', + to: '100px', +}, [ + {at: -0.5, expect: '0'}, // CSS min-height can't be negative. + {at: 0, expect: '0'}, + {at: 0.3, expect: '30px'}, + {at: 0.6, expect: '60px'}, + {at: 1, expect: '100px'}, + {at: 1.5, expect: '150px'} +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-interpolation.html new file mode 100644 index 00000000000..d11fb3d5cb1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/min-width-interpolation.html @@ -0,0 +1,79 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>min-width interpolation</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-width"> +<meta name="assert" content="min-width supports animation by computed value"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + min-width: 30px; +} +.target { + width: 0px; + height: 10px; + background-color: black; + min-width: 10px; +} +.expected { + background-color: green; +} +</style> + +<body></body> + +<script> +test_interpolation({ + property: 'min-width', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.5, expect: '5px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_no_interpolation({ + property: 'min-width', + from: 'initial', + to: '20px', +}); + +test_interpolation({ + property: 'min-width', + from: 'inherit', + to: '20px', +}, [ + {at: -0.5, expect: '35px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_no_interpolation({ + property: 'min-width', + from: 'unset', + to: '20px', +}); + +test_interpolation({ + property: 'min-width', + from: '0px', + to: '100px' +}, [ + {at: -0.5, expect: '0'}, // CSS min-width can't be negative. + {at: 0, expect: '0'}, + {at: 0.3, expect: '30px'}, + {at: 0.6, expect: '60px'}, + {at: 1, expect: '100px'}, + {at: 1.5, expect: '150px'} +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html index 33bc1b14c83..16b67c5ed66 100644 --- a/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html +++ b/tests/wpt/web-platform-tests/css/css-sizing/animation/width-interpolation.html @@ -2,7 +2,7 @@ <meta charset="UTF-8"> <title>width interpolation</title> <link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-width"> -<meta name="assert" content="width supports animation by computed style."> +<meta name="assert" content="width supports animation by computed value"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-height-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-height-computed.html new file mode 100644 index 00000000000..c4c6703250d --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-height-computed.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS basic box model: getComputedStyle().maxHeight</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-height"> +<meta name="assert" content="max-height computed value is as specified, with <length-percentage> values computed"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<style> + #target { + font-size: 40px; + } +</style> +</head> +<body> +<div id="target"></div> +<script> +test_computed_value("max-height", "none"); +test_computed_value("max-height", "min-content"); +test_computed_value("max-height", "max-content"); + +test_computed_value("max-height", "10px"); +test_computed_value("max-height", "20%"); + +test_computed_value('max-height', 'calc(10% + 40px)'); +test_computed_value('max-height', 'calc(10px - 0.5em)', '0px'); +test_computed_value('max-height', 'calc(10px + 0.5em)', '30px'); + +// fit-content not yet tested +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-width-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-width-computed.html new file mode 100644 index 00000000000..7e1c0fc2388 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/max-width-computed.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS basic box model: getComputedStyle().maxWidth</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-max-width"> +<meta name="assert" content="max-width computed value is as specified, with <length-percentage> values computed"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<style> + #target { + font-size: 40px; + } +</style> +</head> +<body> +<div id="target"></div> +<script> +test_computed_value("max-width", "none"); +test_computed_value("max-width", "min-content"); +test_computed_value("max-width", "max-content"); + +test_computed_value("max-width", "10px"); +test_computed_value("max-width", "20%"); + +test_computed_value('max-width', 'calc(10% + 40px)'); +test_computed_value('max-width', 'calc(10px - 0.5em)', '0px'); +test_computed_value('max-width', 'calc(10px + 0.5em)', '30px'); + +// fit-content not yet tested +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-height-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-height-computed.html new file mode 100644 index 00000000000..c15ee9de772 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-height-computed.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS basic box model: getComputedStyle().minHeight</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-height"> +<meta name="assert" content="min-height computed value is as specified, with <length-percentage> values computed"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<style> + #target { + font-size: 40px; + } +</style> +</head> +<body> +<div id="target"></div> +<script> +test_computed_value("min-height", "min-content"); +test_computed_value("min-height", "max-content"); + +test_computed_value("min-height", "10px"); +test_computed_value("min-height", "20%"); + +test_computed_value('min-height', 'calc(10% + 40px)'); +test_computed_value('min-height', 'calc(10px - 0.5em)', '0px'); +test_computed_value('min-height', 'calc(10px + 0.5em)', '30px'); + +// fit-content not yet tested +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-width-computed.html b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-width-computed.html new file mode 100644 index 00000000000..0a69352ed77 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-sizing/parsing/min-width-computed.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS basic box model: getComputedStyle().minWidth</title> +<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#propdef-min-width"> +<meta name="assert" content="min-width computed value is as specified, with <length-percentage> values computed"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<style> + #target { + font-size: 40px; + } +</style> +</head> +<body> +<div id="target"></div> +<script> +test_computed_value("min-width", "min-content"); +test_computed_value("min-width", "max-content"); + +test_computed_value("min-width", "10px"); +test_computed_value("min-width", "20%"); + +test_computed_value('min-width', 'calc(10% + 40px)'); +test_computed_value('min-width', 'calc(10px - 0.5em)', '0px'); +test_computed_value('min-width', 'calc(10px + 0.5em)', '30px'); + +// fit-content not yet tested +</script> +</body> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html b/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html index a12e1df5d84..f32e2dd39c0 100644 --- a/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html +++ b/tests/wpt/web-platform-tests/css/css-tables/html5-table-formatting-3.html @@ -60,47 +60,48 @@ xtd.parentNode.replaceChild(td,xtd); } - generate_tests(assert_equals, [ - [ - "Control test for table-cell padding and border-spacing, etc (width)", - document.querySelector("x-table:nth-of-type(1)").offsetWidth, - 100 - ], - [ - "Control test for table-cell padding and border-spacing (height)", - document.querySelector("x-table:nth-of-type(1)").offsetHeight, - 100 - ], - [ - "Anonymous consecutive columns spanned by the same set of cells are merged", - document.querySelector("x-table:nth-of-type(2)").offsetWidth, - 100 - ], - [ - "Anonymous consecutive rows spanned by the same set of cells are merged", - document.querySelector("x-table:nth-of-type(2)").offsetHeight, - 100 - ], - [ - "Explicitely-defined consecutive columns spanned by the same set of cells are not merged", - document.querySelector("x-table:nth-of-type(3)").offsetWidth, - 75 - ], - [ - "Explicitely-defined consecutive rows spanned by the same set of cells are not merged", - document.querySelector("x-table:nth-of-type(3)").offsetHeight, - 75 - ], - [ - "Explicitely-defined consecutive columns spanned by the same set of cells are not merged, and cells span across border-spacing", - document.querySelector("x-table:nth-of-type(4) x-col").getBoundingClientRect().width, - 12.5 - ], - [ - "Explicitely-defined consecutive rows spanned by the same set of cells are not merged, and cells span across border-spacing", - document.querySelector("x-table:nth-of-type(4) x-tr").getBoundingClientRect().height, - 12.5 - ], - ]) - + document.body.onload = () => { + generate_tests(assert_equals, [ + [ + "Control test for table-cell padding and border-spacing, etc (width)", + document.querySelector("x-table:nth-of-type(1)").offsetWidth, + 100 + ], + [ + "Control test for table-cell padding and border-spacing (height)", + document.querySelector("x-table:nth-of-type(1)").offsetHeight, + 100 + ], + [ + "Anonymous consecutive columns spanned by the same set of cells are merged", + document.querySelector("x-table:nth-of-type(2)").offsetWidth, + 100 + ], + [ + "Anonymous consecutive rows spanned by the same set of cells are merged", + document.querySelector("x-table:nth-of-type(2)").offsetHeight, + 100 + ], + [ + "Explicitely-defined consecutive columns spanned by the same set of cells are not merged", + document.querySelector("x-table:nth-of-type(3)").offsetWidth, + 75 + ], + [ + "Explicitely-defined consecutive rows spanned by the same set of cells are not merged", + document.querySelector("x-table:nth-of-type(3)").offsetHeight, + 75 + ], + [ + "Explicitely-defined consecutive columns spanned by the same set of cells are not merged, and cells span across border-spacing", + document.querySelector("x-table:nth-of-type(4) x-col").getBoundingClientRect().width, + 12.5 + ], + [ + "Explicitely-defined consecutive rows spanned by the same set of cells are not merged, and cells span across border-spacing", + document.querySelector("x-table:nth-of-type(4) x-tr").getBoundingClientRect().height, + 12.5 + ], + ]) + } </script> diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-interpolation.html b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-interpolation.html new file mode 100644 index 00000000000..7d495811391 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/animations/letter-spacing-interpolation.html @@ -0,0 +1,107 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property"> +<meta name="test" content="letter-spacing supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + letter-spacing: 2px; +} +.target { + font: 10px sans-serif; + font-weight: bold; + letter-spacing: 30px; +} +.expected { + color: green; + margin-right: 30px; +} +</style> + +<body> + <template id="target-template">TT</template> +</body> + +<script> +test_interpolation({ + property: 'letter-spacing', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.3, expect: '33px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_interpolation({ + property: 'letter-spacing', + from: 'initial', + to: '20px', +}, [ + {at: -0.3, expect: '-6px'}, + {at: 0, expect: 'normal'}, + {at: 0.3, expect: '6px'}, + {at: 0.6, expect: '12px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '30px'}, +]); + +test_interpolation({ + property: 'letter-spacing', + from: 'inherit', + to: '20px', +}, [ + {at: -0.3, expect: '-3.4px'}, + {at: 0, expect: '2px'}, + {at: 0.3, expect: '7.4px'}, + {at: 0.6, expect: '12.8px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '29px'}, +]); + +test_interpolation({ + property: 'letter-spacing', + from: 'unset', + to: '20px', +}, [ + {at: -0.3, expect: '-3.4px'}, + {at: 0, expect: '2px'}, + {at: 0.3, expect: '7.4px'}, + {at: 0.6, expect: '12.8px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '29px'}, +]); + +test_interpolation({ + property: 'letter-spacing', + from: '-10px', + to: '10px', +}, [ + {at: -0.3, expect: '-16px'}, + {at: 0, expect: '-10px'}, + {at: 0.3, expect: '-4px'}, + {at: 0.6, expect: '2px'}, + {at: 1, expect: '10px'}, + {at: 1.5, expect: '20px'}, +]); + +test_interpolation({ + property: 'letter-spacing', + from: 'normal', + to: '10px', +}, [ + {at: -0.3, expect: '-3px'}, + {at: 0, expect: 'normal'}, + {at: 0.3, expect: '3px'}, + {at: 0.6, expect: '6px'}, + {at: 1, expect: '10px'}, + {at: 1.5, expect: '15px'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-interpolation.html b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-interpolation.html new file mode 100644 index 00000000000..2269fdfa5b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/animations/text-indent-interpolation.html @@ -0,0 +1,131 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#text-indent-property"> +<meta name="test" content="text-indent supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + text-indent: 70px; +} +.target { + font: 10px sans-serif; + text-indent: 10px; + margin-left: 20px; +} +.expected { + color: green; +} +</style> + +<body> + <template id="target-template">T</template> +</body> + +<script> +test_interpolation({ + property: 'text-indent', + from: neutralKeyframe, + to: '40px', +}, [ + {at: -0.3, expect: '1px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '19px'}, + {at: 0.6, expect: '28px'}, + {at: 1, expect: '40px'}, + {at: 1.5, expect: '55px'}, +]); + +test_interpolation({ + property: 'text-indent', + from: 'initial', + to: '20px', +}, [ + {at: -0.3, expect: '-6px'}, + {at: 0, expect: '0px'}, + {at: 0.3, expect: '6px'}, + {at: 0.6, expect: '12px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '30px'}, +]); + +test_interpolation({ + property: 'text-indent', + from: 'inherit', + to: '20px', +}, [ + {at: -0.3, expect: '85px'}, + {at: 0, expect: '70px'}, + {at: 0.3, expect: '55px'}, + {at: 0.6, expect: '40px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '-5px'}, +]); + +test_interpolation({ + property: 'text-indent', + from: 'unset', + to: '20px', +}, [ + {at: -0.3, expect: '85px'}, + {at: 0, expect: '70px'}, + {at: 0.3, expect: '55px'}, + {at: 0.6, expect: '40px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '-5px'}, +]); + +test_interpolation({ + property: 'text-indent', + from: '0px', + to: '50px' +}, [ + {at: -0.3, expect: '-15px'}, + {at: 0, expect: '0'}, + {at: 0.3, expect: '15px'}, + {at: 0.6, expect: '30px'}, + {at: 1, expect: '50px'}, + {at: 1.5, expect: '75px'}, +]); + +test_interpolation({ + property: 'text-indent', + from: '0px hanging', + to: '50px hanging', +}, [ + {at: -0.3, expect: '-15px hanging'}, + {at: 0, expect: '0 hanging'}, + {at: 0.3, expect: '15px hanging'}, + {at: 0.6, expect: '30px hanging'}, + {at: 1, expect: '50px hanging'}, + {at: 1.5, expect: '75px hanging'}, +]); + +test_interpolation({ + property: 'text-indent', + from: '0px hanging each-line', + to: '50px each-line hanging', +}, [ + {at: -0.3, expect: '-15px hanging each-line'}, + {at: 0, expect: '0 hanging each-line'}, + {at: 0.3, expect: '15px hanging each-line'}, + {at: 0.6, expect: '30px hanging each-line'}, + {at: 1, expect: '50px hanging each-line'}, + {at: 1.5, expect: '75px hanging each-line'}, +]); + +test_no_interpolation({ + property: 'text-indent', + from: '0px each-line', + to: '50px hanging', +}); + +test_no_interpolation({ + property: 'text-indent', + from: '0px', + to: '50px each-line hanging', +}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-interpolation.html b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-interpolation.html new file mode 100644 index 00000000000..ffd6bb476ad --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-text/animations/word-spacing-interpolation.html @@ -0,0 +1,104 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#word-spacing-property"> +<meta name="test" content="word-spacing supports animation by computed value type"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/interpolation-testcommon.js"></script> + +<style> +.parent { + word-spacing: 30px; +} +.target { + font: 10px sans-serif; + word-spacing: 10px; +} +.expected { + color: green; +} +</style> + +<body> + <template id="target-template">A B C D</template> +</body> + +<script> +test_interpolation({ + property: 'word-spacing', + from: neutralKeyframe, + to: '20px', +}, [ + {at: -0.3, expect: '7px'}, + {at: 0, expect: '10px'}, + {at: 0.3, expect: '13px'}, + {at: 0.6, expect: '16px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '25px'}, +]); + +test_interpolation({ + property: 'word-spacing', + from: 'initial', + to: '20px', +}, [ + {at: -0.3, expect: '-6px'}, + {at: 0, expect: '0px'}, + {at: 0.3, expect: '6px'}, + {at: 0.6, expect: '12px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '30px'}, +]); + +test_interpolation({ + property: 'word-spacing', + from: 'inherit', + to: '20px', +}, [ + {at: -0.3, expect: '33px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_interpolation({ + property: 'word-spacing', + from: 'unset', + to: '20px', +}, [ + {at: -0.3, expect: '33px'}, + {at: 0, expect: '30px'}, + {at: 0.3, expect: '27px'}, + {at: 0.6, expect: '24px'}, + {at: 1, expect: '20px'}, + {at: 1.5, expect: '15px'}, +]); + +test_interpolation({ + property: 'word-spacing', + from: '-10px', + to: '40px' +}, [ + {at: -0.3, expect: '-25px'}, + {at: 0, expect: '-10px'}, + {at: 0.3, expect: '5px'}, + {at: 0.6, expect: '20px'}, + {at: 1, expect: '40px'}, + {at: 1.5, expect: '65px'}, +]); +test_interpolation({ + property: 'word-spacing', + from: 'normal', + to: '10px' +}, [ + {at: -0.3, expect: '-3px'}, + {at: 0, expect: '0px'}, + {at: 0.3, expect: '3px'}, + {at: 0.6, expect: '6px'}, + {at: 1, expect: '10px'}, + {at: 1.5, expect: '15px'}, +]); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html index e6f10154cb6..18de33f8a7a 100644 --- a/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html +++ b/tests/wpt/web-platform-tests/css/css-transforms/parsing/transform-valid.html @@ -48,6 +48,12 @@ test_valid_value("transform", "skewY(0)", "skewY(0deg)"); test_valid_value("transform", "skewY(-90deg)"); test_valid_value("transform", "translate(1px, 2%) scale(3, 4) rotate(-90deg)"); + +// Regression test for crbug.com/995038 +test_valid_value("transform", "translateX(2e80px)", "translateX(3.40282e+38px)"); +test_valid_value("transform", "rotate(2e80deg)", "rotate(3.40282e+38deg)"); +test_valid_value("transform", "scaleX(2e80)", "scaleX(3.40282e+38)"); +test_valid_value("transform", "skewX(2e80deg)", "skewX(3.40282e+38deg)"); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-angle-serialize.html b/tests/wpt/web-platform-tests/css/css-values/minmax-angle-serialize.html new file mode 100644 index 00000000000..3f424589ba6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-angle-serialize.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#angles"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/parsing-testcommon.js"></script> +<script> +function test_valid_angle(value, expected) { + test_valid_value('transform', `rotate(${value})`, `rotate(${expected})`); +} + +test_valid_angle('min(1deg)', 'min(1deg)'); +test_valid_angle('min(1rad)', 'min(1rad)'); +test_valid_angle('min(1turn)', 'min(1turn)'); +test_valid_angle('min(1grad)', 'min(1grad)'); +test_valid_angle('max(1deg)', 'max(1deg)'); +test_valid_angle('max(1rad)', 'max(1rad)'); +test_valid_angle('max(1turn)', 'max(1turn)'); +test_valid_angle('max(1grad)', 'max(1grad)'); + +// TODO(crbug.com/978682): Complete this test suite + +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-integer-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-integer-computed.html new file mode 100644 index 00000000000..b3794acba9c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-integer-computed.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#integers"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-range"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/computed-testcommon.js"></script> +<div id="target"></div> +<div id="reference"></div> +<script> +const property = 'z-index'; + +function test_integer_equals(value, expected) { + const reference = document.getElementById('reference'); + reference.style[property] = ''; + reference.style[property] = expected; + const computed = getComputedStyle(reference)[property]; + test_computed_value(property, value, computed); +} + +// Identity tests +test_integer_equals('min(1)', '1'); +test_integer_equals('max(1)', '1'); + +// Rounding +test_integer_equals('min(0.4)', '0'); +test_integer_equals('min(0.6)', '1'); +test_integer_equals('max(0.4)', '0'); +test_integer_equals('max(0.6)', '1'); + +// Rounding and nesting +test_integer_equals('min(1.1, max(0.4, 0.6))', '1'); +test_integer_equals('max(0.3, min(1.1, 0.4))', '0'); + +// No rounding at intermediate steps +test_integer_equals('calc(min(0.3, 0.6) * 2)', '1'); +test_integer_equals('calc(max(0.3, 0.6) / 2)', '0'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-length-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-length-computed.html new file mode 100644 index 00000000000..41088449546 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-length-computed.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#lengths"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/computed-testcommon.js"></script> +<div id="container" style="font-size: 20px"> + <div id="target"></div> + <div id="reference"></div> +</div> +<script> +const property = 'letter-spacing'; + +function test_length_equals(value, expected) { + const reference = document.getElementById('reference'); + reference.style[property] = ''; + reference.style[property] = expected; + const computed = getComputedStyle(reference)[property]; + test_computed_value(property, value, computed); +} + +// Identity tests +test_length_equals('min(1px)', '1px'); +test_length_equals('min(1cm)', '1cm'); +test_length_equals('min(1mm)', '1mm'); +test_length_equals('min(1Q)', '1Q'); +test_length_equals('min(1in)', '1in'); +test_length_equals('min(1pc)', '1pc'); +test_length_equals('min(1pt)', '1pt'); +test_length_equals('min(1em)', '1em'); +test_length_equals('min(1ex)', '1ex'); +test_length_equals('min(1ch)', '1ch'); +test_length_equals('min(1rem)', '1rem'); +test_length_equals('min(1vh)', '1vh'); +test_length_equals('min(1vw)', '1vw'); +test_length_equals('min(1vmin)', '1vmin'); +test_length_equals('min(1vmax)', '1vmax'); +test_length_equals('max(1px)', '1px'); +test_length_equals('max(1cm)', '1cm'); +test_length_equals('max(1mm)', '1mm'); +test_length_equals('max(1Q)', '1Q'); +test_length_equals('max(1in)', '1in'); +test_length_equals('max(1pc)', '1pc'); +test_length_equals('max(1pt)', '1pt'); +test_length_equals('max(1em)', '1em'); +test_length_equals('max(1ex)', '1ex'); +test_length_equals('max(1ch)', '1ch'); +test_length_equals('max(1rem)', '1rem'); +test_length_equals('max(1vh)', '1vh'); +test_length_equals('max(1vw)', '1vw'); +test_length_equals('max(1vmin)', '1vmin'); +test_length_equals('max(1vmax)', '1vmax'); + +// Comparisons between same units +test_length_equals('min(1px, 2px)', '1px'); +test_length_equals('min(1cm, 2cm)', '1cm'); +test_length_equals('min(1mm, 2mm)', '1mm'); +test_length_equals('min(1Q, 2Q)', '1Q'); +test_length_equals('min(1in, 2in)', '1in'); +test_length_equals('min(1pc, 2pc)', '1pc'); +test_length_equals('min(1pt, 2pt)', '1pt'); +test_length_equals('min(1em, 2em)', '1em'); +test_length_equals('min(1ex, 2ex)', '1ex'); +test_length_equals('min(1ch, 2ch)', '1ch'); +test_length_equals('min(1rem, 2rem)', '1rem'); +test_length_equals('min(1vh, 2vh)', '1vh'); +test_length_equals('min(1vw, 2vw)', '1vw'); +test_length_equals('min(1vmin, 2vmin)', '1vmin'); +test_length_equals('min(1vmax, 2vmax)', '1vmax'); +test_length_equals('max(1px, 2px)', '2px'); +test_length_equals('max(1cm, 2cm)', '2cm'); +test_length_equals('max(1mm, 2mm)', '2mm'); +test_length_equals('max(1Q, 2Q)', '2Q'); +test_length_equals('max(1in, 2in)', '2in'); +test_length_equals('max(1pc, 2pc)', '2pc'); +test_length_equals('max(1pt, 2pt)', '2pt'); +test_length_equals('max(1em, 2em)', '2em'); +test_length_equals('max(1ex, 2ex)', '2ex'); +test_length_equals('max(1ch, 2ch)', '2ch'); +test_length_equals('max(1rem, 2rem)', '2rem'); +test_length_equals('max(1vh, 2vh)', '2vh'); +test_length_equals('max(1vw, 2vw)', '2vw'); +test_length_equals('max(1vmin, 2vmin)', '2vmin'); +test_length_equals('max(1vmax, 2vmax)', '2vmax'); + +// Comparisons between different absolute units +test_length_equals('min(95px, 1in)', '95px'); +test_length_equals('max(95px, 1in)', '1in'); + +// Comparisons between absolute and relative units +test_length_equals('min(15px, 1em)', '15px'); +test_length_equals('min(25px, 1em)', '20px'); +test_length_equals('max(15px, 1em)', '20px'); +test_length_equals('max(25px, 1em)', '25px'); + +document.getElementById('container').style.fontSize = '10px'; +test_length_equals('min(15px, 1em)', '10px'); +test_length_equals('max(15px, 2em)', '20px'); + +document.getElementById('container').style.fontSize = '20px'; + +// Nestings +test_length_equals('min(25px, max(15px, 1em))', '20px'); +test_length_equals('max(15px, min(25px, 1em))', '20px'); + +// General calculations +test_length_equals('calc(min(1em, 21px) + 10px)', '30px'); +test_length_equals('calc(min(1em, 21px) - 10px)', '10px'); +test_length_equals('calc(min(1em, 21px) * 2', '40px'); +test_length_equals('calc(min(1em, 21px) / 2', '10px'); +test_length_equals('calc(max(1em, 19px) + 10px)', '30px'); +test_length_equals('calc(max(1em, 19px) - 10px)', '10px'); +test_length_equals('calc(max(1em, 19px) * 2', '40px'); +test_length_equals('calc(max(1em, 19px) / 2', '10px'); +test_length_equals('calc(min(1em, 21px) + max(0.9em, 20px))', '40px'); +test_length_equals('calc(min(1em, 21px) - max(0.9em, 20px))', '0px'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-length-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-length-invalid.html new file mode 100644 index 00000000000..1405c319812 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-length-invalid.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#lengths"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/parsing-testcommon.js"></script> +<script> +function test_invalid_length(value) { + // 'letter-spacing' accepts <length> only, not <percentage> or any mixes. + test_invalid_value('letter-spacing', value); +} + +// Syntax checking +test_invalid_length('min()'); +test_invalid_length('min( )'); +test_invalid_length('min(,)'); +test_invalid_length('min(1py)'); +test_invalid_length('min(1px, )'); +test_invalid_length('min(, 1px)'); +test_invalid_length('min(1px + )'); +test_invalid_length('min(1px - )'); +test_invalid_length('min(1px * )'); +test_invalid_length('min(1px / )'); +test_invalid_length('min(1px 2px)'); +test_invalid_length('min(1px, , 2px)'); +test_invalid_length('max()'); +test_invalid_length('max( )'); +test_invalid_length('max(,)'); +test_invalid_length('max(1py)'); +test_invalid_length('max(1px, )'); +test_invalid_length('max(, 1px)'); +test_invalid_length('max(1px + )'); +test_invalid_length('max(1px - )'); +test_invalid_length('max(1px * )'); +test_invalid_length('max(1px / )'); +test_invalid_length('max(1px 2px)'); +test_invalid_length('max(1px, , 2px)'); + +// Type checking +test_invalid_length('min(0)'); +test_invalid_length('min(0%)'); +test_invalid_length('min(0s)'); +test_invalid_length('min(0Hz)'); +test_invalid_length('min(0dpi)'); +test_invalid_length('min(0fr)'); +test_invalid_length('min(1px, 0)'); +test_invalid_length('min(1px, 0%)'); +test_invalid_length('min(1px, 0s)'); +test_invalid_length('min(1px, 0Hz)'); +test_invalid_length('min(1px, 0dpi)'); +test_invalid_length('min(1px, 0fr)'); +test_invalid_length('max(0)'); +test_invalid_length('max(0%)'); +test_invalid_length('max(0s)'); +test_invalid_length('max(0Hz)'); +test_invalid_length('max(0dpi)'); +test_invalid_length('max(0fr)'); +test_invalid_length('max(1px, 0)'); +test_invalid_length('max(1px, 0%)'); +test_invalid_length('max(1px, 0s)'); +test_invalid_length('max(1px, 0Hz)'); +test_invalid_length('max(1px, 0dpi)'); +test_invalid_length('max(1px, 0fr)'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-number-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-number-computed.html new file mode 100644 index 00000000000..c72c2766254 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-number-computed.html @@ -0,0 +1,41 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#numbers"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/computed-testcommon.js"></script> +<div id="target"></div> +<div id="reference"></div> +<script> +const property = 'opacity'; + +function test_number_equals(value, expected) { + const reference = document.getElementById('reference'); + reference.style[property] = ''; + reference.style[property] = expected; + const computed = getComputedStyle(reference)[property]; + test_computed_value(property, value, computed); +} + +// Identity tests +test_number_equals('min(1)', '1'); +test_number_equals('max(1)', '1'); + +// Nestings +test_number_equals('min(0.2, max(0.1, 0.15))', '0.15'); +test_number_equals('max(0.1, min(0.2, 0.15))', '0.15'); + +// General calculations +test_number_equals('calc(min(0.1, 0.2) + 0.05)', '0.15'); +test_number_equals('calc(min(0.1, 0.2) - 0.05)', '0.05'); +test_number_equals('calc(min(0.1, 0.2) * 2)', '0.2'); +test_number_equals('calc(min(0.1, 0.2) / 2)', '0.05'); +test_number_equals('calc(max(0.1, 0.2) + 0.05)', '0.25'); +test_number_equals('calc(max(0.1, 0.2) - 0.05)', '0.15'); +test_number_equals('calc(max(0.1, 0.2) * 2)', '0.4'); +test_number_equals('calc(max(0.1, 0.2) / 2)', '0.1'); +test_number_equals('calc(min(0.1, 0.2) + max(0.1, 0.05))', '0.2'); +test_number_equals('calc(min(0.1, 0.2) - max(0.1, 0.05))', '0'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-number-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-number-invalid.html new file mode 100644 index 00000000000..3f34fde2f23 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-number-invalid.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#numbers"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/parsing-testcommon.js"></script> +<script> +function test_invalid_number(value) { + test_invalid_value('opacity', value); +} + +// Syntax checking +test_invalid_number('min()'); +test_invalid_number('min( )'); +test_invalid_number('min(,)'); +test_invalid_number('min(1, )'); +test_invalid_number('min(, 1)'); +test_invalid_number('min(1 + )'); +test_invalid_number('min(1 - )'); +test_invalid_number('min(1 * )'); +test_invalid_number('min(1 / )'); +test_invalid_number('min(1 2)'); +test_invalid_number('min(1, , 2)'); +test_invalid_number('max()'); +test_invalid_number('max( )'); +test_invalid_number('max(,)'); +test_invalid_number('max(1, )'); +test_invalid_number('max(, 1)'); +test_invalid_number('max(1 + )'); +test_invalid_number('max(1 - )'); +test_invalid_number('max(1 * )'); +test_invalid_number('max(1 / )'); +test_invalid_number('max(1 2)'); +test_invalid_number('max(1, , 2)'); + +// Type checking +test_invalid_number('min(0px)'); +test_invalid_number('min(0s)'); +test_invalid_number('min(0deg)'); +test_invalid_number('min(0Hz)'); +test_invalid_number('min(0dpi)'); +test_invalid_number('min(0fr)'); +test_invalid_number('min(1, 1%)'); +test_invalid_number('min(1, 0px)'); +test_invalid_number('min(1, 0s)'); +test_invalid_number('min(1, 0deg)'); +test_invalid_number('min(1, 0Hz)'); +test_invalid_number('min(1, 0dpi)'); +test_invalid_number('min(1, 0fr)'); +test_invalid_number('max(0px)'); +test_invalid_number('max(0s)'); +test_invalid_number('max(0deg)'); +test_invalid_number('max(0Hz)'); +test_invalid_number('max(0dpi)'); +test_invalid_number('max(0fr)'); +test_invalid_number('max(1, 1%)'); +test_invalid_number('max(1, 0px)'); +test_invalid_number('max(1, 0s)'); +test_invalid_number('max(1, 0deg)'); +test_invalid_number('max(1, 0Hz)'); +test_invalid_number('max(1, 0dpi)'); +test_invalid_number('max(1, 0fr)'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-computed.html new file mode 100644 index 00000000000..9f9d0a59d12 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-computed.html @@ -0,0 +1,43 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#percentages"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/computed-testcommon.js"></script> +<div id="container" style="width: 400px"> + <div id="target"></div> + <div id="reference"></div> +</div> +<script> +const property = 'margin-left'; + +function test_percentage_equals(value, expected) { + const reference = document.getElementById('reference'); + reference.style[property] = ''; + reference.style[property] = expected; + const computed = getComputedStyle(reference)[property]; + test_computed_value(property, value, computed); +} + +// Identity tests +test_percentage_equals('min(1%)', '1%'); +test_percentage_equals('max(1%)', '1%'); + +// Nestings +test_percentage_equals('min(20%, max(10%, 15%))', '15%'); +test_percentage_equals('max(10%, min(20%, 15%))', '15%'); + +// General calculations +test_percentage_equals('calc(min(10%, 20%) + 5%)', '15%'); +test_percentage_equals('calc(min(10%, 20%) - 5%)', '5%'); +test_percentage_equals('calc(min(10%, 20%) * 2)', '20%'); +test_percentage_equals('calc(min(10%, 20%) / 2)', '5%'); +test_percentage_equals('calc(max(10%, 20%) + 5%)', '25%'); +test_percentage_equals('calc(max(10%, 20%) - 5%)', '15%'); +test_percentage_equals('calc(max(10%, 20%) * 2)', '40%'); +test_percentage_equals('calc(max(10%, 20%) / 2)', '10%'); +test_percentage_equals('calc(min(10%, 20%) + max(10%, 5%))', '20%'); +test_percentage_equals('calc(min(10%, 20%) - max(10%, 5%))', '0%'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-invalid.html new file mode 100644 index 00000000000..48d2cdabec1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-percentage-invalid.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#percentages"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/parsing-testcommon.js"></script> +<script> +function test_invalid_percentage(value) { + test_invalid_value('margin-left', value); +} + +// Syntax checking +test_invalid_percentage('min()'); +test_invalid_percentage('min( )'); +test_invalid_percentage('min(,)'); +test_invalid_percentage('min(1#)'); +test_invalid_percentage('min(%1)'); +test_invalid_percentage('min(1%, )'); +test_invalid_percentage('min(, 1%)'); +test_invalid_percentage('min(1% + )'); +test_invalid_percentage('min(1% - )'); +test_invalid_percentage('min(1% * )'); +test_invalid_percentage('min(1% / )'); +test_invalid_percentage('min(1% 2%)'); +test_invalid_percentage('min(1%, , 2%)'); +test_invalid_percentage('max()'); +test_invalid_percentage('max( )'); +test_invalid_percentage('max(,)'); +test_invalid_percentage('max(1#)'); +test_invalid_percentage('max(%1)'); +test_invalid_percentage('max(1%, )'); +test_invalid_percentage('max(, 1%)'); +test_invalid_percentage('max(1% + )'); +test_invalid_percentage('max(1% - )'); +test_invalid_percentage('max(1% * )'); +test_invalid_percentage('max(1% / )'); +test_invalid_percentage('max(1% 2%)'); +test_invalid_percentage('max(1%, , 2%)'); + +// Type checking +test_invalid_percentage('min(0s)'); +test_invalid_percentage('min(0deg)'); +test_invalid_percentage('min(0Hz)'); +test_invalid_percentage('min(0dpi)'); +test_invalid_percentage('min(0fr)'); +test_invalid_percentage('min(1%, 0)'); +test_invalid_percentage('min(1%, 0s)'); +test_invalid_percentage('min(1%, 0deg)'); +test_invalid_percentage('min(1%, 0Hz)'); +test_invalid_percentage('min(1%, 0dpi)'); +test_invalid_percentage('min(1%, 0fr)'); +test_invalid_percentage('max(0s)'); +test_invalid_percentage('max(0deg)'); +test_invalid_percentage('max(0Hz)'); +test_invalid_percentage('max(0dpi)'); +test_invalid_percentage('max(0fr)'); +test_invalid_percentage('max(1%, 0)'); +test_invalid_percentage('max(1%, 0s)'); +test_invalid_percentage('max(1%, 0deg)'); +test_invalid_percentage('max(1%, 0Hz)'); +test_invalid_percentage('max(1%, 0dpi)'); +test_invalid_percentage('max(1%, 0fr)'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-time-computed.html b/tests/wpt/web-platform-tests/css/css-values/minmax-time-computed.html new file mode 100644 index 00000000000..36bcf601eb8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-time-computed.html @@ -0,0 +1,53 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#time"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/computed-testcommon.js"></script> +<div id="target"></div> +<div id="reference"></div> +<script> +const property = 'transition-delay'; + +function test_time_equals(value, expected) { + const reference = document.getElementById('reference'); + reference.style[property] = ''; + reference.style[property] = expected; + const computed = getComputedStyle(reference)[property]; + test_computed_value(property, value, computed); +} + +// Identity tests +test_time_equals('min(1s)', '1s'); +test_time_equals('min(1ms)', '1ms'); +test_time_equals('max(1s)', '1s'); +test_time_equals('max(1ms)', '1ms'); + +// Comparisons between same units +test_time_equals('min(1s, 2s)', '1s'); +test_time_equals('min(1ms, 2ms)', '1ms'); +test_time_equals('max(1s, 2s)', '2s'); +test_time_equals('max(1ms, 2ms)', '2ms'); + +// Comparisons between different units +test_time_equals('min(1s, 1100ms)', '1s'); +test_time_equals('max(0.9s, 1000ms)', '1000ms'); + +// Nestings +test_time_equals('min(2s, max(1s, 1500ms))', '1500ms'); +test_time_equals('max(1000ms, min(2000ms, 1.5s))', '1.5s'); + +// General calculations +test_time_equals('calc(min(0.5s, 600ms) + 500ms)', '1s'); +test_time_equals('calc(min(0.5s, 600ms) - 500ms)', '0s'); +test_time_equals('calc(min(0.5s, 600ms) * 2)', '1s'); +test_time_equals('calc(min(0.5s, 600ms) / 2)', '0.25s'); +test_time_equals('calc(max(0.5s, 400ms) + 500ms)', '1s'); +test_time_equals('calc(max(0.5s, 400ms) - 500ms)', '0s'); +test_time_equals('calc(max(0.5s, 400ms) * 2)', '1s'); +test_time_equals('calc(max(0.5s, 400ms) / 2)', '0.25s'); +test_time_equals('calc(min(0.5s, 600ms) + max(500ms, 0.4s))', '1s'); +test_time_equals('calc(min(0.5s, 600ms) - max(500ms, 0.4s))', '0s'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-values/minmax-time-invalid.html b/tests/wpt/web-platform-tests/css/css-values/minmax-time-invalid.html new file mode 100644 index 00000000000..bebe674cd79 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-values/minmax-time-invalid.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#comp-func"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#time"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#calc-type-checking"> +<link rel="author" title="Xiaocheng Hu" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../support/parsing-testcommon.js"></script> +<script> +function test_invalid_time(value) { + test_invalid_value('transition-delay', value); +} + +// Syntax checking +test_invalid_time('min()'); +test_invalid_time('min( )'); +test_invalid_time('min(,)'); +test_invalid_time('min(1mt)'); +test_invalid_time('min(1s, )'); +test_invalid_time('min(, 1s)'); +test_invalid_time('min(1s + )'); +test_invalid_time('min(1s - )'); +test_invalid_time('min(1s * )'); +test_invalid_time('min(1s / )'); +test_invalid_time('min(1s 2s)'); +test_invalid_time('min(1s, , 2s)'); +test_invalid_time('max()'); +test_invalid_time('max( )'); +test_invalid_time('max(,)'); +test_invalid_time('max(1dag)'); +test_invalid_time('max(1s, )'); +test_invalid_time('max(, 1s)'); +test_invalid_time('max(1s + )'); +test_invalid_time('max(1s - )'); +test_invalid_time('max(1s * )'); +test_invalid_time('max(1s / )'); +test_invalid_time('max(1s 2s)'); +test_invalid_time('max(1s, , 2s)'); + +// Type checking +test_invalid_time('min(0)'); +test_invalid_time('min(0%)'); +test_invalid_time('min(0px)'); +test_invalid_time('min(0deg)'); +test_invalid_time('min(0Hz)'); +test_invalid_time('min(0dpi)'); +test_invalid_time('min(0fr)'); +test_invalid_time('min(1s, 0)'); +test_invalid_time('min(1s, 0%)'); +test_invalid_time('min(1s, 0px)'); +test_invalid_time('min(1s, 0deg)'); +test_invalid_time('min(1s, 0Hz)'); +test_invalid_time('min(1s, 0dpi)'); +test_invalid_time('min(1s, 0fr)'); +test_invalid_time('max(0)'); +test_invalid_time('max(0%)'); +test_invalid_time('max(0px)'); +test_invalid_time('max(0deg)'); +test_invalid_time('max(0Hz)'); +test_invalid_time('max(0dpi)'); +test_invalid_time('max(0fr)'); +test_invalid_time('max(1s, 0)'); +test_invalid_time('max(1s, 0%)'); +test_invalid_time('max(1s, 0px)'); +test_invalid_time('max(1s, 0deg)'); +test_invalid_time('max(1s, 0Hz)'); +test_invalid_time('max(1s, 0dpi)'); +test_invalid_time('max(1s, 0fr)'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht b/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht index 2af581d865c..0100a9098f5 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/abs-pos-non-replaced-vlr-213.xht @@ -12,7 +12,7 @@ <link rel="match" href="abs-pos-non-replaced-vrl-004-ref.xht" /> <meta name="flags" content="ahem image" /> - <meta name="assert" content="When 'direction' is 'rtl' and 'width' is 'auto' and 'left' and 'right' are not 'auto' and 'writing-mode' is 'vertical-lr', then solve for 'left'." /> + <meta name="assert" content="When 'direction' is 'rtl' and 'left' is 'auto' and 'right' and 'width' are not 'auto' and 'writing-mode' is 'vertical-lr', then solve for 'left'." /> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style type="text/css"><![CDATA[ diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html index 84252946946..d59cde45f6e 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-001-ref.html @@ -10,6 +10,7 @@ body > div { writing-mode: vertical-rl; background: green; border-top: 1ch solid white; + height: 1ch; } </style> diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html index 6fdbf9a2e34..ddebe938189 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/reference/available-size-002-ref.html @@ -9,6 +9,7 @@ body > div { color: transparent; writing-mode: vertical-rl; background: green; + height: 1ch; } </style> diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html index a3878d148b2..a6ce755f712 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-001-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-lr, input type=text</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-lr will display an input field for text vertically, and with vertical text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html index 751057dc77c..9f331a0ec87 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-002-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-lr, input type=text placeholder</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-lr will display an input field for text vertically, and with vertical placeholder text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html index bf3d839ec40..624cd242cb5 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-003-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-lr, textarea</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-lr will display a textarea field vertically, and with vertical text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html index 91f991f5285..ce11f1fcb62 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-004-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-lr, textarea placeholder</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-lr will display a textarea field vertically, and with vertical placeholder text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html index 361f9dbec22..c2bf8bb00b4 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vlr-forms-005-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-lr, select, selected item</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-lr will display a select box vertically, and the selected item will be displayed vertically."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html index 20dea4fbc36..6963541d38e 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-001-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-rl, input type=text</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-rl will display an input field for text vertically, and with vertical text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html index 5d7db3e2a38..f7c1b0f69a6 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-002-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-rl, input type=text placeholder</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-rl will display an input field for text vertically, and with vertical placeholder text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html index 3dfe1d61bf5..6e960b876f8 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-003-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-rl, textarea</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-rl will display a textarea field vertically, and with vertical text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html index 074603d5811..bebdf9ca160 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-004-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-rl, textarea placeholder</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-rl will display a textarea field vertically, and with vertical placeholder text inside."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html index 2ce63cd5664..dfad4e00f8b 100644 --- a/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html +++ b/tests/wpt/web-platform-tests/css/css-writing-modes/writing-mode-vrl-forms-005-manual.html @@ -5,6 +5,7 @@ <title>writing mode:vertical-rl, select, selected item</title> <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"/> <link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#block-flow"/> +<meta name="flags" content="should"/> <meta name="assert" content="writing-mode:vertical-rl will display a select box vertically, and the selected item will be displayed vertically."/> <style type="text/css"> @font-face { diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html index 576c6b92630..d539a36c5a4 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/backdrop-filter-interpolation-001.html @@ -9,8 +9,23 @@ <script src="/resources/testharnessreport.js"></script> <script src="/css/support/interpolation-testcommon.js"></script> <style> - body { - color: blue; + .parent { + backdrop-filter: hue-rotate(30deg); + } + .target { + display: inline-block; + width: 50px; + height: 50px; + background-color: green; + color: white; + margin-right: 2px; + backdrop-filter: hue-rotate(10deg); + } + .expected { + margin-right: 20px; + } + .test { + padding-bottom: 10px; } </style> </head> @@ -44,6 +59,114 @@ {at: 1, expect: 'hue-rotate(90deg) blur(10mm)'}, {at: 1.5, expect: 'hue-rotate(95deg) blur(12mm)'} ]); + + test_interpolation({ + property: 'backdrop-filter', + from: neutralKeyframe, + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(5deg)'}, + {at: 0, expect: 'hue-rotate(10deg)'}, + {at: 0.3, expect: 'hue-rotate(13deg)'}, + {at: 0.6, expect: 'hue-rotate(16deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(25deg)'}, + ]); + + test_interpolation({ + property: 'backdrop-filter', + from: 'initial', + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(-10deg)'}, + {at: 0, expect: 'hue-rotate(0deg)'}, + {at: 0.3, expect: 'hue-rotate(6deg)'}, + {at: 0.6, expect: 'hue-rotate(12deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(30deg)'}, + ]); + + test_interpolation({ + property: 'backdrop-filter', + from: 'inherit', + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(35deg)'}, + {at: 0, expect: 'hue-rotate(30deg)'}, + {at: 0.3, expect: 'hue-rotate(27deg)'}, + {at: 0.6, expect: 'hue-rotate(24deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(15deg)'}, + ]); + + test_interpolation({ + property: 'backdrop-filter', + from: 'unset', + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(-10deg)'}, + {at: 0, expect: 'hue-rotate(0deg)'}, + {at: 0.3, expect: 'hue-rotate(6deg)'}, + {at: 0.6, expect: 'hue-rotate(12deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(30deg)'}, + ]); + + test_interpolation({ + property: 'backdrop-filter', + from: 'none', + to: 'hue-rotate(180deg)' + }, [ + {at: -0.5, expect: 'hue-rotate(-90deg)'}, + {at: 0, expect: 'hue-rotate(0deg)'}, + {at: 0.25, expect: 'hue-rotate(45deg)'}, + {at: 0.5, expect: 'hue-rotate(90deg)'}, + {at: 1, expect: 'hue-rotate(180deg)'}, + {at: 1.5, expect: 'hue-rotate(270deg)'}, + ]); + + test_interpolation({ + property: 'backdrop-filter', + from: 'hue-rotate(180deg)', + to: 'none' + }, [ + {at: -0.5, expect: 'hue-rotate(270deg)'}, + {at: 0, expect: 'hue-rotate(180deg)'}, + {at: 0.25, expect: 'hue-rotate(135deg)'}, + {at: 0.5, expect: 'hue-rotate(90deg)'}, + {at: 1, expect: 'hue-rotate(0deg)'}, + {at: 1.5, expect: 'hue-rotate(-90deg)'}, + ]); + + test_interpolation({ + property: 'backdrop-filter', + from: 'drop-shadow(0px 0px 0px currentcolor)', + to: 'drop-shadow(20px 10px green)' + }, [ + {at: -1, expect: 'drop-shadow(-20px -10px white)'}, + {at: 0, expect: 'drop-shadow(0px 0px 0px currentcolor)'}, + {at: 0.5, expect: 'drop-shadow(10px 5px #80C080)'}, + {at: 1, expect: 'drop-shadow(20px 10px green)'}, + {at: 1.5, expect: 'drop-shadow(30px 15px #004100)'} + ]); + + test_no_interpolation({ + property: 'backdrop-filter', + from: 'url("#svgfilter")', + to: 'blur(5px)', + }); + + test_interpolation({ + property: 'backdrop-filter', + from: 'initial', // lacuna is 0 + to: 'sepia(1)' + }, [ + {at: -1, expect: 'sepia(0)'}, // Negative values are not allowed. + {at: 0, expect: 'sepia(0)'}, + {at: 0.5, expect: 'sepia(0.5)'}, + {at: 1, expect: 'sepia(1)'}, + {at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1. + ]); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html index b4a4b3f4bba..62fcbf0a5de 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-001.html @@ -9,8 +9,23 @@ <script src="/resources/testharnessreport.js"></script> <script src="/css/support/interpolation-testcommon.js"></script> <style> - body { - color: blue; + .parent { + filter: hue-rotate(30deg); + } + .target { + display: inline-block; + width: 50px; + height: 50px; + background-color: green; + color: white; + margin-right: 2px; + filter: hue-rotate(10deg); + } + .expected { + margin-right: 20px; + } + .test { + padding-bottom: 10px; } </style> </head> @@ -44,6 +59,58 @@ {at: 1, expect: 'hue-rotate(90deg) blur(10mm)'}, {at: 1.5, expect: 'hue-rotate(95deg) blur(12mm)'} ]); + + test_interpolation({ + property: 'filter', + from: neutralKeyframe, + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(5deg)'}, + {at: 0, expect: 'hue-rotate(10deg)'}, + {at: 0.3, expect: 'hue-rotate(13deg)'}, + {at: 0.6, expect: 'hue-rotate(16deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(25deg)'}, + ]); + + test_interpolation({ + property: 'filter', + from: 'initial', + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(-10deg)'}, + {at: 0, expect: 'hue-rotate(0deg)'}, + {at: 0.3, expect: 'hue-rotate(6deg)'}, + {at: 0.6, expect: 'hue-rotate(12deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(30deg)'}, + ]); + + test_interpolation({ + property: 'filter', + from: 'inherit', + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(35deg)'}, + {at: 0, expect: 'hue-rotate(30deg)'}, + {at: 0.3, expect: 'hue-rotate(27deg)'}, + {at: 0.6, expect: 'hue-rotate(24deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(15deg)'}, + ]); + + test_interpolation({ + property: 'filter', + from: 'unset', + to: 'hue-rotate(20deg)', + }, [ + {at: -0.5, expect: 'hue-rotate(-10deg)'}, + {at: 0, expect: 'hue-rotate(0deg)'}, + {at: 0.3, expect: 'hue-rotate(6deg)'}, + {at: 0.6, expect: 'hue-rotate(12deg)'}, + {at: 1, expect: 'hue-rotate(20deg)'}, + {at: 1.5, expect: 'hue-rotate(30deg)'}, + ]); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html index 1b66c2751d4..6ef25a7dafe 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-002.html @@ -9,8 +9,19 @@ <script src="/resources/testharnessreport.js"></script> <script src="/css/support/interpolation-testcommon.js"></script> <style> - body { - color: blue; + .target { + display: inline-block; + width: 50px; + height: 50px; + background-color: green; + color: white; + margin-right: 2px; + } + .expected { + margin-right: 20px; + } + .test { + padding-bottom: 10px; } </style> </head> @@ -24,6 +35,7 @@ to: 'opacity(0.5) hue-rotate(180deg)', }, [ {at: -0.5, expect: 'opacity(1) hue-rotate(-90deg)'}, + {at: 0, expect: 'opacity(1) hue-rotate(0deg)'}, {at: 0.25, expect: 'opacity(0.875) hue-rotate(45deg)'}, {at: 0.5, expect: 'opacity(0.75) hue-rotate(90deg)'}, {at: 1, expect: 'opacity(0.5) hue-rotate(180deg)'}, @@ -36,12 +48,60 @@ to: 'blur(10px) hue-rotate(180deg)' }, [ {at: -0.5, expect: 'blur(4px) hue-rotate(-90deg)'}, + {at: 0, expect: 'blur(6px) hue-rotate(0deg)'}, {at: 0.25, expect: 'blur(7px) hue-rotate(45deg)'}, {at: 0.5, expect: 'blur(8px) hue-rotate(90deg)'}, {at: 1, expect: 'blur(10px) hue-rotate(180deg)'}, {at: 1.5, expect: 'blur(12px) hue-rotate(270deg)'}, ]); + test_interpolation({ + property: 'filter', + from: 'none', + to: 'hue-rotate(180deg)' + }, [ + {at: -0.5, expect: 'hue-rotate(-90deg)'}, + {at: 0, expect: 'hue-rotate(0deg)'}, + {at: 0.25, expect: 'hue-rotate(45deg)'}, + {at: 0.5, expect: 'hue-rotate(90deg)'}, + {at: 1, expect: 'hue-rotate(180deg)'}, + {at: 1.5, expect: 'hue-rotate(270deg)'}, + ]); + + test_interpolation({ + property: 'filter', + from: 'hue-rotate(180deg)', + to: 'none' + }, [ + {at: -0.5, expect: 'hue-rotate(270deg)'}, + {at: 0, expect: 'hue-rotate(180deg)'}, + {at: 0.25, expect: 'hue-rotate(135deg)'}, + {at: 0.5, expect: 'hue-rotate(90deg)'}, + {at: 1, expect: 'hue-rotate(0deg)'}, + {at: 1.5, expect: 'hue-rotate(-90deg)'}, + ]); + + test_interpolation({ + property: 'filter', + from: 'drop-shadow(0px 0px 0px currentcolor)', + to: 'drop-shadow(20px 10px green)' + }, [ + {at: -1, expect: 'drop-shadow(-20px -10px white)'}, + {at: 0, expect: 'drop-shadow(0px 0px 0px currentcolor)'}, + {at: 0.5, expect: 'drop-shadow(10px 5px #80C080)'}, + {at: 1, expect: 'drop-shadow(20px 10px green)'}, + {at: 1.5, expect: 'drop-shadow(30px 15px #004100)'} + ]); + + // crbug.com/904333: Test that ResolveInterpolableColor doesn't overflow. + test_interpolation({ + property: 'filter', + from: 'drop-shadow(20px 10px blue)', + to: 'drop-shadow(20px 10px green)' + }, [ + {at: 2147483648, expect: 'drop-shadow(20px 10px #00FF00'} + ]); + // Mismatched lists: test_no_interpolation({ property: 'filter', diff --git a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html index 5ca1229e297..1d512487de9 100644 --- a/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html +++ b/tests/wpt/web-platform-tests/css/filter-effects/animation/filter-interpolation-003.html @@ -9,8 +9,20 @@ <script src="/resources/testharnessreport.js"></script> <script src="/css/support/interpolation-testcommon.js"></script> <style> - body { - color: blue; + .target { + display: inline-block; + width: 50px; + height: 50px; + background-color: green; + color: white; + margin-right: 2px; + filter: hue-rotate(10deg); + } + .expected { + margin-right: 20px; + } + .test { + padding-bottom: 10px; } </style> </head> @@ -24,6 +36,7 @@ to: 'blur(10px)' }, [ {at: -1, expect: 'blur(0px)'}, // Negative values are not allowed. + {at: 0, expect: 'blur(0px)'}, {at: 0.5, expect: 'blur(5px)'}, {at: 1, expect: 'blur(10px)'}, {at: 1.5, expect: 'blur(15px)'} @@ -37,6 +50,7 @@ {at: -1, expect: 'brightness(0)'}, // Negative values are not allowed. {at: 0, expect: 'brightness(0)'}, {at: 0.5, expect: 'brightness(0.5)'}, + {at: 1, expect: 'brightness(1)'}, {at: 1.5, expect: 'brightness(1.5)'} ]); @@ -48,6 +62,7 @@ {at: -1, expect: 'contrast(0)'}, // Negative values are not allowed. {at: 0, expect: 'contrast(0)'}, {at: 0.5, expect: 'contrast(0.5)'}, + {at: 1, expect: 'contrast(1)'}, {at: 1.5, expect: 'contrast(1.5)'} ]); @@ -57,6 +72,7 @@ to: 'drop-shadow(20px 10px green)' }, [ {at: -1, expect: 'drop-shadow(-20px -10px transparent)'}, + {at: 0, expect: 'drop-shadow(0px 0px 0px transparent)'}, {at: 0.5, expect: 'drop-shadow(10px 5px rgba(0, 128, 0, 0.5))'}, {at: 1, expect: 'drop-shadow(20px 10px green)'}, {at: 1.5, expect: 'drop-shadow(30px 15px #00C000)'} @@ -68,6 +84,7 @@ to: 'grayscale(1)' }, [ {at: -1, expect: 'grayscale(0)'}, // Negative values are not allowed. + {at: 0, expect: 'grayscale(0)'}, {at: 0.5, expect: 'grayscale(0.5)'}, {at: 1, expect: 'grayscale(1)'}, {at: 1.5, expect: 'grayscale(1)'} // Should clamp values to 1. @@ -79,6 +96,7 @@ to: 'hue-rotate(360deg)' }, [ {at: -1, expect: 'hue-rotate(-360deg)'}, + {at: 0, expect: 'hue-rotate(0deg)'}, {at: 0.5, expect: 'hue-rotate(180deg)'}, {at: 1, expect: 'hue-rotate(360deg)'}, {at: 1.5, expect: 'hue-rotate(540deg)'} @@ -90,6 +108,7 @@ to: 'invert(1)' }, [ {at: -1, expect: 'invert(0)'}, // Negative values are not allowed. + {at: 0, expect: 'invert(0)'}, {at: 0.5, expect: 'invert(0.5)'}, {at: 1, expect: 'invert(1)'}, {at: 1.5, expect: 'invert(1)'} // Should clamp values to 1. @@ -103,6 +122,7 @@ {at: -1, expect: 'opacity(0)'}, // Negative values are not allowed. {at: 0, expect: 'opacity(0)'}, {at: 0.5, expect: 'opacity(0.5)'}, + {at: 1, expect: 'opacity(1)'}, {at: 1.5, expect: 'opacity(1)'} // Should clamp values to 1. ]); @@ -114,6 +134,7 @@ {at: -1, expect: 'saturate(0)'}, // Negative values are not allowed. {at: 0, expect: 'saturate(0)'}, {at: 0.5, expect: 'saturate(0.5)'}, + {at: 1, expect: 'saturate(1)'}, {at: 1.5, expect: 'saturate(1.5)'} ]); @@ -123,6 +144,7 @@ to: 'sepia(1)' }, [ {at: -1, expect: 'sepia(0)'}, // Negative values are not allowed. + {at: 0, expect: 'sepia(0)'}, {at: 0.5, expect: 'sepia(0.5)'}, {at: 1, expect: 'sepia(1)'}, {at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1. @@ -133,6 +155,24 @@ from: 'url("#svgfilter")', to: 'none', // lacuna is not defined }); + + test_no_interpolation({ + property: 'filter', + from: 'url("#svgfilter")', + to: 'blur(5px)', + }); + + test_interpolation({ + property: 'filter', + from: 'initial', // lacuna is 0 + to: 'sepia(1)' + }, [ + {at: -1, expect: 'sepia(0)'}, // Negative values are not allowed. + {at: 0, expect: 'sepia(0)'}, // Equivalent to sepia(0) + {at: 0.5, expect: 'sepia(0.5)'}, + {at: 1, expect: 'sepia(1)'}, + {at: 1.5, expect: 'sepia(1)'} // Should clamp values to 1. + ]); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml b/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml index baf6bddef63..3b882debcc7 100644 --- a/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-empty-001.xml @@ -35,7 +35,7 @@ <test1><test1> </test1></test1> <test2>green!</test2> <test3>><</test3> - <test4>☃</test4> + <test4>∑</test4> <test5><test5/></test5> <test6> </test6> <test7> <!-- --></test7> diff --git a/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md b/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md index a8ef3e07a0d..275c813355c 100644 --- a/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md +++ b/tests/wpt/web-platform-tests/docs/writing-tests/testdriver-tutorial.md @@ -100,6 +100,7 @@ This happens here in the same file: ```javascript let pending_resolve = null; let pending_reject = null; + let result = null; window.addEventListener("message", function(event) { const data = event.data; @@ -112,7 +113,8 @@ This happens here in the same file: } if (data.status === "success") { - pending_resolve(); + result = JSON.parse(data.message).result + pending_resolve(result); } else { pending_reject(); } @@ -315,5 +317,35 @@ run instead of testdriver-extra.js in browser-specific test environments. For ex ### What if I need to return a value from my testdriver API? -We currently don't have this capability, but it is coming soon and will be documented. The bug is [here](https://github.com/web-platform-tests/wpt/issues/10716) +You can return values from testdriver by just making your Action and Protocol classes use return statements. The data being returned will be serialized into JSON and passed +back to the test on the resolving promise. The test can then deserialize the JSON to access the return values. Here is an example of a theoretical GetWindowRect API: + +```python +class GetWindowRectAction(object): + def __call__(self, payload): + return self.protocol.get_window_rect.get_window_rect() +``` + +The WebDriver command will return a [WindowRect object](https://www.w3.org/TR/webdriver1/#dfn-window-rect), which is a dictionary with keys `x`, `y`, `width`, and `height`. +```python +class WebDriverGetWindowRectProtocolPart(GetWindowRectProtocolPart): + def get_window_rect(self): + return self.webdriver.get_window_rect() +``` + +Then a test can access the return value as follows: +```html +<script> +async_test(t => { + test_driver.get_window_rect() + .then((result) => { + assert_equals(result.x, 0) + assert_equals(result.y, 10) + assert_equals(result.width, 800) + assert_equals(result.height, 600) + t.done(); + }) +}); +</script> +``` diff --git a/tests/wpt/web-platform-tests/dom/nodes/selectors.js b/tests/wpt/web-platform-tests/dom/nodes/selectors.js index 553e62f2587..c1680cedd70 100644 --- a/tests/wpt/web-platform-tests/dom/nodes/selectors.js +++ b/tests/wpt/web-platform-tests/dom/nodes/selectors.js @@ -237,10 +237,12 @@ var validSelectors = [ // - :enabled (Level 3) {name: ":enabled pseudo-class selector, matching all enabled form controls", selector: "#pseudo-ui :enabled", expect: ["pseudo-ui-input1", "pseudo-ui-input2", "pseudo-ui-input3", "pseudo-ui-input4", "pseudo-ui-input5", "pseudo-ui-input6", "pseudo-ui-input7", "pseudo-ui-input8", "pseudo-ui-input9", "pseudo-ui-textarea1", "pseudo-ui-button1"], level: 3, testType: TEST_QSA | TEST_MATCH}, + {name: ":enabled pseudo-class selector, not matching link elements", selector: "#pseudo-link :enabled", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH}, // - :disabled (Level 3) - {name: ":enabled pseudo-class selector, matching all disabled form controls", selector: "#pseudo-ui :disabled", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15", + {name: ":disabled pseudo-class selector, matching all disabled form controls", selector: "#pseudo-ui :disabled", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15", "pseudo-ui-input16", "pseudo-ui-input17", "pseudo-ui-input18", "pseudo-ui-textarea2", "pseudo-ui-button2"], level: 3, testType: TEST_QSA | TEST_MATCH}, + {name: ":disabled pseudo-class selector, not matching link elements", selector: "#pseudo-link :disabled", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH}, // - :checked (Level 3) {name: ":checked pseudo-class selector, matching checked radio buttons and checkboxes", selector: "#pseudo-ui :checked", expect: ["pseudo-ui-input4", "pseudo-ui-input6", "pseudo-ui-input13", "pseudo-ui-input15"], level: 3, testType: TEST_QSA | TEST_MATCH}, @@ -619,10 +621,12 @@ var scopedSelectors = [ // - :enabled (Level 3) {name: ":enabled pseudo-class selector, matching all enabled form controls (1)", selector: "#pseudo-ui :enabled", ctx: "", expect: ["pseudo-ui-input1", "pseudo-ui-input2", "pseudo-ui-input3", "pseudo-ui-input4", "pseudo-ui-input5", "pseudo-ui-input6", "pseudo-ui-input7", "pseudo-ui-input8", "pseudo-ui-input9", "pseudo-ui-textarea1", "pseudo-ui-button1"], level: 3, testType: TEST_FIND | TEST_MATCH}, + {name: ":enabled pseudo-class selector, not matching link elements (1)", selector: "#pseudo-link :enabled", ctx: "", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH}, // - :disabled (Level 3) - {name: ":enabled pseudo-class selector, matching all disabled form controls (1)", selector: "#pseudo-ui :disabled", ctx: "", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15", + {name: ":disabled pseudo-class selector, matching all disabled form controls (1)", selector: "#pseudo-ui :disabled", ctx: "", expect: ["pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15", "pseudo-ui-input16", "pseudo-ui-input17", "pseudo-ui-input18", "pseudo-ui-textarea2", "pseudo-ui-button2"], level: 3, testType: TEST_FIND | TEST_MATCH}, + {name: ":disabled pseudo-class selector, not matching link elements (1)", selector: "#pseudo-link :disabled", ctx: "", expect: [] /*no matches*/, unexpected: ["pseudo-link-a1","pseudo-link-a2","pseudo-link-a3","pseudo-link-map1","pseudo-link-area1","pseudo-link-area2"], level: 3, testType: TEST_QSA | TEST_MATCH}, // - :checked (Level 3) {name: ":checked pseudo-class selector, matching checked radio buttons and checkboxes (1)", selector: "#pseudo-ui :checked", ctx: "", expect: ["pseudo-ui-input4", "pseudo-ui-input6", "pseudo-ui-input13", "pseudo-ui-input15"], level: 3, testType: TEST_FIND | TEST_MATCH}, diff --git a/tests/wpt/web-platform-tests/element-timing/resources/iframe-with-content.html b/tests/wpt/web-platform-tests/element-timing/resources/iframe-with-content.html new file mode 100644 index 00000000000..ab8cdfde011 --- /dev/null +++ b/tests/wpt/web-platform-tests/element-timing/resources/iframe-with-content.html @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<body> +<p>Text</p> +<img src='/images/blue.png'/> +</body> diff --git a/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js b/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js index 1f5dabd7b51..81f210eec89 100644 --- a/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js +++ b/tests/wpt/web-platform-tests/encoding/textdecoder-ignorebom.any.js @@ -15,18 +15,30 @@ cases.forEach(function(testCase) { decoder.decode(bytes), BOM + 'abc', testCase.encoding + ': BOM should be present in decoded string if ignored'); + assert_equals( + decoder.decode(bytes), + BOM + 'abc', + testCase.encoding + ': BOM should be present in decoded string if ignored by a reused decoder'); decoder = new TextDecoder(testCase.encoding, {ignoreBOM: false}); assert_equals( decoder.decode(bytes), 'abc', testCase.encoding + ': BOM should be absent from decoded string if not ignored'); + assert_equals( + decoder.decode(bytes), + 'abc', + testCase.encoding + ': BOM should be absent from decoded string if not ignored by a reused decoder'); decoder = new TextDecoder(testCase.encoding); assert_equals( decoder.decode(bytes), 'abc', testCase.encoding + ': BOM should be absent from decoded string by default'); + assert_equals( + decoder.decode(bytes), + 'abc', + testCase.encoding + ': BOM should be absent from decoded string by default with a reused decoder'); }, 'BOM is ignored if ignoreBOM option is specified: ' + testCase.encoding); }); diff --git a/tests/wpt/web-platform-tests/feature-policy/META.yml b/tests/wpt/web-platform-tests/feature-policy/META.yml index a4136f77e3f..5fb6249c67a 100644 --- a/tests/wpt/web-platform-tests/feature-policy/META.yml +++ b/tests/wpt/web-platform-tests/feature-policy/META.yml @@ -1,3 +1,4 @@ spec: https://wicg.github.io/feature-policy/ suggested_reviewers: - bakulf + - clelland diff --git a/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js b/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js index cbd0518ff21..c6bea817512 100644 --- a/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js +++ b/tests/wpt/web-platform-tests/feature-policy/experimental-features/resources/common.js @@ -66,13 +66,15 @@ function wait_for_load(e) { }); } -window.reporting_observer_instance = new ReportingObserver((reports, observer) => { - if (window.reporting_observer_callback) { - reports.forEach(window.reporting_observer_callback); - } -}, {types: ["feature-policy-violation"]}); -window.reporting_observer_instance.observe(); -window.reporting_observer_callback = null; +setup(() => { + window.reporting_observer_instance = new ReportingObserver((reports, observer) => { + if (window.reporting_observer_callback) { + reports.forEach(window.reporting_observer_callback); + } + }, {types: ["feature-policy-violation"]}); + window.reporting_observer_instance.observe(); + window.reporting_observer_callback = null; +}); // Waits for a violation in |feature| and source file containing |file_name|. function wait_for_violation_in_file(feature, file_name) { diff --git a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html index 0d30ef9e385..af898aa29f5 100644 --- a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html +++ b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-no-referrer-service-worker.https.html @@ -12,7 +12,7 @@ </head> <body> <script> - service_worker_test("referrer-no-referrer.js?pipe=sub"); + service_worker_test("referrer-no-referrer.js"); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html index 39a65b0e333..634877edae8 100644 --- a/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html +++ b/tests/wpt/web-platform-tests/fetch/api/policies/referrer-unsafe-url-service-worker.https.html @@ -12,7 +12,7 @@ </head> <body> <script> - service_worker_test("referrer-unsafe-url.js?pipe=sub"); + service_worker_test("referrer-unsafe-url.js"); </script> </body> </html> diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html index 4b81c7c44f9..fec801e94ba 100644 --- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html +++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html @@ -18,9 +18,7 @@ function frameOnload() { if (next) { next(); - dump("next \n"); } else { - dump("no next \n"); // The test does the following navigation steps for iframe // 1. load page-with-fragment.html#fragment // 2. load blank1 diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-defaults.window.js b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-defaults.window.js new file mode 100644 index 00000000000..1b2d68a4626 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-defaults.window.js @@ -0,0 +1,12 @@ +async_test(t => { + const frame = document.createElement("iframe"); + t.add_cleanup(() => frame.remove()); + frame.name = "foo"; + frame.src = "/common/blank.html"; + frame.onload = t.step_func(() => { + frame.onload = t.unreached_func(); + t.step_timeout(() => t.done(), 500); + assert_equals(window[0], window.open(undefined, "foo")); + }); + document.body.append(frame); +}, "window.open()'s url parameter default"); diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-none.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-none.https.html new file mode 100644 index 00000000000..5298347fd9d --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-none.https.html @@ -0,0 +1,85 @@ +<!doctype html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> +<script> +const SCOPE = new URL(location.href).pathname; +const SCRIPT = + 'resources/sw.js?' + + `pipe=header(service-worker-allowed,${SCOPE})`; + +function remote(path) { + const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN; + return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/'); +} + +promise_test(async (t) => { + const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE); + add_completion_callback(() => { + reg.unregister(); + }); + await new Promise(resolve => { + navigator.serviceWorker.addEventListener('controllerchange', resolve); + }); +}, 'setting up'); + +promise_test(async (t) => { + await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await fetch('/common/blank.html', {mode: 'no-cors'}); +}, 'making a same-origin request for no CORP'); + +promise_test(async (t) => { + await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await fetch(remote('/common/blank.html'), {mode: 'no-cors'}); +}, 'making a cross-origin request for no CORP'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'), + {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'}); +}, 'making a cross-origin request for no CORP [PASS THROUGH]'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt?passthrough'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'})); +}, 'making a cross-origin request with CORS without ACAO'); + +promise_test(async (t) => { + const URL = remote( + '/common/blank.html?pipe=header(access-control-allow-origin,*'); + await fetch(URL, {mode: 'cors'}); +}, 'making a cross-origin request with CORS'); + +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html new file mode 100644 index 00000000000..1dec25fadad --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html @@ -0,0 +1,88 @@ +<!doctype html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> +<script> +const SCOPE = new URL(location.href).pathname; +const SCRIPT = + 'resources/sw.js?' + + `pipe=header(service-worker-allowed,${SCOPE})`; + +function remote(path) { + const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN; + return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/'); +} + +promise_test(async (t) => { + const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE); + add_completion_callback(() => { + reg.unregister(); + }); + await new Promise(resolve => { + navigator.serviceWorker.addEventListener('controllerchange', resolve); + }); +}, 'setting up'); + +promise_test(async (t) => { + await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await fetch('/common/blank.html', {mode: 'no-cors'}); +}, 'making a same-origin request for no CORP'); + +promise_test(async (t) => { + await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'no-cors'})); +}, 'making a cross-origin request for no CORP'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'), + {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'})); +}, 'making a cross-origin request for no CORP [PASS THROUGH]'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt?passthrough'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'})); +}, 'making a cross-origin request with CORS without ACAO'); + +promise_test(async (t) => { + const URL = remote( + '/common/blank.html?pipe=header(access-control-allow-origin,*'); + await fetch(URL, {mode: 'cors'}); +}, 'making a cross-origin request with CORS'); + +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers new file mode 100644 index 00000000000..8df98474b58 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/none-sw-from-require-corp.https.html.headers @@ -0,0 +1 @@ +cross-origin-embedder-policy: require-corp diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html new file mode 100644 index 00000000000..896ea46ff08 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-none.https.html @@ -0,0 +1,87 @@ +<!doctype html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> +<script> +const SCOPE = new URL(location.href).pathname; +const SCRIPT = + 'resources/sw.js?' + + `pipe=header(service-worker-allowed,${SCOPE})|` + + 'header(cross-origin-embedder-policy,require-corp)'; + +function remote(path) { + const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN; + return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/'); +} + +promise_test(async (t) => { + const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE); + add_completion_callback(() => { + reg.unregister(); + }); + await new Promise(resolve => { + navigator.serviceWorker.addEventListener('controllerchange', resolve); + }); +}, 'setting up'); + +promise_test(async (t) => { + await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await fetch('/common/blank.html', {mode: 'no-cors'}); +}, 'making a same-origin request for no CORP'); + +promise_test(async (t) => { + await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'no-cors'})); +}, 'making a cross-origin request for no CORP'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'), + {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'}); +}, 'making a cross-origin request for no CORP [PASS THROUGH]'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt?passthrough'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'})); +}, 'making a cross-origin request with CORS without ACAO'); + +promise_test(async (t) => { + const URL = remote( + '/common/blank.html?pipe=header(access-control-allow-origin,*'); + await fetch(URL, {mode: 'cors'}); +}, 'making a cross-origin request with CORS'); + +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html new file mode 100644 index 00000000000..e62184b7b6a --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html @@ -0,0 +1,89 @@ +<!doctype html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/common/get-host-info.sub.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> +<script> +const SCOPE = new URL(location.href).pathname; +const SCRIPT = + 'resources/sw.js?' + + `pipe=header(service-worker-allowed,${SCOPE})|` + + 'header(cross-origin-embedder-policy,require-corp)'; + +function remote(path) { + const REMOTE_ORIGIN = get_host_info().HTTPS_REMOTE_ORIGIN; + return new URL(path, REMOTE_ORIGIN + '/html/cross-origin-embedder-policy/'); +} + +promise_test(async (t) => { + const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE); + add_completion_callback(() => { + reg.unregister(); + }); + await new Promise(resolve => { + navigator.serviceWorker.addEventListener('controllerchange', resolve); + }); +}, 'setting up'); + +promise_test(async (t) => { + await fetch('resources/nothing-same-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await fetch('/common/blank.html', {mode: 'no-cors'}); +}, 'making a same-origin request for no CORP'); + +promise_test(async (t) => { + await fetch('resources/nothing-cross-origin-corp.txt', {mode: 'no-cors'}); +}, 'making a same-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt'), {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'no-cors'})); +}, 'making a cross-origin request for no CORP'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('resources/nothing-same-origin-corp.txt?passthrough'), + {mode: 'no-cors'})); +}, 'making a cross-origin request for CORP: same-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), + fetch(remote('/common/blank.html?passthrough'), {mode: 'no-cors'})); +}, 'making a cross-origin request for no CORP [PASS THROUGH]'); + +promise_test(async (t) => { + await fetch( + remote('resources/nothing-cross-origin-corp.txt?passthrough'), + {mode: 'no-cors'}); +}, 'making a cross-origin request for CORP: cross-origin [PASS THROUGH]'); + +promise_test(async (t) => { + await promise_rejects( + t, TypeError(), fetch(remote('/common/blank.html'), {mode: 'cors'})); +}, 'making a cross-origin request with CORS without ACAO'); + +promise_test(async (t) => { + const URL = remote( + '/common/blank.html?pipe=header(access-control-allow-origin,*'); + await fetch(URL, {mode: 'cors'}); +}, 'making a cross-origin request with CORS'); + +</script> +</html> diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers new file mode 100644 index 00000000000..8df98474b58 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/require-corp-sw-from-require-corp.https.html.headers @@ -0,0 +1 @@ +cross-origin-embedder-policy: require-corp diff --git a/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/sw.js b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/sw.js new file mode 100644 index 00000000000..57f0b41ba5b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/cross-origin-embedder-policy/resources/sw.js @@ -0,0 +1,12 @@ +self.addEventListener('activate', (e) => { + e.waitUntil(clients.claim()); +}); + +self.addEventListener('fetch', (e) => { + const url = new URL(e.request.url); + if (url.searchParams.has('passthrough')) { + return; + } + + e.respondWith(fetch(e.request)); +}); diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html index 2d8c49c7f61..4a8a9a291a9 100644 --- a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html +++ b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/document-level-apis.html @@ -31,4 +31,4 @@ test(function () { }, "The hasFocus() method must return false if the Document has no browsing context"); </script> -<iframe id="fr" src="test.html" onload="frame_load()"></iframe> +<iframe id="fr" src="support/test.html" onload="frame_load()"></iframe> diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/test.html b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/support/test.html index 90d63e51e93..90d63e51e93 100644 --- a/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/test.html +++ b/tests/wpt/web-platform-tests/html/interaction/focus/document-level-focus-apis/support/test.html diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html new file mode 100644 index 00000000000..e3aedea246e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/resources/frameset-using-page.html @@ -0,0 +1,6 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>We'll grab a frame from this page to test its tabIndex</title> +<frameset> + <frame></frame> +</frameset> diff --git a/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html new file mode 100644 index 00000000000..27a92f76ab7 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/interaction/focus/sequential-focus-navigation-and-the-tabindex-attribute/tabindex-getter-frame.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTML Test: tabIndex getter return value for frames</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<!-- <frame> elements are harder to test than the rest so they get their own file --> + +<body> + +<script> +"use strict"; +test(() => { + const frame = document.createElement("frame"); + assert_equals(frame.tabIndex, 0); +}, "disconnected frame element .tabIndex should return 0 by default"); + +for (const setValue of [-1, 0, 1]) { + test(() => { + const frame = document.createElement("frame"); + frame.setAttribute("tabindex", setValue); + assert_equals(frame.tabIndex, setValue); + }, `disconnected frame element .tabIndex should return ${setValue} when set to ${setValue}`); +} + +promise_test(async t => { + const frame = await getFrame(t); + assert_equals(frame.tabIndex, 0); +}, "connected frame element inside frameset .tabIndex should return 0 by default"); + +for (const setValue of [-1, 0, 1]) { + promise_test(async t => { + const frame = await getFrame(t); + frame.setAttribute("tabindex", setValue); + assert_equals(frame.tabIndex, setValue); + }, `connected frame element inside frameset .tabIndex should return ${setValue} when set to ${setValue}`); +} + + +function getFrame(t) { + return new Promise((resolve, reject) => { + const iframe = document.createElement("iframe"); + t.add_cleanup(() => iframe.remove()); + + iframe.src = "resources/frameset-using-page.html"; + iframe.onload = () => { + resolve(iframe.contentDocument.querySelector("frame")); + }; + iframe.onerror = () => reject(new Error("Could not load frameset page")); + + document.body.append(iframe); + }); +} +</script> diff --git a/tests/wpt/web-platform-tests/html/rendering/widgets/appearance/default-styles.html b/tests/wpt/web-platform-tests/html/rendering/widgets/appearance/default-styles.html new file mode 100644 index 00000000000..8869808696e --- /dev/null +++ b/tests/wpt/web-platform-tests/html/rendering/widgets/appearance/default-styles.html @@ -0,0 +1,96 @@ +<!doctype html> +<title>HTML: default style for 'appearance'</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +// namespaces +const htmlns = 'http://www.w3.org/1999/xhtml'; +const svgns = 'http://www.w3.org/2000/svg'; + +// auto +testAppearance(htmlns, 'input', null, 'auto'); +testAppearance(htmlns, 'input', {type: 'text'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'TEXT'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'search'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'tel'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'url'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'email'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'password'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'date'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'month'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'week'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'time'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'datetime-local'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'number'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'range'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'color'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'checkbox'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'radio'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'submit'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'reset'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'button'}, 'auto'); +testAppearance(htmlns, 'input', {type: 'unknowntype'}, 'auto'); +testAppearance(htmlns, 'select', null, 'auto'); +testAppearance(htmlns, 'select', {multiple: ''}, 'auto'); +testAppearance(htmlns, 'select', {size: '2'}, 'auto'); +testAppearance(htmlns, 'button', null, 'auto'); +testAppearance(htmlns, 'textarea', null, 'auto'); +testAppearance(htmlns, 'meter', null, 'auto'); +testAppearance(htmlns, 'progress', null, 'auto'); + +// none +testAppearance(htmlns, 'input', {type: 'hidden'}, 'none'); +testAppearance(htmlns, 'input', {type: 'HIDDEN'}, 'none'); +testAppearance(htmlns, 'input', {type: 'file'}, 'none'); +testAppearance(htmlns, 'input', {type: 'image'}, 'none'); +testAppearance(htmlns, 'div', null, 'none'); +testAppearance(htmlns, 'details', null, 'none'); +testAppearance(htmlns, 'summary', null, 'none'); +testAppearance(htmlns, 'video', null, 'none'); +testAppearance(htmlns, 'video', {controls: ''}, 'none'); +testAppearance(htmlns, 'menuitem', null, 'none'); +testAppearance(htmlns, 'marquee', null, 'none'); +testAppearance(htmlns, 'keygen', null, 'none'); +testAppearance(null, 'input', null, 'none'); +testAppearance(svgns, 'input', null, 'none'); + +test(t => { + assertAppearance(document.documentElement, 'none'); +}, 'The html element'); + +test(t => { + assertAppearance(document.body, 'none'); +}, 'The body element'); + + +function testAppearance(ns, tag, attributes, expected) { + test(t => { + const elm = document.createElementNS(ns, tag); + for (const att in attributes) { + elm.setAttribute(att, attributes[att]); + } + document.body.appendChild(elm); + t.add_cleanup(() => elm.remove()); + assertAppearance(elm, expected); + }, formatTestName(ns, tag, attributes)); +} + +function assertAppearance(elm, expected) { + const computedStyle = getComputedStyle(elm); + assert_equals(computedStyle.getPropertyValue('-webkit-appearance'), expected, '-webkit-appearance'); + assert_equals(computedStyle.getPropertyValue('appearance'), expected, 'appearance (no prefix)'); +} + +function formatTestName(ns, tag, attributes) { + let s = `<${tag}`; + for (const att in attributes) { + s += ` ${att}="${attributes[att]}"`; + } + s += '>'; + if (ns !== htmlns) { + s += ` (namespace: ${ns})`; + } + return s; +} +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js new file mode 100644 index 00000000000..7c4e121b7c3 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/historical-progress-event.window.js @@ -0,0 +1,16 @@ +async_test(t => { + const img = new Image(); + t.add_cleanup(() => img.remove()); + img.onloadstart = img.onprogress = img.onloadend = t.unreached_func("progress event fired"); + img.onload = t.step_func_done(e => { + assert_true(e instanceof Event); + assert_false(e instanceof ProgressEvent); + }); + img.src = "/images/rrgg-256x256.png"; + document.body.append(img); +}, "<img> does not support ProgressEvent or loadstart/progress/loadend"); + +test(t => { + assert_equals(document.body.onloadend, undefined); + assert_equals(window.onloadend, undefined); +}, "onloadend is not exposed"); diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html index c564a5845d5..ab1b2b25091 100644 --- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html +++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html @@ -58,8 +58,6 @@ <img srcset='/images/green-1x1.png?e37a 50w, /images/green-16x16.png?e37a 51w' sizes='(min-width:0) min(1px, 100px)'> <img srcset='/images/green-1x1.png?e37b 50w, /images/green-16x16.png?e37b 51w' sizes='(min-width:0) max(-100px, 1px)'> <img srcset='/images/green-1x1.png?e38 50w, /images/green-16x16.png?e38 51w' sizes='(min-width:calc(0)) 1px'> -<img srcset='/images/green-1x1.png?e38a 50w, /images/green-16x16.png?e38a 51w' sizes='(min-width:min(0, 200vw)) 1px'> -<img srcset='/images/green-1x1.png?e38b 50w, /images/green-16x16.png?e38b 51w' sizes='(min-width:max(-200vw, 0)) 1px'> <img srcset='/images/green-1x1.png?e39 50w, /images/green-16x16.png?e39 51w' sizes='(min-width:0) 1px, 100vw'> <img srcset='/images/green-1x1.png?e40 50w, /images/green-16x16.png?e40 51w' sizes='(min-width:0) 1px, (min-width:0) 100vw, 100vw'> <img srcset='/images/green-1x1.png?e41 50w, /images/green-16x16.png?e41 51w' sizes='(min-width:0) 1px'> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html b/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.html index cc018814c92..c3974bd02a3 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.sub.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/autofocus/no-cross-origin-autofocus.html @@ -5,6 +5,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> +<script src="/common/get-host-info.sub.js"></script> </head> <body> <h1>Autofocus shouldn't work in cross-origin iframe.</h1> @@ -36,7 +37,7 @@ } })); document.getElementById("child").src = - "http://{{domains[www]}}:{{ports[http][0]}}/html/semantics/forms/autofocus/resources/child-autofocus.html"; + get_host_info().HTTP_REMOTE_ORIGIN + "/html/semantics/forms/autofocus/resources/child-autofocus.html"; }, "Autofocus shouldn't work in cross-origin iframe"); </script> </body> diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js index 398da56595f..dcbe60f2c2f 100644 --- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js +++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/json-module/non-object.any.js @@ -3,12 +3,12 @@ for (const value of [null, true, false, "string"]) { promise_test(async t => { const result = await import(`./${value}.json`); - assert_equals(result, value); + assert_equals(result.default, value); }, `Non-object: ${value}`); } promise_test(async t => { const result = await import("./array.json"); - assert_array_equals(result, ["en", "try"]); + assert_array_equals(result.default, ["en", "try"]); }, "Non-object: array"); diff --git a/tests/wpt/web-platform-tests/idle-detection/mock.js b/tests/wpt/web-platform-tests/idle-detection/mock.js index d88d1ad1c55..cb67ce02c31 100644 --- a/tests/wpt/web-platform-tests/idle-detection/mock.js +++ b/tests/wpt/web-platform-tests/idle-detection/mock.js @@ -64,7 +64,7 @@ function intercept() { let result = new FakeIdleMonitor(); let binding = new mojo.Binding(blink.mojom.IdleManager, result); - let interceptor = new MojoInterfaceInterceptor(blink.mojom.IdleManager.name); + let interceptor = new MojoInterfaceInterceptor(blink.mojom.IdleManager.name, "context", true); interceptor.oninterfacerequest = (e) => { binding.bind(e.handle); } diff --git a/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html index 1c7172bf7c6..634948942ee 100644 --- a/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html +++ b/tests/wpt/web-platform-tests/import-maps/data.sub.tentative.html @@ -1,4 +1,5 @@ <!DOCTYPE html> +<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="resources/test-helper.js"></script> diff --git a/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html index 3f89e8f12df..280d02d8473 100644 --- a/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html +++ b/tests/wpt/web-platform-tests/import-maps/fallback-disallowed.sub.tentative.html @@ -1,4 +1,5 @@ <!DOCTYPE html> +<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="resources/test-helper.js"></script> diff --git a/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html b/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html index 4cf3e18182a..3f4f2887da8 100644 --- a/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html +++ b/tests/wpt/web-platform-tests/import-maps/fallback.sub.tentative.html @@ -1,4 +1,5 @@ <!DOCTYPE html> +<meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="resources/test-helper.js"></script> diff --git a/tests/wpt/web-platform-tests/interfaces/appmanifest.idl b/tests/wpt/web-platform-tests/interfaces/appmanifest.idl index fd26c9ba71e..ddfe82dc34d 100644 --- a/tests/wpt/web-platform-tests/interfaces/appmanifest.idl +++ b/tests/wpt/web-platform-tests/interfaces/appmanifest.idl @@ -3,7 +3,7 @@ // (https://github.com/tidoust/reffy-reports) // Source: Web App Manifest (https://w3c.github.io/manifest/) -[Constructor(DOMString type, optional EventInit eventInitDict), +[Constructor(DOMString type, optional EventInit eventInitDict = {}), Exposed=Window] interface BeforeInstallPromptEvent : Event { Promise<PromptResponseObject> prompt(); diff --git a/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl b/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl index 99d1155a3e3..9e35287696b 100644 --- a/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl +++ b/tests/wpt/web-platform-tests/interfaces/clipboard-apis.idl @@ -7,7 +7,7 @@ dictionary ClipboardEventInit : EventInit { DataTransfer? clipboardData = null; }; -[Constructor(DOMString type, optional ClipboardEventInit eventInitDict), Exposed=Window] +[Constructor(DOMString type, optional ClipboardEventInit eventInitDict = {}), Exposed=Window] interface ClipboardEvent : Event { readonly attribute DataTransfer? clipboardData; }; @@ -31,11 +31,11 @@ typedef Promise<ClipboardItemDataType> ClipboardItemData; callback ClipboardItemDelayedCallback = ClipboardItemData (); [Constructor(record<DOMString, ClipboardItemData> items, - optional ClipboardItemOptions options), + optional ClipboardItemOptions options = {}), Exposed=Window] interface ClipboardItem { static ClipboardItem createDelayed( record<DOMString, ClipboardItemDelayedCallback> items, - optional ClipboardItemOptions options); + optional ClipboardItemOptions options = {}); readonly attribute PresentationStyle presentationStyle; readonly attribute long long lastModified; diff --git a/tests/wpt/web-platform-tests/interfaces/css-animations.idl b/tests/wpt/web-platform-tests/interfaces/css-animations.idl index cd5f6016e53..f87015f6a87 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-animations.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-animations.idl @@ -4,7 +4,7 @@ // Source: CSS Animations Level 1 (https://drafts.csswg.org/css-animations/) [Exposed=Window, - Constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict)] + Constructor(CSSOMString type, optional AnimationEventInit animationEventInitDict = {})] interface AnimationEvent : Event { readonly attribute CSSOMString animationName; readonly attribute double elapsedTime; diff --git a/tests/wpt/web-platform-tests/interfaces/css-transitions.idl b/tests/wpt/web-platform-tests/interfaces/css-transitions.idl index 129f1463ed8..be5a635112b 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-transitions.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-transitions.idl @@ -4,7 +4,7 @@ // Source: CSS Transitions (https://drafts.csswg.org/css-transitions/) [Exposed=Window, - Constructor(CSSOMString type, optional TransitionEventInit transitionEventInitDict)] + Constructor(CSSOMString type, optional TransitionEventInit transitionEventInitDict = {})] interface TransitionEvent : Event { readonly attribute CSSOMString propertyName; readonly attribute double elapsedTime; diff --git a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl index be2946bc20f..b54a16338ec 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl @@ -302,7 +302,7 @@ interface CSSPerspective : CSSTransformComponent { }; [Exposed=(Window, Worker, PaintWorklet, LayoutWorklet), - Constructor(DOMMatrixReadOnly matrix, optional CSSMatrixComponentOptions options)] + Constructor(DOMMatrixReadOnly matrix, optional CSSMatrixComponentOptions options = {})] interface CSSMatrixComponent : CSSTransformComponent { attribute DOMMatrix matrix; }; diff --git a/tests/wpt/web-platform-tests/interfaces/cssom-view.idl b/tests/wpt/web-platform-tests/interfaces/cssom-view.idl index 9567b134cf9..5d30ede1e40 100644 --- a/tests/wpt/web-platform-tests/interfaces/cssom-view.idl +++ b/tests/wpt/web-platform-tests/interfaces/cssom-view.idl @@ -32,11 +32,11 @@ partial interface Window { [Replaceable] readonly attribute double pageXOffset; [Replaceable] readonly attribute double scrollY; [Replaceable] readonly attribute double pageYOffset; - void scroll(optional ScrollToOptions options); + void scroll(optional ScrollToOptions options = {}); void scroll(unrestricted double x, unrestricted double y); - void scrollTo(optional ScrollToOptions options); + void scrollTo(optional ScrollToOptions options = {}); void scrollTo(unrestricted double x, unrestricted double y); - void scrollBy(optional ScrollToOptions options); + void scrollBy(optional ScrollToOptions options = {}); void scrollBy(unrestricted double x, unrestricted double y); // client @@ -59,7 +59,7 @@ interface MediaQueryList : EventTarget { }; [Exposed=Window, - Constructor(CSSOMString type, optional MediaQueryListEventInit eventInitDict)] + Constructor(CSSOMString type, optional MediaQueryListEventInit eventInitDict = {})] interface MediaQueryListEvent : Event { readonly attribute CSSOMString media; readonly attribute boolean matches; @@ -103,12 +103,12 @@ dictionary ScrollIntoViewOptions : ScrollOptions { partial interface Element { DOMRectList getClientRects(); [NewObject] DOMRect getBoundingClientRect(); - void scrollIntoView(optional (boolean or ScrollIntoViewOptions) arg); - void scroll(optional ScrollToOptions options); + void scrollIntoView(optional (boolean or ScrollIntoViewOptions) arg = {}); + void scroll(optional ScrollToOptions options = {}); void scroll(unrestricted double x, unrestricted double y); - void scrollTo(optional ScrollToOptions options); + void scrollTo(optional ScrollToOptions options = {}); void scrollTo(unrestricted double x, unrestricted double y); - void scrollBy(optional ScrollToOptions options); + void scrollBy(optional ScrollToOptions options = {}); void scrollBy(unrestricted double x, unrestricted double y); attribute unrestricted double scrollTop; attribute unrestricted double scrollLeft; @@ -170,10 +170,10 @@ dictionary ConvertCoordinateOptions { }; interface mixin GeometryUtils { - sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options); - DOMQuad convertQuadFromNode(DOMQuadInit quad, GeometryNode from, optional ConvertCoordinateOptions options); - DOMQuad convertRectFromNode(DOMRectReadOnly rect, GeometryNode from, optional ConvertCoordinateOptions options); - DOMPoint convertPointFromNode(DOMPointInit point, GeometryNode from, optional ConvertCoordinateOptions options); // XXX z,w turns into 0 + sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options = {}); + DOMQuad convertQuadFromNode(DOMQuadInit quad, GeometryNode from, optional ConvertCoordinateOptions options = {}); + DOMQuad convertRectFromNode(DOMRectReadOnly rect, GeometryNode from, optional ConvertCoordinateOptions options = {}); + DOMPoint convertPointFromNode(DOMPointInit point, GeometryNode from, optional ConvertCoordinateOptions options = {}); // XXX z,w turns into 0 }; Text includes GeometryUtils; // like Range diff --git a/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl b/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl index 83b7f893552..0144f04e046 100644 --- a/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/shape-detection-api.idl @@ -5,7 +5,7 @@ [Exposed=(Window,Worker), SecureContext, - Constructor(optional FaceDetectorOptions faceDetectorOptions)] + Constructor(optional FaceDetectorOptions faceDetectorOptions = {})] interface FaceDetector { Promise<sequence<DetectedFace>> detect(ImageBitmapSource image); }; @@ -36,7 +36,7 @@ enum LandmarkType { [Exposed=(Window,Worker), SecureContext, - Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions)] + Constructor(optional BarcodeDetectorOptions barcodeDetectorOptions = {})] interface BarcodeDetector { static Promise<sequence<BarcodeFormat>> getSupportedFormats(); diff --git a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl index 183f7732605..f515dda1a81 100644 --- a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl +++ b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl @@ -29,7 +29,7 @@ interface Bluetooth : EventTarget { attribute EventHandler onavailabilitychanged; [SameObject] readonly attribute BluetoothDevice? referringDevice; - Promise<BluetoothDevice> requestDevice(optional RequestDeviceOptions options); + Promise<BluetoothDevice> requestDevice(optional RequestDeviceOptions options = {}); }; Bluetooth includes BluetoothDeviceEventHandlers; Bluetooth includes CharacteristicEventHandlers; @@ -60,7 +60,7 @@ interface BluetoothPermissionResult : PermissionStatus { [ Exposed=Window, - Constructor(DOMString type, optional ValueEventInit initDict), + Constructor(DOMString type, optional ValueEventInit initDict = {}), SecureContext ] interface ValueEvent : Event { diff --git a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl index 769eb7dd2f5..ff28d84de3d 100644 --- a/tests/wpt/web-platform-tests/interfaces/web-nfc.idl +++ b/tests/wpt/web-platform-tests/interfaces/web-nfc.idl @@ -21,9 +21,9 @@ interface NDEFRecord { readonly attribute NDEFRecordType recordType; readonly attribute USVString mediaType; - USVString toText(); - [NewObject] ArrayBuffer toArrayBuffer(); - [NewObject] object toJSON(); + USVString? toText(); + [NewObject] ArrayBuffer? toArrayBuffer(); + [NewObject] object? toJSON(); }; dictionary NDEFRecordInit { @@ -37,18 +37,17 @@ typedef DOMString NDEFRecordType; typedef (DOMString or ArrayBuffer or NDEFMessageInit) NDEFMessageSource; -[Constructor(), SecureContext, Exposed=Window] +[Constructor, SecureContext, Exposed=Window] interface NFCWriter { Promise<void> push(NDEFMessageSource message, optional NFCPushOptions options={}); }; -[Constructor(optional NFCReaderOptions options={}), SecureContext, Exposed=Window] +[Constructor, SecureContext, Exposed=Window] interface NFCReader : EventTarget { attribute EventHandler onreading; attribute EventHandler onerror; - void start(); - void stop(); + void scan(optional NFCScanOptions options={}); }; [Constructor(DOMString type, NFCReadingEventInit readingEventInitDict), SecureContext, Exposed=Window] @@ -91,7 +90,8 @@ enum NFCPushTarget { "any" }; -dictionary NFCReaderOptions { +dictionary NFCScanOptions { + AbortSignal? signal; USVString url = ""; NDEFRecordType recordType; USVString mediaType = ""; diff --git a/tests/wpt/web-platform-tests/interfaces/worklets.idl b/tests/wpt/web-platform-tests/interfaces/worklets.idl index 22d04d15b06..16187664b3b 100644 --- a/tests/wpt/web-platform-tests/interfaces/worklets.idl +++ b/tests/wpt/web-platform-tests/interfaces/worklets.idl @@ -7,6 +7,7 @@ interface WorkletGlobalScope { }; +[Exposed=Window] interface Worklet { [NewObject] Promise<void> addModule(USVString moduleURL, optional WorkletOptions options); }; diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/iframe-content-not-observed.html b/tests/wpt/web-platform-tests/largest-contentful-paint/iframe-content-not-observed.html new file mode 100644 index 00000000000..7cb23ddbd20 --- /dev/null +++ b/tests/wpt/web-platform-tests/largest-contentful-paint/iframe-content-not-observed.html @@ -0,0 +1,27 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<head> +<title>Largest Contentful Paint: do NOT observe elements from same-origin iframes</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> + async_test((t) => { + if (!window.LargestContentfulPaint) { + assert_unreached("LargestContentfulPaint is not implemented"); + } + const observer = new PerformanceObserver( + t.step_func_done(entryList => { + assert_unreached("Should not have received an entry!"); + }) + ); + observer.observe({type: 'largest-contentful-paint', buffered: true}); + // After a delay, assume that no entry was produced. + t.step_timeout(() => { + t.done(); + }, 200); + }, 'Element in child iframe is not observed, even if same-origin.'); +</script> +<iframe src='resources/iframe-with-content.html'></iframe> +</body> diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/invisible-images.html b/tests/wpt/web-platform-tests/largest-contentful-paint/invisible-images.html new file mode 100644 index 00000000000..cd71f30ae45 --- /dev/null +++ b/tests/wpt/web-platform-tests/largest-contentful-paint/invisible-images.html @@ -0,0 +1,46 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<head> +<title>Largest Contentful Paint: invisible images are not observable</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + .opacity0 { + opacity: 0; + } + .visibilityHidden { + visibility: hidden; + } + .displayNone { + display: none; + } +</style> +</head> +<body> +<script> + async_test(t => { + if (!window.LargestContentfulPaint) { + assert_unreached("LargestContentfulPaint is not implemented"); + } + const observer = new PerformanceObserver( + t.step_func_done(entryList => { + // The images should not have caused an entry, so fail test. + assert_unreached('Should not have received an entry! Received one with id ' + + entryList.getEntries()[0].id); + }) + ); + observer.observe({type: 'largest-contentful-paint', buffered: true}); + // Images have been added but should not cause entries to be dispatched. + // Wait for 500ms and end test, ensuring no entry was created. + t.step_timeout(() => { + t.done(); + }, 500); + }, 'Images with opacity: 0, visibility: hidden, or display: none are not observable by LargestContentfulPaint.'); +</script> +<img src='/images/blue.png' class='opacity0' id='opacity0'/> +<img src='/images/green.png' class='visibilityHidden' id='visibilityHidden'/> +<img src='/images/red.png' class='displayNone' id='displayNone'/> +<div class='opacity0'><img src='/images/yellow.png' id='divOpacity0'/></div> +<div class='visibilityHidden'><img src='/images/yellow.png' id='divVisibilityHidden'/></div> +<div class='displayNone'><img src='/images/yellow.png' id='divDisplayNone'/></div> +</body> diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/larger-image.html b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-image.html new file mode 100644 index 00000000000..7ff38cf2be1 --- /dev/null +++ b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-image.html @@ -0,0 +1,49 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>Largest Contentful Paint: largest image is reported.</title> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<!-- There is some text and some images. We care about blue.png being reported, as it is the largest. --> +<p>This is some text! :)</p> +<img src='/images/red.png' id='red'/> +<img src='/images/blue.png' id='blue'/> +<img src='/images/black-rectangle.png' id='black'/> +<p>More text!</p> +<script> + async_test(function (t) { + if (!window.LargestContentfulPaint) { + assert_unreached("LargestContentfulPaint is not implemented"); + } + const beforeRender = performance.now(); + const observer = new PerformanceObserver( + t.step_func(entryList => { + entryList.getEntries().forEach(entry => { + // The text or other image could be reported as LCP if it is rendered before the blue image. + if (entry.id !== 'blue') + return; + + assert_equals(entry.entryType, 'largest-contentful-paint'); + assert_greater_than_equal(entry.renderTime, beforeRender, + 'The rendering timestamp should occur after script starts running.'); + assert_greater_than_equal(performance.now(), entry.renderTime, + 'The rendering timestamp should occur before the entry is dispatched to the observer.'); + assert_equals(entry.startTime, entry.renderTime, 'startTime should equal renderTime'); + assert_equals(entry.duration, 0); + // blue.png is 133 x 106. + assert_equals(entry.size, 133 * 106); + assert_equals(entry.id, 'blue'); + assert_equals(entry.url, window.location.origin + '/images/blue.png'); + assert_greater_than(entry.loadTime, beforeRender, + 'The load timestamp should occur after script starts running.'); + assert_less_than(entry.loadTime, entry.renderTime, + 'The load timestamp should occur before the render timestamp.') + assert_equals(entry.element, document.getElementById('blue')); + t.done(); + }) + }) + ); + observer.observe({type: 'largest-contentful-paint', buffered: true}); + }, 'Largest Contentful Paint: largest image is reported.'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/largest-contentful-paint/larger-text.html b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-text.html new file mode 100644 index 00000000000..973832ca6c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/largest-contentful-paint/larger-text.html @@ -0,0 +1,53 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>Largest Contentful Paint: largest text is reported.</title> +<body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style type="text/css"> +#text2 { + position: absolute; + width: auto; + white-space: nowrap; +} +</style> +<!-- There is some text and some tiny images. We care about the largest text. --> +<img src='/images/green-1x1.png'/> +<div id='text1'>This is some text.</div> +<div id='text2'>This is more text so it will be the Largest Contentful Paint!</div> +<img src='/images/green-2x2.png'/> +<script> + async_test(function (t) { + if (!window.LargestContentfulPaint) { + assert_unreached("LargestContentfulPaint is not implemented"); + } + let beforeRender; + const observer = new PerformanceObserver( + t.step_func(entryList => { + entryList.getEntries().forEach(entry => { + // The tiny images or text1 could be reported as LCP if it is rendered before text2. + if (entry.id !== 'text2') + return; + + assert_equals(entry.entryType, 'largest-contentful-paint'); + assert_greater_than_equal(entry.renderTime, beforeRender); + assert_greater_than_equal(performance.now(), entry.renderTime); + assert_equals(entry.startTime, entry.renderTime, 'startTime should equal renderTime'); + assert_equals(entry.duration, 0); + const div = document.getElementById('text2'); + // The div styling makes it approximate the text size. + assert_greater_than_equal(entry.size, (div.clientHeight - 5) * (div.clientWidth - 5)); + assert_less_than_equal(entry.size, (div.clientHeight + 1) * (div.clientWidth + 1)); + assert_equals(entry.loadTime, 0); + assert_equals(entry.id, 'text2'); + assert_equals(entry.url, ''); + assert_equals(entry.element, div); + t.done(); + }) + }) + ); + observer.observe({type: 'largest-contentful-paint', buffered: true}); + beforeRender = performance.now(); + }, 'Largest Contentful Paint: largest text is reported.'); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist index 669038166ab..a6aa9466810 100644 --- a/tests/wpt/web-platform-tests/lint.whitelist +++ b/tests/wpt/web-platform-tests/lint.whitelist @@ -822,3 +822,11 @@ WEB-PLATFORM.TEST:signed-exchange/resources/generate-test-sxgs.sh SET TIMEOUT: inert/inert-retargeting.tentative.html SET TIMEOUT: inert/inert-retargeting-iframe.tentative.html + +# https://github.com/web-platform-tests/wpt/issues/16455 +MISSING DEPENDENCY: idle-detection/interceptor.https.html +MISSING DEPENDENCY: sms/sms_provider.js +MISSING DEPENDENCY: web-nfc/resources/nfc-helpers.js +MISSING DEPENDENCY: shape-detection/resources/shapedetection-helpers.js +MISSING DEPENDENCY: webxr/resources/webxr_util.js +MISSING DEPENDENCY: contacts/resources/helpers.js diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011-ref.html new file mode 100644 index 00000000000..400c46a2456 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011-ref.html @@ -0,0 +1,155 @@ +<!DOCTYPE html> +<html> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <!-- Test displaystyle on mstyle --> + <math> + <mstyle displaystyle="true"> + <munder><mo>O</mo><mo>O</mo></munder> + </mstyle> + <mstyle displaystyle="false"> + <msub><mo>O</mo><mo>O</mo></munder> + </mstyle> + </math> + + <!-- The mfrac element sets displaystyle to "false", or if it was already + false increments scriptlevel by 1, within numerator and denominator. + --> + <math> + <mstyle displaystyle="true"> + <mfrac> + <msub><mo>O</mo><mo>O</mo></msub> + <msub><mo>O</mo><mo>O</mo></msub> + </mfrac> + </mstyle> + </math> + + <!-- The mroot element increments scriptlevel by 2, and sets + displaystyle to "false", within index, but leaves both attributes + unchanged within base. + The msqrt element leaves both attributes unchanged within its + argument. --> + <math> + <mstyle displaystyle="true"> + <mroot> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + </mroot> + <msqrt> + <munder><mo>O</mo><mo>O</mo></munder> + </msqrt> + </mstyle> + </math> + +<!-- + The msub element [...] increments scriptlevel by 1, and sets displaystyle to + "false", within subscript, but leaves both attributes unchanged within base. + + The msup element [...] increments scriptlevel by 1, and sets displaystyle to + "false", within superscript, but leaves both attributes unchanged within + base. + + The msubsup element [...] increments scriptlevel by 1, and sets displaystyle + to "false", within subscript and superscript, but leaves both attributes + unchanged within base. + + The mmultiscripts element increments scriptlevel by 1, and sets displaystyle + to "false", within each of its arguments except base, but leaves both + attributes unchanged within base. + --> + <math> + <mstyle displaystyle="true"> + <msub> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + </msub> + <msup> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + </msup> + <msubsup> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + <msub><mo>O</mo><mo>O</mo></msub> + </msubsup> + <mmultiscripts> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + <msub><mo>O</mo><mo>O</mo></msub> + <mprescripts/> + <msub><mo>O</mo><mo>O</mo></msub> + <msub><mo>O</mo><mo>O</mo></msub> + </mmultiscripts> + </mstyle> + </math> + +<!-- + The munder element [...] always sets displaystyle to "false" within the + underscript, but increments scriptlevel by 1 only when accentunder is + "false". Within base, it always leaves both attributes unchanged. + + The mover element [...] always sets displaystyle to "false" within + overscript, but increments scriptlevel by 1 only when accent is "false". + Within base, it always leaves both attributes unchanged. + + The munderover [..] always sets displaystyle to "false" within underscript + and overscript, but increments scriptlevel by 1 only when accentunder or + accent, respectively, are "false". Within base, it always leaves both + attributes unchanged. +--> + <math> + <mstyle displaystyle="true"> + <munder> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + </munder> + <mover> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + </mover> + <munderover> + <munder><mo>O</mo><mo>O</mo></munder> + <msub><mo>O</mo><mo>O</mo></msub> + <msub><mo>O</mo><mo>O</mo></msub> + </munderover> + </mstyle> + </math> + +<!-- + The displaystyle attribute is allowed on the mtable element to set the + inherited value of the attribute. If the attribute is not present, the + mtable element sets displaystyle to "false" within the table elements. +--> + <math> + <mstyle displaystyle="false"> + <mtable displaystyle="true"> + <mtr> + <mtd> + <munder><mo>O</mo><mo>O</mo></munder> + </mtd> + </mtr> + </mtable> + </mstyle> + <mstyle displaystyle="true"> + <mtable> + <mtr> + <mtd> + <msub><mo>O</mo><mo>O</mo></msub> + </mtd> + </mtr> + </mtable> + </mstyle> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011.html new file mode 100644 index 00000000000..9a85a17dd0f --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-011.html @@ -0,0 +1,166 @@ +<!DOCTYPE html> +<html> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#radicals-msqrt-mroot"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#subscripts-and-superscripts-msub-msup-msubsup"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#prescripts-and-tensor-indices-mmultiscripts"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#table-or-matrix-mtable"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo"> + <link rel="match" href="displaystyle-011-ref.html"/> + <meta name="assert" content="Test the effect on displaystyle and movablelimits"> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <!-- Test displaystyle on mstyle --> + <math> + <mstyle displaystyle="true"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mstyle> + <mstyle displaystyle="false"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mstyle> + </math> + + <!-- The mfrac element sets displaystyle to "false", or if it was already + false increments scriptlevel by 1, within numerator and denominator. + --> + <math> + <mstyle displaystyle="true"> + <mfrac> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mfrac> + </mstyle> + </math> + + <!-- The mroot element increments scriptlevel by 2, and sets + displaystyle to "false", within index, but leaves both attributes + unchanged within base. + The msqrt element leaves both attributes unchanged within its + argument. --> + <math> + <mstyle displaystyle="true"> + <mroot> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mroot> + <msqrt> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </msqrt> + </mstyle> + </math> + +<!-- + The msub element [...] increments scriptlevel by 1, and sets displaystyle to + "false", within subscript, but leaves both attributes unchanged within base. + + The msup element [...] increments scriptlevel by 1, and sets displaystyle to + "false", within superscript, but leaves both attributes unchanged within + base. + + The msubsup element [...] increments scriptlevel by 1, and sets displaystyle + to "false", within subscript and superscript, but leaves both attributes + unchanged within base. + + The mmultiscripts element increments scriptlevel by 1, and sets displaystyle + to "false", within each of its arguments except base, but leaves both + attributes unchanged within base. + --> + <math> + <mstyle displaystyle="true"> + <msub> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </msub> + <msup> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </msup> + <msubsup> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </msubsup> + <mmultiscripts> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mprescripts/> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mmultiscripts> + </mstyle> + </math> + +<!-- + The munder element [...] always sets displaystyle to "false" within the + underscript, but increments scriptlevel by 1 only when accentunder is + "false". Within base, it always leaves both attributes unchanged. + + The mover element [...] always sets displaystyle to "false" within + overscript, but increments scriptlevel by 1 only when accent is "false". + Within base, it always leaves both attributes unchanged. + + The munderover [..] always sets displaystyle to "false" within underscript + and overscript, but increments scriptlevel by 1 only when accentunder or + accent, respectively, are "false". Within base, it always leaves both + attributes unchanged. +--> + <math> + <mstyle displaystyle="true"> + <munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </munder> + <mover> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mover> + <munderover> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </munderover> + </mstyle> + </math> + +<!-- + The displaystyle attribute is allowed on the mtable element to set the + inherited value of the attribute. If the attribute is not present, the + mtable element sets displaystyle to "false" within the table elements. +--> + <math> + <mstyle displaystyle="false"> + <mtable displaystyle="true"> + <mtr> + <mtd> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mtd> + </mtr> + </mtable> + </mstyle> + <mstyle displaystyle="true"> + <mtable> + <mtr> + <mtd> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + </mtd> + </mtr> + </mtable> + </mstyle> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012-ref.html new file mode 100644 index 00000000000..96042b696ff --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012-ref.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <!-- Test the effect of displaystyle on munder, mover and munderover --> + <math> + <mstyle displaystyle="true"> + <munder><mo>O</mo><mo>O</mo></munder> + <mover><mo>O</mo><mo>O</mo></mover> + <munderover><mo>O</mo><mo>O</mo><mo>O</mo></munderover> + </mstyle> + <mstyle displaystyle="false"> + <msub><mo>O</mo><mo>O</mo></msub> + <msup><mo>O</mo><mo>O</mo></msup> + <msubsup><mo>O</mo><mo>O</mo><mo>O</mo></msubsup> + </mstyle> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012.html new file mode 100644 index 00000000000..150443f2527 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-012.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo"> + <link rel="match" href="displaystyle-012-ref.html"/> + <meta name="assert" content="Test the effect on displaystyle on munder, mover and munderover"> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <math> + <mstyle displaystyle="true"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mover><mo movablelimits="true">O</mo><mo>O</mo></mover> + <munderover><mo movablelimits="true">O</mo><mo>O</mo><mo>O</mo></munderover> + </mstyle> + <mstyle displaystyle="false"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mover><mo movablelimits="true">O</mo><mo>O</mo></mover> + <munderover><mo movablelimits="true">O</mo><mo>O</mo><mo>O</mo></munderover> + </mstyle> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013-ref.html new file mode 100644 index 00000000000..9a580350de9 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013-ref.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <!-- Test dynamic change of displaystyle --> + <math id="m1" displaystyle="true"> + <munder><mo>O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </math> + <math> + <mstyle id="m2" displaystyle="true"> + <munder><mo>O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mstyle> + </math> + <math> + <mtable id="m3" displaystyle="true"> + <mtr> + <mtd> + <munder><mo>O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mtd> + </mtr> + </mtable> + </math> + <math id="m4" displaystyle="false"> + <msub><mo>O</mo><mo>O</mo></msub> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </math> + <math> + <mstyle id="m5" displaystyle="false"> + <msub><mo>O</mo><mo>O</mo></msub> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mstyle> + </math> + <math> + <mtable id="m6" displaystyle="false"> + <mtr> + <mtd> + <msub><mo>O</mo><mo>O</mo></msub> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mtd> + </mtr> + </mtable> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013.html new file mode 100644 index 00000000000..60bc906452b --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-013.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#table-or-matrix-mtable"> + <link rel="match" href="displaystyle-013-ref.html"/> + <meta name="assert" content="Test dynamic change of displaystyle"> + <script type="text/javascript"> + function doTest() { + document.body.offsetTop; // Update layout + document.getElementById("m1").setAttribute("displaystyle", "true"); + document.getElementById("m2").setAttribute("displaystyle", "true"); + document.getElementById("m3").setAttribute("displaystyle", "true"); + document.getElementById("m4").removeAttribute("displaystyle"); + document.getElementById("m5").removeAttribute("displaystyle"); + document.getElementById("m6").removeAttribute("displaystyle"); + document.documentElement.removeAttribute("class"); + } + window.addEventListener("load", function() { + // Delay the check to workaround WebKit's bug https://webkit.org/b/174030. + requestAnimationFrame(() => { document.fonts.ready.then(doTest); }); + }); + </script> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <math id="m1"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </math> + <math> + <mstyle id="m2"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mstyle> + </math> + <math> + <mtable id="m3"> + <mtr> + <mtd> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mtd> + </mtr> + </mtable> + </math> + <math id="m4" displaystyle="true"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </math> + <math> + <mstyle id="m5" displaystyle="true"> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mstyle> + </math> + <math> + <mtable id="m6" displaystyle="true"> + <mtr> + <mtd> + <munder><mo movablelimits="true">O</mo><mo>O</mo></munder> + <mfrac><mn>1</mn><mn>2</mn></mfrac> + </mtd> + </mtr> + </mtable> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014-ref.html new file mode 100644 index 00000000000..085e2c429da --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014-ref.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <!-- See https://bugzilla.mozilla.org/show_bug.cgi?id=832800 --> + <math> + <mstyle displaystyle="true"> + <mfrac> + <mrow> + <mn>X</mn> + <mo id="mathOperator" mathbackground="red">+</mo> + <mfrac> + <mrow><mn>X</mn></mrow> + <mrow><mn>X</mn></mrow> + </mfrac> + </mrow> + <mrow> + <mn>X</mn> + </mrow> + </mfrac> + </mstyle> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014.html new file mode 100644 index 00000000000..5f30f534e5e --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-014.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html class="reftest-wait"> + <head> + <title>displaystyle</title> + <meta charset="utf-8"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#fractions-mfrac"> + <link rel="match" href="displaystyle-014-ref.html"/> + <meta name="assert" content="Test dynamic change of mathbackground on an operator does not interfer with its displaystyle"> + <script type="text/javascript"> + function doTest() { + document.body.offsetTop; // Update layout + document.getElementById('mathOperator'). + setAttribute('mathbackground', 'red'); + document.documentElement.removeAttribute("class"); + } + window.addEventListener("load", function() { + // Delay the check to workaround WebKit's bug https://webkit.org/b/174030. + requestAnimationFrame(() => { document.fonts.ready.then(doTest); }); + }); + </script> + <link rel="stylesheet" href="/fonts/ahem.css"> + <style> + math { + font: 25px Ahem; + } + </style> + </head> + <body> + + <!-- See https://bugzilla.mozilla.org/show_bug.cgi?id=832800 --> + <math> + <mstyle displaystyle="true"> + <mfrac> + <mrow> + <mn>X</mn> + <mo id="mathOperator">+</mo> + <mfrac> + <mrow><mn>X</mn></mrow> + <mrow><mn>X</mn></mrow> + </mfrac> + </mrow> + <mrow> + <mn>X</mn> + </mrow> + </mfrac> + </mstyle> + </math> + + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015-ref.html new file mode 100644 index 00000000000..2e375c68865 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015-ref.html @@ -0,0 +1,58 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>displaystyle and display</title> + </head> + <body> + <math> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </math> + <math displaystyle="true"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </math> + <math display="inline" displaystyle="true"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </math> + <math display="block" displaystyle="true"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </math> + <math displaystyle="false"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </math> + <math display="inline" displaystyle="false"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </math> + <math display="block" displaystyle="false"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </math> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015.html new file mode 100644 index 00000000000..df25171dbd6 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-015.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>displaystyle and display</title> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-top-level-math-element"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#underscripts-and-overscripts-munder-mover-munderover"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-fence-separator-or-accent-mo"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#operator-dictionary"> + <link rel="match" href="displaystyle-015-ref.html"/> + <meta name="assert" content="Test interaction of math@display and displaystyle on an operator with movablelimits"> + </head> + <body> + <math> + <mstyle displaystyle="false"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </mstyle> + </math> + <math> + <mstyle displaystyle="true"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </mstyle> + </math> + <math display="inline"> + <mstyle displaystyle="true"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </mstyle> + </math> + <math display="block"> + <mstyle displaystyle="true"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </mstyle> + </math> + <math> + <mstyle displaystyle="false"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </mstyle> + </math> + <math display="inline"> + <mstyle displaystyle="false"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </mstyle> + </math> + <math display="block"> + <mstyle displaystyle="false"> + <munderover> + <mo>∑</mo> + <mi>b</mi> + <mi>c</mi> + </munderover> + </mstyle> + </math> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001-notref.html new file mode 100644 index 00000000000..65e2781c5e1 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001-notref.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on mrow (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mrow mathbackground="green"> + <mtext>□■□■□■□</mtext> + </mrow> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001.html new file mode 100644 index 00000000000..48318bc6c6d --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-001.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on mrow</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#horizontally-group-sub-expressions-mrow"> +<link rel="mismatch" href="mathbackground-001-notref.html"/> +<meta name="assert" content="mathbackground on a mrow has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mrow mathbackground="red"> + <mtext>□■□■□■□</mtext> + </mrow> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002-notref.html new file mode 100644 index 00000000000..8c984c26191 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002-notref.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on mstyle (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mstyle mathbackground="green"> + <mtext>□■□■□■□</mtext> + </mstyle> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002.html new file mode 100644 index 00000000000..425488132c8 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-002.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on mstyle</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle"> +<link rel="mismatch" href="mathbackground-002-notref.html"/> +<meta name="assert" content="mathbackground on a mstyle has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mstyle mathbackground="red"> + <mtext>□■□■□■□</mtext> + </mstyle> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003-notref.html new file mode 100644 index 00000000000..b6adaa8d4e6 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003-notref.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on mtext (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mtext mathbackground="green">□■□■□■□</mtext> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003.html new file mode 100644 index 00000000000..780fdc4a7b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-003.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on mtext</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="mismatch" href="mathbackground-003-notref.html"/> +<meta name="assert" content="mathbackground on a mtext has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mtext mathbackground="red">□■□■□■□</mtext> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004-notref.html new file mode 100644 index 00000000000..75465a6c382 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004-notref.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on semantics (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <semantics mathbackground="red"> + <mtext>□■□■□■□</mtext> + </semantics> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004.html new file mode 100644 index 00000000000..3af50856015 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathbackground-004.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathbackground on semantics</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#semantics-and-presentation"> +<link rel="mismatch" href="mathbackground-004-notref.html"/> +<meta name="assert" content="mathbackground on a semantics has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <semantics mathbackground="green"> + <mtext>□■□■□■□</mtext> + </semantics> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001-notref.html new file mode 100644 index 00000000000..9bc1ba54363 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001-notref.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on mrow (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mrow mathcolor="green"> + <mtext>□■□■□■□</mtext> + </mrow> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001.html new file mode 100644 index 00000000000..5c23ff4f4a3 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-001.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on mrow</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#horizontally-group-sub-expressions-mrow"> +<link rel="mismatch" href="mathcolor-001-notref.html"/> +<meta name="assert" content="mathcolor on a mrow has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mrow mathcolor="red"> + <mtext>□■□■□■□</mtext> + </mrow> +</math> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002-notref.html new file mode 100644 index 00000000000..5f9fd2bb9b6 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002-notref.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on mstyle (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mstyle mathcolor="green"> + <mtext>□■□■□■□</mtext> + </mstyle> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002.html new file mode 100644 index 00000000000..e0c1f3883a0 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-002.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on mstyle</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#style-change-mstyle"> +<link rel="mismatch" href="mathcolor-002-notref.html"/> +<meta name="assert" content="mathcolor on a mstyle has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mstyle mathcolor="red"> + <mtext>□■□■□■□</mtext> + </mstyle> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003-notref.html new file mode 100644 index 00000000000..11e018ebc17 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003-notref.html @@ -0,0 +1,7 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on mtext (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mtext mathcolor="green">□■□■□■□</mtext> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003.html new file mode 100644 index 00000000000..8b1ed83d6cd --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-003.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on mtext</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="mismatch" href="mathcolor-003-notref.html"/> +<meta name="assert" content="mathcolor on a mtext has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <mtext mathcolor="red">□■□■□■□</mtext> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004-notref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004-notref.html new file mode 100644 index 00000000000..67a45249e52 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004-notref.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on semantics (reference)</title> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <semantics mathcolor="red"> + <mtext>□■□■□■□</mtext> + </semantics> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004.html new file mode 100644 index 00000000000..36ce0a4252e --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathcolor-004.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>mathcolor on semantics</title> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#text-mtext"> +<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#semantics-and-presentation"> +<link rel="mismatch" href="mathcolor-004-notref.html"/> +<meta name="assert" content="mathcolor on a semantics has a visual effect."> +<math xmlns="http://www.w3.org/1998/Math/MathML"> + <semantics mathcolor="green"> + <mtext>□■□■□■□</mtext> + </semantics> +</math> + diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html new file mode 100644 index 00000000000..d24fbf041af --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords-ref.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"/> + <title>mathsize and css keywords</title> + </head> + <body> + <p>Test passes if you see ten "A" of equal size:</p> + <math> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + <mtext>A</mtext> + </math> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords.html new file mode 100644 index 00000000000..9b3852d0b37 --- /dev/null +++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathsize-attribute-css-keywords.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"/> + <title>mathsize and css keywords</title> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#css-styling"> + <link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes"> + <meta name="assert" content="Verify that CSS font-size keywords are invalid for the mathsize attribute."> + <link rel="match" href="mathsize-attribute-css-keywords-ref.html"> + </head> + <body> + <p>Test passes if you see ten "A" of equal size:</p> + <math> + <mtext>A</mtext> + <mtext mathsize="xx-small">A</mtext> + <mtext mathsize="x-small">A</mtext> + <mtext mathsize="small">A</mtext> + <mtext mathsize="medium">A</mtext> + <mtext mathsize="large">A</mtext> + <mtext mathsize="x-large">A</mtext> + <mtext mathsize="xx-large">A</mtext> + <mtext mathsize="larger">A</mtext> + <mtext mathsize="smaller">A</mtext> + </math> + </body> +</html> diff --git a/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js index a4eb2871104..fd2ff888e37 100644 --- a/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js @@ -44,19 +44,19 @@ promise_test(async t => { promise_test(async t => { const root = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); const dir = await createDirectory(t, 'dir', root); - await promise_rejects(t, 'NotFoundError', dir.removeEntry("")); + await promise_rejects(t, new TypeError(), dir.removeEntry("")); }, 'removeEntry() with empty name should fail'); promise_test(async t => { const root = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); const dir = await createDirectory(t, 'dir', root); - await promise_rejects(t, 'SecurityError', dir.removeEntry(kCurrentDirectory)); + await promise_rejects(t, new TypeError(), dir.removeEntry(kCurrentDirectory)); }, `removeEntry() with "${kCurrentDirectory}" name should fail`); promise_test(async t => { const root = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); const dir = await createDirectory(t, 'dir', root); - await promise_rejects(t, 'SecurityError', dir.removeEntry(kParentDirectory)); + await promise_rejects(t, new TypeError(), dir.removeEntry(kParentDirectory)); }, `removeEntry() with "${kParentDirectory}" name should fail`); promise_test(async t => { @@ -70,7 +70,7 @@ promise_test(async t => { for (let i = 0; i < kPathSeparators.length; ++i) { const path_with_separator = `${dir_name}${kPathSeparators[i]}${file_name}`; - await promise_rejects(t, 'SecurityError', root.removeEntry(path_with_separator), + await promise_rejects(t, new TypeError(), root.removeEntry(path_with_separator), `removeEntry() must reject names containing "${kPathSeparators[i]}"`); } }, 'removeEntry() with a path separator should fail.'); diff --git a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js index 2064fc46f05..79154b058ff 100644 --- a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js @@ -58,22 +58,22 @@ promise_test(async t => { promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); - await promise_rejects(t, 'NotFoundError', dir.getDirectory("", { create: true })); - await promise_rejects(t, 'NotFoundError', dir.getDirectory("", { create: false })); + await promise_rejects(t, new TypeError(), dir.getDirectory("", { create: true })); + await promise_rejects(t, new TypeError(), dir.getDirectory("", { create: false })); }, 'getDirectory() with empty name'); promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); - await promise_rejects(t, 'SecurityError', dir.getDirectory(kCurrentDirectory)); - await promise_rejects(t, 'SecurityError', dir.getDirectory(kCurrentDirectory, { create: true })); + await promise_rejects(t, new TypeError(), dir.getDirectory(kCurrentDirectory)); + await promise_rejects(t, new TypeError(), dir.getDirectory(kCurrentDirectory, { create: true })); }, `getDirectory() with "${kCurrentDirectory}" name`); promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); const subdir = await createDirectory(t, 'subdir-name', /*parent=*/dir); - await promise_rejects(t, 'SecurityError', subdir.getDirectory(kParentDirectory)); - await promise_rejects(t, 'SecurityError', subdir.getDirectory(kParentDirectory, { create: true })); + await promise_rejects(t, new TypeError(), subdir.getDirectory(kParentDirectory)); + await promise_rejects(t, new TypeError(), subdir.getDirectory(kParentDirectory, { create: true })); }, `getDirectory() with "${kParentDirectory}" name`); promise_test(async t => { @@ -87,7 +87,7 @@ promise_test(async t => { for (let i = 0; i < kPathSeparators.length; ++i) { const path_with_separator = `${first_subdir_name}${kPathSeparators[i]}${second_subdir_name}`; - await promise_rejects(t, 'SecurityError', dir.getDirectory(path_with_separator), + await promise_rejects(t, new TypeError(), dir.getDirectory(path_with_separator), `getDirectory() must reject names containing "${kPathSeparators[i]}"`); } }, 'getDirectory(create=false) with a path separator when the directory exists'); @@ -100,7 +100,7 @@ promise_test(async t => { for (let i = 0; i < kPathSeparators.length; ++i) { const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`; - await promise_rejects(t, 'SecurityError', dir.getDirectory(path_with_separator, { create: true }), + await promise_rejects(t, new TypeError(), dir.getDirectory(path_with_separator, { create: true }), `getDirectory(true) must reject names containing "${kPathSeparators[i]}"`); } }, 'getDirectory(create=true) with a path separator'); diff --git a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js index 473cad4c9c3..fa38abbc544 100644 --- a/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js @@ -63,22 +63,22 @@ promise_test(async t => { promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); - await promise_rejects(t, 'NotFoundError', dir.getFile("", { create: true })); - await promise_rejects(t, 'NotFoundError', dir.getFile("", { create: false })); + await promise_rejects(t, new TypeError(), dir.getFile("", { create: true })); + await promise_rejects(t, new TypeError(), dir.getFile("", { create: false })); }, 'getFile() with empty name'); promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); - await promise_rejects(t, 'SecurityError', dir.getFile(kCurrentDirectory)); - await promise_rejects(t, 'SecurityError', dir.getFile(kCurrentDirectory, { create: true })); + await promise_rejects(t, new TypeError(), dir.getFile(kCurrentDirectory)); + await promise_rejects(t, new TypeError(), dir.getFile(kCurrentDirectory, { create: true })); }, `getFile() with "${kCurrentDirectory}" name`); promise_test(async t => { const dir = await FileSystemDirectoryHandle.getSystemDirectory({ type: 'sandbox' }); const subdir = await createDirectory(t, 'subdir-name', /*parent=*/dir); - await promise_rejects(t, 'SecurityError', subdir.getFile(kParentDirectory)); - await promise_rejects(t, 'SecurityError', subdir.getFile(kParentDirectory, { create: true })); + await promise_rejects(t, new TypeError(), subdir.getFile(kParentDirectory)); + await promise_rejects(t, new TypeError(), subdir.getFile(kParentDirectory, { create: true })); }, `getFile() with "${kParentDirectory}" name`); promise_test(async t => { @@ -92,7 +92,7 @@ promise_test(async t => { for (let i = 0; i < kPathSeparators.length; ++i) { const path_with_separator = `${subdir_name}${kPathSeparators[i]}${file_name}`; - await promise_rejects(t, 'SecurityError', dir.getFile(path_with_separator), + await promise_rejects(t, new TypeError(), dir.getFile(path_with_separator), `getFile() must reject names containing "${kPathSeparators[i]}"`); } }, 'getFile(create=false) with a path separator when the file exists.'); @@ -105,7 +105,7 @@ promise_test(async t => { for (let i = 0; i < kPathSeparators.length; ++i) { const path_with_separator = `${subdir_name}${kPathSeparators[i]}file_name`; - await promise_rejects(t, 'SecurityError', dir.getFile(path_with_separator, { create: true }), + await promise_rejects(t, new TypeError(), dir.getFile(path_with_separator, { create: true }), `getFile(true) must reject names containing "${kPathSeparators[i]}"`); } }, 'getFile(create=true) with a path separator'); diff --git a/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html b/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html index 2978226f3cc..da30fef0019 100644 --- a/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html +++ b/tests/wpt/web-platform-tests/payment-request/MerchantValidationEvent/constructor.https.html @@ -80,6 +80,20 @@ test(() => { }, "Relative validationURLs use the document as the base."); test(() => { + const validationURL = "pass"; + const base = document.createElement("base"); + base.href = "https://pass.com"; + document.head.append(base); + const event = new MerchantValidationEvent("test", { validationURL }); + try { + assert_idl_attribute(event, "validationURL"); + assert_equals(event.validationURL, "https://pass.com/pass"); + } finally { + base.remove(); + } +}, "Relative validationURLs use the document.baseURI as the base."); + +test(() => { const methodName = "https://pass.com"; const event = new MerchantValidationEvent("test", { methodName }); assert_idl_attribute(event, "methodName"); diff --git a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js index 83bd6b8a0de..9722f8ee570 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js +++ b/tests/wpt/web-platform-tests/resources/chromium/nfc-mock.js @@ -273,13 +273,11 @@ var WebNFCTest = (() => { this.watchers_.push({id: id, options: options}); // Triggers onWatch if the new watcher matches existing messages - if (this.reading_messages_.length !== 0) { - for(let message of this.reading_messages_) { - if (matchesWatchOptions(message.message, - message.compatibility, options)) { - this.client_.onWatch([id], fake_tag_serial_number, - toMojoNDEFMessage(message.message)); - } + for (let message of this.reading_messages_) { + if (matchesWatchOptions( + message.message, message.compatibility, options)) { + this.client_.onWatch( + [id], fake_tag_serial_number, toMojoNDEFMessage(message.message)); } } @@ -362,13 +360,12 @@ var WebNFCTest = (() => { this.reading_messages_.push({message: message, compatibility: toMojoNDEFCompatibility(compatibility)}); // Triggers onWatch if the new message matches existing watchers - if (this.watchers_.length !== 0) { - for (let watcher of this.watchers_) { - if (matchesWatchOptions(message, - message.compatibility, watcher.options)) { - this.client_.onWatch([watcher.id], fake_tag_serial_number, - toMojoNDEFMessage(message.message)); - } + for (let watcher of this.watchers_) { + if (matchesWatchOptions( + message, message.compatibility, watcher.options)) { + this.client_.onWatch( + [watcher.id], fake_tag_serial_number, + toMojoNDEFMessage(message.message)); } } } diff --git a/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js b/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js index 4c89463dcd2..ee8f082b874 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js +++ b/tests/wpt/web-platform-tests/resources/chromium/web-bluetooth-test.js @@ -82,6 +82,7 @@ class FakeBluetooth { this.fake_bluetooth_ptr_ = new bluetooth.mojom.FakeBluetoothPtr(); Mojo.bindInterface(bluetooth.mojom.FakeBluetooth.name, mojo.makeRequest(this.fake_bluetooth_ptr_).handle, 'process'); + this.fake_central_ = null; } // Set it to indicate whether the platform supports BLE. For example, @@ -105,12 +106,16 @@ class FakeBluetooth { // See Bluetooth 4.2 Vol 3 Part C 2.2.2 "Roles when Operating over an // LE Physical Transport". async simulateCentral({state}) { + if (this.fake_central_) + throw 'simulateCentral() should only be called once'; + await this.setLESupported(true); let {fakeCentral: fake_central_ptr} = await this.fake_bluetooth_ptr_.simulateCentral( toMojoCentralState(state)); - return new FakeCentral(fake_central_ptr); + this.fake_central_ = new FakeCentral(fake_central_ptr); + return this.fake_central_; } // Returns true if there are no pending responses. @@ -202,6 +207,16 @@ class FakeCentral { return this.fetchOrCreatePeripheral_(scanResult.deviceAddress); } + // Simulates a change in the central device described by |state|. For example, + // setState('powered-off') can be used to simulate the central device powering + // off. + // + // This method should be used for any central state changes after + // simulateCentral() has been called to create a FakeCentral object. + async setState(state) { + await this.fake_central_ptr_.setState(toMojoCentralState(state)); + } + // Create a fake_peripheral object from the given address. fetchOrCreatePeripheral_(address) { let peripheral = this.peripherals_.get(address); diff --git a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js index 19b207ff428..bb6b0c1be55 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js +++ b/tests/wpt/web-platform-tests/resources/chromium/webxr-test.js @@ -116,7 +116,6 @@ class MockVRService { if (index >= 0) { this.runtimes_.splice(index, 1); if (this.client_) { - console.error("Notifying client"); this.client_.onDeviceChanged(); } } @@ -153,7 +152,7 @@ class MockVRService { // If there were no successful results, returns a null session. return { result: { - failureReason : device.mojom.RequestSessionResult.NO_RUNTIME_FOUND, + failureReason : device.mojom.RequestSessionError.NO_RUNTIME_FOUND, $tag : 1 } }; @@ -224,6 +223,9 @@ class MockRuntime { this.setBoundsGeometry(fakeDeviceInit.boundsCoordinates); this.setViews(fakeDeviceInit.views); + + // Need to support webVR which doesn't have a notion of features + this.setFeatures(fakeDeviceInit.supportedFeatures || []); } // Test API methods. @@ -421,6 +423,34 @@ class MockRuntime { }; } + setFeatures(supportedFeatures) { + function convertFeatureToMojom(feature) { + switch (feature) { + case "viewer": + return device.mojom.XRSessionFeature.REF_SPACE_VIEWER; + case "local": + return device.mojom.XRSessionFeature.REF_SPACE_LOCAL; + case "local-floor": + return device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR; + case "bounded-floor": + return device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR; + case "unbounded": + return device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED; + default: + return device.mojom.XRSessionFeature.INVALID; + } + } + + this.supportedFeatures_ = []; + + for (let i = 0; i < supportedFeatures.length; i++) { + let feature = convertFeatureToMojom(supportedFeatures[i]); + if (feature !== device.mojom.XRSessionFeature.INVALID) { + this.supportedFeatures_.push(feature); + } + } + } + // These methods are intended to be used by MockXRInputSource only. addInputSource(source) { let index = this.input_sources_.indexOf(source); @@ -525,12 +555,28 @@ class MockRuntime { let clientRequest = mojo.makeRequest(this.sessionClient_); + let enabled_features = []; + for(let i = 0; i < sessionOptions.requiredFeatures.length; i++) { + if (this.supportedFeatures_.indexOf(sessionOptions.requiredFeatures[i]) !== -1) { + enabled_features.push(sessionOptions.requiredFeatures[i]); + } else { + return Promise.resolve({session: null}); + } + } + + for (let i =0; i < sessionOptions.optionalFeatures.length; i++) { + if (this.supportedFeatures_.indexOf(sessionOptions.optionalFeatures[i]) !== -1) { + enabled_features.push(sessionOptions.optionalFeatures[i]); + } + } + return Promise.resolve({ session: { submitFrameSink: submit_frame_sink, dataProvider: dataProviderPtr, clientRequest: clientRequest, - displayInfo: this.displayInfo_ + displayInfo: this.displayInfo_, + enabledFeatures: enabled_features, } }); } else { diff --git a/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment-target.html b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment-target.html new file mode 100644 index 00000000000..724132fab29 --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment-target.html @@ -0,0 +1,22 @@ +<!doctype html> +<title>Navigating to a text fragment anchor</title> +<script> +function checkScroll() { + let bc = new BroadcastChannel('scroll-to-text-fragment'); + bc.postMessage({ didScrollToTarget: window.scrollY > 0 }); + bc.close(); + window.close(); +} +</script> +<style> + body { + height: 3200px; + } + p { + position: absolute; + top: 3000px; + } +</style> +<body onload="checkScroll()"> + <p id="text">This is a test page</p> +</body> diff --git a/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment.html b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment.html new file mode 100644 index 00000000000..eaab1843706 --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-to-text-fragment/scroll-to-text-fragment.html @@ -0,0 +1,38 @@ +<!doctype html> +<title>Navigating to a text fragment anchor</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script> +let test_cases = [ + { fragment: '#', expect_scroll: false }, + { fragment: '##targetText=test', expect_scroll: true }, + { fragment: '##targetText=this,page', expect_scroll: true }, + { fragment: '##targetText=this-,is,test', expect_scroll: true }, + { fragment: '##targetText=this-,is,test,-page', expect_scroll: true }, + { fragment: '##targetText=this-,is,page,-none', expect_scroll: false }, + { fragment: '##targetText=this,test,-page', expect_scroll: true }, + { fragment: '##targetText=this%20is%20a%20test%20page', expect_scroll: true }, + { fragment: '##targetText=this&targetText=test,page', expect_scroll: true }, + { fragment: '#pagestate##targetText=test', expect_scroll: true }, + { fragment: '#pagestate##targetText=nomatch', expect_scroll: false }, +]; + +for (const test_case of test_cases) { + promise_test(t => new Promise(resolve => { + let channel = new BroadcastChannel('scroll-to-text-fragment'); + channel.addEventListener("message", e => { + resolve(e.data.didScrollToTarget); + }, {once: true}); + + test_driver.bless('Open a URL with a text fragment anchor', () => { + window.open('scroll-to-text-fragment-target.html' + test_case.fragment, '_blank', 'noopener'); + }); + }).then(scroll => { + assert_equals(scroll, test_case.expect_scroll, + 'Expected ' + test_case.fragment + (test_case.expect_scroll ? ' to scroll.' : ' to not scroll.')); + }), 'Test navigation with text fragment anchor ' + test_case.fragment); +} +</script> diff --git a/tests/wpt/web-platform-tests/selection/toString-ff-bug-001.html b/tests/wpt/web-platform-tests/selection/toString-ff-bug-001.html new file mode 100644 index 00000000000..985be73b5ca --- /dev/null +++ b/tests/wpt/web-platform-tests/selection/toString-ff-bug-001.html @@ -0,0 +1,23 @@ +<!doctype html> +<title>Can serialize a range which starts at the end of an element</title> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1571517"> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<table> + <tr> + <td id="left">Foo</td> + <td id="right">Hello</td> + </tr> +</table> +<script> +test(function() { + let s = getSelection(); + let r = new Range(); + r.setStart(document.getElementById("left"), 1); + r.setEnd(document.getElementById("right").firstChild, 4); + s.addRange(r); + assert_equals(s.toString().trim(), "Hell"); +}, "Can serialize a range which starts at the end of an element"); +</script> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-frozen.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-frozen.https.html new file mode 100644 index 00000000000..ef27ac3d372 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-frozen.https.html @@ -0,0 +1,103 @@ +<!DOCTYPE html> +<title>Service Worker: Clients.matchAll</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/test-helpers.sub.js"></script> +<script> +var scope = 'resources/clients-frame-freeze.html'; +var windows = []; +var expected_window_1 = + {visibilityState: 'visible', focused: false, lifecycleState: "frozen", url: new URL(scope + '#1', location).toString(), type: 'window', frameType: 'top-level'}; +var expected_window_2 = + {visibilityState: 'visible', focused: false, lifecycleState: "active", url: new URL(scope + '#2', location).toString(), type: 'window', frameType: 'top-level'}; +function with_window(url, name) { + return new Promise(function(resolve) { + var child = window.open(url, name); + window.onmessage = () => {resolve(child)}; + }); +} + +promise_test(function(t) { + return service_worker_unregister_and_register( + t, 'resources/clients-matchall-worker.js', scope) + .then(function(registration) { + t.add_cleanup(function() { + return service_worker_unregister(t, scope); + }); + + return wait_for_state(t, registration.installing, 'activated'); + }) + .then(function() { return with_window(scope + '#1', 'Child 1'); }) + .then(function(window1) { + windows.push(window1); + return with_window(scope + '#2', 'Child 2'); + }) + .then(function(window2) { + windows.push(window2); + return new Promise(function(resolve) { + window.onmessage = resolve; + windows[0].postMessage('freeze'); + }); + }) + .then(function() { + var channel = new MessageChannel(); + + return new Promise(function(resolve) { + channel.port1.onmessage = resolve; + windows[1].navigator.serviceWorker.controller.postMessage( + {port:channel.port2, includeLifecycleState: true}, [channel.port2]); + }); + }) + .then(function(e) { + assert_equals(e.data.length, 1); + assert_object_equals(e.data[0], expected_window_2); + }) + .then(function() { + var channel = new MessageChannel(); + + return new Promise(function(resolve) { + channel.port1.onmessage = resolve; + windows[1].navigator.serviceWorker.controller.postMessage( + {port:channel.port2, options: {lifecycleState: "all"}, includeLifecycleState: true}, [channel.port2]); + }); + }) + .then(function(e) { + assert_equals(e.data.length, 2); + // No specific order is required, so support inversion. + if (e.data[0][3] == new URL(scope + '#2', location)) { + assert_object_equals(e.data[0], expected_window_2); + assert_object_equals(e.data[1], expected_window_1); + } else { + assert_object_equals(e.data[0], expected_window_1); + assert_object_equals(e.data[1], expected_window_2); + } + }) + .then(function() { + var channel = new MessageChannel(); + + return new Promise(function(resolve) { + channel.port1.onmessage = resolve; + windows[1].navigator.serviceWorker.controller.postMessage( + {port:channel.port2, options: {lifecycleState: "frozen"}, includeLifecycleState: true}, [channel.port2]); + }); + }) + .then(function(e) { + assert_equals(e.data.length, 1); + assert_object_equals(e.data[0], expected_window_1); + }) + .then(function() { + var channel = new MessageChannel(); + + return new Promise(function(resolve) { + channel.port1.onmessage = resolve; + windows[1].navigator.serviceWorker.controller.postMessage( + {port:channel.port2, options: {lifecycleState: "active"}, includeLifecycleState: true}, [channel.port2]); + }); + }) + .then(function(e) { + assert_equals(e.data.length, 1); + assert_object_equals(e.data[0], expected_window_2); + }); +}, 'Test Clients.matchAll()'); + +</script> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-frame-freeze.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-frame-freeze.html new file mode 100644 index 00000000000..7468a660e90 --- /dev/null +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-frame-freeze.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script> + document.addEventListener('freeze', () => { + opener.postMessage('frozen', "*"); + }); + + window.onmessage = (e) => { + if (e.data == 'freeze') { + test_driver.freeze(); + } + }; + opener.postMessage('loaded', '*'); +</script> diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js index d6634f4d40e..13e111a2f91 100644 --- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js +++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/clients-matchall-worker.js @@ -13,11 +13,20 @@ self.onmessage = function(e) { // In that case, just pretend it's top-level! frame_type = 'top-level'; } - message.push([client.visibilityState, - client.focused, - client.url, - client.type, - frame_type]); + if (e.data.includeLifecycleState) { + message.push({visibilityState: client.visibilityState, + focused: client.focused, + url: client.url, + lifecycleState: client.lifecycleState, + type: client.type, + frameType: frame_type}); + } else { + message.push([client.visibilityState, + client.focused, + client.url, + client.type, + frame_type]); + } }); // Sort by url if (!e.data.disableSort) { diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py index 062c6a42d0f..7397de7fb89 100644 --- a/tests/wpt/web-platform-tests/tools/lint/lint.py +++ b/tests/wpt/web-platform-tests/tools/lint/lint.py @@ -389,6 +389,7 @@ regexps = [item() for item in # type: ignore rules.GenerateTestsRegexp, rules.PrintRegexp, rules.LayoutTestsRegexp, + rules.MissingDepsRegexp, rules.SpecialPowersRegexp]] def check_regexp_line(repo_root, path, f): diff --git a/tests/wpt/web-platform-tests/tools/lint/rules.py b/tests/wpt/web-platform-tests/tools/lint/rules.py index 9b78f3495b2..f354a33fa49 100644 --- a/tests/wpt/web-platform-tests/tools/lint/rules.py +++ b/tests/wpt/web-platform-tests/tools/lint/rules.py @@ -350,6 +350,13 @@ class LayoutTestsRegexp(Regexp): file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"] description = "eventSender/testRunner/internals used; these are LayoutTests-specific APIs (WebKit/Blink)" +class MissingDepsRegexp(Regexp): + pattern = br"[^\w]/gen/" + name = "MISSING DEPENDENCY" + file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"] + description = "Chromium-specific content referenced" + to_fix = "Reimplement the test to use well-documented testing interfaces" + class SpecialPowersRegexp(Regexp): pattern = b"SpecialPowers" name = "SPECIALPOWERS API" diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py b/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py index 31456ae8bbc..b3a83fe5f30 100644 --- a/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py +++ b/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py @@ -203,6 +203,36 @@ def test_internals(): 1)] +def test_missing_deps(): + error_map = check_with_files(b"<script src='/gen/foo.js'></script>") + + for (filename, (errors, kind)) in error_map.items(): + check_errors(errors) + + if kind == "python": + assert errors == [("PARSE-FAILED", "Unable to parse file", filename, 1)] + else: + assert errors == [('MISSING DEPENDENCY', + 'Chromium-specific content referenced', + filename, + 1)] + + +def test_no_missing_deps(): + error_map = check_with_files(b"""<head> +<script src='/foo/gen/foo.js'></script> +<script src='/gens/foo.js'></script> +</head>""") + + for (filename, (errors, kind)) in error_map.items(): + check_errors(errors) + + if kind == "python": + assert errors == [("PARSE-FAILED", "Unable to parse file", filename, 1)] + else: + assert errors == [] + + def test_meta_timeout(): code = b""" <html xmlns="http://www.w3.org/1999/xhtml"> diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py index 0943ee9f3d7..b905379c754 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py @@ -581,25 +581,25 @@ class Chrome(Browser): return m.group(1) -class ChromeAndroid(Browser): - """Chrome-specific interface for Android. +class ChromeAndroidBase(Browser): + """A base class for ChromeAndroid and AndroidWebView. + On Android, WebView is based on Chromium open source project, and on some + versions of Android we share the library with Chrome. Therefore, we have + a very similar WPT runner implementation. Includes webdriver installation. """ - - product = "chrome_android" - requirements = "requirements_chrome_android.txt" + __metaclass__ = ABCMeta # This is an abstract class. def __init__(self, logger): - super(ChromeAndroid, self).__init__(logger) + super(ChromeAndroidBase, self).__init__(logger) def install(self, dest=None, channel=None): raise NotImplementedError + @abstractmethod def find_binary(self, venv_path=None, channel=None): - if channel in ("beta", "dev", "canary"): - return "com.chrome." + channel - return "com.android.chrome" + raise NotImplementedError def find_webdriver(self, channel=None): return find_executable("chromedriver") @@ -629,6 +629,49 @@ class ChromeAndroid(Browser): return match.group(1) +class ChromeAndroid(ChromeAndroidBase): + """Chrome-specific interface for Android. + """ + + product = "chrome_android" + requirements = "requirements_chrome_android.txt" + + def find_binary(self, venv_path=None, channel=None): + if channel in ("beta", "dev", "canary"): + return "com.chrome." + channel + return "com.android.chrome" + + +class AndroidWebview(ChromeAndroidBase): + """Webview-specific interface for Android. + + Design doc: + https://docs.google.com/document/d/19cGz31lzCBdpbtSC92svXlhlhn68hrsVwSB7cfZt54o/view + """ + + product = "android_webview" + requirements = "requirements_android_webview.txt" + + def find_binary(self, venv_path=None, channel=None): + # Just get the current package name of the WebView provider. + # For WebView, it is not trivial to change the WebView provider, so + # we will just grab whatever is available. + # https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/channels.md + command = ['adb', 'shell', 'dumpsys', 'webviewupdate'] + try: + output = call(*command) + except (subprocess.CalledProcessError, OSError): + self.logger.warning("Failed to call %s" % " ".join(command)) + return None + m = re.search(r'^\s*Current WebView package \(name, version\): \((.*), ([0-9.]*)\)$', + output, re.M) + if m is None: + self.logger.warning("Unable to find current WebView package in dumpsys output") + return None + self.logger.warning("Final package name: " + m.group(1)) + return m.group(1) + + class ChromeiOS(Browser): """Chrome-specific interface for iOS. """ diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py index 617ea7282b8..181d6bfdea9 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/run.py @@ -341,6 +341,29 @@ class ChromeiOS(BrowserSetup): raise WptrunError("Unable to locate or install chromedriver binary") +class AndroidWebview(BrowserSetup): + name = "android_webview" + browser_cls = browser.AndroidWebview + + def setup_kwargs(self, kwargs): + if kwargs["webdriver_binary"] is None: + webdriver_binary = self.browser.find_webdriver() + + if webdriver_binary is None: + install = self.prompt_install("chromedriver") + + if install: + logger.info("Downloading chromedriver") + webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path) + else: + logger.info("Using webdriver binary %s" % webdriver_binary) + + if webdriver_binary: + kwargs["webdriver_binary"] = webdriver_binary + else: + raise WptrunError("Unable to locate or install chromedriver binary") + + class Opera(BrowserSetup): name = "opera" browser_cls = browser.Opera @@ -532,6 +555,7 @@ class Epiphany(BrowserSetup): product_setup = { + "android_webview": AndroidWebview, "firefox": Firefox, "firefox_android": FirefoxAndroid, "chrome": Chrome, diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_android_webview.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_android_webview.txt new file mode 100644 index 00000000000..470aaf9a939 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_android_webview.txt @@ -0,0 +1 @@ +mozprocess==1.0.0 diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py index 18434e499dc..75ec775658c 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py @@ -22,7 +22,8 @@ All classes and functions named in the above dict must be imported into the module global scope. """ -product_list = ["chrome", +product_list = ["android_webview", + "chrome", "chrome_android", "chrome_ios", "edgechromium", diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/android_webview.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/android_webview.py new file mode 100644 index 00000000000..42ae8b64b14 --- /dev/null +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/android_webview.py @@ -0,0 +1,124 @@ +import subprocess + +from .base import Browser, ExecutorBrowser, require_arg +from .base import get_timeout_multiplier # noqa: F401 +from .chrome import executor_kwargs as chrome_executor_kwargs +from ..webdriver_server import ChromeDriverServer +from ..executors.executorwebdriver import (WebDriverTestharnessExecutor, # noqa: F401 + WebDriverRefTestExecutor) # noqa: F401 +from ..executors.executorchrome import ChromeDriverWdspecExecutor # noqa: F401 + + +__wptrunner__ = {"product": "android_webview", + "check_args": "check_args", + "browser": "SystemWebViewShell", + "executor": {"testharness": "WebDriverTestharnessExecutor", + "reftest": "WebDriverRefTestExecutor", + "wdspec": "ChromeDriverWdspecExecutor"}, + "browser_kwargs": "browser_kwargs", + "executor_kwargs": "executor_kwargs", + "env_extras": "env_extras", + "env_options": "env_options", + "timeout_multiplier": "get_timeout_multiplier"} + +_wptserve_ports = set() + + +def check_args(**kwargs): + require_arg(kwargs, "webdriver_binary") + + +def browser_kwargs(test_type, run_info_data, config, **kwargs): + return {"binary": kwargs["binary"], + "webdriver_binary": kwargs["webdriver_binary"], + "webdriver_args": kwargs.get("webdriver_args")} + + +def executor_kwargs(test_type, server_config, cache_manager, run_info_data, + **kwargs): + # Use update() to modify the global list in place. + _wptserve_ports.update(set( + server_config['ports']['http'] + server_config['ports']['https'] + + server_config['ports']['ws'] + server_config['ports']['wss'] + )) + + executor_kwargs = chrome_executor_kwargs(test_type, server_config, + cache_manager, run_info_data, + **kwargs) + del executor_kwargs["capabilities"]["goog:chromeOptions"]["prefs"] + del executor_kwargs["capabilities"]["goog:chromeOptions"]["useAutomationExtension"] + capabilities = executor_kwargs["capabilities"] + # Note that for WebView, we launch a test shell and have the test shell use WebView. + # https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/webview-shell.md + capabilities["goog:chromeOptions"]["androidPackage"] = \ + "org.chromium.webview_shell" + capabilities["goog:chromeOptions"]["androidActivity"] = ".WebPlatformTestsActivity" + + # Workaround: driver.quit() cannot quit SystemWebViewShell. + executor_kwargs["pause_after_test"] = False + # Workaround: driver.close() is not supported. + executor_kwargs["restart_after_test"] = True + executor_kwargs["close_after_done"] = False + return executor_kwargs + + +def env_extras(**kwargs): + return [] + + +def env_options(): + return {} + + +#TODO: refactor common elements of SystemWebViewShell and ChromeAndroidBrowser +class SystemWebViewShell(Browser): + """Chrome is backed by chromedriver, which is supplied through + ``wptrunner.webdriver.ChromeDriverServer``. + """ + + def __init__(self, logger, binary, webdriver_binary="chromedriver", + webdriver_args=None): + """Creates a new representation of Chrome. The `binary` argument gives + the browser binary to use for testing.""" + Browser.__init__(self, logger) + self.binary = binary + self.server = ChromeDriverServer(self.logger, + binary=webdriver_binary, + args=webdriver_args) + self.setup_adb_reverse() + + def _adb_run(self, args): + self.logger.info('adb ' + ' '.join(args)) + subprocess.check_call(['adb'] + args) + + def setup_adb_reverse(self): + self._adb_run(['wait-for-device']) + self._adb_run(['forward', '--remove-all']) + self._adb_run(['reverse', '--remove-all']) + # "adb reverse" basically forwards network connection from device to + # host. + for port in _wptserve_ports: + self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port]) + + def start(self, **kwargs): + self.server.start(block=False) + + def stop(self, force=False): + self.server.stop(force=force) + + def pid(self): + return self.server.pid + + def is_alive(self): + # TODO(ato): This only indicates the driver is alive, + # and doesn't say anything about whether a browser session + # is active. + return self.server.is_alive() + + def cleanup(self): + self.stop() + self._adb_run(['forward', '--remove-all']) + self._adb_run(['reverse', '--remove-all']) + + def executor_browser(self): + return ExecutorBrowser, {"webdriver_url": self.server.url} diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py index 588e0b2fad6..b1e86ff1fd0 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py @@ -2,6 +2,7 @@ import base64 import hashlib from six.moves.http_client import HTTPConnection import io +import json import os import threading import traceback @@ -615,15 +616,16 @@ class CallbackHandler(object): except KeyError: raise ValueError("Unknown action %s" % action) try: - action_handler(payload) + result = action_handler(payload) except Exception: self.logger.warning("Action %s failed" % action) self.logger.warning(traceback.format_exc()) self._send_message("complete", "error") raise else: - self.logger.debug("Action %s completed" % action) - self._send_message("complete", "success") + self.logger.debug("Action %s completed with result %s" % (action, result)) + return_message = {"result": result} + self._send_message("complete", "success", json.dumps(return_message)) return False, None diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js index e23073dece1..9f97fac9a0c 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testdriver-extra.js @@ -3,6 +3,7 @@ (function(){ let pending_resolve = null; let pending_reject = null; + let result = null; window.addEventListener("message", function(event) { const data = event.data; @@ -15,7 +16,8 @@ } if (data.status === "success") { - pending_resolve(); + result = JSON.parse(data.message).result + pending_resolve(result); } else { pending_reject(); } diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicy-exposed.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicy-exposed.tentative.html deleted file mode 100644 index e671c6fb61d..00000000000 --- a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicy-exposed.tentative.html +++ /dev/null @@ -1,25 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js" ></script> -<script src="/resources/testharnessreport.js"></script> -<script src="support/helper.sub.js"></script> - -<meta http-equiv="Content-Security-Policy" content="trusted-types *"> -<body> -<script> - // Not exposed policy test - test(t => { - let policy = window.TrustedTypes.createPolicy('SomeName', { createHTML: s => s } ); - assert_equals(window.TrustedTypes.getExposedPolicy('SomeName'), null); - }, "Null is returned when policy is not exposed - by default"); - - // Non-existent policy test - test(t => { - assert_equals(window.TrustedTypes.getExposedPolicy('JustAName'), null); - }, "Null is returned when policy is non-existent."); - - // Exposed policy test - test(t => { - let policy = window.TrustedTypes.createPolicy('SomeOtherName', { createHTML: s => s }, true ); - assert_equals(window.TrustedTypes.getExposedPolicy('SomeOtherName'), policy); - }, "Policy is returned when exposed == true."); -</script> diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html deleted file mode 100644 index a6dd2d1317a..00000000000 --- a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-defaultTests.tentative.html +++ /dev/null @@ -1,13 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js" ></script> -<script src="/resources/testharnessreport.js"></script> -<script src="support/helper.sub.js"></script> -<body> -<script> - //Policy name test - test(t => { - assert_throws("InvalidStateError", _ => { - let policy = window.TrustedTypes.createPolicy('default', { createHTML: s => s } ); - }); - }, "default policy has to be exposed"); -</script> diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html deleted file mode 100644 index 137d0f54c82..00000000000 --- a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-createPolicy-exposedTests.tentative.html +++ /dev/null @@ -1,26 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js" ></script> -<script src="/resources/testharnessreport.js"></script> -<script src="support/helper.sub.js"></script> - -<meta http-equiv="Content-Security-Policy" content="trusted-types *"> -<body> -<script> - // Not exposed policy test - test(t => { - let policy = window.TrustedTypes.createPolicy('SomeName', { createHTML: s => s } ); - assert_equals(window.TrustedTypes.getExposedPolicy('SomeName'), null); - }, "Null is returned when policy is not exposed - by default"); - - // Non-existent policy test - test(t => { - let policy = window.TrustedTypes.createPolicy('SomeOtherName', { createHTML: s => s } ); - assert_equals(window.TrustedTypes.getExposedPolicy('JustAName'), null); - }, "Null is returned when policy is non-existent."); - - // Exposed policy test - test(t => { - let policy = window.TrustedTypes.createPolicy('EvenSomeOtherName', { createHTML: s => s }, true ); - assert_equals(window.TrustedTypes.getExposedPolicy('EvenSomeOtherName'), policy); - }, "Policy is returned when exposed == true."); -</script> diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html new file mode 100644 index 00000000000..ea00566854d --- /dev/null +++ b/tests/wpt/web-platform-tests/trusted-types/TrustedTypePolicyFactory-defaultPolicy.tentative.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js" ></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/helper.sub.js"></script> +<body> +<script> + test(t => { + assert_equals(window.TrustedTypes.defaultPolicy, null); + }, "defaultPolicy with no default created is not an error"); + + test(t => { + let policy = window.TrustedTypes.createPolicy('default', { createHTML: s => s } ); + assert_true(policy instanceof TrustedTypePolicy); + assert_equals(policy, window.TrustedTypes.defaultPolicy); + }, "defaultPolicy returns the correct default policy"); + + test(t => { + let foo_policy = window.TrustedTypes.createPolicy('foo', { createHTML: s => s } ); + let default_policy = window.TrustedTypes.defaultPolicy; + window.TrustedTypes.defaultPolicy = foo_policy; + assert_equals(window.TrustedTypes.defaultPolicy, default_policy); + assert_not_equals(window.TrustedTypes.defaultPolicy, foo_policy); + }, "defaultPolicy is a read-only property"); +</script> diff --git a/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html b/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html index 8dda8b23c8f..16e6d2a7d8d 100644 --- a/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html +++ b/tests/wpt/web-platform-tests/trusted-types/trusted-types-reporting.tentative.https.html @@ -93,11 +93,14 @@ return p; }, "Trusted Type violation report: creating a report-only-forbidden policy."); + // policy_one is set below, and used in several tests further down. + let policy_one = null; + promise_test(t => { let p = Promise.resolve() .then(promise_violation("trusted-types two")) .then(promise_flush()); - TrustedTypes.createPolicy("one", a_policy, {exposed: true}); + policy_one = TrustedTypes.createPolicy("one", a_policy); flush(); return p; }, "Trusted Type violation report: creating a forbidden-but-not-reported policy."); @@ -114,25 +117,16 @@ return p; }, "Trusted Type violation report: assign string to html"); - // In the following tests, we rely on the previous tests to have successfully - // created an exposed, no-op policy "one". Let's briefly test that. - promise_test(t => { - assert_true(!!TrustedTypes.getExposedPolicy("one")); - return Promise.resolve(); - }, "By now, the \"one\" policy should have been created."); - promise_test(t => { let p = promise_flush()(); - document.getElementById("anchor").href = - TrustedTypes.getExposedPolicy("one").createURL("#"); + document.getElementById("anchor").href = policy_one.createURL("#"); flush(); return p; }, "Trusted Type violation report: assign trusted URL to url; no report"); promise_test(t => { let p = promise_flush()(); - document.getElementById("div").innerHTML = - TrustedTypes.getExposedPolicy("one").createHTML("abc"); + document.getElementById("div").innerHTML = policy_one.createHTML("abc"); flush(); return p; }, "Trusted Type violation report: assign trusted HTML to html; no report"); diff --git a/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js b/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js index a1d65030f02..a1d65030f02 100755..100644 --- a/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js +++ b/tests/wpt/web-platform-tests/web-animations/resources/timing-override.js diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html index 97c7214ac75..5383b520bb4 100644 --- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html +++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/pausing-an-animation.html @@ -66,7 +66,7 @@ promise_test(async t => { await animation.ready; // If the current time was updated using the new playback rate it will jump // back to 25s but if we correctly used the old playback rate the current time - // will be >50s. + // will be > 50s. assert_greater_than(animation.currentTime, 50 * MS_PER_SEC); }, 'A pause-pending animation maintains the current time when applying a' + ' pending playback rate'); diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html index 24d5046f483..6515a7fdd02 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFMessage_constructor.https.html @@ -28,8 +28,8 @@ 'toText() contains the same text content'); assert_equals(message.records[0].toArrayBuffer(), null, 'toArrayBuffer() returns null'); - assert_equals(message.records[0].toJSON(), undefined, - 'toJSON() returns undefined'); + assert_equals(message.records[0].toJSON(), null, + 'toJSON() returns null'); }, 'NDEFMessage constructor with a text record'); </script> diff --git a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html index 2264815780b..4d6ec956eac 100644 --- a/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html +++ b/tests/wpt/web-platform-tests/web-nfc/NDEFRecord_constructor.https.html @@ -15,9 +15,9 @@ const record = new NDEFRecord(null); assert_equals(record.recordType.length, 0, 'empty recordType'); assert_equals(record.mediaType.length, 0, 'empty mediaType'); - assert_equals(record.toText().length, 0, 'toText() gets an empty string'); + assert_equals(record.toText(), null, 'toText() returns null'); assert_equals(record.toArrayBuffer(), null, 'toArrayBuffer() returns null'); - assert_equals(record.toJSON(), undefined, 'toJSON() returns undefined'); + assert_equals(record.toJSON(), null, 'toJSON() returns null'); }, 'NDEFRecord constructor with null init dict'); test(() => { diff --git a/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js b/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js index 76c878ae094..02f348ddf27 100644 --- a/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js +++ b/tests/wpt/web-platform-tests/web-nfc/resources/nfc-helpers.js @@ -165,8 +165,8 @@ function assertWebNDEFMessagesEqual(message, expectedMessage) { expectedJson = expectedRecord.toJSON(); } catch (e) { } - if (json === undefined) - assert_equals(expectedJson, undefined); + if (json === undefined || json === null) + assert_equals(json, expectedJson); else assert_object_equals(json, expectedJson); } diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html new file mode 100644 index 00000000000..bcd2dd2942c --- /dev/null +++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line-ref.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<title>Reference for WebVTT rendering, set explicit 'line' and 'position', which will force 'snap-to-line' to false</title> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> +<style> +html { overflow:hidden } +body { margin:0 } +.video { + display: inline-block; + width: 320px; + height: 180px; + position: relative; +} +.cue { + position: absolute; + top: 90px; + left: 160px; + text-align: center; + font: 20px/1 Ahem; +} +.cueText { + background: rgba(0,0,0,0.8); + color: green; +} +</style> +<div class=video> + <div class="cue"> + <span class="cueText">foo</span> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html new file mode 100644 index 00000000000..f3705a1879b --- /dev/null +++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>WebVTT rendering, set explicit 'line' and 'position', which will force 'snap-to-line' to false</title> +<link rel="match" href="snap-to-line-ref.html"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> +<style> +html { overflow:hidden } +body { margin:0 } +::cue { + font: 20px/1 Ahem; + color: green; +} +</style> +<script src="/common/reftest-wait.js"></script> +<video width="320" height="180" autoplay onplaying="this.onplaying = null; this.pause(); takeScreenshot();"> + <source src="/media/white.webm" type="video/webm"> + <source src="/media/white.mp4" type="video/mp4"> + <track src="support/snap-to-line.vtt"> + <script> + document.getElementsByTagName('track')[0].track.mode = 'showing'; + </script> +</video> +</html> diff --git a/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt new file mode 100644 index 00000000000..2d102812eeb --- /dev/null +++ b/tests/wpt/web-platform-tests/webvtt/rendering/cues-with-video/processing-model/support/snap-to-line.vtt @@ -0,0 +1,5 @@ +WEBVTT + +NOTE set line as percentage would make 'snap-to-line' to false +00:00:00.000 --> 00:00:05.000 align:start position:50%,line-left line:50%,start +foo diff --git a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js index a0b0e278a87..e0330b80f53 100644 --- a/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js +++ b/tests/wpt/web-platform-tests/webxr/resources/webxr_test_constants.js @@ -112,16 +112,26 @@ const NON_IMMERSIVE_VIEWS = [{ } ]; +const ALL_FEATURES = [ + "viewer", + "local", + "local-floor", + "bounded-floor", + "unbounded", +]; + const TRACKED_IMMERSIVE_DEVICE = { supportsImmersive: true, views: VALID_VIEWS, - viewerOrigin: IDENTITY_TRANSFORM + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES }; const VALID_NON_IMMERSIVE_DEVICE = { supportsImmersive: false, views: NON_IMMERSIVE_VIEWS, - viewerOrigin: IDENTITY_TRANSFORM + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES }; const VALID_CONTROLLER = { diff --git a/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html b/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html index 1d7ad93695a..812acf457c1 100644 --- a/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrBoundedReferenceSpace_updates.https.html @@ -14,7 +14,8 @@ let fakeDeviceInitParams = { supportsImmersive: true, views: VALID_VIEWS, viewerOrigin: IDENTITY_TRANSFORM, - floorOrigin: VALID_FLOOR_ORIGIN + floorOrigin: VALID_FLOOR_ORIGIN, + supportedFeatures: ALL_FEATURES }; let testFunction = function(session, fakeDeviceController, t) { diff --git a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html index 516df836b1b..fd5fa68e1fc 100644 --- a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffset.https.html @@ -29,7 +29,8 @@ const VIEWS_WITH_OFFSET = [{ let fakeDeviceInitParams = { supportsImmersive: true, viewerOrigin: VALID_POSE_TRANSFORM, - views: VIEWS_WITH_OFFSET + views: VIEWS_WITH_OFFSET, + supportedFeatures: ALL_FEATURES }; let testFunction = diff --git a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html index d0f91a4630d..5e2bd39d2de 100644 --- a/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrReferenceSpace_originOffsetBounded.https.html @@ -37,6 +37,7 @@ const fakeDeviceInitParams = { views: VIEWS_WITH_OFFSET, viewerOrigin: IDENTITY_TRANSFORM, floorOrigin: FLOOR_TRANSFORM, + supportedFeatures: ALL_FEATURES, boundsCoordinates: [ { x: 1, z: -1.5 }, { x: 1, z: 1.5 }, diff --git a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html index d014fe6fb56..57c7ef1853e 100644 --- a/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrRigidTransform_sameObject.https.html @@ -22,11 +22,14 @@ let testFunction = let position = transform.position; let orientation = transform.orientation; + let matrix = transform.matrix; t.step(() => { assert_equals(position, transform.position, "XRRigidTransform.position returns the same object."); assert_equals(orientation, transform.orientation, "XRRigidTransform.orientation returns the same object."); + assert_equals(matrix, transform.matrix, + "XRRigidTransform.matrix returns the same object."); }); resolve(); diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_features_deviceSupport.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_features_deviceSupport.https.html new file mode 100644 index 00000000000..45a68c9df2f --- /dev/null +++ b/tests/wpt/web-platform-tests/webxr/xrSession_features_deviceSupport.https.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<body> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> +<canvas></canvas> +<script> + + let testName = + "Immersive XRSession requests with no supported device should reject"; + + let fakeDeviceInitParams = { + supportsImmersive: true, + views: VALID_VIEWS, + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: [ + "viewer", + "local", + "local-floor"] + }; + + xr_promise_test(testName, + (t) => { + function session_resolves(sessionMode, sessionInit) { + return navigator.xr.requestSession(sessionMode, sessionInit) + .then((session) => { + return session.end(); + }); + } + + return navigator.xr.test.simulateDeviceConnection(fakeDeviceInitParams) + .then((controller) => new Promise((resolve, reject) => { + navigator.xr.test.simulateUserActivation(() => { + // Attempting to request required features that aren't supported by + // the device should reject. + promise_rejects(t, "NotSupportedError", + navigator.xr.requestSession("immersive-vr", { + requiredFeatures: ['bounded-floor'] + })) + .then(() => { + // Attempting to request with an unsupported feature as optional + // should succeed + return session_resolves("immersive-vr", { + optionalFeatures: ['bounded-floor'] + }); + }) + .then(() => { + // Attempting to request with supported features only should succeed. + return session_resolves("immersive-vr", { + requiredFeatures: ['local', 'local-floor'] + }) + .then(() => { + resolve(); + }).catch((err) => { + reject(err); + });; + }); + }); + })); + }); + +</script> +</body> diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html index 9ddc36e95b3..70e9d6e6e59 100644 --- a/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html @@ -16,7 +16,8 @@ let fakeDeviceInitParams = { supportsImmersive: true, - views: VALID_VIEWS + views: VALID_VIEWS, + supportedFeatures: ALL_FEATURES }; // A valid pose matrix/transform for when we don't care about specific values diff --git a/tests/wpt/web-platform-tests/webxr/xrSession_viewer_availability.https.html b/tests/wpt/web-platform-tests/webxr/xrSession_viewer_availability.https.html new file mode 100644 index 00000000000..686859166fe --- /dev/null +++ b/tests/wpt/web-platform-tests/webxr/xrSession_viewer_availability.https.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<body> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> +<canvas></canvas> +<script> + + let testName = + "Inline viewer support wtih no device"; + + // Purposefully not connecting a device to ensure that viewer is always + // supported if that is the only feature requested. + xr_promise_test(testName, + (t) => { + function session_resolves(sessionMode, sessionInit) { + return navigator.xr.requestSession(sessionMode, sessionInit) + .then((session) => { + return session.end(); + }); + } + + // RequestSession with explicit request for the viewer space should succeed. + return session_resolves('inline', { + requiredFeatures: ['viewer'] + }) + .then(() => { + // RequestSession with no requirements should succeed. + return session_resolves('inline', {}); + }) + .then(() => { + // RequestSession with unsupported optional features should succeed. + return session_resolves('inline', { + requiredFeatures: ['viewer'], + optionalFeatures: ['local'] + }) + }) + .then(() => { + // Request with unsupported required features should reject. + return promise_rejects(t, "NotSupportedError", + navigator.xr.requestSession('inline', { + requiredFeatures: ['local'] + })); + }); + }); + +</script> +</body> diff --git a/tests/wpt/web-platform-tests/webxr/xrView_match.https.html b/tests/wpt/web-platform-tests/webxr/xrView_match.https.html index 142f272d36f..9ccad9518b9 100644 --- a/tests/wpt/web-platform-tests/webxr/xrView_match.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrView_match.https.html @@ -26,7 +26,8 @@ const fakeViews = [{ let fakeDeviceInitParams = { supportsImmersive: true, views: fakeViews, - viewerOrigin: IDENTITY_TRANSFORM + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES }; let testFunction = function(session, fakeDeviceController, t) { diff --git a/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html b/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html index 9404fcb8aaf..4386433788c 100644 --- a/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html +++ b/tests/wpt/web-platform-tests/webxr/xrView_oneframeupdate.https.html @@ -27,7 +27,8 @@ const fakeViews = [{ let fakeDeviceInitParams = { supportsImmersive: true, views: fakeViews, - viewerOrigin: IDENTITY_TRANSFORM + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES }; let testFunction = function(session, fakeDeviceController, t) { |