Sync WPT with upstream (10-07-2025) (#37974)

Automated downstream sync of changes from upstream as of 10-07-2025
[no-wpt-sync]

Signed-off-by: WPT Sync Bot <ghbot+wpt-sync@servo.org>
This commit is contained in:
Servo WPT Sync 2025-07-10 05:09:13 +02:00 committed by GitHub
parent 4615464388
commit 84f0cd5801
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
192 changed files with 4789 additions and 2068 deletions

View file

@ -14,3 +14,6 @@
[Opening a blob URL in a new window by clicking an <a> tag works immediately before revoking the URL.] [Opening a blob URL in a new window by clicking an <a> tag works immediately before revoking the URL.]
expected: TIMEOUT expected: TIMEOUT
[Fetching a blob URL immediately before revoking it works in <script> tags.]
expected: TIMEOUT

File diff suppressed because it is too large Load diff

View file

@ -1,3 +0,0 @@
[frame-ancestors-path-ignored.window.html]
[A 'frame-ancestors' CSP directive with a URL that includes a path should be ignored.]
expected: FAIL

View file

@ -34,3 +34,15 @@
[url hashes should allow redirected scripts - metatag] [url hashes should allow redirected scripts - metatag]
expected: FAIL expected: FAIL
[dynamically inserted parser-inserted script should be allowed if strict-dynamic-url is present - header]
expected: FAIL
[dynamically inserted script inserted by an inline script should be allowed if strict-dynamic-url is present - header]
expected: FAIL
[dynamically inserted parser-inserted script should be allowed if strict-dynamic-url is present - metatag]
expected: FAIL
[dynamically inserted script inserted by an inline script should be allowed if strict-dynamic-url is present - metatag]
expected: FAIL

View file

@ -0,0 +1,3 @@
[eval-blocked-report-contains-hash.html]
[Violation report status OK.]
expected: FAIL

View file

@ -0,0 +1,2 @@
[border-shape-shadow.html]
expected: FAIL

View file

@ -1,14 +1,7 @@
[layer-font-face-override.html] [layer-font-face-override.html]
bug: https://github.com/servo/servo/issues/35520 bug: https://github.com/servo/servo/issues/35520
[@font-face unlayered overrides layered] [@font-face unlayered overrides layered]
expected: [FAIL, PASS] expected: [FAIL, PASS]
[@font-face override between layers] [@font-face override between layers]
expected: [FAIL, PASS] expected: [FAIL, PASS]
[@font-face override update with appended sheet 1]
expected: FAIL
[@font-face override update with appended sheet 2]
expected: FAIL

View file

@ -1,4 +1,5 @@
[font-relative-units-dynamic.html] [font-relative-units-dynamic.html]
expected: ERROR
[em units respond to changes] [em units respond to changes]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,2 @@
[grid-auto-margin-and-replaced-item-001.html]
expected: FAIL

View file

@ -1,15 +0,0 @@
[contents-rule.html]
[Simple @contents with no fallback]
expected: FAIL
[Implicit semicolon after @contents, at end of block]
expected: FAIL
[Block in @apply overrides fallback]
expected: FAIL
[Fallback is used if @apply has no block]
expected: FAIL
[@contents is ignored if there is no @contents parameter]
expected: FAIL

View file

@ -1,3 +0,0 @@
[cross-stylesheet.html]
[CSS Mixins: Mixin from another stylesheet]
expected: FAIL

View file

@ -1,9 +0,0 @@
[shadow-dom.html]
[Style in shadow DOM should have access to outside non-adopted mixins]
expected: FAIL
[Style in shadow DOM should have access to inside mixins]
expected: FAIL
[Style in shadow DOM should have access to mixins from adopted stylesheets]
expected: FAIL

View file

@ -7,6 +7,3 @@
[rowspan can't be zero] [rowspan can't be zero]
expected: FAIL expected: FAIL
[table 7]
expected: FAIL

View file

@ -0,0 +1,2 @@
[caret-shape-block-color-004.tentative.html]
expected: FAIL

View file

@ -4,6 +4,3 @@
[Make sure the page is ready for animation.] [Make sure the page is ready for animation.]
expected: FAIL expected: FAIL
[Smooth scrolling while doing history navigation.]
expected: FAIL

View file

@ -0,0 +1,2 @@
[backdrop-filter-root-toggle-crash.html]
expected: TIMEOUT

View file

@ -44,9 +44,6 @@
[sec-fetch-mode] [sec-fetch-mode]
expected: FAIL expected: FAIL
[sec-fetch-dest]
expected: FAIL
[sec-fetch-storage-access - Same site] [sec-fetch-storage-access - Same site]
expected: FAIL expected: FAIL

View file

@ -2,9 +2,6 @@
[load event does not fire on window.open()] [load event does not fire on window.open()]
expected: FAIL expected: FAIL
[load event does not fire on window.open('about:blank')]
expected: FAIL
[load event does not fire on window.open('')] [load event does not fire on window.open('')]
expected: FAIL expected: FAIL

View file

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

View file

@ -0,0 +1,2 @@
[canvas.2d.disconnected-font-size-math.html]
expected: FAIL

View file

@ -2,6 +2,3 @@
expected: ERROR expected: ERROR
[Test that transfer an OffscreenCanvas that has a webgl context throws exception in a worker.] [Test that transfer an OffscreenCanvas that has a webgl context throws exception in a worker.]
expected: FAIL expected: FAIL
[Test that transfer an OffscreenCanvas twice throws exception in a worker.]
expected: FAIL

View file

@ -1,216 +0,0 @@
[headings-styles.html]
[<h1> (in <article>) - margin-top]
expected: FAIL
[<h1> (in <article>) - margin-bottom]
expected: FAIL
[<h1> (in <article>) - font-size]
expected: FAIL
[<h1> (in <article><article>) - margin-top]
expected: FAIL
[<h1> (in <article><article>) - margin-bottom]
expected: FAIL
[<h1> (in <article><article>) - font-size]
expected: FAIL
[<h1> (in <article><article><article>) - margin-top]
expected: FAIL
[<h1> (in <article><article><article>) - margin-bottom]
expected: FAIL
[<h1> (in <article><article><article>) - font-size]
expected: FAIL
[<h1> (in <article><article><article><article>) - margin-top]
expected: FAIL
[<h1> (in <article><article><article><article>) - margin-bottom]
expected: FAIL
[<h1> (in <article><article><article><article>) - font-size]
expected: FAIL
[<h1> (in <article><article><article><article><article>) - margin-top]
expected: FAIL
[<h1> (in <article><article><article><article><article>) - margin-bottom]
expected: FAIL
[<h1> (in <article><article><article><article><article>) - font-size]
expected: FAIL
[<h1> (in <article><article><article><article><article><hgroup>) - margin-top]
expected: FAIL
[<h1> (in <article><article><article><article><article><hgroup>) - margin-bottom]
expected: FAIL
[<h1> (in <article><article><article><article><article><hgroup>) - font-size]
expected: FAIL
[<h1> (in <aside>) - margin-top]
expected: FAIL
[<h1> (in <aside>) - margin-bottom]
expected: FAIL
[<h1> (in <aside>) - font-size]
expected: FAIL
[<h1> (in <aside><aside>) - margin-top]
expected: FAIL
[<h1> (in <aside><aside>) - margin-bottom]
expected: FAIL
[<h1> (in <aside><aside>) - font-size]
expected: FAIL
[<h1> (in <aside><aside><aside>) - margin-top]
expected: FAIL
[<h1> (in <aside><aside><aside>) - margin-bottom]
expected: FAIL
[<h1> (in <aside><aside><aside>) - font-size]
expected: FAIL
[<h1> (in <aside><aside><aside><aside>) - margin-top]
expected: FAIL
[<h1> (in <aside><aside><aside><aside>) - margin-bottom]
expected: FAIL
[<h1> (in <aside><aside><aside><aside>) - font-size]
expected: FAIL
[<h1> (in <aside><aside><aside><aside><aside>) - margin-top]
expected: FAIL
[<h1> (in <aside><aside><aside><aside><aside>) - margin-bottom]
expected: FAIL
[<h1> (in <aside><aside><aside><aside><aside>) - font-size]
expected: FAIL
[<h1> (in <aside><aside><aside><aside><aside><hgroup>) - margin-top]
expected: FAIL
[<h1> (in <aside><aside><aside><aside><aside><hgroup>) - margin-bottom]
expected: FAIL
[<h1> (in <aside><aside><aside><aside><aside><hgroup>) - font-size]
expected: FAIL
[<h1> (in <nav>) - margin-top]
expected: FAIL
[<h1> (in <nav>) - margin-bottom]
expected: FAIL
[<h1> (in <nav>) - font-size]
expected: FAIL
[<h1> (in <nav><nav>) - margin-top]
expected: FAIL
[<h1> (in <nav><nav>) - margin-bottom]
expected: FAIL
[<h1> (in <nav><nav>) - font-size]
expected: FAIL
[<h1> (in <nav><nav><nav>) - margin-top]
expected: FAIL
[<h1> (in <nav><nav><nav>) - margin-bottom]
expected: FAIL
[<h1> (in <nav><nav><nav>) - font-size]
expected: FAIL
[<h1> (in <nav><nav><nav><nav>) - margin-top]
expected: FAIL
[<h1> (in <nav><nav><nav><nav>) - margin-bottom]
expected: FAIL
[<h1> (in <nav><nav><nav><nav>) - font-size]
expected: FAIL
[<h1> (in <nav><nav><nav><nav><nav>) - margin-top]
expected: FAIL
[<h1> (in <nav><nav><nav><nav><nav>) - margin-bottom]
expected: FAIL
[<h1> (in <nav><nav><nav><nav><nav>) - font-size]
expected: FAIL
[<h1> (in <nav><nav><nav><nav><nav><hgroup>) - margin-top]
expected: FAIL
[<h1> (in <nav><nav><nav><nav><nav><hgroup>) - margin-bottom]
expected: FAIL
[<h1> (in <nav><nav><nav><nav><nav><hgroup>) - font-size]
expected: FAIL
[<h1> (in <section>) - margin-top]
expected: FAIL
[<h1> (in <section>) - margin-bottom]
expected: FAIL
[<h1> (in <section>) - font-size]
expected: FAIL
[<h1> (in <section><section>) - margin-top]
expected: FAIL
[<h1> (in <section><section>) - margin-bottom]
expected: FAIL
[<h1> (in <section><section>) - font-size]
expected: FAIL
[<h1> (in <section><section><section>) - margin-top]
expected: FAIL
[<h1> (in <section><section><section>) - margin-bottom]
expected: FAIL
[<h1> (in <section><section><section>) - font-size]
expected: FAIL
[<h1> (in <section><section><section><section>) - margin-top]
expected: FAIL
[<h1> (in <section><section><section><section>) - margin-bottom]
expected: FAIL
[<h1> (in <section><section><section><section>) - font-size]
expected: FAIL
[<h1> (in <section><section><section><section><section>) - margin-top]
expected: FAIL
[<h1> (in <section><section><section><section><section>) - margin-bottom]
expected: FAIL
[<h1> (in <section><section><section><section><section>) - font-size]
expected: FAIL
[<h1> (in <section><section><section><section><section><hgroup>) - margin-top]
expected: FAIL
[<h1> (in <section><section><section><section><section><hgroup>) - margin-bottom]
expected: FAIL
[<h1> (in <section><section><section><section><section><hgroup>) - font-size]
expected: FAIL

View file

@ -1,3 +0,0 @@
[iframe-loading-lazy-nav-location-assign.html]
[Navigating iframe loading='lazy' before it is loaded: location.assign]
expected: FAIL

View file

@ -0,0 +1,3 @@
[iframe-loading-lazy-reload-location-reload.html]
[Reloading iframe loading='lazy' before it is loaded: location.reload]
expected: FAIL

View file

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

View file

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

View file

@ -1,3 +0,0 @@
[historical.html]
[<input name=isindex> should not be supported]
expected: FAIL

View file

@ -0,0 +1,3 @@
[print-during-unload.html]
[print() during unload]
expected: FAIL

View file

@ -77,9 +77,6 @@
[success (xhr): main] [success (xhr): main]
expected: FAIL expected: FAIL
[MIME-error (script): main]
expected: FAIL
[404 (style): main] [404 (style): main]
expected: FAIL expected: FAIL

View file

@ -0,0 +1,6 @@
[selection-modify-extend-word-generated-content.html]
[extending selection from middle of first word of the middle line shouldn't extend the range to the previous line]
expected: FAIL
[extending selection from middle of last word of the middle line shouldn't extend the range to the next line]
expected: FAIL

View file

@ -37,7 +37,53 @@
[script.https.html?reporting=true] [script.https.html?reporting=true]
expected: ERROR expected: TIMEOUT
[Ensure that a script without integrity did not run]
expected: TIMEOUT
[Ensure that a script with unknown integrity algorithm did not run]
expected: NOTRUN
[Ensure that a script without integrity algorithm runs and gets reported in report-only mode]
expected: NOTRUN
[Ensure that a no-cors script gets blocked]
expected: NOTRUN
[Ensure that ReportingObserver gets called without endpoints]
expected: NOTRUN
[Ensure that a script with integrity runs]
expected: NOTRUN
[Ensure that a data URI script with no integrity runs]
expected: NOTRUN
[Ensure that a no-CORS data URI script with no integrity runs]
expected: NOTRUN
[Ensure that a blob URL script with no integrity runs]
expected: NOTRUN
[Ensure that a no-CORS blob URL script with no integrity runs]
expected: NOTRUN
[Ensure that an about:blank URL script with no integrity does not trigger a report]
expected: NOTRUN
[Ensure that a no-CORS about:blank URL script with no integrity does not trigger a report]
expected: NOTRUN
[script.https.html?reporting=false] [script.https.html?reporting=false]
expected: ERROR [Ensure that a script without integrity did not run]
expected: FAIL
[Ensure that a script with unknown integrity algorithm did not run]
expected: FAIL
[Ensure that a no-cors script gets blocked]
expected: FAIL
[Ensure that ReportingObserver gets called without endpoints]
expected: FAIL

View file

@ -0,0 +1,51 @@
[style.https.html?reporting=true]
expected: TIMEOUT
[Ensure that a style without integrity did not run]
expected: TIMEOUT
[Ensure that a style with unknown integrity algorithm did not run]
expected: NOTRUN
[Ensure that a style without integrity algorithm runs and gets reported in report-only mode]
expected: NOTRUN
[Ensure that a no-cors style gets blocked]
expected: NOTRUN
[Ensure that ReportingObserver gets called without endpoints]
expected: NOTRUN
[Ensure that a style with integrity runs]
expected: NOTRUN
[Ensure that a data URI style with no integrity runs]
expected: NOTRUN
[Ensure that a no-CORS data URI style with no integrity runs]
expected: NOTRUN
[Ensure that a blob URL style with no integrity runs]
expected: NOTRUN
[Ensure that a no-CORS blob URL style with no integrity runs]
expected: NOTRUN
[Ensure that an about:blank URL style with no integrity does not trigger a report]
expected: NOTRUN
[Ensure that a no-CORS about:blank URL style with no integrity does not trigger a report]
expected: NOTRUN
[style.https.html?reporting=false]
[Ensure that a style without integrity did not run]
expected: FAIL
[Ensure that a style with unknown integrity algorithm did not run]
expected: FAIL
[Ensure that a no-cors style gets blocked]
expected: FAIL
[Ensure that ReportingObserver gets called without endpoints]
expected: FAIL

View file

@ -1,5 +1,4 @@
[audiocontext-suspend-resume.html] [audiocontext-suspend-resume.html]
expected: TIMEOUT
[Executing "test-suspend"] [Executing "test-suspend"]
expected: FAIL expected: FAIL
@ -23,3 +22,12 @@
[< [test-resume\] 1 out of 4 assertions were failed.] [< [test-resume\] 1 out of 4 assertions were failed.]
expected: FAIL expected: FAIL
[Test suspend() for offline context]
expected: FAIL
[Test resume() for offline context]
expected: FAIL
[Test state after context closed]
expected: FAIL

View file

@ -7,3 +7,6 @@
[# AUDIT TASK RUNNER FINISHED: 1 out of 3 tasks were failed.] [# AUDIT TASK RUNNER FINISHED: 1 out of 3 tasks were failed.]
expected: FAIL expected: FAIL
[AudioParam: Chaining of envelope methods schedules values as expected]
expected: FAIL

View file

@ -13,3 +13,6 @@
[# AUDIT TASK RUNNER FINISHED: 1 out of 2 tasks were failed.] [# AUDIT TASK RUNNER FINISHED: 1 out of 2 tasks were failed.]
expected: FAIL expected: FAIL
[cancel1: cancel setValueCurve]
expected: FAIL

View file

@ -1,3 +1,6 @@
[realtime-conv.html] [realtime-conv.html]
[Executing "test"] [Executing "test"]
expected: FAIL expected: FAIL
[Test convolver with realtime context]
expected: FAIL

View file

@ -16,7 +16,7 @@
const dynamicScriptUrl = new URL("./support/add_dynamic_script.js", document.location).toString(); const dynamicScriptUrl = new URL("./support/add_dynamic_script.js", document.location).toString();
const redirectUrl = new URL("/common/redirect.py?location=" + scriptUrl, document.location).toString(); const redirectUrl = new URL("/common/redirect.py?location=" + scriptUrl, document.location).toString();
// This is the hash of 'foo.js': // This is the hash of the string 'foo.js':
const wrongHash = "LJVNbdCJGjP5027dMuLOQeMEiDI8JvMr5zMiXqW5tzs="; const wrongHash = "LJVNbdCJGjP5027dMuLOQeMEiDI8JvMr5zMiXqW5tzs=";
function get_iframe_url(test_type, policy, script_url) { function get_iframe_url(test_type, policy, script_url) {
@ -25,6 +25,12 @@
`support/iframe_meta.sub.html?policy=${policy}&script_url=${script_url}`; `support/iframe_meta.sub.html?policy=${policy}&script_url=${script_url}`;
} }
function get_iframe_url_with_inline_script(test_type, policy) {
return test_type == "header" ?
`support/iframe_inline.sub.html?pipe=header(Content-Security-Policy,${policy})`:
`support/iframe_inline_meta.sub.html?policy=${policy}`;
}
for (let test_type of ["header", "metatag"]) { for (let test_type of ["header", "metatag"]) {
promise_test(async t => { promise_test(async t => {
@ -115,6 +121,36 @@
assert_equals(msgEvent.data, 'SCRIPT_RAN'); assert_equals(msgEvent.data, 'SCRIPT_RAN');
}, "url hashes should allow redirected scripts - " + test_type); }, "url hashes should allow redirected scripts - " + test_type);
// Tests for strict-dynamic-url keyword:
promise_test(async t => {
// add_dynamic_script.js isn't allowlisted but strict-dynamic-url should allow it:
const dynamicScriptUrlHash = await sha256ofURL(dynamicScriptUrl);
const policy = `script-src 'nonce-forinlinescript' 'strict-dynamic-url' 'url-sha256-${dynamicScriptUrlHash}'`
let frame = document.createElement('iframe');
frame.src = get_iframe_url(test_type, policy, 'add_dynamic_script.js');
document.body.appendChild(frame);
const msgEvent = await new Promise(resolve => window.onmessage = resolve);
assert_equals(msgEvent.data, 'SCRIPT_RAN');
}, "dynamically inserted parser-inserted script should be allowed if strict-dynamic-url is present - " + test_type);
promise_test(async t => {
// externalScript.js isn't allowlisted but strict-dynamic-url should allow it:
const scriptUrlHash = await sha256ofURL(scriptUrl);
// This is the hash of the inline script that dynamically inserts externalScript.js.
const inlineScriptHash = "F8UqObF6TSi2W4dDcDzAOAplJkYovBE6JpJjsZJy5HA=";
const policy = `script-src 'nonce-forinlinescript' 'strict-dynamic-url' 'sha256-${inlineScriptHash}'`
let frame = document.createElement('iframe');
frame.src = get_iframe_url_with_inline_script(test_type, policy);
document.body.appendChild(frame);
const msgEvent = await new Promise(resolve => window.onmessage = resolve);
assert_equals(msgEvent.data, 'SCRIPT_RAN');
}, "dynamically inserted script inserted by an inline script should be allowed if strict-dynamic-url is present - " + test_type);
} }
</script> </script>

View file

@ -0,0 +1,19 @@
<!-- Same as iframe.sub.html, but the script is inserted from an inline script. -->
<!DOCTYPE html>
<html>
<body>
<script nonce='forinlinescript'>
window.addEventListener('securitypolicyviolation', function() {
top.postMessage('CSP_VIOLATION', '*');
});
</script>
<!-- sha256 of the script below is 'F8UqObF6TSi2W4dDcDzAOAplJkYovBE6JpJjsZJy5HA=' -->
<script>
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = "externalScript.js";
document.getElementsByTagName('head')[0].appendChild(s);
</script>
</body>
</html>

View file

@ -0,0 +1,20 @@
<!-- Same as iframe_inline.sub.html, but provides the CSP in a meta tag. -->
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Security-Policy" content="{{GET[policy]}}">
<body>
<script nonce='forinlinescript'>
window.addEventListener('securitypolicyviolation', function() {
top.postMessage('CSP_VIOLATION', '*');
});
</script>
<!-- sha256 of the script below is 'F8UqObF6TSi2W4dDcDzAOAplJkYovBE6JpJjsZJy5HA=' -->
<script>
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = "externalScript.js";
document.getElementsByTagName('head')[0].appendChild(s);
</script>
</body>
</html>

View file

@ -1,3 +1,4 @@
<!-- Same as iframe.sub.html, but provides CSP in a meta tag -->
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<meta http-equiv="Content-Security-Policy" content="{{GET[policy]}}"> <meta http-equiv="Content-Security-Policy" content="{{GET[policy]}}">

View file

@ -1,3 +1,4 @@
<!-- Same as iframe_meta.sub.html, but provides multiple CSPs in meta tags -->
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<meta http-equiv="Content-Security-Policy" content="{{GET[policy1]}}"> <meta http-equiv="Content-Security-Policy" content="{{GET[policy1]}}">

View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<title>eval-blocked-and-sends-report</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src='../../support/logTest.sub.js?logs=["PASS: eval() blocked"]'></script>
<script src="../../support/alertAssert.sub.js?alerts=[]"></script>
</head>
<body>
<script>
try {
eval("alert_assert('FAIL')");
} catch (e) {
log('PASS: eval() blocked');
}
</script>
<script async defer src='../../support/checkReport.sub.js?reportField=eval-hash&reportValue=eval-sha256-59RYbtpsgpNknZwNEVJ55z9MzqclgnRZLLIunfpEiL4='></script>
<div id="log"></div>
</body>
</html>

View file

@ -0,0 +1,6 @@
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0, false
Pragma: no-cache
Set-Cookie: eval-blocked-report-contains-hash={{$id:uuid()}};
Content-Security-Policy: script-src 'self' 'unsafe-inline'; report-uri /reporting/resources/report.py?op=put&reportID={{$id}}

View file

@ -305,7 +305,7 @@ promise_test(async testCase => {
const cookies = await cookieStore.getAll('cookie-name'); const cookies = await cookieStore.getAll('cookie-name');
assert_equals(cookies.length, 1); assert_equals(cookies.length, 1);
assert_equals(cookies[0].name, 'cookie-name'); assert_equals(cookies[0].name, 'cookie-name');
assert_equals(cookies[0].value, 'cookie-new-value'); assert_equals(cookies[0].value, 'new-cookie-value');
}, 'cookieStore.set can modify a cookie set by document.cookie if document is defined'); }, 'cookieStore.set can modify a cookie set by document.cookie if document is defined');
promise_test(async testCase => { promise_test(async testCase => {

View file

@ -3,12 +3,13 @@
<script src="/resources/testharnessreport.js"></script> <script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script> <script src="/cookies/resources/cookie-helper.sub.js"></script>
<script> <script>
let counter = 0;
function create_test(prefix, params, shouldExistInDOM, shouldExistViaHTTP, title) { function create_test(prefix, params, shouldExistInDOM, shouldExistViaHTTP, title) {
promise_test(t => { promise_test(t => {
var name = prefix + "prefixtestcookie"; var name = prefix + "prefixtestcookie";
erase_cookie_from_js(name, params); erase_cookie_from_js(name, params);
t.add_cleanup(() => erase_cookie_from_js(name, params)); t.add_cleanup(() => erase_cookie_from_js(name, params));
var value = "" + Math.random(); var value = "foo" + ++counter;
document.cookie = name + "=" + value + ";" + params; document.cookie = name + "=" + value + ";" + params;
assert_dom_cookie(name, value, shouldExistInDOM); assert_dom_cookie(name, value, shouldExistInDOM);

View file

@ -9,7 +9,7 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
<style type="text/css"><![CDATA[ <style type="text/css">
div div
{ {
background-color: orange; background-color: orange;
@ -18,7 +18,6 @@
padding: 0em 2em; padding: 0em 2em;
width: 3em; width: 3em;
} }
]]>
</style> </style>
</head> </head>
@ -30,4 +29,4 @@
<div>123</div> <div>123</div>
</body> </body>
</html> </html>

View file

@ -67,6 +67,8 @@ body {
} }
</style> </style>
<script> <script>
setup({ explicit_done: true });
test(() => { test(() => {
const target = test1.querySelector('.target'); const target = test1.querySelector('.target');
const style = getComputedStyle(target); const style = getComputedStyle(target);
@ -98,19 +100,24 @@ test(() => {
</div> </div>
</div> </div>
<script> <script>
test(() => { // Ensure Ahem font has a chance to load before examining layout.
const targets = test2.querySelectorAll('.target'); document.fonts.ready.then(() => {
test(() => {
const targets = test2.querySelectorAll('.target');
const style1 = getComputedStyle(targets[0]); const style1 = getComputedStyle(targets[0]);
assert_equals(style1.top, '20px'); assert_equals(style1.top, '20px');
assert_equals(style1.bottom, '0px'); assert_equals(style1.bottom, '0px');
assert_equals(style1.left, '-120px'); assert_equals(style1.left, '-120px');
assert_equals(style1.right, '80px'); assert_equals(style1.right, '80px');
const style2 = getComputedStyle(targets[1]); const style2 = getComputedStyle(targets[1]);
assert_equals(style2.top, '20px'); assert_equals(style2.top, '20px');
assert_equals(style2.bottom, '0px'); assert_equals(style2.bottom, '0px');
assert_equals(style2.left, '0px'); assert_equals(style2.left, '0px');
assert_equals(style2.right, '0px'); assert_equals(style2.right, '0px');
}, 'getComputedStyle() with fragmented containing block in inline layout'); }, 'getComputedStyle() with fragmented containing block in inline layout');
done();
})
</script> </script>

View file

@ -0,0 +1,19 @@
<!doctype html>
<link rel="help" href="https://drafts.csswg.org/css-animations-1/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
#target { color: red }
@keyframes green {
from, to { color: green }
}
</style>
<div id=target style="animation-duration: 1s"></div>
<script>
test(t => {
target.style.animationName = "none";
assert_equals(getComputedStyle(target).color, "rgb(255, 0, 0)");
target.style.animationName = "green";
assert_equals(getComputedStyle(target).color, "rgb(0, 128, 0)");
}, "Animation starts when the name is mutated via inline style");
</script>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-borders-4/#border-shape">
<style>
body {
margin: 0;
}
svg {
width: 200px;
height: 200px;
}
.shadow {
fill: purple;
transform: translate(10px, 20px);
}
.target {
fill: green;
stroke: black;
stroke-width: 2px;
}
</style>
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<polygon points="70,10 130,60, 70,110, 10,60" class="shadow" />
<polygon points="70,10 130,60, 70,110, 10,60" class="target" />
</svg>

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-borders-4/#border-shape">
<link rel="match" href="border-shape-shadow-ref.html">
<meta name="fuzzy" content="maxDifference=0-96;totalPixels=0-256">
<style>
body {
margin: 0;
}
#target {
margin: 10px;
width: 120px;
height: 100px;
border-shape: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
position: relative;
background: green;
box-shadow: 10px 20px 0 0px purple;
stroke: black;
stroke-width: 2px;
}
</style>
<div id="target">
</div>

View file

@ -0,0 +1,7 @@
@scope {
.a {
width: 100px;
height :100px;
background: green;
}
}

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
<link rel="help" href="drafts.csswg.org/css-cascade-6/#scoped-styles">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930618">
<div>
<style>
@scope {
.a {
width: 100px;
height: 100px;
background: green;
}
}
</style>
<p>Test passes if there is a filled green square.</p>
<div class="a"></div>
</div>

View file

@ -0,0 +1,10 @@
<!DOCTYPE html>
<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
<link rel="help" href="drafts.csswg.org/css-cascade-6/#scoped-styles">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930618">
<div>
<link rel="stylesheet" href="resources/scope-implicit.css">
<p>Test passes if there is a filled green square.</p>
<div class="a"></div>
</div>

View file

@ -0,0 +1,8 @@
<!DOCTYPE html>
<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
<link rel="help" href="drafts.csswg.org/css-cascade-6/#scoped-styles">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930618">
<p>Test passes if there is a filled green square.</p>
<svg width="100" height="100" viewBox="0 0 100 100">
<rect x="0" y="0" width="100" height="100" fill="green"/>
</svg>

View file

@ -0,0 +1,16 @@
<!DOCTYPE html>
<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
<link rel="help" href="drafts.csswg.org/css-cascade-6/#scoped-styles">
<link rel="match" href="scope-implicit-003-print-ref.html">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930618">
<p>Test passes if there is a filled green square.</p>
<svg width="100" height="100" viewBox="0 0 100 100">
<style>
@scope {
.a {
fill: green;
}
}
</style>
<rect class="a" x="0" y="0" width="100" height="100" />
</svg>

View file

@ -0,0 +1,22 @@
<?xml-stylesheet href="resources/scope-implicit.css" type="text/css"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com" />
<link rel="help" href="drafts.csswg.org/css-cascade-6/#scoped-styles" />
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html" />
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930618" />
<body>
<div>
<style>
@scope {
.a {
width: 100px;
height: 100px;
background: green;
}
}
</style>
<p>Test passes if there is a filled green square.</p>
<div class="a"></div>
</div>
</body>
</html>

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
<link rel="help" href="drafts.csswg.org/css-cascade-6/#scoped-styles">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930618">
<div>
<p>Test passes if there is a filled green square.</p>
<div>
<template shadowrootmode=open>
<style>
@scope {
.a {
width: 100px;
height: 100px;
background: green;
}
}
</style>
<div class="a"></div>
</template>
</div>
</div>

View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
<link rel="help" href="drafts.csswg.org/css-cascade-6/#scoped-styles">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930618">
<div>
<style id="os">
@scope {
.a {
width: 100px;
height: 100px;
background: green;
}
}
</style>
<p>Test passes if there is a filled green square.</p>
<div class="a"></div>
<div>
<template shadowrootmode=open>
<style id="is">
@scope {
.a {
width: 100px;
height: 100px;
background: red;
}
}
</style>
</template>
</div>
</div>

View file

@ -49,8 +49,9 @@
<div id="item2"></div> <div id="item2"></div>
</div> </div>
<script> <script>
setup(() => assert_implements_size_container_queries()); setup(() => assert_implements_size_container_queries(), { explicit_done: true });
document.fonts.ready.then(() => {
const item1_width = parseInt(getComputedStyle(item1).width); const item1_width = parseInt(getComputedStyle(item1).width);
const item2_width = parseInt(getComputedStyle(item2).width); const item2_width = parseInt(getComputedStyle(item2).width);
const container_width = parseInt(getComputedStyle(container).width); const container_width = parseInt(getComputedStyle(container).width);
@ -73,4 +74,7 @@
test(() => { test(() => {
assert_equals(parseInt(getComputedStyle(item2, "::before").width), item2_width); assert_equals(parseInt(getComputedStyle(item2, "::before").width), item2_width);
}, "The size of the flex item #2 should be given by its contents"); }, "The size of the flex item #2 should be given by its contents");
done();
})
</script> </script>

View file

@ -6,7 +6,7 @@
<script src="support/cq-testcommon.js"></script> <script src="support/cq-testcommon.js"></script>
<script> <script>
setup(() => assert_implements_size_container_queries()); setup(() => assert_implements_size_container_queries(), { explicit_done: true });
// Inflate a <template> subtree into #main, run the test function, // Inflate a <template> subtree into #main, run the test function,
// then clean up. // then clean up.
@ -171,12 +171,14 @@ test_template(document.currentScript.previousElementSibling, (t) => {
</div> </div>
</template> </template>
<script> <script>
test_template(document.currentScript.previousElementSibling, (t) => { document.fonts.load("10px Ahem").then(() => {
t.add_cleanup(() => main.classList.remove("larger")); test_template(document.currentScript.previousElementSibling, (t) => {
assert_equals(getComputedStyle(main.querySelector("#test")).color, red); t.add_cleanup(() => main.classList.remove("larger"));
main.classList.add("larger"); assert_equals(getComputedStyle(main.querySelector("#test")).color, red);
assert_equals(getComputedStyle(main.querySelector("#test")).color, green); main.classList.add("larger");
}, 'cap units respond to changes'); assert_equals(getComputedStyle(main.querySelector("#test")).color, green);
}, 'cap units respond to changes');
})
</script> </script>
<template> <template>
@ -319,10 +321,14 @@ test_template(document.currentScript.previousElementSibling, (t) => {
</div> </div>
</template> </template>
<script> <script>
test_template(document.currentScript.previousElementSibling, (t) => { document.fonts.load("10px Ahem").then(() => {
t.add_cleanup(() => document.documentElement.classList.remove("larger")); test_template(document.currentScript.previousElementSibling, (t) => {
assert_equals(getComputedStyle(main.querySelector("#test")).color, red); t.add_cleanup(() => document.documentElement.classList.remove("larger"));
document.documentElement.classList.add("larger"); assert_equals(getComputedStyle(main.querySelector("#test")).color, red);
assert_equals(getComputedStyle(main.querySelector("#test")).color, green); document.documentElement.classList.add("larger");
}, 'rcap units respond to changes'); assert_equals(getComputedStyle(main.querySelector("#test")).color, green);
}, 'rcap units respond to changes');
done();
})
</script> </script>

View file

@ -2,7 +2,6 @@ spec: https://drafts.csswg.org/css-flexbox/
suggested_reviewers: suggested_reviewers:
- kojiishi - kojiishi
- plinss - plinss
- cbiesinger
- fantasai - fantasai
- rachelandrew - rachelandrew
- tabatkins - tabatkins

View file

@ -28,6 +28,9 @@ features:
files: files:
- alternates-order.html - alternates-order.html
- font-variant-alternates-* - font-variant-alternates-*
- name: font-variant-emoji
files:
- font-variant-emoji-*
- name: font-variant-position - name: font-variant-position
files: files:
- font-variant-position-* - font-variant-position-*

View file

@ -29,3 +29,9 @@ features:
- name: font-variant-alternates - name: font-variant-alternates
files: files:
- font-variant-alternates-* - font-variant-alternates-*
- name: font-variant-emoji
files:
- font-variant-emoji-*
- name: font-variant-position
files:
- font-variant-position-*

View file

@ -0,0 +1,15 @@
<!DOCTYPE html>
<head>
<title>Make sure we don't crash when we don't have a gap and also have a repeater for color</title>
<link rel="help" href="https://drafts.csswg.org/css-gaps-1/">
<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com">
</head>
<style>
#current {
column-rule-style: solid;
columns: 2;
height: 1px;
column-rule-color: repeat(auto, blue);
}
</style>
<div id="current"></div>

View file

@ -26,7 +26,7 @@
float: left; float: left;
height: 80px; height: 80px;
margin-top: 2px; margin-top: 2px;
width: 640px; width: 160px;
} }
</style> </style>
</head> </head>

View file

@ -27,7 +27,7 @@
float: right; float: right;
height: 80px; height: 80px;
margin-top: 2px; margin-top: 2px;
width: 640px; width: 160px;
} }
</style> </style>
</head> </head>

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<style>
.container {
width: 100px;
height: 100px;
background-color: green;
clip-path: circle(25% at 50% 50%);
}
</style>
<body>
<div class="container"></div>
</body>
</html>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html class="reftest-wait">
<link rel="help" href="https://drafts.csswg.org/css-shapes-1/#basic-shape-interpolation">
<link rel="match" href="clip-path-animation-circle-0-percent-ref.html">
<style>
.container {
width: 100px;
height: 100px;
background-color: green;
animation: clippath 20s steps(2, jump-end) -9.95s;
}
@keyframes clippath {
0% { clip-path: circle(0% at 50% 50%); }
100% { clip-path: circle(50% at 50% 50%); }
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/web-animations/resources/timing-utils.js"></script>
<body>
<div class="container"></div>
<script>
waitForAnimationTime(document.getAnimations()[0], 50).then(takeScreenshot);
</script>
</body>
</html>

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<style>
.container {
width: 100px;
height: 100px;
background-color: green;
clip-path: inset(25% 25%);
}
</style>
<body>
<div class="container"></div>
</body>
</html>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html class="reftest-wait">
<link rel="help" href="https://drafts.csswg.org/css-shapes-1/#basic-shape-interpolation">
<link rel="match" href="clip-path-animation-inset-50-percent-ref.html">
<style>
.container {
width: 100px;
height: 100px;
background-color: green;
animation: clippath 20s steps(2, jump-end) -9.95s;
}
@keyframes clippath {
0% { clip-path: inset(50% 50%); }
100% { clip-path: inset(0% 0%); }
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/web-animations/resources/timing-utils.js"></script>
<body>
<div class="container"></div>
<script>
waitForAnimationTime(document.getAnimations()[0], 50).then(takeScreenshot);
</script>
</body>
</html>

View file

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html class="reftest-wait">
<link rel="help" href="https://drafts.csswg.org/css-shapes-1/#basic-shape-interpolation">
<link rel="match" href="clip-path-transition-ref.html">
<style>
.container {
width: 100px;
height: 100px;
clip-path: inset(50% 50%);
background-color: green;
transition-property: clip-path;
transition-duration: 20s;
transition-timing-function: steps(2, jump-end);
transition-delay: -9.95s;
transition-behavior: allow-discrete;
}
</style>
<script src="/common/reftest-wait.js"></script>
<script src="/web-animations/resources/timing-utils.js"></script>
<body>
<div class="container" id="target"></div>
<script>
function update() {
document.getElementById('target').style.clipPath = "circle(40% at 40% 40%)";
waitForAnimationTime(document.getAnimations()[0], 50).then(takeScreenshot);
}
requestAnimationFrame(function () {
requestAnimationFrame(update);
});
</script>
</body>
</html>

View file

@ -1,87 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Mixins: Mixins depending on other mixins</title>
<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#apply-rule">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
@mixin --m1(@contents) {
@contents;
}
#e1 {
color: red;
@apply --m1 { color: green; }
}
@mixin --m2(@contents) {
@contents
}
#e2 {
color: red;
@apply --m1 { color: green; }
}
@mixin --m3(@contents) {
&.a {
@contents { color: blue; }
}
}
.b {
color: red;
@apply --m3 { color: green; }
}
@mixin --m4(@contents) {
&.c {
@contents { color: green; }
}
}
.d {
color: red;
@apply --m4;
}
@mixin --m5 {
@contents { color: red !important; }
color: green;
}
#e4 {
@apply --m5 { color: red !important; }
}
</style>
</head>
<body>
<div id="e1">This text should be green.</div>
<div id="e2">This text should be green.</div>
<div class="a b" id="e3">This text should be green.</div>
<div class="c d" id="e4">This text should be green.</div>
<div id="e5">This text should be green.</div>
<script>
test(() => {
let target = document.getElementById('e1');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Simple @contents with no fallback');
test(() => {
let target = document.getElementById('e2');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Implicit semicolon after @contents, at end of block');
test(() => {
let target = document.getElementById('e3');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Block in @apply overrides fallback');
test(() => {
let target = document.getElementById('e4');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Fallback is used if @apply has no block');
test(() => {
let target = document.getElementById('e5');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, '@contents is ignored if there is no @contents parameter');
</script>
</body>
</html>

View file

@ -1,29 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Mixins: Mixin from another stylesheet</title>
<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#using-mixins">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
div {
color: red;
@apply --m1;
}
</style>
<style>
@mixin --m1() {
color: green;
}
</style>
</head>
<body>
<div><div class="cls" id="target">This text should be green.</div></div>
<script>
test(() => {
let target = document.getElementById('target');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
});
</script>
</body>
</html>

View file

@ -1,75 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>CSS Mixins: Shadow DOM</title>
<link rel="help" href="https://drafts.csswg.org/css-mixins-1/#defining-mixins">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
@mixin --exists-only-outside-shadow() {
color: green;
}
#e4 {
color: green;
@apply --in-shadow;
}
</style>
</head>
<body>
<div id="host">
<template shadowrootmode="open">
<style>
#e1 {
color: red;
@apply --exists-only-outside-shadow;
}
#e2 {
color: red;
@apply --m1;
}
#e3 {
color: red;
@apply --exists-only-in-adopted;
}
</style>
<style>
@mixin --m1() {
color: green;
}
@mixin --in-shadow() {
color: red;
}
</style>
<div id="e1">This text should be green.</div>
<div id="e2">This text should be green.</div>
<div id="e3">This text should be green.</div>
</template>
</div>
<div id="e4">This text should be green.</div>
<script>
const sheet = new CSSStyleSheet();
sheet.replaceSync('@mixin --exists-only-in-adopted() { color: green; }');
document.getElementById('host').shadowRoot.adoptedStyleSheets = [sheet];
test(() => {
let target = document.getElementById('host').shadowRoot.getElementById('e1');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Style in shadow DOM should have access to outside non-adopted mixins');
test(() => {
let target = document.getElementById('host').shadowRoot.getElementById('e2');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Style in shadow DOM should have access to inside mixins');
test(() => {
let target = document.getElementById('host').shadowRoot.getElementById('e3');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Style in shadow DOM should have access to mixins from adopted stylesheets');
test(() => {
let target = document.getElementById('e4');
assert_equals(getComputedStyle(target).color, 'rgb(0, 128, 0)');
}, 'Style outside shadow DOM should _not_ have access to inside mixins');
</script>
</body>
</html>

View file

@ -0,0 +1,16 @@
<!DOCTYPE html>
<title>Nested multicol, overflowed block with spanner in next outer column</title>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/364933065">
<div style="columns:2; column-fill:auto; height:100px;">
<div style="columns:2; column-fill:auto;">
<span>
<div style="height:10px;">
<span style="outline:solid;">
<div style="height:205px;"></div>
<div style="column-span:all; height:20px;"></div>
</span>
</div>
</span>
</div>
</div>

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<title>Overflowed block with spanner</title>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/364933065">
<div style="columns:2; column-fill:auto; height:100px; line-height:50px;">
<span>
<div style="height:100px;">
<div style="height:150px;"></div>
<div style="column-span:all; height:20px;"></div>
</div>
</span>
</div>

View file

@ -1,4 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<meta name="timeout" content="long">
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> <link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://www.w3.org/TR/css-break-3/#possible-breaks"> <link rel="help" href="https://www.w3.org/TR/css-break-3/#possible-breaks">
<link rel="match" href="monolithic-overflow-024-print-ref.html"> <link rel="match" href="monolithic-overflow-024-print-ref.html">

View file

@ -1,4 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<meta name="timeout" content="long">
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> <link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href=""> <link rel="help" href="">
<link rel="match" href="monolithic-overflow-025-print-ref.html"> <link rel="match" href="monolithic-overflow-025-print-ref.html">

View file

@ -37,47 +37,49 @@ function checkMarkerSize(expectedWidth, expectedHeight) {
} }
setup({explicit_done: true}); setup({explicit_done: true});
addEventListener("load", () => { addEventListener("load", () => {
test(() => { document.fonts.load("10px Ahem").then(() => {
// Marker string: "1. " test(() => {
target.style.listStyleType = "decimal"; // Marker string: "1. "
checkMarkerSize("30px", "10px"); target.style.listStyleType = "decimal";
}, "Decimal ::marker"); checkMarkerSize("30px", "10px");
test(() => { }, "Decimal ::marker");
// Marker string: "10. " test(() => {
target.setAttribute("value", "10"); // Marker string: "10. "
checkMarkerSize("40px", "10px"); target.setAttribute("value", "10");
}, "Decimal ::marker with custom value"); checkMarkerSize("40px", "10px");
test(() => { }, "Decimal ::marker with custom value");
// Marker string: "st" test(() => {
target.style.listStyleType = "'st'"; // Marker string: "st"
checkMarkerSize("20px", "10px"); target.style.listStyleType = "'st'";
}, "String ::marker"); checkMarkerSize("20px", "10px");
test(() => { }, "String ::marker");
// No marker box test(() => {
target.style.listStyleType = "none"; // No marker box
checkMarkerSize("auto", "auto"); target.style.listStyleType = "none";
}, "::marker with no box due to 'list-style'"); checkMarkerSize("auto", "auto");
test(() => { }, "::marker with no box due to 'list-style'");
// Marker contents: "foo", "bar" test(() => {
target.style.setProperty("--content", "'foo' 'bar'"); // Marker contents: "foo", "bar"
checkMarkerSize("60px", "10px"); target.style.setProperty("--content", "'foo' 'bar'");
}, "::marker with custom string contents"); checkMarkerSize("60px", "10px");
test(() => { }, "::marker with custom string contents");
// Marker contents: 100x50 image (+2px due to baseline alignment) test(() => {
target.style.setProperty("--content", "var(--image)"); // Marker contents: 100x50 image (+2px due to baseline alignment)
checkMarkerSize("100px", "52px"); target.style.setProperty("--content", "var(--image)");
}, "::marker with custom image contents"); checkMarkerSize("100px", "52px");
test(() => { }, "::marker with custom image contents");
// Marker contents: "foo", 100x50 image (+2px due to baseline alignment) test(() => {
target.style.setProperty("--content", "'foo' var(--image)"); // Marker contents: "foo", 100x50 image (+2px due to baseline alignment)
checkMarkerSize("130px", "52px"); target.style.setProperty("--content", "'foo' var(--image)");
}, "::marker with custom string and image contents"); checkMarkerSize("130px", "52px");
test(() => { }, "::marker with custom string and image contents");
// No marker box test(() => {
target.style.listStyleType = ""; // No marker box
target.style.setProperty("--content", "none"); target.style.listStyleType = "";
checkMarkerSize("auto", "auto"); target.style.setProperty("--content", "none");
}, "::marker with no box due to 'content'"); checkMarkerSize("auto", "auto");
done(); }, "::marker with no box due to 'content'");
done();
});
}, {once: true}); }, {once: true});
</script> </script>

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<title>Scroll anchoring at focused input element inside editable newly created table-column</title>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://issues.chromium.org/issues/427715253">
<div id="container" contenteditable>
<input id="input" style="height:200vh;">
</div>
<script>
scrollTo(0, 10);
input.focus();
container.style.display = "table-column-group";
</script>

View file

@ -0,0 +1,3 @@
features:
- name: scroll-initial-target
files: "**"

View file

@ -55,7 +55,7 @@
</div> </div>
<p><a href="https://quirks.spec.whatwg.org/#the-collapsing-table-quirk">The collapsing table quirk</a></p> <p><a href="https://quirks.spec.whatwg.org/#the-collapsing-table-quirk">The collapsing table quirk</a></p>
<p class="error">Chrome Legacy/Edge/Safari ignore the quirk, FF does not. <b>Proposal: depreciate the quirk</b></p> <p class="error">Chrome Legacy/Edge/Safari ignore the quirk, FF does not. <b>Proposal: deprecate the quirk</b></p>
<table style="border: 20px solid green" data-expected-height=40 data-expected-width=40></table> <table style="border: 20px solid green" data-expected-height=40 data-expected-width=40></table>
<p><a href="https://quirks.spec.whatwg.org/#the-table-cell-width-calculation-quirk">The table cell width calculation quirk</a></p> <p><a href="https://quirks.spec.whatwg.org/#the-table-cell-width-calculation-quirk">The table cell width calculation quirk</a></p>
@ -64,10 +64,10 @@
</table> </table>
<p><a href="https://html.spec.whatwg.org/multipage/tables.html#algorithm-for-processing-rows">The "let <i>cell grows downward</i> be false" quirk</a></p> <p><a href="https://html.spec.whatwg.org/multipage/tables.html#algorithm-for-processing-rows">The "let <i>cell grows downward</i> be false" quirk</a></p>
<p class="error">Chrome LayoutNG and Safari ignore the quirk, FF does not.</p> <p class="error">Chrome LayoutNG and Safari ignore the quirk, FF does not. <b>Proposal: deprecate the quirk</b></p>
<table> <table>
<tr style="height: 100px"> <tr style="height: 100px">
<td id="rowspan" rowspan="0" data-expected-height=100>100 height</td> <td id="rowspan" rowspan="0" data-expected-height=208>208 height</td>
</tr> </tr>
<tr style="height: 100px"></tr> <tr style="height: 100px"></tr>
</table> </table>
@ -82,7 +82,7 @@
assert_equals(window.getComputedStyle(document.querySelector("#notitalic")).fontStyle, "normal"); assert_equals(window.getComputedStyle(document.querySelector("#notitalic")).fontStyle, "normal");
}, "decoration does not propagate into table"); }, "decoration does not propagate into table");
test(_ => { test(_ => {
assert_equals(document.querySelector("#rowspan").rowSpan, 1); assert_equals(document.querySelector("#rowspan").rowSpan, 0);
}, "rowspan can't be zero"); }, "rowspan can be zero");
document.fonts.ready.then(() => checkLayout("table")); document.fonts.ready.then(() => checkLayout("table"));
</script> </script>

View file

@ -2,3 +2,6 @@ features:
- name: text-emphasis - name: text-emphasis
files: files:
- text-emphasis-* - text-emphasis-*
- name: text-underline-offset
files:
- text-underline-offset-*

View file

@ -0,0 +1,4 @@
features:
- name: text-underline-offset
files:
- text-underline-offset-*

View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<style>
div {
font-size: 5em;
}
span {
background-color: rgba(0, 0, 0, 0.5);
}
</style>
<div><span>a</span>bc</div>

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html class="reftest-wait">
<title>caret-shape block color is the same as what is specified by caret-color property</title>
<link rel=help href="https://drafts.csswg.org/css-ui/#caret-shape">
<link rel="match" href="caret-shape-block-color-004-ref.tentative.html">
<script src="/common/reftest-wait.js"></script>
<meta name="assert"
content="Test checks that the opacity of caret-shape block color doesn't change when caret-color is auto. ">
<style>
div {
font-size: 5em;
}
#target {
caret-shape: block;
caret-animation: manual;
}
#target:focus {
outline: none;
}
</style>
<body>
<div id="target" contenteditable>abc</div>
<script>
target.focus();
requestAnimationFrame(() => {
target.style.caretShape = "block";
requestAnimationFrame(() => {
target.style.caretShape = "underscore";
requestAnimationFrame(() => {
target.style.caretShape = "block";
takeScreenshot();
});
});
});
</script>
</body>

View file

@ -23,6 +23,7 @@
box-sizing: border-box; box-sizing: border-box;
background-color: limegreen; background-color: limegreen;
border: 1px solid black; border: 1px solid black;
outline: none;
} }
</style> </style>

View file

@ -29,34 +29,40 @@ function getBoundingClientRect(node, start, end) {
return rect; return rect;
} }
test(() => { setup({ explicit_done: true });
const element = document.querySelector('#text-1');
const elementRect = element.getBoundingClientRect();
const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length);
assert_approx_equals(elementRect.x, rangeRect.x, 1);
assert_approx_equals(elementRect.y, rangeRect.y, 1);
assert_approx_equals(elementRect.width, rangeRect.width, 1);
assert_approx_equals(elementRect.height, rangeRect.height, 1);
}, 'Element.getBoundingClientRect() and Range.getBoudingClientRect() should match for an SVG <text>');
test(() => { document.fonts.ready.then(() => {
const element = document.querySelector('#text-2'); test(() => {
const elementRect = element.getBoundingClientRect(); const element = document.querySelector('#text-1');
const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length); const elementRect = element.getBoundingClientRect();
assert_approx_equals(elementRect.x, rangeRect.x, 1); const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length);
assert_approx_equals(elementRect.y, rangeRect.y, 1); assert_approx_equals(elementRect.x, rangeRect.x, 1);
assert_approx_equals(elementRect.width, rangeRect.width, 1); assert_approx_equals(elementRect.y, rangeRect.y, 1);
assert_approx_equals(elementRect.height, rangeRect.height, 1); assert_approx_equals(elementRect.width, rangeRect.width, 1);
}, 'Element.getBoundingClientRect() and Range.getBoudingClientRect() should match for an SVG <text> with a transform'); assert_approx_equals(elementRect.height, rangeRect.height, 1);
}, 'Element.getBoundingClientRect() and Range.getBoudingClientRect() should match for an SVG <text>');
test(() => { test(() => {
const element = document.querySelector('#text-3'); const element = document.querySelector('#text-2');
const elementRect = element.getBoundingClientRect(); const elementRect = element.getBoundingClientRect();
const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length); const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length);
assert_approx_equals(elementRect.x, rangeRect.x, 1); assert_approx_equals(elementRect.x, rangeRect.x, 1);
assert_approx_equals(elementRect.y, rangeRect.y, 1); assert_approx_equals(elementRect.y, rangeRect.y, 1);
assert_approx_equals(elementRect.width, rangeRect.width, 1); assert_approx_equals(elementRect.width, rangeRect.width, 1);
assert_approx_equals(elementRect.height, rangeRect.height, 1); assert_approx_equals(elementRect.height, rangeRect.height, 1);
}, 'Element.getBoundingClientRect() and Range.getBoudingClientRect() should match for an SVG <text> with a rotate'); }, 'Element.getBoundingClientRect() and Range.getBoudingClientRect() should match for an SVG <text> with a transform');
test(() => {
const element = document.querySelector('#text-3');
const elementRect = element.getBoundingClientRect();
const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length);
assert_approx_equals(elementRect.x, rangeRect.x, 1);
assert_approx_equals(elementRect.y, rangeRect.y, 1);
assert_approx_equals(elementRect.width, rangeRect.width, 1);
assert_approx_equals(elementRect.height, rangeRect.height, 1);
}, 'Element.getBoundingClientRect() and Range.getBoudingClientRect() should match for an SVG <text> with a rotate');
done();
});
</script> </script>
</body> </body>

