Sync WPT with upstream (11-07-2025) (#38001)

Automated downstream sync of changes from upstream as of 11-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-11 18:06:40 +02:00 committed by GitHub
parent f7c7db3f71
commit c631220311
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
350 changed files with 7036 additions and 2185 deletions

File diff suppressed because it is too large Load diff

View file

@ -5,3 +5,9 @@
[@font-face override between layers]
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

@ -0,0 +1,18 @@
[masonry-shorthand-computed.html]
[Property masonry value '"a b" 1fr 2fr row normal']
expected: FAIL
[Property masonry value '8px column normal']
expected: FAIL
[Property masonry value '"a b c" 10% 20% 30% row-reverse']
expected: FAIL
[Property masonry value '"a b" 10px 20px column-reverse reverse']
expected: FAIL
[Property masonry value 'min-content row']
expected: FAIL
[Property masonry value 'repeat(5, auto) reverse']
expected: FAIL

View file

@ -0,0 +1,21 @@
[masonry-shorthand-serialization.html]
[grid-template-rows: none,\n grid-template-columns: none,\n grid-template-areas: none,\n masonry-direction: column,\n masonry-fill: normal should be valid.]
expected: FAIL
[grid-template-rows: 10px,\n grid-template-columns: none,\n grid-template-areas: none,\n masonry-direction: column,\n masonry-fill: reverse should be valid.]
expected: FAIL
[grid-template-rows: 10px 20px,\n grid-template-columns: 10% 20%,\n grid-template-areas: none,\n masonry-direction: row,\n masonry-fill: normal should be valid.]
expected: FAIL
[grid-template-rows: none,\n grid-template-columns: 1fr 1fr 3fr,\n grid-template-areas: "a a b",\n masonry-direction: column,\n masonry-fill: reverse should be valid.]
expected: FAIL
[grid-template-rows: 20% 40%,\n grid-template-columns: none,\n grid-template-areas: "b" "a",\n masonry-direction: row,\n masonry-fill: normal should be valid.]
expected: FAIL
[grid-template-rows: none,\n grid-template-columns: fit-content(calc(0.5em + 10px)),\n grid-template-areas: none,\n masonry-direction: column-reverse,\n masonry-fill: normal should be valid.]
expected: FAIL
[grid-template-rows: 10% 20% 40%,\n grid-template-columns: none,\n grid-template-areas: "a" "b" "c",\n masonry-direction: row-reverse,\n masonry-fill: normal should be valid.]
expected: FAIL

View file

@ -0,0 +1,102 @@
[masonry-shorthand-valid.html]
[masonry followed by !important]
expected: FAIL
[e.style['masonry'\] = "\\"a\\" calc(10px) column-reverse normal" should set the property value]
expected: FAIL
[e.style['masonry'\] = "minmax(calc(30% + 40vw), 10px)" should set the property value]
expected: FAIL
[masonry: minmax(10px, 20px) row should be valid.]
expected: FAIL
[masonry: 1px 2px should be valid.]
expected: FAIL
[masonry: "a" 10px reverse should be valid.]
expected: FAIL
[masonry: "a b" 10px 20px row normal should be valid.]
expected: FAIL
[masonry: "a b c" 10% 20% 30% row-reverse should be valid.]
expected: FAIL
[masonry: repeat(5, auto) row reverse should be valid.]
expected: FAIL
[e.style['masonry'\] = "none" should set grid-template-areas]
expected: FAIL
[e.style['masonry'\] = "none" should set grid-template-columns]
expected: FAIL
[e.style['masonry'\] = "none" should set masonry-direction]
expected: FAIL
[e.style['masonry'\] = "none" should set masonry-fill]
expected: FAIL
[e.style['masonry'\] = "none" should not set unrelated longhands]
expected: FAIL
[e.style['masonry'\] = "10px reverse" should set grid-template-areas]
expected: FAIL
[e.style['masonry'\] = "10px reverse" should set grid-template-columns]
expected: FAIL
[e.style['masonry'\] = "10px reverse" should set masonry-direction]
expected: FAIL
[e.style['masonry'\] = "10px reverse" should set masonry-fill]
expected: FAIL
[e.style['masonry'\] = "10px reverse" should not set unrelated longhands]
expected: FAIL
[e.style['masonry'\] = "\\"b a\\" 20% 40% column normal" should set grid-template-areas]
expected: FAIL
[e.style['masonry'\] = "\\"b a\\" 20% 40% column normal" should set grid-template-columns]
expected: FAIL
[e.style['masonry'\] = "\\"b a\\" 20% 40% column normal" should set masonry-direction]
expected: FAIL
[e.style['masonry'\] = "\\"b a\\" 20% 40% column normal" should set masonry-fill]
expected: FAIL
[e.style['masonry'\] = "\\"b a\\" 20% 40% column normal" should not set unrelated longhands]
expected: FAIL
[e.style['masonry'\] = "\\"b b a\\" 1fr 2fr 3fr row" should set grid-template-areas]
expected: FAIL
[e.style['masonry'\] = "\\"b b a\\" 1fr 2fr 3fr row" should set grid-template-rows]
expected: FAIL
[e.style['masonry'\] = "\\"b b a\\" 1fr 2fr 3fr row" should set masonry-direction]
expected: FAIL
[e.style['masonry'\] = "\\"b b a\\" 1fr 2fr 3fr row" should set masonry-fill]
expected: FAIL
[e.style['masonry'\] = "\\"b b a\\" 1fr 2fr 3fr row" should not set unrelated longhands]
expected: FAIL
[e.style['masonry'\] = "repeat(2, auto) row-reverse" should set grid-template-areas]
expected: FAIL
[e.style['masonry'\] = "repeat(2, auto) row-reverse" should set grid-template-rows]
expected: FAIL
[e.style['masonry'\] = "repeat(2, auto) row-reverse" should set masonry-direction]
expected: FAIL
[e.style['masonry'\] = "repeat(2, auto) row-reverse" should set masonry-fill]
expected: FAIL
[e.style['masonry'\] = "repeat(2, auto) row-reverse" should not set unrelated longhands]
expected: FAIL

View file

@ -0,0 +1,3 @@
[CSSPseudoElement-identity.html]
[CSS Pseudo Test: CSSPseudoElement stable identity]
expected: FAIL

View file

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

View file

@ -52,3 +52,6 @@
[sec-fetch-user]
expected: FAIL
[sec-fetch-dest]
expected: FAIL

View file

@ -47,8 +47,5 @@
[sec-fetch-storage-access - Not sent to non-trustworthy same-origin destination]
expected: FAIL
[sec-fetch-storage-access - Not sent to non-trustworthy same-site destination]
expected: FAIL
[sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination]
expected: FAIL

View file

@ -1,2 +1,4 @@
[001.html]
expected: TIMEOUT
[traversing history must also traverse hash changes]
expected: FAIL

View file

@ -0,0 +1,6 @@
[nameditem-no-shadowing.tentative.html]
[document.constructor is not shadowed]
expected: FAIL
[document.__proto__ is not shadowed]
expected: FAIL

View file

@ -1,3 +0,0 @@
[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_escaping-1.html]
expected: CRASH
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
expected: TIMEOUT
expected: FAIL

View file

@ -1,4 +1,3 @@
[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

View file

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

View file

@ -0,0 +1,4 @@
[reparent-form-during-planned-navigation-task.html]
expected: TIMEOUT
[reparent-form-during-planned-navigation-task]
expected: TIMEOUT

View file

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

View file

@ -59,9 +59,6 @@
[Decode-error (script): main]
expected: FAIL
[CORS (style): main]
expected: FAIL
[success (script): main]
expected: FAIL
@ -79,6 +76,3 @@
[404 (style): main]
expected: FAIL
[CORS (script): main]
expected: FAIL

View file

@ -61,7 +61,7 @@
expected: CRASH
[trusted-types-navigation.html?06-10]
expected: TIMEOUT
expected: CRASH
[Navigate a frame via anchor with javascript:-urls w/ default policy in enforcing mode.]
expected: FAIL

View file

@ -0,0 +1,4 @@
[localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.html]
expected: TIMEOUT
[StorageKey: test 3P about:blank window opened from a 3P iframe]
expected: TIMEOUT

View file

@ -1,2 +0,0 @@
[Worker-constructor.html]
expected: ERROR

View file

@ -29,3 +29,9 @@ promise_test(async () => {
assert_in_array(availability, kValidAvailabilities, options);
}
}, 'Rewriter.availability() returns a valid value with plausible options');
promise_test(async (t) => {
return promise_rejects_js(t, RangeError, Rewriter.availability({
expectedInputLanguages: ['en-abc-invalid'], // not supported
}));
}, 'Rewriter.availability() rejects when given invalid language tags');

View file

@ -89,11 +89,16 @@ promise_test(async () => {
}, 'Rewriter.outputLanguage');
promise_test(async (t) => {
promise_rejects_js(
t, RangeError,
createRewriter({ expectedInputLanguages: ['en-abc-invalid'] }));
return promise_rejects_js(
t, RangeError,
createRewriter({expectedInputLanguages: ['en-abc-invalid']}));
}, 'Creating Rewriter with malformed language string');
promise_test(async (t) => {
let session = await createRewriter({expectedInputLanguages: ['EN']});
assert_true(!!session);
}, 'Rewriter.create() canonicalizes language tags');
promise_test(async () => {
const rewriter = await createRewriter({});
assert_equals(rewriter.expectedInputLanguages, null);

View file

@ -1,22 +1,21 @@
// META: title=Rewriter Create User Activation
// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: timeout=long
'use strict';
// Model download state is shared between test cases of the same file when run
// with `EchoAIManagerImpl`, so this test case needs to be on its own file.
// Mocked model download state may be shared between test cases in the same file
// (see e.g. `EchoAIManagerImpl`), so this test case is kept in a separate file.
// TODO(crbug.com/390246212): Support model state controls for WPTs.
promise_test(async t => {
// Creating Rewriter without user activation rejects with NotAllowedError.
// Create requires user activation when availability is 'downloadable'.
assert_implements_optional(await Rewriter.availability() == 'downloadable');
assert_false(navigator.userActivation.isActive);
await promise_rejects_dom(t, 'NotAllowedError', Rewriter.create());
await test_driver.bless('Rewriter.create', Rewriter.create);
// Creating Rewriter with user activation succeeds.
await createRewriter();
// Expect available after create.
// Create does not require user activation when availability is 'available'.
assert_equals(await Rewriter.availability(), 'available');
// Now that it is available, we should no longer need user activation.
assert_false(navigator.userActivation.isActive);
await Rewriter.create();
}, 'Rewriter.create() requires user activation when availability is "downloadable"');
}, 'Create requires user activation when availability is "downloadable"');

View file

@ -30,3 +30,9 @@ promise_test(async () => {
assert_in_array(availability, kValidAvailabilities, options);
}
}, 'Summarizer.availability() returns a valid value with plausible options');
promise_test(async (t) => {
return promise_rejects_js(t, RangeError, Summarizer.availability({
expectedInputLanguages: ['en-abc-invalid'], // not supported
}));
}, 'Summarizer.availability() rejects when given invalid language tags');

