Sync WPT with upstream (15-06-2025) (#37468)

Automated downstream sync of changes from upstream as of 15-06-2025
[no-wpt-sync]

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
This commit is contained in:
Servo WPT Sync 2025-06-15 06:21:56 +02:00 committed by GitHub
parent 96adb1e959
commit 1eb62a1ffb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
50 changed files with 1293 additions and 226 deletions

View file

@ -38233,7 +38233,7 @@
},
"apng": {
"animated-png-timeout.html": [
"6975bd9c4e7339ceceb9f078bbf0c356f9949f3e",
"2a10f8df06ccce550ebd642f7602c3b55dad9a8b",
[
null,
[
@ -188203,7 +188203,113 @@
],
{}
]
]
],
"subgrid": {
"subgrid-gap-decorations-001.html": [
"d5356ea5aa6de0bac341fb111b8c98734dde69da",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"subgrid-gap-decorations-002.html": [
"82df19b25fded7593aba75703c0ab050b7130256",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"subgrid-gap-decorations-003.html": [
"21199263380eae7aa5217fa6645b8ee5a930294d",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"subgrid-gap-decorations-004.html": [
"20fb1404fa24503bf70eebf297fbe77129910365",
[
null,
[
[
"/css/css-gaps/grid/grid-gap-decorations-006-ref.html",
"=="
]
],
{}
]
],
"subgrid-gap-decorations-005.html": [
"7c92642b603bd8fcac55f6ac635390a3d7fb15df",
[
null,
[
[
"/css/css-gaps/grid/grid-gap-decorations-007-ref.html",
"=="
]
],
{}
]
],
"subgrid-gap-decorations-006.html": [
"8ac8b7a9ad91e76c44bc1c7f1978fc27418455f0",
[
null,
[
[
"/css/css-gaps/grid/grid-gap-decorations-008-ref.html",
"=="
]
],
{}
]
],
"subgrid-gap-decorations-007.html": [
"64a87d62d115ebdedb02fb15c446aed0be209193",
[
null,
[
[
"/css/css-gaps/grid/grid-gap-decorations-010-ref.html",
"=="
]
],
{}
]
],
"subgrid-gap-decorations-008.html": [
"b43dea7114936d2b8ae718c0033ed9bcda27e200",
[
null,
[
[
"/css/css-gaps/grid/grid-gap-decorations-012-ref.html",
"=="
]
],
{}
]
]
}
},
"multicol": {
"multicol-gap-decorations-001.html": [
@ -334565,6 +334671,19 @@
{}
]
],
"mq-invalid-media-type-006.html": [
"430c3a36a37b097ca8db6d491c3f2f2fc82e227f",
[
null,
[
[
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
],
{}
]
],
"mq-invalid-media-type-layer-001.html": [
"ef3fc48ca888810101ad196917022f6c378b52a9",
[
@ -378028,7 +378147,7 @@
],
"support": {
"clear-cache-helper.sub.js": [
"1e9f2c2c33a7c1394c9c813579bd41d4d6a51f38",
"5db0caf834cbf6a598f02761beda267dc8f1bcf8",
[]
],
"clear-site-data-cache.py": [
@ -443915,7 +444034,7 @@
[]
],
"position-sticky-fractional-offset-ref.html": [
"8b7a1f8a195843b2b943e39813b5e24781955b8d",
"37a087b7be7182c2bdefc3a39124132360c1bab0",
[]
],
"position-sticky-grid-ref.html": [
@ -517510,7 +517629,7 @@
[]
],
"executorservodriver.py": [
"e27b111ee8b7c4cdff4a0aee5c010d402efff263",
"8176d15ea2a5bbc201618076d58c76b59bc42c47",
[]
],
"executorwebdriver.py": [
@ -564530,18 +564649,8 @@
]
},
"clear-site-data": {
"clear-cache-bfcache-partitioning.tentative.https.html": [
"02a2f020cbca1a14088f60db27de61b61aae2cf8",
[
null,
{
"testdriver": true,
"timeout": "long"
}
]
],
"clear-cache-bfcache.https.html": [
"b9967c541f1d89f6343ea47df38b3cbdb722ecc1",
"clear-cache-bfcache.sub.https.html": [
"61d810f453b827946cb6ef943b4509b24e5f3246",
[
null,
{
@ -569474,7 +569583,7 @@
]
],
"compute_pressure_duplicate_updates.https.window.js": [
"abf53854b40637d17102132d39e8a5e0aeaa438d",
"b2968375db06ad348bd92b403f56828b84ff5fb9",
[
"compute-pressure/compute_pressure_duplicate_updates.https.window.html?globalScope=dedicated_worker",
{
@ -585932,21 +586041,21 @@
]
],
"corner-shape-computed.html": [
"e1b458fd06eb512ccd12912ed96c464f8a29bf82",
"e48fda86af2bb161f12e3144b160e55a324b65c8",
[
null,
{}
]
],
"corner-shape-invalid.html": [
"6aee773f4a4005e1365ff7601b69cc4c08533e46",
"5426a5ec704f4f74618d00c36afdf5846231f0f0",
[
null,
{}
]
],
"corner-shape-valid.html": [
"0ad14c81a74425ce905ea5f1b560e737fbff6d08",
"c9c4421a46c0c33b96b6ea8b63edbb29640643c7",
[
null,
{}
@ -627392,7 +627501,7 @@
]
],
"define.html": [
"d3d923bd916fd04576d0de1d809e43a5395b9edb",
"52193ebd17e4ea01e2dccf0656ad28915894d65b",
[
null,
{}
@ -627454,7 +627563,7 @@
{}
]
],
"valid-custom-element-names.tentative.html": [
"valid-custom-element-names.html": [
"72a5999e3a9a76bd35b3f17402cf13f6ef43dc4d",
[
null,
@ -730920,7 +731029,7 @@
]
],
"video-intrinsic-width-height.html": [
"047c832da35246278ce58a255037c64bb1d8b723",
"836fadb24fda2f90b5730babe801b212d3125fea",
[
null,
{}
@ -803178,6 +803287,28 @@
}
]
],
"lcp": {
"tentative": {
"broken-image-icon.html": [
"fbfb2280dcfbad916b0b62d69e481b35256b0188",
[
null,
{
"testdriver": true
}
]
],
"contracted-image.html": [
"46d359a87b3fe5e99e03879cf3801e4e358e1f67",
[
null,
{
"testdriver": true
}
]
]
}
},
"load-classic-script-history-push.tentative.html": [
"4e375b2164db87258132f4a6edba4b68c1c2b99b",
[
@ -883501,6 +883632,102 @@
}
]
],
"opSupportLimits.https.any.js": [
"cd28df9b6938acfcfb0d09fbe52b3d0c0693ecf1",
[
"webnn/validation_tests/opSupportLimits.https.any.html?cpu",
{
"script_metadata": [
[
"title",
"validation context.opSupportLimits() interface"
],
[
"global",
"window"
],
[
"variant",
"?cpu"
],
[
"variant",
"?gpu"
],
[
"variant",
"?npu"
],
[
"script",
"../resources/utils_validation.js"
]
]
}
],
[
"webnn/validation_tests/opSupportLimits.https.any.html?gpu",
{
"script_metadata": [
[
"title",
"validation context.opSupportLimits() interface"
],
[
"global",
"window"
],
[
"variant",
"?cpu"
],
[
"variant",
"?gpu"
],
[
"variant",
"?npu"
],
[
"script",
"../resources/utils_validation.js"
]
]
}
],
[
"webnn/validation_tests/opSupportLimits.https.any.html?npu",
{
"script_metadata": [
[
"title",
"validation context.opSupportLimits() interface"
],
[
"global",
"window"
],
[
"variant",
"?cpu"
],
[
"variant",
"?gpu"
],
[
"variant",
"?npu"
],
[
"script",
"../resources/utils_validation.js"
]
]
}
]
],
"pad.https.any.js": [
"fb285ed8277fcf7ce04c6927b7173cc3b47b2544",
[

View file

@ -28,3 +28,24 @@
[.test 16: space-around]
expected: FAIL
[.test 1: start]
expected: FAIL
[.test 4: baseline]
expected: FAIL
[.test 6: flex-start]
expected: FAIL
[.test 8: unsafe start]
expected: FAIL
[.test 11: safe start]
expected: FAIL
[.test 15: space-between]
expected: FAIL
[.test 17: normal]
expected: FAIL

View file

@ -112,3 +112,21 @@
[Property corner-shape value 'superellipse(-1) superellipse(3) superellipse(0) superellipse(infinity)']
expected: FAIL
[Property corner-left-shape value 'round scoop']
expected: FAIL
[Property corner-top-shape value 'round scoop']
expected: FAIL
[Property corner-top-shape value 'superellipse(4)']
expected: FAIL
[Property corner-right-shape value 'superellipse(-1.5) superellipse(3)']
expected: FAIL
[Property corner-right-shape value 'superellipse(-1) superellipse(2)']
expected: FAIL
[Property corner-bottom-shape value 'scoop scoop']
expected: FAIL

View file

@ -478,3 +478,147 @@
[e.style['corner-shape'\] = "superellipse(-0.5) superellipse(3) square superellipse(-30)" should set the property value]
expected: FAIL
[e.style['corner-top-shape'\] = "scoop" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "scoop" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "scoop" should not set unrelated longhands]
expected: FAIL
[e.style['corner-top-shape'\] = "bevel notch" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "bevel notch" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "bevel notch" should not set unrelated longhands]
expected: FAIL
[e.style['corner-top-shape'\] = "superellipse(-2) squircle" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "superellipse(-2) squircle" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands]
expected: FAIL
[e.style['corner-top-shape'\] = "superellipse(3)" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "superellipse(3)" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-top-shape'\] = "superellipse(3)" should not set unrelated longhands]
expected: FAIL
[e.style['corner-right-shape'\] = "scoop" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "scoop" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "scoop" should not set unrelated longhands]
expected: FAIL
[e.style['corner-right-shape'\] = "bevel notch" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "bevel notch" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "bevel notch" should not set unrelated longhands]
expected: FAIL
[e.style['corner-right-shape'\] = "superellipse(-2) squircle" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "superellipse(-2) squircle" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands]
expected: FAIL
[e.style['corner-right-shape'\] = "superellipse(3)" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "superellipse(3)" should set corner-top-right-shape]
expected: FAIL
[e.style['corner-right-shape'\] = "superellipse(3)" should not set unrelated longhands]
expected: FAIL
[e.style['corner-bottom-shape'\] = "scoop" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "scoop" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "scoop" should not set unrelated longhands]
expected: FAIL
[e.style['corner-bottom-shape'\] = "bevel notch" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "bevel notch" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "bevel notch" should not set unrelated longhands]
expected: FAIL
[e.style['corner-bottom-shape'\] = "superellipse(-2) squircle" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "superellipse(-2) squircle" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands]
expected: FAIL
[e.style['corner-bottom-shape'\] = "superellipse(3)" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "superellipse(3)" should set corner-bottom-right-shape]
expected: FAIL
[e.style['corner-bottom-shape'\] = "superellipse(3)" should not set unrelated longhands]
expected: FAIL
[e.style['corner-left-shape'\] = "scoop" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "scoop" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "scoop" should not set unrelated longhands]
expected: FAIL
[e.style['corner-left-shape'\] = "bevel notch" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "bevel notch" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "bevel notch" should not set unrelated longhands]
expected: FAIL
[e.style['corner-left-shape'\] = "superellipse(-2) squircle" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "superellipse(-2) squircle" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands]
expected: FAIL
[e.style['corner-left-shape'\] = "superellipse(3)" should set corner-bottom-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "superellipse(3)" should set corner-top-left-shape]
expected: FAIL
[e.style['corner-left-shape'\] = "superellipse(3)" should not set unrelated longhands]
expected: FAIL

View file

@ -0,0 +1,2 @@
[subgrid-gap-decorations-002.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[subgrid-gap-decorations-003.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[subgrid-gap-decorations-004.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[subgrid-gap-decorations-005.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[subgrid-gap-decorations-006.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[subgrid-gap-decorations-007.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[subgrid-gap-decorations-008.html]
expected: FAIL

View file

@ -1,2 +0,0 @@
[dynamic-available-size-iframe.html]
expected: FAIL

View file

@ -0,0 +1,9 @@
[define.html]
[Element names: defining an element named a-a× should succeed]
expected: FAIL
[Element names: defining an element named a-a  should succeed]
expected: FAIL
[Element names: defining an element named a-a󰀀 should succeed]
expected: FAIL

View file

@ -1,3 +1,3 @@
[valid-custom-element-names.tentative.html]
[valid-custom-element-names.html]
[valid-custom-element-names]
expected: FAIL

View file

@ -1,5 +1,5 @@
[max-payload.tentative.https.window.html]
expected: ERROR
expected: TIMEOUT
[fetchLater() accepts max payload in a POST request body of String in same-origin iframe.]
expected: FAIL

View file

@ -26,3 +26,6 @@
[sec-fetch-user - no options - updating]
expected: NOTRUN
[sec-fetch-site - Same origin, no options - registration]
expected: FAIL

View file

@ -4,3 +4,6 @@
[Navigating to a different document with form submission]
expected: FAIL
[Navigating to a different document with link click]
expected: FAIL

View file

@ -1,3 +0,0 @@
[duplicate-name-order.html]
[Duplicate name lookup order]
expected: FAIL

View file

@ -1,4 +1,3 @@
[document-base-url-window-initiator-is-not-opener.https.window.html]
expected: TIMEOUT
[window.open() gets base url from initiator not opener.]
expected: [FAIL, PASS, TIMEOUT]

View file

@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-2.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: FAIL
expected: TIMEOUT

View file

@ -1,3 +1,4 @@
[iframe_sandbox_popups_nonescaping-1.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: FAIL
expected: NOTRUN

View file

@ -10,3 +10,12 @@
[Reload domInteractive > Original domInteractive]
expected: FAIL
[Reload domContentLoadedEventEnd > Original domContentLoadedEventEnd]
expected: FAIL
[Reload domContentLoadedEventStart > Original domContentLoadedEventStart]
expected: FAIL
[Reload fetchStart > Original fetchStart]
expected: FAIL

View file

@ -71,11 +71,11 @@
[404 (script): main]
expected: FAIL
[success (xhr): main]
expected: FAIL
[404 (xhr): main]
expected: FAIL
[Decode-error (style): main]
expected: FAIL
[CORS (xhr): main]
expected: FAIL

View file

@ -832,3 +832,15 @@
[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[14650\]\t3.7113974459152624e-22\t8.6956524848937988e-1\t8.6956524848937988e-1\t1.0000000000000000e+0\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 8.6956524848937988e-1 at index of 14650.\n\tMax RelError of 1.0000000000000000e+0 at index of 14650.\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[14650\]\t2.9950560000000000e+7\t8.6956524848937988e-1\t2.9950559130434752e+7\t3.4443141768217228e+7\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 2.9950559130434752e+7 at index of 14650.\n\tMax RelError of 3.4443141768217228e+7 at index of 14650.\n]
expected: FAIL
[X SNR (-106.09401274404922 dB) is not greater than or equal to 65.737. Got -106.09401274404922.]
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[14650\]\t6.2262804267009756e-15\t8.6956524848937988e-1\t8.6956524848937367e-1\t9.9999999999999289e-1\t3.8985999999999999e-3\n\t[14651\]\t3.0547976493835449e-1\t8.9879405498504639e-1\t5.9331429004669189e-1\t6.6012262403823208e-1\t3.8985999999999999e-3\n\tMax AbsError of 8.6956524848937367e-1 at index of 14650.\n\tMax RelError of 9.9999999999999289e-1 at index of 14650.\n]
expected: FAIL
[X SNR (42.96525288004429 dB) is not greater than or equal to 65.737. Got 42.96525288004429.]
expected: FAIL

View file

@ -1,7 +1,6 @@
<html class="reftest-wait">
<title>APNG: Second frame displays quickly, replacing red with green.</title>
<link rel="match" href="animated-png-timeout-ref.html"/>
<img src=../images/apng.png onload="loaded()"/>
<script>
function loaded() {
setTimeout(function() {
@ -9,3 +8,4 @@
}, 1000);
}
</script>
<img src=../images/apng.png onload="loaded()"/>

View file

@ -1,61 +0,0 @@
<!DOCTYPE html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Clear-Site-Data: cache for bfcache</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="support/clear-cache-helper.sub.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/common/utils.js"></script>
<script src="/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js"></script>
<script type="module">
// cross-site: example.com (iframe: example.net) -> example.net (iframe example.net clear) -> in bfcache
runBfCacheClearTest(
{
getUrlParams: {
clear: "cache",
secondOrigin: true,
},
targetOrigin: crossSiteOrigin,
mode: "iframe",
shouldBeCached: true,
funcBeforeNavigation: async (url) => {
await new Promise(resolve => {
const iframe = document.createElement("iframe");
iframe.src = url;
document.body.appendChild(iframe);
iframe.onload = resolve;
});
},
argsBeforeNavigation: [crossSiteOrigin],
},
"BfCached document not be dropped when containing cross-site iframe and that cross-site received clear-cache header"
);
// same-site: www.example.com (iframe: www2.example.com) -> www2.example.com (iframe www2.example.com clear) -> bfcache entry gets cleared
runBfCacheClearTest(
{
getUrlParams: {
clear: "cache",
subdomain: true,
},
targetOrigin: subdomainOrigin,
mode: "iframe",
shouldBeCached: false,
funcBeforeNavigation: async (url) => {
await new Promise(resolve => {
const iframe = document.createElement("iframe");
iframe.src = url;
document.body.appendChild(iframe);
iframe.onload = resolve;
});
},
argsBeforeNavigation: [subdomainOrigin],
},
"BfCached document should be dropped when containing same-site iframe and that same-site received clear-cache header"
);
</script>

View file

@ -1,63 +0,0 @@
<!DOCTYPE html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Clear-Site-Data: cache for bfcache</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="support/clear-cache-helper.sub.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/common/utils.js"></script>
<script src="/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js"></script>
<script type="module">
runBfCacheClearTest(
{
getUrlParams: {
clear: "cache",
},
mode: "iframe",
shouldBeCached: false,
},
"BfCached document shouldn't be cached after receiving clear-cache header from the same origin."
);
runBfCacheClearTest(
{
targetOrigin: subdomainOrigin,
getUrlParams: {
subdomain: true,
clear: "cache",
},
mode: "iframe",
shouldBeCached: true,
},
"BfCached document should be cached after receiving clear-cache header from a subdomain."
);
runBfCacheClearTest(
{
targetOrigin: crossSiteOrigin,
getUrlParams: {
secondOrigin: true,
clear: "cache",
},
mode: "iframe",
shouldBeCached: true,
},
"BfCached document should be cached after receiving clear-cache header from another site."
);
runBfCacheClearTest(
{
getUrlParams: {
clear: "cache",
},
mode: "window",
shouldBeCached: false,
},
"BfCached document shouldn't be cached after receiving clear-cache header from another window."
);
</script>

View file

@ -0,0 +1,115 @@
<!DOCTYPE html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>Clear-Site-Data: cache for bfcache</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="support/clear-cache-helper.sub.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/common/utils.js"></script>
<script src="/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js"></script>
<script type="module">
const sameOrigin =
'https://{{host}}:{{ports[https][0]}}';
const subdomainOrigin =
'https://{{hosts[][www2]}}:{{ports[https][0]}}';
const crossSiteOrigin =
'https://{{hosts[alt][]}}:{{ports[https][0]}}';
// The tests are built on top of the back-forward-cache test harness.
// Here is the steps for the tests:
// 1. Open a new window and navigate to a test URL.
// 2. Navigate the window to a second page.
// 3. Trigger the clear-site-data header either by window.open() or loading an
// iframe from the second page.
// 4. Navigate back to the first page.
// 5. Assert that the first page is or is not cached.
function runBfCacheClearTest(params, description) {
runBfcacheTest(
{
targetOrigin: sameOrigin,
scripts: ["/clear-site-data/support/clear-cache-helper.sub.js"],
funcBeforeBackNavigation: async (getUrlParams, mode) => {
const cacheHelper = self.crypto.randomUUID();
const testUrl = getUrl(cacheHelper, getUrlParams);
let clearingPromise;
if (mode === "window") {
clearingPromise = new Promise(resolve => {
window.addEventListener("message", resolve, {once: true});
window.open(testUrl);
});
} else if (mode === "iframe") {
clearingPromise = new Promise(resolve => {
const iframe = document.createElement("iframe");
iframe.src = testUrl;
document.body.appendChild(iframe);
iframe.onload = resolve;
});
} else {
throw new Error("Unsupported mode");
}
await clearingPromise;
},
argsBeforeBackNavigation: [params.getUrlParams, params.mode],
...params,
},
description
);
}
runBfCacheClearTest(
{
getUrlParams: {
clear: "cache",
},
mode: "iframe",
shouldBeCached: false,
},
"BfCached document shouldn't be cached after receiving clear-cache header from the same origin."
);
runBfCacheClearTest(
{
targetOrigin: subdomainOrigin,
getUrlParams: {
subdomain: true,
clear: "cache",
},
mode: "iframe",
shouldBeCached: true,
},
"BfCached document should be cached after receiving clear-cache header from a subdomain."
);
runBfCacheClearTest(
{
targetOrigin: crossSiteOrigin,
getUrlParams: {
secondOrigin: true,
clear: "cache",
},
mode: "iframe",
shouldBeCached: true,
},
"BfCached document should be cached after receiving clear-cache header from another site."
);
runBfCacheClearTest(
{
getUrlParams: {
clear: "cache",
},
mode: "window",
shouldBeCached: false,
},
"BfCached document shouldn't be cached after receiving clear-cache header from another window."
);
</script>

View file

@ -3,15 +3,6 @@
"use strict"
const sameOrigin =
'https://{{host}}:{{ports[https][0]}}';
const subdomainOrigin =
'https://{{hosts[][www2]}}:{{ports[https][0]}}';
const crossSiteOrigin =
'https://{{hosts[alt][]}}:{{ports[https][0]}}';
const subomdainCrossSiteOrigin =
'https://{{hosts[alt][www2]}}:{{ports[https][0]}}';
/**
* Constructs a url for an intermediate "bounce" hop which represents a tracker.
* @param {string} cacheHelper - Unique uuid for this test
@ -139,49 +130,3 @@ function testCacheClear(test, params, assert) {
openTestPageHelper(test, null, testUrls, 0, assert, resolve)
});
}
// The tests are built on top of the back-forward-cache test harness.
// Here is the steps for the tests:
// 1. Open a new window and navigate to a test URL.
// 2. Navigate the window to a second page.
// 3. Trigger the clear-site-data header either by window.open() or loading an
// iframe from the second page.
// 4. Navigate back to the first page.
// 5. Assert that the first page is or is not cached.
function runBfCacheClearTest(params, description) {
runBfcacheTest(
{
targetOrigin: sameOrigin,
scripts: ["/clear-site-data/support/clear-cache-helper.sub.js"],
funcBeforeBackNavigation: async (getUrlParams, mode) => {
const cacheHelper = self.crypto.randomUUID();
const testUrl = getUrl(cacheHelper, getUrlParams);
let clearingPromise;
if (mode === "window") {
clearingPromise = new Promise(resolve => {
window.addEventListener("message", resolve, {once: true});
window.open(testUrl);
});
} else if (mode === "iframe") {
clearingPromise = new Promise(resolve => {
const iframe = document.createElement("iframe");
iframe.src = testUrl;
document.body.appendChild(iframe);
iframe.onload = resolve;
});
} else {
throw new Error("Unsupported mode");
}
await clearingPromise;
},
argsBeforeBackNavigation: [params.getUrlParams, params.mode],
...params,
},
description
);
}

View file

@ -27,7 +27,7 @@ pressure_test(async (t) => {
await new Promise(resolve => {t.step_timeout(resolve, 3000)});
assert_equals(syncObserver.changes().length, 1);
await update_virtual_pressure_source('cpu', 'nominal'), 0.2;
await update_virtual_pressure_source('cpu', 'nominal', 0.2);
await syncObserver.waitForUpdate();
assert_equals(syncObserver.changes()[1][0].state, 'nominal');

View file

@ -37,5 +37,11 @@ test_computed_value("corner-shape", "superellipse(-1) superellipse(3) square", "
test_computed_value("corner-shape", "superellipse(-1) superellipse(3) superellipse(0)", "scoop superellipse(3) bevel");
test_computed_value("corner-shape", "bevel superellipse(1) squircle round", "bevel round squircle");
test_computed_value("corner-shape", "superellipse(-1) superellipse(3) superellipse(0) superellipse(infinity)", "scoop superellipse(3) bevel square");
test_computed_value("corner-left-shape", "round scoop");
test_computed_value("corner-top-shape", "round scoop");
test_computed_value("corner-top-shape", "superellipse(4)");
test_computed_value("corner-right-shape", "superellipse(-1.5) superellipse(3)");
test_computed_value("corner-right-shape", "superellipse(-1) superellipse(2)", "scoop squircle");
test_computed_value("corner-bottom-shape", "scoop scoop", "scoop");
</script>

View file

@ -24,4 +24,16 @@ test_invalid_value("corner-shape", "superellipse(1 abc)");
test_invalid_value("corner-shape", "superellipse(1) / bevel");
test_invalid_value("corner-shape", "superellipse(1) / superellipse(3)");
test_invalid_value("corner-shape", "superellipse(1), superellipse(3)");
for (const edge of ["left", "right", "top", "bottom"]) {
const prop = `corner-${edge}-shape`;
test_invalid_value(prop, "auto");
test_invalid_value(prop, "none");
test_invalid_value(prop, "superellipse(1 abc)");
test_invalid_value(prop, "superellipse()");
test_invalid_value(prop, "auto round");
test_invalid_value(prop, "superellipse(--.3) squircle");
test_invalid_value(prop, "superellipse(--.3) squircle bc");
}
</script>

View file

@ -7,6 +7,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
<script src="/css/support/shorthand-testcommon.js"></script>
<script>
function test_values_for_prop(prop) {
@ -29,6 +30,13 @@
test_valid_value(prop, "superellipse(calc(0.5 * 4))", "superellipse(calc(2))");
}
function test_corner_shape_shorthand(shorthand, longhand1, longhand2) {
test_shorthand_value(shorthand, "scoop", {[longhand1]: "scoop", [longhand2]: "scoop"});
test_shorthand_value(shorthand, "bevel notch", {[longhand1]: "bevel", [longhand2]: "notch"});
test_shorthand_value(shorthand, "superellipse(-2) squircle", {[longhand1]: "superellipse(-2)", [longhand2]: "squircle"});
test_shorthand_value(shorthand, "superellipse(3)", {[longhand1]: "superellipse(3)", [longhand2]: "superellipse(3)"});
}
for (const v of ["top", "bottom"]) {
for (const h of ["left", "right"]) {
test_values_for_prop(`corner-${v}-${h}-shape`);
@ -49,4 +57,8 @@
test_valid_value("corner-shape", "bevel superellipse(2) squircle round", "bevel superellipse(2) squircle round");
test_valid_value("corner-shape", "superellipse(0.5) superellipse(3) superellipse(1) superellipse(infinity)");
test_corner_shape_shorthand('corner-top-shape', 'corner-top-left-shape', 'corner-top-right-shape');
test_corner_shape_shorthand('corner-right-shape', 'corner-top-right-shape', 'corner-bottom-right-shape');
test_corner_shape_shorthand('corner-bottom-shape', 'corner-bottom-left-shape', 'corner-bottom-right-shape');
test_corner_shape_shorthand('corner-left-shape', 'corner-top-left-shape', 'corner-bottom-left-shape');
</script>

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: Gap decorations are painted with the grid subgridded on both axes.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 10px;
width: 100px;
height: 100px;
}
.subgrid {
display: grid;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
background: red;
grid-column: 1 / -1;
grid-row: 1 / -1;
column-rule: green solid 10px;
row-rule: green solid 10px;
}
.subgrid-item {
background: green;
}
</style>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div class="grid-container">
<div class="subgrid">
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
</div>
</div>

View file

@ -0,0 +1,47 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: Gap decorations are painted with the grid subgridded on column axis.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 10px;
width: 100px;
height: 100px;
}
.subgrid {
display: grid;
grid-template-columns: subgrid;
grid-template-rows: repeat(2, 1fr);
grid-column: 1 / -1;
grid-row: 1 / -1;
column-rule: green solid 10px;
row-gap: 20px;
row-rule: green solid 20px;
background: red;
}
.subgrid-item {
background: green;
}
</style>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div class="grid-container">
<div class="subgrid">
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
</div>
</div>

View file

@ -0,0 +1,47 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: Gap decorations are painted with the grid subgridded on row axis.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 10px;
width: 100px;
height: 100px;
}
.subgrid {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: subgrid;
grid-column: 1 / -1;
grid-row: 1 / -1;
column-gap: 20px;
column-rule: green solid 20px;
row-rule: green solid 10px;
background: red;
}
.subgrid-item {
background: green;
}
</style>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div class="grid-container">
<div class="subgrid">
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
<div class="subgrid-item"></div>
</div>
</div>

View file

@ -0,0 +1,46 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: *rule-break defaults to spanning-item and avoids painting behind spanners in subgrid.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
<link rel="match" href="../grid-gap-decorations-006-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
body {
margin: 0;
}
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: 10px;
width: 430px;
height: 430px;
}
.subgrid {
display: grid;
grid-column: 1 / -1;
grid-row: 1 / -1;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
column-rule: blue solid 5px;
row-rule: red solid 5px;
}
.grid-item {
background-color: gray;
opacity: 0.5;
border: 1px solid #000;
}
</style>
<div class="grid-container">
<div class="subgrid">
<div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
<div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
<div class="grid-item" style="grid-row: 2 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
<div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
</div>
</div>

View file

@ -0,0 +1,52 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: setting *rule-break to intersection stops painting decorations at each intersection in subgrid.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
<link rel="match" href="../grid-gap-decorations-007-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
body {
margin: 0;
}
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: 10px;
width: 430px;
height: 430px;
}
.subgrid {
display: grid;
grid-column: 1 / -1;
grid-row: 1 / -1;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
column-rule: blue solid 5px;
row-rule: red solid 5px;
column-rule-break: intersection;
column-rule-outset: 0px;
row-rule-break: intersection;
row-rule-outset: 0px;
}
.grid-item {
background-color: gray;
opacity: 0.5;
border: 1px solid #000;
}
</style>
<div class="grid-container">
<div class="subgrid">
<div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
<div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
<div class="grid-item" style="grid-row: 2 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
<div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
</div>
</div>

View file

@ -0,0 +1,49 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: setting *rule-break to none paints decorations from first grid line to last grid line in subgrid.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/#break">
<link rel="match" href="../grid-gap-decorations-008-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
body {
margin: 0;
}
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: 10px;
width: 430px;
height: 430px;
}
.subgrid {
display: grid;
grid-column: 1 / -1;
grid-row: 1 / -1;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
column-rule: blue solid 5px;
row-rule: red solid 5px;
column-rule-break: none;
row-rule-break: none;
}
.grid-item {
background-color: gray;
opacity: 0.5;
border: 1px solid #000;
}
</style>
<div class="grid-container">
<div class="subgrid">
<div class="grid-item" style="grid-column: 1 / 3; grid-row: 1 / 2;"></div>
<div class="grid-item" style="grid-column: 3 / 4; grid-row: 1 / 3;"></div>
<div class="grid-item" style="grid-row: 2 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 4; grid-row: 3 / 4;"></div>
<div class="grid-item" style="grid-column: 2 / 3; grid-row: 2 / 3;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 1 / 4;"></div>
<div class="grid-item" style="grid-column: 1 / 4; grid-row: 4 / 5;"></div>
<div class="grid-item" style="grid-column: 4 / 5; grid-row: 4 / 5;"></div>
</div>
</div>

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: An outset of 0px aligns the ends of gap decorations with adjacent item in subgrid.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="match" href="../grid-gap-decorations-010-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
body {
margin: 0;
}
.grid-container {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
gap: 10px;
}
.subgrid {
display: grid;
grid-column: 1 / -1;
grid-row: 1 / -1;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
column-rule: blue solid 5px;
row-rule: red solid 5px;
column-rule-outset: 0px;
column-rule-break: intersection;
}
.item {
background: gray;
opacity: 0.5;
}
</style>
<div class="grid-container">
<div class="subgrid">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</div>

View file

@ -0,0 +1,47 @@
<!DOCTYPE html>
<title>
CSS Gap Decorations: An outset of 5px extends decorations slightly beyond the edges of adjacent items in subgrid.
</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="match" href="../grid-gap-decorations-012-ref.html">
<link rel="author" title="Sam Davis Omekara Jr." href="mailto:samomekarajr@microsoft.com">
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
gap: 10px;
}
.subgrid {
display: grid;
grid-column: 1 / -1;
grid-row: 1 / -1;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
column-rule: blue solid 5px;
row-rule: red solid 5px;
column-rule-outset: 5px;
column-rule-break: intersection;
}
.item {
background: gray;
opacity: 0.5;
}
</style>
<body>
<div class="grid-container">
<div class="subgrid">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</div>
</body>

View file

@ -4,9 +4,16 @@
width: 100px;
height: 100px;
overflow-y: scroll;
background: lightgreen;
/**
* The scroll container background color can affect whether we use light
* or dark scrollbars. Use the same color as the test to ensure they match
**/
background: red;
display: inline-block;
}
.container div {
background: lightgreen;
}
</style>
<div class="container">

View file

@ -0,0 +1,63 @@
<!DOCTYPE html>
<html>
<head>
<link rel="help" href="https://drafts.csswg.org/mediaqueries4/#error-handling">
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
<meta name="assert" content="Test if we ignore syntactically invalid media query lists with multiple media queries and missing media types.">
<style>
div {
width: 100px;
height: 20px;
}
#valid1,
#valid2,
#valid3 {
background-color: red;
}
#invalid1,
#invalid2 {
background-color: green;
}
@media screen and (min-width: 480px), screen and (device-width: 768px) {
#valid1 {
background-color: green;
}
}
@media screen {
#valid2 {
background-color: green;
}
}
@media {
#valid3 {
background-color: green;
}
}
@media screen and (min-width: 480px) screen and (device-width: 768px) {
#invalid1 {
background-color: red;
}
}
@media screen and (min-width: 480px) and (device-width: 768px) {
#invalid2 {
background-color: red;
}
}
</style>
</head>
<body>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div id="valid1"></div>
<div id="valid2"></div>
<div id="valid3"></div>
<div id="invalid1"></div>
<div id="invalid2"></div>
</body>
</html>

View file

@ -70,6 +70,9 @@
'a-0123456789',
'a-\u6F22\u5B57', // Two CJK Unified Ideographs
'a-\uD840\uDC0B', // Surrogate pair U+2000B
'a-a\u00D7',
'a-a\u3000',
'a-a\uDB80\uDC00', // Surrogate pair U+F0000
];
let invalidCustomElementNames = [
undefined,
@ -85,9 +88,6 @@
'a-A',
'a-Z',
'A-a',
'a-a\u00D7',
'a-a\u3000',
'a-a\uDB80\uDC00', // Surrogate pair U+F0000
// name must not be any of the hyphen-containing element names.
'annotation-xml',
'color-profile',

View file

@ -9,7 +9,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<body style="width: 500px">
<div id="log"></div>
<video title="no width/height attributes"
data-expected-width="300" data-expected-height="150"></video>

View file

@ -0,0 +1,78 @@
<!doctype html>
<!--
The soft navigation version of the identically named test in
/largest-contentful-paint/broken-image-icon.html.
Notes:
- Awaits trivial soft navigation with same page contents as original test.
- Viewport is very small so that the small icon below (16x8) is
sufficiently large to trigger a soft navigation.
- Original test was awaiting FCP, but we don't support that yet
for soft navs; so now we await LCP for the hard navigation, and then
LCP and soft nav for the soft navigation, with the promise set up prior
to the click.
-->
<meta name="viewport" content="width=50, height=50, initial-scale=1" />
<title>Broken Image Icon Should Not Be LCP after soft navigation</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script>
<script>
function clickHandler() {
document.body.innerHTML = `
<img src="../non-existent-image.jpg">
<img src="/css/css-images/support/colors-16x8.png">
`;
history.pushState({}, "", "/test");
}
</script>
<body>
<div id="click-target" onclick="clickHandler()">Click!</div>
</body>
<script>
promise_test(async (t) => {
assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented");
const helper = new SoftNavigationTestHelper(t);
const lcpEntries = await helper.getBufferedPerformanceEntriesWithTimeout(
/*type=*/ "largest-contentful-paint",
/*includeSoftNavigationObservations=*/ false,
/*minNumEntries=*/ 1,
);
assert_equals(lcpEntries.length, 1);
assert_equals(lcpEntries[0].id, "click-target", "The first entry should be the button");
const promise = Promise.all([
SoftNavigationTestHelper.getPerformanceEntries(
/*type=*/ "largest-contentful-paint",
/*includeSoftNavigationObservations=*/ true,
/*minNumEntries=*/ 1,
),
SoftNavigationTestHelper.getPerformanceEntries(
/*type=*/ "soft-navigation",
/*includeSoftNavigationObservations=*/ true,
/*minNumEntries=*/ 1,
),
]);
if (test_driver) {
test_driver.click(document.getElementById("click-target"));
}
const [softLcpEntries, softNavigationEntries] = await promise;
assert_equals(softNavigationEntries.length, 1, "One soft navigation entry.");
assert_true(
softNavigationEntries[0].name.endsWith("test"),
"Soft navigation should be to test page.",
);
// There should be only 1 LCP entry and it should be the colors-16x8.png though
// being smaller than the broken image icon. The broken image icon should not
// emit an LCP entry.
assert_equals(softLcpEntries.length, 1, "There should be one and only one LCP entry.");
assert_true(
softLcpEntries[0].url.includes("colors-16x8.png"),
"The LCP entry should be the colors-16x8.png",
);
}, "The broken image icon should not emit an LCP entry after soft navigation.");
</script>

View file

@ -0,0 +1,63 @@
<!doctype html>
<!--
The soft navigation version of the identically named
test in /largest-contentful-paint/contracted-image.html.
Notes:
- Awaits trivial soft navigation with same page contents as original test.
- Uses promise_test and slightly revised HTML tags, to make it easy to
observe the initial LCP before the soft navigation (the click target)
and distinguish it from the interesting LCP after the soft navigation.
-->
<meta charset="utf-8" />
<title>
Largest Contentful Paint: contracted image bounded by display size after soft navigation.
</title>
<style type="text/css">
#image_id {
width: 50px;
height: 50px;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/largest-contentful-paint/resources/largest-contentful-paint-helpers.js"></script>
<script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script>
<script>
function clickHandler() {
document.body.innerHTML = `<img src="/images/black-rectangle.png" id="image_id" />`;
history.pushState({}, "", "/test");
}
</script>
<body>
<div id="click-target" onclick="clickHandler()">Click!</div>
</body>
<script>
promise_test(async (t) => {
assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented");
if (test_driver) {
test_driver.click(document.getElementById("click-target"));
}
const beforeLoad = performance.now();
const helper = new SoftNavigationTestHelper(t);
await helper.getBufferedPerformanceEntriesWithTimeout(
/*type=*/ "soft-navigation",
/*includeSoftNavigationObservations=*/ false,
/*minNumEntries=*/ 1,
);
const entries = await helper.getBufferedPerformanceEntriesWithTimeout(
/*type=*/ "largest-contentful-paint",
/*includeSoftNavigationObservations=*/ true,
/*minNumEntries=*/ 2,
);
assert_equals(entries.length, 2);
assert_equals(entries[0].id, "click-target", "The first entry should be the button");
const entry = entries[1];
const url = window.location.origin + "/images/black-rectangle.png";
// black-rectangle.png is 100 x 50. It occupies 50 x 50 so size will be bounded by the displayed size.
const size = 50 * 50;
checkImage(entry, url, "image_id", size, beforeLoad);
}, "Largest Contentful Paint: |size| attribute is bounded by display size after soft navigation.");
</script>

View file

@ -20,17 +20,14 @@ def do_delayed_imports():
def __init__(self, session):
self.session = session
@webdriver.client.command
def get_prefs(self, *prefs):
body = {"prefs": list(prefs)}
return self.session.send_session_command("POST", "servo/prefs/get", body)
@webdriver.client.command
def set_prefs(self, prefs):
body = {"prefs": prefs}
return self.session.send_session_command("POST", "servo/prefs/set", body)
@webdriver.client.command
def reset_prefs(self, *prefs):
body = {"prefs": list(prefs)}
return self.session.send_session_command("POST", "servo/prefs/reset", body)

View file

@ -0,0 +1,54 @@
// META: title=validation context.opSupportLimits() interface
// META: global=window
// META: variant=?cpu
// META: variant=?gpu
// META: variant=?npu
// META: script=../resources/utils_validation.js
'use strict';
const tests = [
{
operator: 'logicalAnd',
limits: {
a: {dataTypes: ['uint8']},
b: {dataTypes: ['uint8']},
output: {dataTypes: ['uint8']},
}
},
{
operator: 'logicalOr',
limits: {
a: {dataTypes: ['uint8']},
b: {dataTypes: ['uint8']},
output: {dataTypes: ['uint8']},
}
},
{
operator: 'logicalXor',
limits: {
a: {dataTypes: ['uint8']},
b: {dataTypes: ['uint8']},
output: {dataTypes: ['uint8']},
}
},
{
operator: 'logicalNot',
limits: {
a: {dataTypes: ['uint8']},
output: {dataTypes: ['uint8']},
}
}
];
tests.forEach(test => promise_test(async t => {
const limits = context.opSupportLimits()[test.operator];
for (let [name, expected] of Object.entries(test.limits)) {
for (let actualDataType of limits[name].dataTypes) {
assert_in_array(
actualDataType, expected.dataTypes,
`${test.operator}.${name}.dataTypes`);
}
}
}, `check opSupportLimits data types of ${test.operator}`));