View file

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html class="test-wait">
<head>
<style>
#container {
view-transition-name: arandomname;
width: 100px;
height: 100px;
background: blue;
}
#overlay {
width: 100%;
height: 100%;
}
#overlay.blur {
backdrop-filter: blur(8px);
}
</style>
</head>
<body>
<div id="container">
<div id="overlay"></div>
</div>
<script>
async function doTest() {
let itersLeft = 10;
while (itersLeft-- > 0) {
await new Promise(resolve => window.requestAnimationFrame(resolve));
await new Promise(resolve => window.requestAnimationFrame(resolve));
document.getElementById('overlay').classList.toggle('blur');
}
document.documentElement.removeAttribute("class");
}
document.documentElement.addEventListener("TestRendered", doTest);
//window.addEventListener("load", doTest);
</script>
</body>
</html>

View file

@ -0,0 +1,22 @@
<!doctype html>
<title>Filter primitive (feConvolveMatrix) with zero divisor</title>
<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty">
<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#feConvolveMatrixElement">
<link rel="match" href="reference/feconvolve-divisor-ref.html">
<svg xmlns="http://www.w3.org/2000/svg"
width="800" height="250">
<defs>
<!-- Setting the divisor to 0 should result in the default value being
used instead.
-->
<filter id="f1" filterUnits="userSpaceOnUse"
x="100" y="100" width="100" height="100">
<feConvolveMatrix kernelMatrix="1 1 1 1 1 1 1 1 1"
divisor="0" preserveAlpha="false" bias=".5" />
</filter>
</defs>
<rect x="100" y="100" width="100" height="100" fill="red"/>
<rect x="100" y="100" width="100" height="100" fill="lime"
filter="url(#f1)" />
</svg>