View file

@ -75,11 +75,16 @@ promise_test(async () => {
}, 'Summarizer.outputLanguage');
promise_test(async (t) => {
promise_rejects_js(
t, RangeError,
createSummarizer({ expectedInputLanguages: ['en-abc-invalid'] }));
return promise_rejects_js(
t, RangeError,
createSummarizer({expectedInputLanguages: ['en-abc-invalid']}));
}, 'Creating Summarizer with malformed language string');
promise_test(async (t) => {
let summarizer = await createSummarizer({expectedInputLanguages: ['EN']});
assert_true(!!summarizer);
}, 'Summarizer.create() canonicalizes language tags');
promise_test(async () => {
const summarizer = await createSummarizer();
assert_equals(summarizer.expectedInputLanguages, null);

View file

@ -1,22 +1,21 @@
// META: title=Summarizer Create User Activation
// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: timeout=long
'use strict';
// Model download state is shared between test cases of the same file when run
// with `EchoAIManagerImpl`, so this test case needs to be on its own file.
// Mocked model download state may be shared between test cases in the same file
// (see e.g. `EchoAIManagerImpl`), so this test case is kept in a separate file.
// TODO(crbug.com/390246212): Support model state controls for WPTs.
promise_test(async t => {
// Creating Summarizer without user activation rejects with NotAllowedError.
// Create requires user activation when availability is 'downloadable'.
assert_implements_optional(await Summarizer.availability() == 'downloadable');
assert_false(navigator.userActivation.isActive);
await promise_rejects_dom(t, 'NotAllowedError', Summarizer.create());
await test_driver.bless('Summarizer.create', Summarizer.create);
// Creating Summarizer with user activation succeeds.
await createSummarizer();
// Expect available after create.
// Create does not require user activation when availability is 'available'.
assert_equals(await Summarizer.availability(), 'available');
// Now that it is available, we should no longer need user activation.
assert_false(navigator.userActivation.isActive);
await Summarizer.create();
}, 'Summarizer.create() requires user activation when availability is "downloadable"');
}, 'Create requires user activation when availability is "downloadable"');

