aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini2
-rw-r--r--tests/wpt/metadata/MANIFEST.json88
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini4
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini4
-rw-r--r--tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini4
-rw-r--r--tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini3
-rw-r--r--tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/content-type/response.window.js.ini15
-rw-r--r--tests/wpt/metadata/fetch/content-type/script.window.js.ini5
-rw-r--r--tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini4
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini (renamed from tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini)2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html.ini4
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini1
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini3
-rw-r--r--tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html.ini6
-rw-r--r--tests/wpt/metadata/webmessaging/without-ports/017.html.ini5
-rw-r--r--tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid/placement/grid-placement-using-named-grid-lines-003.html27
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html11
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute.html19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/original-crossorigin-applied.sub.html42
-rw-r--r--tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js15
-rw-r--r--tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html7
-rw-r--r--tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html2
-rw-r--r--tests/wpt/web-platform-tests/portals/portal-activate-data.html16
-rw-r--r--tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html4
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.js74
-rw-r--r--tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html34
-rw-r--r--tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html8
-rw-r--r--tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js22
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/pr_preview.py9
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py47
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py50
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py72
-rw-r--r--tests/wpt/web-platform-tests/url/resources/urltestdata.json45
-rw-r--r--tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js6
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/document-timeline-phases.tentative.html19
-rw-r--r--tests/wpt/web-platform-tests/webauthn/helpers.js36
43 files changed, 557 insertions, 204 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 d4f62ed7113..faa00f45ecf 100644
--- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
+++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini
@@ -7,7 +7,7 @@
expected: FAIL
[Opening a blob URL in a new window immediately before revoking it works.]
- expected: FAIL
+ expected: TIMEOUT
[Opening a blob URL in a noopener about:blank window immediately before revoking it works.]
expected: TIMEOUT
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 38ead3071d5..548eb63cd89 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -17305,7 +17305,7 @@
]
},
"rejects_if_not_active-manual.https.html": [
- "d03032d0498fc482a7ab45d42f291daf2dcdf59d",
+ "8e214cb6094a25436374da984deaade660ccc191",
[
null,
{}
@@ -143222,6 +143222,19 @@
],
{}
]
+ ],
+ "grid-placement-using-named-grid-lines-003.html": [
+ "31173e0a455a04156ca8755779d7a2ae4b24b103",
+ [
+ null,
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
},
"subgrid": {
@@ -225921,6 +225934,19 @@
],
{}
]
+ ],
+ "iframe-scrolling-attribute.html": [
+ "cc7df7b43a06219350f14ad007cbc649e5cc0046",
+ [
+ null,
+ [
+ [
+ "/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
]
}
},
@@ -320319,6 +320345,10 @@
"c907a119f8b786aa070c2d1951670c56060a2d64",
[]
],
+ "iframe-scrolling-attribute-ref.html": [
+ "fe72b9f9380fecfa75f1477541d0e1513c0cbd12",
+ []
+ ],
"support": {
"body-marginwidth-marginheight.html": [
"5d825e3455664970097b913146b4b51669bf8e58",
@@ -328823,7 +328853,7 @@
[]
],
"app-respond-with-minimal-ui.js": [
- "0e6b1b78b9197d8d1582c8eb70bbcc15ba3861c4",
+ "45ac57c2279b1136322001bfd42e827378a2e776",
[]
],
"app-supports-shipping-contact-delegation.js": [
@@ -338125,7 +338155,7 @@
[]
],
"testharness.js": [
- "0ec232c1d27d792b1dc000a9cf7899e011217698",
+ "ce043a287f758338e1564e86bc6908ce8388638e",
[]
],
"testharness.js.headers": [
@@ -341996,7 +342026,7 @@
},
"styling": {
"presentation-attributes.js": [
- "552041496f187e97b4e17bfa445826d8cd278b99",
+ "7bf77cb77bcf08af3d72efe63317b189abac5d2a",
[]
],
"render": {
@@ -342330,7 +342360,7 @@
[]
],
"pr_preview.py": [
- "4b76b37f87e1d6b7eede89376e72e8bdd9c7aa3e",
+ "ba5997f68a615f49322ac009a15aebf0a5a071f3",
[]
],
"run_tc.py": [
@@ -342407,7 +342437,7 @@
[]
],
"test_pr_preview.py": [
- "cdf3c9528eaaa8dd3ac2d82d2f457dc12a647a82",
+ "2d9966fc8cf4187913adce8609ee750ade1b9797",
[]
]
},
@@ -348032,12 +348062,12 @@
[]
],
"chromium.py": [
- "03e674eb2e8008179712758464e1360df90eb54a",
+ "62ed53865d7825da8fd81608cf7e1302cf0650bc",
[]
],
"tests": {
"test_chromium.py": [
- "f9ae80b0be54a27b4f846aabf206551589c1d978",
+ "cb6f1ad370f2faafaa8311b82e9126ce9afd327d",
[]
]
},
@@ -349410,7 +349440,7 @@
[]
],
"urltestdata.json": [
- "32ed1959430c135bf5910b643e553296b8cd3a00",
+ "b2f8964c440dad8d1399127848185aec3edd025f",
[]
]
}
@@ -350229,7 +350259,7 @@
[]
],
"helpers.js": [
- "0fc64c8b522cfd7fce2ec585e2ec1d6bd839b855",
+ "27abaaf4766c4a2fe85f1034be8df9145b712f75",
[]
],
"resources": {
@@ -438664,6 +438694,13 @@
{}
]
],
+ "image-loading-lazy-crossorigin-change.sub.html": [
+ "13560324854dceeca26bda3433301cafe07fb62a",
+ [
+ null,
+ {}
+ ]
+ ],
"image-loading-lazy-in-cross-origin-ifame-001.sub.html": [
"a4627cb8c25dc3f57581dcaea14b2ea4cfccea40",
[
@@ -438818,13 +438855,6 @@
{}
]
],
- "original-crossorigin-applied.sub.html": [
- "2cf076e75f79b465e58166248c323331418ed0bd",
- [
- null,
- {}
- ]
- ],
"original-referrer-policy-applied.sub.html": [
"c300119f72fbd3742d6dbf7e2439d967911303a5",
[
@@ -472874,7 +472904,7 @@
},
"portals": {
"about-blank-cannot-host.html": [
- "6a721c32e6807cbd615b3adbffd7422467375525",
+ "7aba015e69b85a173c7a63dc277aedafeefc63a2",
[
null,
{}
@@ -472922,7 +472952,7 @@
]
],
"portal-activate-data.html": [
- "cefb0eae3dc9a8b10880687fc084d44991f8f26f",
+ "004fa97e55c05049a32657450a22af090466f4a4",
[
null,
{}
@@ -472964,7 +472994,7 @@
]
],
"portals-activate-inside-iframe.html": [
- "5234babfdf9528c5b9d7861ba90ffe6ceebaccce",
+ "587e483479cf8e616694de345ecb681a69214e61",
[
null,
{}
@@ -524883,6 +524913,13 @@
{}
]
],
+ "scroll-timeline-phases.tentative.html": [
+ "0cc4e12864e209602b8c3ad57106deb3927e5be8",
+ [
+ null,
+ {}
+ ]
+ ],
"setting-current-time.html": [
"069a7cc149eaa69234580345854e1560804d5c1a",
[
@@ -537169,7 +537206,7 @@
]
],
"presentation-attributes-special-cases.html": [
- "8fa045984d9ad55097768e6608146bbe2b37e8bf",
+ "c99ed704cf1dde83a26ed4dd52f537bc8805165e",
[
null,
{}
@@ -544644,7 +544681,7 @@
]
],
"wakelock-active-document.https.window.js": [
- "53f9fb56fa8d7754fa61e11f018e17188228d678",
+ "53745ea3c60e7322720d9082919950c798259f0f",
[
"wake-lock/wakelock-active-document.https.window.html",
{}
@@ -547512,6 +547549,13 @@
{}
]
],
+ "document-timeline-phases.tentative.html": [
+ "9b86a7105d5dcfafc7e5d7f1f63593f7b1063f33",
+ [
+ null,
+ {}
+ ]
+ ],
"style-change-events.html": [
"c1607e6fb92943c580802025e4a4cc617a747144",
[
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini
new file mode 100644
index 00000000000..f64b45fea6b
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini
@@ -0,0 +1,4 @@
+[hit-test-floats-002.html]
+ [Hit test float]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini
new file mode 100644
index 00000000000..4bfb0c2053a
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-004.html.ini
@@ -0,0 +1,4 @@
+[hit-test-floats-004.html]
+ [Miss float below something else]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini
new file mode 100644
index 00000000000..baa9f1a7541
--- /dev/null
+++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini
@@ -0,0 +1,4 @@
+[hit-test-floats-005.html]
+ [Miss clipped float]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini
index f8e7e539aae..4a1e8110f6f 100644
--- a/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini
+++ b/tests/wpt/metadata/css/css-transforms/transform-scale-hittest.html.ini
@@ -2,6 +2,3 @@
[Hit test intersecting scaled box]
expected: FAIL
- [Hit test within unscaled box]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
index c884dc82eab..628b1fab770 100644
--- a/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
+++ b/tests/wpt/metadata/css/cssom-view/MediaQueryList-addListener-removeListener.html.ini
@@ -2,6 +2,3 @@
[listeners are called when <iframe> is resized]
expected: FAIL
- [listeners are called correct number of times]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini
index 6ef8bb1049f..171592fc08f 100644
--- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini
+++ b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-iframes.html.ini
@@ -2,6 +2,3 @@
[elementsFromPoint on the root document for points in iframe elements]
expected: FAIL
- [elementsFromPoint on inner documents]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
deleted file mode 100644
index e181af5397f..00000000000
--- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[elementsFromPoint-invalid-cases.html]
- [The root element is the last element returned for otherwise empty queries within the viewport]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
index 0af08ed6710..98f49140596 100644
--- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini
@@ -318,3 +318,18 @@
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
+ [<iframe>: combined response Content-Type: text/html;" text/plain]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: */* text/html]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/plain */*]
+ expected: FAIL
+
+ [<iframe>: combined response Content-Type: text/html */*;charset=gbk]
+ expected: FAIL
+
+ [<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
+ 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 a1ec6ff3aa3..d2df9b78483 100644
--- a/tests/wpt/metadata/fetch/content-type/script.window.js.ini
+++ b/tests/wpt/metadata/fetch/content-type/script.window.js.ini
@@ -53,9 +53,6 @@
[combined text/javascript ]
expected: FAIL
- [separate text/javascript;charset=windows-1252 text/javascript]
- expected: FAIL
-
- [separate text/javascript error]
+ [separate text/javascript x/x]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
index 369bf4d4fa4..30e1b851fd4 100644
--- a/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
+++ b/tests/wpt/metadata/fetch/nosniff/parsing-nosniff.window.js.ini
@@ -11,6 +11,3 @@
[X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!]
expected: FAIL
- [Content-Type-Options%3A%20nosniff]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
deleted file mode 100644
index 87b07c3e670..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_1.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[traverse_the_history_1.html]
- [Multiple history traversals from the same task]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
index dc2e45516de..51f8272a6de 100644
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_3.html.ini
@@ -1,4 +1,4 @@
-[traverse_the_history_5.html]
+[traverse_the_history_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
index 71edac2c5ed..e440b1e38c6 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
@@ -1,6 +1,6 @@
[iframe_sandbox_popups_nonescaping-3.html]
type: testharness
- expected: CRASH
+ expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html.ini
new file mode 100644
index 00000000000..58679792732
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html.ini
@@ -0,0 +1,4 @@
+[image-loading-lazy-crossorigin-change.sub.html]
+ [Test that when deferred image is loaded, it uses the latest crossorigin attribute.]
+ 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 a56bad443a2..66bd350083b 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,5 +1,4 @@
[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/audiobuffersource-multi-channels.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
index 601831e0fda..f3e6ba959a0 100644
--- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
+++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiobuffersourcenode-interface/audiobuffersource-multi-channels.html.ini
@@ -26,3 +26,6 @@
[X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 44056 more errors.\n\tMax AbsError of 1.9999977350234985e+0 at index of 10361.\n\t[10361\]\t9.9999773502349854e-1\t-1.0000000000000000e+0\t1.9999977350234985e+0\t1.9999977350234985e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 7056.\n\t[7056\]\t5.8778524398803711e-1\t0.0000000000000000e+0\t5.8778524398803711e-1\tInfinity\t3.0517578125000000e-5\n]
expected: FAIL
+ [X Rendered audio for channel 5 does not equal [0,0.0626220703125,0.125030517578125,0.18695068359375,0.24810791015625,0.308319091796875,0.3673095703125,0.42486572265625,0.480743408203125,0.53472900390625,0.58660888671875,0.636199951171875,0.68328857421875,0.727691650390625,0.76922607421875,0.8077392578125...\] with an element-wise tolerance of {"absoluteThreshold":0.000030517578125,"relativeThreshold":0}.\n\tIndex\tActual\t\t\tExpected\t\tAbsError\t\tRelError\t\tTest threshold\n\t[1\]\t3.6732959747314453e-1\t6.2622070312500000e-2\t3.0470752716064453e-1\t4.8658168859649127e+0\t3.0517578125000000e-5\n\t[2\]\t6.8329977989196777e-1\t1.2503051757812500e-1\t5.5826926231384277e-1\t4.4650639949963384e+0\t3.0517578125000000e-5\n\t[3\]\t9.0373212099075317e-1\t1.8695068359375000e-1\t7.1678143739700317e-1\t3.8340669508039502e+0\t3.0517578125000000e-5\n\t[4\]\t9.9780619144439697e-1\t2.4810791015625000e-1\t7.4969828128814697e-1\t3.0216621502152523e+0\t3.0517578125000000e-5\n\t[5\]\t9.5236867666244507e-1\t3.0831909179687500e-1\t6.4404958486557007e-1\t2.0889059484187866e+0\t3.0517578125000000e-5\n\t...and 37004 more errors.\n\tMax AbsError of 1.9986611604690552e+0 at index of 26105.\n\t[26105\]\t-9.9994289875030518e-1\t9.9871826171875000e-1\t1.9986611604690552e+0\t2.0012262087101997e+0\t3.0517578125000000e-5\n\tMax RelError of Infinity at index of 10584.\n\t[10584\]\t-5.8778524398803711e-1\t0.0000000000000000e+0\t5.8778524398803711e-1\tInfinity\t3.0517578125000000e-5\n]
+ 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 05e13f78c22..729e7e05482 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
@@ -158,3 +158,9 @@
[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[19030\]\t-4.2493608780205250e-3\t-7.3546999692916870e-1\t7.3122063605114818e-1\t9.9422225121927066e-1\t3.8985999999999999e-3\n\t[19031\]\t-3.6017334461212158e-1\t-6.9157749414443970e-1\t3.3140414953231812e-1\t4.7920030992665957e-1\t3.8985999999999999e-3\n\t[38059\]\t-9.8401503637433052e-3\t-9.8956179618835449e-1\t9.7972164582461119e-1\t9.9005605268751673e-1\t3.8985999999999999e-3\n\t[38060\]\t-8.8409073650836945e-2\t-9.9664616584777832e-1\t9.0823709219694138e-1\t9.1129341918891205e-1\t3.8985999999999999e-3\n\tMax AbsError of 9.7972164582461119e-1 at index of 38059.\n\tMax RelError of 9.9422225121927066e-1 at index of 19030.\n]
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[19030\]\t5.4585758720000000e+9\t-7.3546999692916870e-1\t5.4585758727354698e+9\t7.4218879023302593e+9\t3.8985999999999999e-3\n\t[19031\]\t-3.6017334461212158e-1\t-6.9157749414443970e-1\t3.3140414953231812e-1\t4.7920030992665957e-1\t3.8985999999999999e-3\n\t[38059\]\t1.0836776960000000e+10\t-9.8956179618835449e-1\t1.0836776960989561e+10\t1.0951086635247259e+10\t3.8985999999999999e-3\n\t[38060\]\t-8.8409073650836945e-2\t-9.9664616584777832e-1\t9.0823709219694138e-1\t9.1129341918891205e-1\t3.8985999999999999e-3\n\tMax AbsError of 1.0836776960989561e+10 at index of 38059.\n\tMax RelError of 1.0951086635247259e+10 at index of 38059.\n]
+ expected: FAIL
+
+ [X SNR (-158.2459298453396 dB) is not greater than or equal to 65.737. Got -158.2459298453396.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini b/tests/wpt/metadata/webmessaging/without-ports/017.html.ini
deleted file mode 100644
index 064cf47545b..00000000000
--- a/tests/wpt/metadata/webmessaging/without-ports/017.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[017.html]
- expected: TIMEOUT
- [origin of the script that invoked the method, about:blank]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
index 268949ced5c..f584fce5df1 100644
--- a/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
+++ b/tests/wpt/metadata/workers/semantics/multiple-workers/005.html.ini
@@ -1,4 +1,5 @@
[005.html]
+ expected: ERROR
[dedicated worker in shared worker in dedicated worker]
expected: FAIL
diff --git a/tests/wpt/web-platform-tests/css/css-grid/placement/grid-placement-using-named-grid-lines-003.html b/tests/wpt/web-platform-tests/css/css-grid/placement/grid-placement-using-named-grid-lines-003.html
new file mode 100644
index 00000000000..31173e0a455
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid/placement/grid-placement-using-named-grid-lines-003.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid item placement with named line and auto repeat()</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#line-placement">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Grid placement algorithm is able to select the right line when there is an auto repeat().">
+<style>
+.grid {
+ display: grid;
+ width: 300px;
+ height: 300px;
+ position: relative;
+ top: -200px;
+ left: -200px;
+ grid-template-columns: repeat(auto-fill, 100px 100px) [area-start] 100px [area-end];
+ grid-template-rows: repeat(auto-fill, 100px 100px [area-start]) [area-start] 100px [area-end];
+}
+.grid > div {
+ grid-area: area;
+ background: green;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="grid">
+ <div></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html
new file mode 100644
index 00000000000..fe72b9f9380
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>iframe and the scrolling attributes</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+
+
+
+<p>These two iframes should *both* render with scrollbars:</p>
+<iframe style="height: 100px; width: 100px;" scrolling="unknown"
+ srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
+<iframe style="height: 100px; width: 100px;" scrolling="unknown"
+ srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute.html
new file mode 100644
index 00000000000..cc7df7b43a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/the-page/iframe-scrolling-attribute.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>iframe and the scrolling attributes</title>
+<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/rendering.html#the-page">
+<link rel="match" href="iframe-scrolling-attribute-ref.html">
+
+<p>These two iframes should *both* render with scrollbars:</p>
+<iframe style="height: 100px; width: 100px;" scrolling="unknown"
+ srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
+<iframe style="height: 100px; width: 100px;" scrolling="unknown"
+ srcdoc="<div style='height: 200px; width: 200px; background: linear-gradient(135deg, red, blue);'></div>"></iframe>
+
+<script>
+ var iframe = document.getElementsByTagName("iframe")[1];
+ // Setting scrolling=no and then back to scrolling=unknown
+ // should result in a final value of auto.
+ iframe.setAttribute("scrolling", "no");
+ iframe.setAttribute("scrolling", "unknown");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html
new file mode 100644
index 00000000000..13560324854
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-crossorigin-change.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<head>
+ <title>Deferred images with loading='lazy' use the latest crossorigin attribute</title>
+ <link rel="author" title="Raj T" href="mailto:rajendrant@chromium.org">
+ <link rel="author" title="Rob Buis" href="mailto:rbuis@igalia.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="common.js"></script>
+</head>
+
+<script>
+ const crossorigin_img = new ElementLoadPromise("crossorigin_img");
+
+ // Set the crossorigin attribute and scroll down to load the deferred image.
+ window.addEventListener("load", () => {
+ crossorigin_img.element().crossOrigin = 'anonymous';
+ crossorigin_img.element().scrollIntoView();
+ });
+
+ async_test(function(t) {
+ crossorigin_img.promise.then(t.unreached_func("The image should not load.")).catch(t.step_func_done());
+ }, "Test that when deferred image is loaded, it uses the latest crossorigin attribute.");
+</script>
+
+<body>
+ <div style="height:1000vh;"></div>
+ <img id="crossorigin_img" loading="lazy"
+ src='http://{{hosts[alt][]}}:{{ports[http][0]}}/html/semantics/embedded-content/the-img-element/resources/image.png'
+ onload="crossorigin_img.resolve();" onerror="crossorigin_img.reject();">
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/original-crossorigin-applied.sub.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/original-crossorigin-applied.sub.html
deleted file mode 100644
index 2cf076e75f7..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/original-crossorigin-applied.sub.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<head>
- <title>Deferred images with loading='lazy' use the original crossorigin attribute specified at the parse time</title>
- <link rel="author" title="Raj T" href="mailto:rajendrant@chromium.org">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="common.js"></script>
-</head>
-
-<script>
- const crossorigin_img = new ElementLoadPromise("crossorigin_img");
-
- // Set the crossorigin and scroll down to load the deferred image.
- window.addEventListener("load", () => {
- crossorigin_img.element().crossOrigin = 'anonymous';
- crossorigin_img.element().scrollIntoView();
- });
-
- async_test(function(t) {
- crossorigin_img.promise.then(t.step_func_done(() => {
- // The image originally did not had crossOrigin property set, so CORS will
- // not be involved in fetching that. So drawing the image in a canvas will
- // make it tainted. Verify that the image did not load with CORS headers
- // due to the updated crossOrigin property.
- const img_element = crossorigin_img.element();
- const canvas = document.createElement('canvas');
- const context = canvas.getContext('2d');
- canvas.width = img_element.width;
- canvas.height = img_element.height;
- context.drawImage(img_element, 0, 0);
- assert_throws_dom('SecurityError', () => canvas.toDataURL());
- })
- ).catch(t.unreached_func("The image load should not fail, trying to load with CORS headers set."));
- }, "Test that when deferred image is loaded, it uses the crossorigin attribute specified at parse time.");
-</script>
-
-<body>
- <div style="height:10000px;"></div>
- <img id="crossorigin_img" loading="lazy"
- src='http://{{hosts[alt][www]}}:{{ports[http][0]}}/html/semantics/embedded-content/the-img-element/resources/image.png'
- onload="crossorigin_img.resolve();" onerror="crossorigin_img.reject();">
-</body>
diff --git a/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js b/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js
index 0e6b1b78b91..45ac57c2279 100644
--- a/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js
+++ b/tests/wpt/web-platform-tests/payment-handler/app-respond-with-minimal-ui.js
@@ -1,3 +1,18 @@
self.addEventListener('canmakepayment', event => {
+ if (!event.currency) {
+ event.respondWith(false);
+ return;
+ }
+
+ if (event.currency !== 'USD') {
+ event.respondWith(false);
+ return;
+ }
+
+ if (!event.respondWithMinimalUI) {
+ event.respondWith(false);
+ return;
+ }
+
event.respondWithMinimalUI(event.methodData[0].data.test);
});
diff --git a/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html b/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html
index d03032d0498..8e214cb6094 100644
--- a/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active-manual.https.html
@@ -61,6 +61,8 @@ function testAbortShowIfDocumentIsNotActive() {
iframe,
"/payment-request/resources/page1.html"
);
+ // Save the DOMException of page1.html before navigating away.
+ const frameDOMException1 = iframe.contentWindow.DOMException;
// We navigate the iframe again, putting request1's document into an inactive state.
const request2 = await getLoadedPaymentRequest(
iframe,
@@ -71,6 +73,7 @@ function testAbortShowIfDocumentIsNotActive() {
await promise_rejects_dom(
t,
"AbortError",
+ frameDOMException1,
request1.show(),
"Inactive document, so must throw AbortError"
);
@@ -80,6 +83,7 @@ function testAbortShowIfDocumentIsNotActive() {
await promise_rejects_dom(
t,
"InvalidStateError",
+ iframe.contentWindow.DOMException,
request2.show(),
"Abort already called, so InvalidStateError"
);
@@ -112,6 +116,8 @@ function testAbortShowIfDocumentIsNotFullyActive() {
innerIframe,
"/payment-request/resources/page2.html"
);
+ // Save DOMException from innerIframe before navigating away.
+ const innerIframeDOMException = innerIframe.contentWindow.DOMException;
// Navigate the outer iframe to a new location.
// Wait for the load event to fire.
@@ -128,6 +134,7 @@ function testAbortShowIfDocumentIsNotFullyActive() {
await promise_rejects_dom(
t,
"AbortError",
+ innerIframeDOMException,
showPromise,
"Active, but not fully active, so must throw AbortError"
);
diff --git a/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html b/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html
index 6a721c32e68..7aba015e69b 100644
--- a/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html
+++ b/tests/wpt/web-platform-tests/portals/about-blank-cannot-host.html
@@ -12,7 +12,7 @@ promise_test(async (t) => {
portal.src = "resources/simple-portal.html";
hostWindow.document.body.appendChild(portal);
- await promise_rejects_dom(t, "InvalidStateError", portal.activate());
+ await promise_rejects_dom(t, "InvalidStateError", hostWindow.DOMException, portal.activate());
}, "about:blank cannot host a portal");
</script>
diff --git a/tests/wpt/web-platform-tests/portals/portal-activate-data.html b/tests/wpt/web-platform-tests/portals/portal-activate-data.html
index cefb0eae3dc..004fa97e55c 100644
--- a/tests/wpt/web-platform-tests/portals/portal-activate-data.html
+++ b/tests/wpt/web-platform-tests/portals/portal-activate-data.html
@@ -12,9 +12,9 @@ function nextMessage(target) {
});
}
-async function openPortalAndActivate(logic, activateOptions) {
+async function openPortalAndActivate(logic, activateOptions, testWindow) {
assert_precondition("HTMLPortalElement" in self);
- const w = await openBlankPortalHost();
+ const w = testWindow || await openBlankPortalHost();
try {
const portal = w.document.createElement('portal');
portal.src = new URL('resources/portal-activate-data-portal.html?logic=' + encodeURIComponent(logic), location.href);
@@ -71,9 +71,10 @@ promise_test(async () => {
}, "A message port can be passed through activate data.");
promise_test(async t => {
-await promise_rejects_dom(
- t, 'DataCloneError',
- openPortalAndActivate('', {data: new SharedArrayBuffer}));
+ const w = await openBlankPortalHost();
+ await promise_rejects_dom(
+ t, 'DataCloneError', w.DOMException,
+ openPortalAndActivate('', {data: new SharedArrayBuffer}, w));
}, "A SharedArrayBuffer cannot be passed through activate data.");
promise_test(async t => {
@@ -83,9 +84,10 @@ promise_test(async t => {
}, "Uncloneable data has its exception propagated.");
promise_test(async t => {
+ const w = await openBlankPortalHost();
await promise_rejects_js(
- t, TypeError,
- openPortalAndActivate('', {data: null, transfer: [null]}));
+ t, w.TypeError,
+ openPortalAndActivate('', {data: null, transfer: [null]}, w));
}, "Errors during transfer list processing are propagated.");
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html b/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html
index 5234babfdf9..587e483479c 100644
--- a/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html
+++ b/tests/wpt/web-platform-tests/portals/portals-activate-inside-iframe.html
@@ -13,7 +13,9 @@
document.body.appendChild(iframe);
await waitForLoad;
const portal = iframe.contentDocument.getElementById("portal");
- return promise_rejects_dom(t, "InvalidStateError", portal.activate());
+ return promise_rejects_dom(t, "InvalidStateError",
+ iframe.contentWindow.DOMException,
+ portal.activate());
}, "activating portal inside iframe should fail");
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/resources/testharness.js b/tests/wpt/web-platform-tests/resources/testharness.js
index 0ec232c1d27..ce043a287f7 100644
--- a/tests/wpt/web-platform-tests/resources/testharness.js
+++ b/tests/wpt/web-platform-tests/resources/testharness.js
@@ -638,11 +638,37 @@ policies and contribution forms [3].
});
}
+ /**
+ * Make a copy of a Promise in the current realm.
+ *
+ * @param {Promise} promise the given promise that may be from a different
+ * realm
+ * @returns {Promise}
+ *
+ * An arbitrary promise provided by the caller may have originated in
+ * another frame that have since navigated away, rendering the frame's
+ * document inactive. Such a promise cannot be used with `await` or
+ * Promise.resolve(), as microtasks associated with it may be prevented
+ * from being run. See https://github.com/whatwg/html/issues/5319 for a
+ * particular case.
+ *
+ * In functions we define here, there is an expectation from the caller
+ * that the promise is from the current realm, that can always be used with
+ * `await`, etc. We therefore create a new promise in this realm that
+ * inherit the value and status from the given promise.
+ */
+
+ function bring_promise_to_current_realm(promise) {
+ return new Promise(promise.then.bind(promise));
+ }
+
function promise_rejects_js(test, constructor, promise, description) {
- return promise.then(test.unreached_func("Should have rejected: " + description)).catch(function(e) {
- assert_throws_js_impl(constructor, function() { throw e },
- description, "promise_rejects_js");
- });
+ return bring_promise_to_current_realm(promise)
+ .then(test.unreached_func("Should have rejected: " + description))
+ .catch(function(e) {
+ assert_throws_js_impl(constructor, function() { throw e },
+ description, "promise_rejects_js");
+ });
}
/**
@@ -678,17 +704,21 @@ policies and contribution forms [3].
assert(maybeDescription === undefined,
"Too many args pased to no-constructor version of promise_rejects_dom");
}
- return promise.then(test.unreached_func("Should have rejected: " + description)).catch(function(e) {
- assert_throws_dom_impl(type, function() { throw e }, description,
- "promise_rejects_dom", constructor);
- });
+ return bring_promise_to_current_realm(promise)
+ .then(test.unreached_func("Should have rejected: " + description))
+ .catch(function(e) {
+ assert_throws_dom_impl(type, function() { throw e }, description,
+ "promise_rejects_dom", constructor);
+ });
}
function promise_rejects_exactly(test, exception, promise, description) {
- return promise.then(test.unreached_func("Should have rejected: " + description)).catch(function(e) {
- assert_throws_exactly_impl(exception, function() { throw e },
- description, "promise_rejects_exactly");
- });
+ return bring_promise_to_current_realm(promise)
+ .then(test.unreached_func("Should have rejected: " + description))
+ .catch(function(e) {
+ assert_throws_exactly_impl(exception, function() { throw e },
+ description, "promise_rejects_exactly");
+ });
}
/**
@@ -2808,24 +2838,8 @@ policies and contribution forms [3].
var message_port;
if (is_service_worker(worker)) {
- if (window.MessageChannel) {
- // The ServiceWorker's implicit MessagePort is currently not
- // reliably accessible from the ServiceWorkerGlobalScope due to
- // Blink setting MessageEvent.source to null for messages sent
- // via ServiceWorker.postMessage(). Until that's resolved,
- // create an explicit MessageChannel and pass one end to the
- // worker.
- var message_channel = new MessageChannel();
- message_port = message_channel.port1;
- message_port.start();
- worker.postMessage({type: "connect"}, [message_channel.port2]);
- } else {
- // If MessageChannel is not available, then try the
- // ServiceWorker.postMessage() approach using MessageEvent.source
- // on the other end.
- message_port = navigator.serviceWorker;
- worker.postMessage({type: "connect"});
- }
+ message_port = navigator.serviceWorker;
+ worker.postMessage({type: "connect"});
} else if (is_shared_worker(worker)) {
message_port = worker.port;
message_port.start();
diff --git a/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html
new file mode 100644
index 00000000000..0cc4e12864e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/scroll-animations/scroll-timeline-phases.tentative.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test basic functionality of scroll timeline phases.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<script src="testcommon.js"></script>
+<style>
+ .scroller {
+ overflow: auto;
+ height: 100px;
+ width: 100px;
+ }
+ .contents {
+ height: 1000px;
+ width: 100%;
+ }
+</style>
+<div id="log"></div>
+<script>
+ 'use strict';
+
+ promise_test(async t => {
+ const timeline = createScrollTimeline(t);
+ assert_equals(timeline.phase, "inactive");
+ }, 'Scroll timeline starts in "inactive" phase.');
+
+ promise_test(async t => {
+ const timeline = createScrollTimeline(t);
+ assert_throws_js(TypeError, () => {
+ timeline.phase = "after";
+ });
+ }, 'Setting scroll timeline phase (which is readonly) throws TypeError.');
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html
index 8fa045984d9..c99ed704cf1 100644
--- a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html
+++ b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes-special-cases.html
@@ -98,11 +98,11 @@ if (CSS.supports("d", "initial")) {
// animation elements.
if (CSS.supports("fill", "initial")) {
- test(function() {
- for (let e of ["animate", "animateMotion", "animateTransform", "discard", "set"]) {
+ for (let e of ["animate", "animateMotion", "animateTransform", "discard", "set"]) {
+ test(function() {
assertPresentationAttributeIsNotSupported(e, "fill", "blue", "fill");
- }
- }, `fill presentation attribute not supported on animation elements`);
+ }, `fill presentation attribute not supported on ${e}`);
+ }
}
diff --git a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js
index 552041496f1..7bf77cb77bc 100644
--- a/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js
+++ b/tests/wpt/web-platform-tests/svg/styling/presentation-attributes.js
@@ -145,7 +145,7 @@ const PROPERTIES = {
irrelevantElement: null,
},
"image-rendering": {
- value: "optimizeSpeed",
+ value: ["optimizeSpeed", "pixelated"],
relevantElement: "image",
irrelevantElement: "path",
},
@@ -361,17 +361,25 @@ function presentationAttributeIsSupported(element, attribute, value, property) {
return propertyValueBefore != propertyValueAfter;
}
-function assertPresentationAttributeIsSupported(element, attribute, value, property) {
+function assertPresentationAttributeIsSupported(element, attribute, values, property) {
+ if (typeof values === 'string')
+ values = [values];
+ let supported = values.some(
+ value => presentationAttributeIsSupported(element, attribute, value, property));
assert_true(
- presentationAttributeIsSupported(element, attribute, value, property),
- `Presentation attribute ${attribute}="${value}" should be supported on ${element} element`
+ supported,
+ `Presentation attribute ${attribute}="${values.join(" | ")}" should be supported on ${element} element`
);
}
-function assertPresentationAttributeIsNotSupported(element, attribute, value, property) {
+function assertPresentationAttributeIsNotSupported(element, attribute, values, property) {
+ if (typeof values === 'string')
+ values = [values];
+ let supported = values.some(
+ value => presentationAttributeIsSupported(element, attribute, value, property));
assert_false(
- presentationAttributeIsSupported(element, attribute, value, property),
- `Presentation attribute ${attribute}="${value}" should be supported on ${element} element`
+ supported,
+ `Presentation attribute ${attribute}="${values.join(" | ")}" should not be supported on ${element} element`
);
}
diff --git a/tests/wpt/web-platform-tests/tools/ci/pr_preview.py b/tests/wpt/web-platform-tests/tools/ci/pr_preview.py
index 4b76b37f87e..ba5997f68a6 100755
--- a/tests/wpt/web-platform-tests/tools/ci/pr_preview.py
+++ b/tests/wpt/web-platform-tests/tools/ci/pr_preview.py
@@ -268,10 +268,11 @@ def has_mirroring_label(pull_request):
def should_be_mirrored(project, pull_request):
return (
- is_open(pull_request) and
- pull_request['user']['login'] not in AUTOMATION_GITHUB_USERS and (
- pull_request['author_association'] in TRUSTED_AUTHOR_ASSOCIATIONS or
- has_mirroring_label(pull_request)
+ is_open(pull_request) and (
+ has_mirroring_label(pull_request) or (
+ pull_request['user']['login'] not in AUTOMATION_GITHUB_USERS and
+ pull_request['author_association'] in TRUSTED_AUTHOR_ASSOCIATIONS
+ )
) and
# Query this last as it requires another API call to verify
not project.pull_request_is_from_fork(pull_request)
diff --git a/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py b/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py
index cdf3c9528ea..2d9966fc8cf 100644
--- a/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py
+++ b/tests/wpt/web-platform-tests/tools/ci/tests/test_pr_preview.py
@@ -512,6 +512,8 @@ def test_synchronize_sync_trusted_contributor():
'items': [
{
'number': 23,
+ # user here is a contributor (untrusted), but the issue
+ # has been labelled as safe.
'labels': [{'name': 'safe for preview'}],
'closed_at': None,
'user': {'login': 'Hexcles'},
@@ -541,6 +543,51 @@ def test_synchronize_sync_trusted_contributor():
assert returncode == 0
assert same_members(expected_traffic, actual_traffic)
+def test_synchronize_sync_bot_with_label():
+ expected_traffic = [
+ (Requests.get_rate, Responses.no_limit),
+ (Requests.get_rate, Responses.no_limit),
+ (Requests.get_rate, Responses.no_limit),
+ (Requests.get_rate, Responses.no_limit),
+ (Requests.get_rate, Responses.no_limit),
+ (Requests.get_rate, Responses.no_limit),
+ (Requests.search, (
+ 200,
+ {
+ 'items': [
+ {
+ 'number': 23,
+ # user here is a bot which is normally not mirrored,
+ # but the issue has been labelled as safe.
+ 'labels': [{'name': 'safe for preview'}],
+ 'closed_at': None,
+ 'user': {'login': 'chromium-wpt-export-bot'},
+ 'author_association': 'COLLABORATOR'
+ }
+ ],
+ 'incomplete_results': False
+ }
+ )),
+ (Requests.pr_details, (200,
+ {
+ 'head': {
+ 'repo': {
+ 'full_name': 'test-org/test-repo'
+ }
+ }
+ }
+ )),
+ (Requests.ref_create_open, (200, {})),
+ (Requests.ref_create_trusted, (200, {})),
+ (Requests.deployment_get, (200, [])),
+ (Requests.deployment_create, (200, {}))
+ ]
+
+ returncode, actual_traffic, remote_refs = synchronize(expected_traffic)
+
+ assert returncode == 0
+ assert same_members(expected_traffic, actual_traffic)
+
def test_synchronize_update_collaborator():
expected_traffic = [
(Requests.get_rate, Responses.no_limit),
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
index 03e674eb2e8..62ed53865d7 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py
@@ -55,13 +55,25 @@ class ChromiumFormatter(base.BaseFormatter):
prefix += "%s: " % subtest
self.messages[test] += prefix + message + "\n"
- def _store_test_result(self, name, actual, expected, message, subtest_failure=False):
+ def _append_artifact(self, cur_dict, artifact_name, artifact_value):
+ """
+ Appends artifacts to the specified dictionary.
+ :param dict cur_dict: the test leaf dictionary to append to
+ :param str artifact_name: the name of the artifact
+ :param str artifact_value: the value of the artifact
+ """
+ if "artifacts" not in cur_dict.keys():
+ cur_dict["artifacts"] = {}
+ cur_dict["artifacts"][artifact_name] = artifact_value
+
+ def _store_test_result(self, name, actual, expected, message, wpt_actual, subtest_failure):
"""
Stores the result of a single test in |self.tests|
:param str name: name of the test.
:param str actual: actual status of the test.
:param str expected: expected statuses of the test.
:param str message: test output, such as status, subtest, errors etc.
+ :param str wpt_actual: actual status reported by wpt, may differ from |actual|.
:param bool subtest_failure: whether this test failed because of subtests
"""
# The test name can contain a leading / which will produce an empty
@@ -73,12 +85,12 @@ class ChromiumFormatter(base.BaseFormatter):
cur_dict = cur_dict.setdefault(name_part, {})
cur_dict["actual"] = actual
cur_dict["expected"] = expected
- if subtest_failure or message:
- cur_dict["artifacts"] = {"log": ""}
- if subtest_failure:
- cur_dict["artifacts"]["log"] += "subtest_failure\n"
- if message != "":
- cur_dict["artifacts"]["log"] += message
+ if subtest_failure:
+ self._append_artifact(cur_dict, "wpt_subtest_failure", "true")
+ if wpt_actual != actual:
+ self._append_artifact(cur_dict, "wpt_actual_status", wpt_actual)
+ if message != "":
+ self._append_artifact(cur_dict, "log", message)
# Figure out if there was a regression or unexpected status. This only
# happens for tests that were run
@@ -108,7 +120,7 @@ class ChromiumFormatter(base.BaseFormatter):
return "SKIP"
if status == "EXTERNAL-TIMEOUT":
return "TIMEOUT"
- if status in ("ERROR", "CRASH"):
+ if status in ("ERROR", "CRASH", "PRECONDITION_FAILED"):
# CRASH in WPT means a browser crash, which Chromium treats as a
# test failure.
return "FAIL"
@@ -161,20 +173,28 @@ class ChromiumFormatter(base.BaseFormatter):
def test_end(self, data):
test_name = data["test"]
- actual_status = self._map_status_name(data["status"])
+ # Save the status reported by WPT since we might change it when reporting
+ # to Chromium.
+ wpt_actual_status = data["status"]
+ actual_status = self._map_status_name(wpt_actual_status)
expected_statuses = self._get_expected_status_from_data(actual_status, data)
subtest_failure = False
- if actual_status == "PASS" and test_name in self.tests_with_subtest_fails:
- # This test passed but it has failing subtests, so we flip the status
- # to FAIL.
- actual_status = "FAIL"
+ if test_name in self.tests_with_subtest_fails:
subtest_failure = True
# Clean up the test list to avoid accumulating too many.
self.tests_with_subtest_fails.remove(test_name)
+ # This test passed but it has failing subtests. Since we can only
+ # report a single status to Chromium, we choose FAIL to indicate
+ # that something about this test did not run correctly.
+ if actual_status == "PASS":
+ actual_status = "FAIL"
if "message" in data:
- self._append_test_message(test_name, None, actual_status, expected_statuses, data["message"])
- self._store_test_result(test_name, actual_status, expected_statuses, self.messages[test_name], subtest_failure)
+ self._append_test_message(test_name, None, actual_status,
+ expected_statuses, data["message"])
+ self._store_test_result(test_name, actual_status, expected_statuses,
+ self.messages[test_name], wpt_actual_status,
+ subtest_failure)
# Remove the test from messages dict to avoid accumulating too many.
self.messages.pop(test_name)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
index f9ae80b0be5..cb6f1ad370f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
@@ -156,13 +156,13 @@ def test_subtest_messages(capfd):
output.seek(0)
output_json = json.load(output)
- t1_log = output_json["tests"]["t1"]["artifacts"]["log"]
- assert t1_log == "subtest_failure\n" \
- "[FAIL expected PASS] t1_a: t1_a_message\n" \
- "[PASS] t1_b: t1_b_message\n"
-
- t2_log = output_json["tests"]["t2"]["artifacts"]["log"]
- assert t2_log == "[TIMEOUT expected PASS] t2_message\n"
+ t1_artifacts = output_json["tests"]["t1"]["artifacts"]
+ assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \
+ "[PASS] t1_b: t1_b_message\n"
+ assert t1_artifacts["wpt_subtest_failure"] == "true"
+ t2_artifacts = output_json["tests"]["t2"]["artifacts"]
+ assert t2_artifacts["log"] == "[TIMEOUT expected PASS] t2_message\n"
+ assert "wpt_subtest_failure" not in t2_artifacts.keys()
def test_subtest_failure(capfd):
@@ -203,13 +203,15 @@ def test_subtest_failure(capfd):
output_json = json.load(output)
test_obj = output_json["tests"]["t1"]
- t1_log = test_obj["artifacts"]["log"]
- assert t1_log == "subtest_failure\n" \
- "[FAIL expected PASS] t1_a: t1_a_message\n" \
- "[PASS] t1_b: t1_b_message\n" \
- "[TIMEOUT expected PASS] t1_c: t1_c_message\n"
+ t1_artifacts = test_obj["artifacts"]
+ assert t1_artifacts["log"] == "[FAIL expected PASS] t1_a: t1_a_message\n" \
+ "[PASS] t1_b: t1_b_message\n" \
+ "[TIMEOUT expected PASS] t1_c: t1_c_message\n"
+ assert t1_artifacts["wpt_subtest_failure"] == "true"
# The status of the test in the output is a failure because subtests failed,
- # despite the harness reporting that the test passed.
+ # despite the harness reporting that the test passed. But the harness status
+ # is logged as an artifact.
+ assert t1_artifacts["wpt_actual_status"] == "PASS"
assert test_obj["actual"] == "FAIL"
assert test_obj["expected"] == "PASS"
# Also ensure that the formatter cleaned up its internal state
@@ -300,10 +302,12 @@ def test_unexpected_subtest_pass(capfd):
output_json = json.load(output)
test_obj = output_json["tests"]["t1"]
- t1_log = test_obj["artifacts"]["log"]
- assert t1_log == "subtest_failure\n" \
- "[PASS expected FAIL] t1_a: t1_a_message\n"
- # Since the subtest status is unexpected, we fail the test.
+ t1_artifacts = test_obj["artifacts"]
+ assert t1_artifacts["log"] == "[PASS expected FAIL] t1_a: t1_a_message\n"
+ assert t1_artifacts["wpt_subtest_failure"] == "true"
+ # Since the subtest status is unexpected, we fail the test. But we report
+ # wpt_actual_status as an artifact
+ assert t1_artifacts["wpt_actual_status"] == "PASS"
assert test_obj["actual"] == "FAIL"
assert test_obj["expected"] == "PASS"
# Also ensure that the formatter cleaned up its internal state
@@ -448,3 +452,37 @@ def test_flaky_test_unexpected(capfd):
# one of the expected ones
assert test_obj["is_regression"] is True
assert test_obj["is_unexpected"] is True
+
+
+def test_precondition_failed(capfd):
+ # Check that a failed precondition gets properly handled.
+
+ # set up the handler.
+ output = StringIO()
+ logger = structuredlog.StructuredLogger("test_a")
+ logger.add_handler(handlers.StreamHandler(output, ChromiumFormatter()))
+
+ # Run a test with a precondition failure
+ logger.suite_start(["t1"], run_info={}, time=123)
+ logger.test_start("t1")
+ logger.test_end("t1", status="PRECONDITION_FAILED", expected="OK")
+ logger.suite_end()
+
+ # check nothing got output to stdout/stderr
+ # (note that mozlog outputs exceptions during handling to stderr!)
+ captured = capfd.readouterr()
+ assert captured.out == ""
+ assert captured.err == ""
+
+ # check the actual output of the formatter
+ output.seek(0)
+ output_json = json.load(output)
+
+ test_obj = output_json["tests"]["t1"]
+ # The precondition failure should map to FAIL status, but we should also
+ # have an artifact containing the original PRECONDITION_FAILED status.
+ assert test_obj["actual"] == "FAIL"
+ assert test_obj["artifacts"]["wpt_actual_status"] == "PRECONDITION_FAILED"
+ # ...this is an unexpected regression because we expected a pass but failed
+ assert test_obj["is_regression"] is True
+ assert test_obj["is_unexpected"] is True
diff --git a/tests/wpt/web-platform-tests/url/resources/urltestdata.json b/tests/wpt/web-platform-tests/url/resources/urltestdata.json
index 32ed1959430..b2f8964c440 100644
--- a/tests/wpt/web-platform-tests/url/resources/urltestdata.json
+++ b/tests/wpt/web-platform-tests/url/resources/urltestdata.json
@@ -6682,5 +6682,50 @@
"pathname": "/test",
"search": "?a",
"hash": "#bc"
+ },
+ "First scheme char - not allowed: https://github.com/whatwg/url/issues/464",
+ {
+ "input": "10.0.0.7:8080/foo.html",
+ "base": "file:///some/dir/bar.html",
+ "href": "file:///some/dir/10.0.0.7:8080/foo.html",
+ "protocol": "file:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/some/dir/10.0.0.7:8080/foo.html",
+ "search": "",
+ "hash": ""
+ },
+ "Subsequent scheme chars - not allowed",
+ {
+ "input": "a!@$*=/foo.html",
+ "base": "file:///some/dir/bar.html",
+ "href": "file:///some/dir/a!@$*=/foo.html",
+ "protocol": "file:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/some/dir/a!@$*=/foo.html",
+ "search": "",
+ "hash": ""
+ },
+ "First and subsequent scheme chars - allowed",
+ {
+ "input": "a1234567890-+.:foo/bar",
+ "base": "http://example.com/dir/file",
+ "href": "a1234567890-+.:foo/bar",
+ "protocol": "a1234567890-+.:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "foo/bar",
+ "search": "",
+ "hash": ""
}
]
diff --git a/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js b/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js
index 53f9fb56fa8..53745ea3c60 100644
--- a/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js
+++ b/tests/wpt/web-platform-tests/wake-lock/wakelock-active-document.https.window.js
@@ -20,6 +20,8 @@ promise_test(async t => {
iframe,
"/wake-lock/resources/page1.html"
);
+ // Save the DOMException of page1.html before navigating away.
+ const frameDOMException1 = iframe.contentWindow.DOMException;
// We navigate the iframe again, putting wakeLock1's document into an inactive state.
const wakeLock2 = await getWakeLockObject(
iframe,
@@ -30,6 +32,7 @@ promise_test(async t => {
await promise_rejects_dom(
t,
"NotAllowedError",
+ frameDOMException1,
wakeLock1.request('screen'),
"Inactive document, so must throw NotAllowedError"
);
@@ -58,6 +61,8 @@ promise_test(async t => {
innerIframe,
"/wake-lock/resources/page2.html"
);
+ // Save DOMException from innerIframe before navigating away.
+ const innerIframeDOMException = innerIframe.contentWindow.DOMException;
// Navigate the outer iframe to a new location.
// Wait for the load event to fire.
@@ -73,6 +78,7 @@ promise_test(async t => {
await promise_rejects_dom(
t,
"NotAllowedError",
+ innerIframeDOMException,
wakeLock.request('screen'),
"Active, but not fully active, so must throw NotAllowedError"
);
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/document-timeline-phases.tentative.html b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/document-timeline-phases.tentative.html
new file mode 100644
index 00000000000..9b86a7105d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/document-timeline-phases.tentative.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test basic functionality of document timeline phases.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ 'use strict';
+ promise_test(async t => {
+ const timeline = new DocumentTimeline();
+ assert_equals(timeline.phase, "active");
+ }, 'Document timeline starts in "active" phase.');
+
+ promise_test(async t => {
+ const timeline = new DocumentTimeline();
+ assert_throws_js(TypeError, () => {
+ timeline.phase = "after";
+ });
+ }, 'Setting document timeline phase (which is readonly) throws TypeError.');
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/webauthn/helpers.js b/tests/wpt/web-platform-tests/webauthn/helpers.js
index 0fc64c8b522..27abaaf4766 100644
--- a/tests/wpt/web-platform-tests/webauthn/helpers.js
+++ b/tests/wpt/web-platform-tests/webauthn/helpers.js
@@ -537,28 +537,22 @@ function validateAuthenticatorAssertionResponse(assert) {
function standardSetup(cb) {
// Setup an automated testing environment if available.
- let authenticator;
- promise_test(async t => {
- try {
- authenticator = await window.test_driver.add_virtual_authenticator({
- protocol: "ctap1/u2f",
- transport: "usb"
- });
- } catch (error) {
- if (error !== "error: Action add_virtual_authenticator not implemented") {
- throw error;
- }
- // The protocol is not available. Continue manually.
- }
- }, "Set up the test environment");
-
- cb();
-
- promise_test(t => {
- if (authenticator) {
- return window.test_driver.remove_virtual_authenticator(authenticator);
+ window.test_driver.add_virtual_authenticator({
+ protocol: "ctap1/u2f",
+ transport: "usb"
+ }).then(authenticator => {
+ cb();
+ // XXX add a subtest to clean up the virtual authenticator since
+ // testharness does not support waiting for promises on cleanup.
+ promise_test(() => window.test_driver.remove_virtual_authenticator(authenticator),
+ "Clean up the test environment");
+ }).catch(error => {
+ if (error !== "error: Action add_virtual_authenticator not implemented") {
+ throw error;
}
- }, "Clean up the test environment");
+ // The protocol is not available. Continue manually.
+ cb();
+ });
}
/* JSHINT */