View file

@ -0,0 +1,26 @@
<!doctype html>
<title>If kernelUnitLength is omitted it should default to 1</title>
<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty">
<link rel="help" href="https://www.w3.org/TR/filter-effects-1/#element-attrdef-feconvolvematrix-kernelunitlength">
<link rel="help" href="https://www.w3.org/TR/filter-effects-1/#element-attrdef-fediffuselighting-kernelunitlength">
<link rel="match" href="reference/kernel-unit-length-ref.html">
<svg width="7.5cm" height="5cm" viewBox="0 0 200 120"
xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="MyFilter" filterUnits="userSpaceOnUse"
x="0" y="0" width="200" height="120">
<feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
<feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75"
specularExponent="20" lighting-color="#bbbbbb">
<fePointLight x="-5000" y="-10000" z="20000"/>
</feSpecularLighting>
</filter>
</defs>
<rect x="1" y="1" width="198" height="118" fill="#888888"/>
<g filter="url(#MyFilter)">
<path fill="none" stroke="#D90000" stroke-width="10"
d="M50,90 C0,90 0,30 50,30 L150,30 C200,30 200,90 150,90 z"/>
<path fill="#D90000"
d="M60,80 C30,80 30,40 60,40 L140,40 C170,40 170,80 140,80 z"/>
</g>
</svg>