View file

@ -6,7 +6,7 @@
'use strict';
promise_test(async () => {
assert_true(!!Summarizer);
assert_implements_optional("Summarizer" in self, "Summarizer is not supported");
assert_equals(typeof Summarizer.create, 'function');
}, 'Summarizer.create() is defined');

View file

@ -29,3 +29,9 @@ promise_test(async () => {
assert_in_array(availability, kValidAvailabilities, options);
}
}, 'Writer.availability() returns a valid value with plausible options');
promise_test(async (t) => {
return promise_rejects_js(t, RangeError, Writer.availability({
expectedInputLanguages: ['en-abc-invalid'], // not supported
}));
}, 'Writer.availability() rejects when given invalid language tags');

View file

@ -84,11 +84,16 @@ promise_test(async () => {
}, 'Writer.outputLanguage');
promise_test(async (t) => {
promise_rejects_js(
t, RangeError,
createWriter({ expectedInputLanguages: ['en-abc-invalid'] }));
return promise_rejects_js(
t, RangeError,
createWriter({expectedInputLanguages: ['en-abc-invalid']}));
}, 'Creating Writer with malformed language string');
promise_test(async (t) => {
let writer = await createWriter({expectedInputLanguages: ['EN']});
assert_true(!!writer);
}, 'Writer.create() canonicalizes language tags');
promise_test(async () => {
const writer = await createWriter({});
assert_equals(writer.expectedInputLanguages, null);

View file

@ -1,22 +1,21 @@
// META: title=Writer Create User Activation
// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: timeout=long
'use strict';
// Model download state is shared between test cases of the same file when run
// with `EchoAIManagerImpl`, so this test case needs to be on its own file.
// Mocked model download state may be shared between test cases in the same file
// (see e.g. `EchoAIManagerImpl`), so this test case is kept in a separate file.
// TODO(crbug.com/390246212): Support model state controls for WPTs.
promise_test(async t => {
// Creating Writer without user activation rejects with NotAllowedError.
// Create requires user activation when availability is 'downloadable'.
assert_implements_optional(await Writer.availability() == 'downloadable');
assert_false(navigator.userActivation.isActive);
await promise_rejects_dom(t, 'NotAllowedError', Writer.create());
await test_driver.bless('Writer.create', Writer.create);
// Creating Writer with user activation succeeds.
await createWriter();
// Expect available after create.
// Create does not require user activation when availability is 'available'.
assert_equals(await Writer.availability(), 'available');
// Now that it is available, we should no longer need user activation.
assert_false(navigator.userActivation.isActive);
await Writer.create();
}, 'Writer.create() requires user activation when availability is "downloadable"');
}, 'Create requires user activation when availability is "downloadable"');

