Update web-platform-tests to revision 556afc9ad1a27504be759fb9e62a266a1f653b09

This commit is contained in:
WPT Sync Bot 2020-03-03 08:20:38 +00:00
parent c0d9ee0ce2
commit bdf20e37ce
44 changed files with 559 additions and 204 deletions

View file

@ -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

View file

@ -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",
[

View file

@ -0,0 +1,4 @@
[hit-test-floats-002.html]
[Hit test float]
expected: FAIL

View file

@ -0,0 +1,4 @@
[hit-test-floats-004.html]
[Miss float below something else]
expected: FAIL

View file

@ -0,0 +1,4 @@
[hit-test-floats-005.html]
[Miss clipped float]
expected: FAIL

View file

@ -0,0 +1,2 @@
[bidi-span-001.html]
expected: CRASH

View file

@ -2,6 +2,3 @@
[Hit test intersecting scaled box]
expected: FAIL
[Hit test within unscaled box]
expected: FAIL

View file

@ -2,6 +2,3 @@
[listeners are called when <iframe> is resized]
expected: FAIL
[listeners are called correct number of times]
expected: FAIL

View file

@ -2,6 +2,3 @@
[elementsFromPoint on the root document for points in iframe elements]
expected: FAIL
[elementsFromPoint on inner documents]
expected: FAIL

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,4 +0,0 @@
[traverse_the_history_1.html]
[Multiple history traversals from the same task]
expected: FAIL

View file

@ -1,4 +1,4 @@
[traverse_the_history_5.html]
[traverse_the_history_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,5 +0,0 @@
[017.html]
expected: TIMEOUT
[origin of the script that invoked the method, about:blank]
expected: TIMEOUT

View file

@ -1,4 +1,5 @@
[005.html]
expected: ERROR
[dedicated worker in shared worker in dedicated worker]
expected: FAIL

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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);
});

View file

@ -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"
);

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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();

View file

@ -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>

View file

@ -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}`);
}
}

View file

@ -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`
);
}

View file

@ -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)

View file

@ -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),

View file

@ -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)

View file

@ -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

View file

@ -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": ""
}
]

View file

@ -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"
);

View file

@ -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>

View file

@ -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.
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;
}
}, "Set up the test environment");
cb();
promise_test(t => {
if (authenticator) {
return window.test_driver.remove_virtual_authenticator(authenticator);
}
}, "Clean up the test environment");
// The protocol is not available. Continue manually.
cb();
});
}
/* JSHINT */