View file

@ -0,0 +1,27 @@
<!doctype html>
<title>If kernelUnitLength is negative or zero it should default to 1</title>
<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty">
<link rel="help" href="https://www.w3.org/TR/filter-effects-1/#element-attrdef-feconvolvematrix-kernelunitlength">
<link rel="help" href="https://www.w3.org/TR/filter-effects-1/#element-attrdef-fediffuselighting-kernelunitlength">
<link rel="match" href="reference/kernel-unit-length-ref.html">
<svg width="7.5cm" height="5cm" viewBox="0 0 200 120"
xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="MyFilter" filterUnits="userSpaceOnUse"
x="0" y="0" width="200" height="120">
<feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
<feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75"
specularExponent="20" lighting-color="#bbbbbb"
kernelUnitLength="0 -1">
<fePointLight x="-5000" y="-10000" z="20000"/>
</feSpecularLighting>
</filter>
</defs>
<rect x="1" y="1" width="198" height="118" fill="#888888"/>
<g filter="url(#MyFilter)">
<path fill="none" stroke="#D90000" stroke-width="10"
d="M50,90 C0,90 0,30 50,30 L150,30 C200,30 200,90 150,90 z"/>
<path fill="#D90000"
d="M60,80 C30,80 30,40 60,40 L140,40 C170,40 170,80 140,80 z"/>
</g>
</svg>