View file

@ -4,6 +4,12 @@
'use strict';
promise_test(async t => {
t.add_cleanup(async () => {
await cookieStore.delete('ordered-1');
await cookieStore.delete('ordered-2');
await cookieStore.delete('ordered-3');
});
await cookieStore.set('ordered-1', 'cookie-value1');
await cookieStore.set('ordered-2', 'cookie-value2');
await cookieStore.set('ordered-3', 'cookie-value3');
@ -20,6 +26,12 @@ promise_test(async t => {
'they all end up in the cookie jar in order.');
promise_test(async t => {
t.add_cleanup(async () => {
await cookieStore.delete('ordered-unordered1');
await cookieStore.delete('ordered-unordered2');
await cookieStore.delete('ordered-unordered3');
});
await Promise.all([
cookieStore.set('ordered-unordered1', 'unordered-cookie-value1'),
cookieStore.set('ordered-unordered2', 'unordered-cookie-value2'),

View file

@ -61,6 +61,7 @@ for (const scenario of scenarios) {
await cookieStore.set(scenario.cookie.name, scenario.cookie.value);
value = (await cookieStore.get(scenario.cookie.name))?.value;
assert_equals(value, scenario.expected.value);
await cookieStore.delete({ name: scenario.cookie.name });
} catch(e) {
assert_equals(scenario.expected, undefined);
}

View file

@ -51,6 +51,8 @@
await promise_rejects_js(testCase, TypeError,
cookieStore.set( { name: `${prefix}cookie-name`, value: 'cookie-value',
path: "/path" }));
await cookieStore.delete({ name: `${prefix}cookie-name`});
}, `cookieStore.set with ${prefix} prefix a path option`);
});

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