View file

@ -0,0 +1,19 @@
<!doctype html>
<title>Test that no edge lighting highlights appear</title>
<link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty">
<link rel="help" href="https://www.w3.org/TR/filter-effects-1/#FilterEffectsRegion">
<link rel="match" href="reference/lighting-region-ref.html">
<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-8012" />
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="250">
<defs>
<filter id="restrictedDiffuse" x="25%" y="25%" width="50%" height="50%">
<feDiffuseLighting>
<feDistantLight elevation="30" />
</feDiffuseLighting>
</filter>
</defs>
<rect x="100" y="100" width="100" height="100" fill="lightgreen" />
<rect x="100" y="100" width="100" height="100"
filter="url(#restrictedDiffuse)" />
</svg>

View file

@ -0,0 +1,14 @@
<!doctype html>
<svg xmlns="http://www.w3.org/2000/svg"
width="800" height="250">
<defs>
<filter id="f1" filterUnits="userSpaceOnUse"
x="100" y="100" width="100" height="100">
<feConvolveMatrix kernelMatrix="1 1 1 1 1 1 1 1 1"
preserveAlpha="false" bias=".5" />
</filter>
</defs>
<rect x="100" y="100" width="100" height="100" fill="lime"
filter="url(#f1)" />
</svg>

View file

@ -0,0 +1,22 @@
<!doctype html>
<svg width="7.5cm" height="5cm" viewBox="0 0 200 120"
xmlns="http://www.w3.org/2000/svg">
<defs>
<filter id="MyFilter" filterUnits="userSpaceOnUse"
x="0" y="0" width="200" height="120">
<feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
<feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75"
specularExponent="20" lighting-color="#bbbbbb"
kernelUnitLength="1 1">
<fePointLight x="-5000" y="-10000" z="20000"/>
</feSpecularLighting>
</filter>
</defs>
<rect x="1" y="1" width="198" height="118" fill="#888888"/>
<g filter="url(#MyFilter)">
<path fill="none" stroke="#D90000" stroke-width="10"
d="M50,90 C0,90 0,30 50,30 L150,30 C200,30 200,90 150,90 z"/>
<path fill="#D90000"
d="M60,80 C30,80 30,40 60,40 L140,40 C170,40 170,80 140,80 z"/>
</g>
</svg>

View file

@ -0,0 +1,8 @@
<!doctype html>
<svg xmlns="http://www.w3.org/2000/svg"
width="800" height="250">
<rect x="100" y="100" width="100" height="100" fill="lightgreen" />
<rect x="125" y="125" width="50" height="50" fill="rgba(188,188,188,188)" />
</svg>

View file

@ -227,6 +227,12 @@
checkDOMMatrix(result, expected); checkDOMMatrix(result, expected);
},"test rotateAxisAngle() "); },"test rotateAxisAngle() ");
test(function() {
var result = new DOMMatrix([1, 1, 1, 1, 1, 1]).rotateAxisAngle(0, 0, 3, 90);
var expected = new DOMMatrix([1, 1, -1, -1, 1, 1]);
checkDOMMatrix(result, expected);
},"test rotateAxisAngle() on 2D matrix with 2D rotation");
test(function() { test(function() {
var angleDeg = 75; var angleDeg = 75;
var result = initialDOMMatrix().skewX(angleDeg); var result = initialDOMMatrix().skewX(angleDeg);

View file

@ -231,4 +231,24 @@
); );
} }
}, "Mediation is required to get a DigitalCredential."); }, "Mediation is required to get a DigitalCredential.");
promise_test(async t => {
const throwingValues = [
BigInt(123),
(() => { const o = {}; o.self = o; return o; })(),
Symbol("foo")
];
for (const badValue of throwingValues) {
const options = makeGetOptions("openid4vp");
options.digital.requests[0].data = badValue;
await promise_rejects_js(
t,
TypeError,
navigator.credentials.get(options),
`Should throw for: ${String(badValue)}`
);
}
}, "Throws TypeError when request data is not JSON stringifiable.");
</script> </script>

View file

@ -339,4 +339,6 @@ Emulation of browser APIs via [WebDriver BiDi Emulation](https://www.w3.org/TR/w
```eval_rst ```eval_rst
.. js:autofunction:: test_driver.bidi.emulation.set_geolocation_override .. js:autofunction:: test_driver.bidi.emulation.set_geolocation_override
.. js:autofunction:: test_driver.bidi.emulation.set_locale_override
.. js:autofunction:: test_driver.bidi.emulation.set_screen_orientation_override
``` ```

View file

@ -112,11 +112,11 @@ test(function() {
assert_not_equals(element, null) assert_not_equals(element, null)
assert_equals(element.nodeType, Node.ELEMENT_NODE) assert_equals(element.nodeType, Node.ELEMENT_NODE)
assert_equals(element.ownerDocument, doc) assert_equals(element.ownerDocument, doc)
var qualified = String(qualifiedName), names = [] var qualified = String(qualifiedName)
var names = []
var firstColonIndex = qualified.indexOf(":") var firstColonIndex = qualified.indexOf(":")
if (firstColonIndex >= 0) { if (firstColonIndex >= 0) {
names.push(qualified.substring(0, firstColonIndex)); names = qualifiedName.split(":", 2);
names.push(qualified.substring(firstColonIndex + 1));
} else { } else {
names = [null, qualified] names = [null, qualified]
} }

Some files were not shown because too many files have changed in this diff Show more