Update web-platform-tests to revision b'9b5719f9756aba6e4aa3c855db9cc54648df815f' (#32214)

This commit is contained in:
Servo WPT Sync 2024-05-02 01:54:54 -04:00 committed by GitHub
parent 0df79b939a
commit 60613e77c5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
149 changed files with 5315 additions and 3178 deletions

View file

@ -1,3 +1,6 @@
[starting-style-size-container.html]
[Triggered transition from first style update based on up-to-date container query]
expected: FAIL
[Triggered transition from the display change inside the up-to-date container query]
expected: FAIL

View file

@ -0,0 +1,12 @@
[focus-preserve.html]
[when reparenting an element, don't automatically reset the document focus]
expected: FAIL
[when reparenting a focused element into an inert parent, reset the document focus]
expected: FAIL
[when reparenting a focused element into a hidden parent, reset the document focus]
expected: FAIL
[when reparenting an ancestor of an focused element into a hidden parent, reset the document focus]
expected: FAIL

View file

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

View file

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

View file

@ -2,4 +2,4 @@
type: testharness
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: NOTRUN
expected: FAIL

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,6 @@
[starting-style-size-container.html]
[Triggered transition from first style update based on up-to-date container query]
expected: FAIL
[Triggered transition from the display change inside the up-to-date container query]
expected: FAIL

View file

@ -0,0 +1,3 @@
[MediaQueryList-extends-EventTarget-interop.html]
[listener added with addListener and addEventListener is called once]
expected: FAIL

View file

@ -0,0 +1,12 @@
[focus-preserve.html]
[when reparenting an element, don't automatically reset the document focus]
expected: FAIL
[when reparenting a focused element into an inert parent, reset the document focus]
expected: FAIL
[when reparenting a focused element into a hidden parent, reset the document focus]
expected: FAIL
[when reparenting an ancestor of an focused element into a hidden parent, reset the document focus]
expected: FAIL

View file

@ -1,3 +0,0 @@
[navigation-unload-same-origin.window.html]
[Same-origin navigation started from unload handler must be ignored]
expected: FAIL

View file

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

View file

@ -1,4 +1,4 @@
[iframe_sandbox_popups_escaping-1.html]
expected: TIMEOUT
[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,3 +1,3 @@
[iframe_sandbox_popups_escaping-3.html]
[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,4 @@
[iframe_sandbox_popups_nonescaping-2.html]
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
expected: FAIL
expected: NOTRUN

View file

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

View file

@ -13,7 +13,7 @@
let open_rq = createdb(t);
open_rq.onupgradeneeded = function(e) {
let db = e.target.result;
let objStore = db.createObjectStore("test", { keyPath:"pKey" });
let objStore = db.createObjectStore("test");
let sab = new SharedArrayBuffer(256);

View file

@ -0,0 +1,56 @@
<!doctype html>
<meta charset=utf-8>
<meta name=timeout content=long>
<meta name=variant content="?method=a">
<meta name=variant content="?method=a&noreferrer">
<meta name=variant content="?method=img">
<meta name=variant content="?method=img&noreferrer">
<meta name=variant content="?method=open">
<meta name=variant content="?method=open&noreferrer">
<meta name=variant content="?method=script">
<meta name=variant content="?method=script&noreferrer">
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/helpers.js"></script>
<body>
<script>
const waitForRequest = async () => {
const url = blankURL();
url.searchParams.set('get-requests', 'true');
for (let i = 0; i < 20; i++) {
const resp = await fetch(url);
const payload = await resp.json();
if (payload !== null && payload.length > 0) {
return payload;
}
await delay(100);
}
throw new Error('Timeout polling requests');
};
const searchParams = new URLSearchParams(location.search);
promise_test(async t => {
const noreferrer = searchParams.has('noreferrer');
await registerAttributionSrc({
method: 'variant',
extraQueryParams: {'store-request': 'true'},
referrerPolicy: noreferrer ? 'no-referrer' : '',
});
const requests = await waitForRequest();
assert_equals(requests.length, 1);
if (noreferrer) {
assert_not_own_property(requests[0], 'referer');
} else {
assert_own_property(requests[0], 'referer');
assert_equals(requests[0].referer, location.toString());
}
}, 'attributionsrc referrer policy is propagated.');
</script>

View file

@ -53,9 +53,7 @@ promise_test(async t => {
} else {
assert_not_own_property(requests[0], 'attribution-reporting-eligible');
}
assert_equals(requests[0].referer, location.toString());
// TODO(apaseltiner): Test various referrer policies.
// TODO(apaseltiner): Test cookie propagation.
const expectedURL = blankURL();

View file

@ -171,6 +171,7 @@ const registerAttributionSrc = async ({
extraQueryParams = {},
reportingOrigin,
extraHeaders = [],
referrerPolicy = '',
}) => {
const searchParams = new URLSearchParams(location.search);
@ -201,7 +202,6 @@ const registerAttributionSrc = async ({
headers.push({name, value: cookie});
}
let credentials;
if (method === 'fetch') {
const params = getFetchParams(reportingOrigin, cookie);
@ -219,6 +219,7 @@ const registerAttributionSrc = async ({
switch (method) {
case 'img':
const img = document.createElement('img');
img.referrerPolicy = referrerPolicy;
if (eligible === null) {
img.attributionSrc = url;
} else {
@ -236,6 +237,7 @@ const registerAttributionSrc = async ({
return 'event';
case 'script':
const script = document.createElement('script');
script.referrerPolicy = referrerPolicy;
if (eligible === null) {
script.attributionSrc = url;
} else {
@ -249,6 +251,7 @@ const registerAttributionSrc = async ({
return 'event';
case 'a':
const a = document.createElement('a');
a.referrerPolicy = referrerPolicy;
a.target = '_blank';
a.textContent = 'link';
if (eligible === null) {
@ -263,12 +266,13 @@ const registerAttributionSrc = async ({
return 'navigation';
case 'open':
await test_driver.bless('open window', () => {
const feature = referrerPolicy === 'no-referrer' ? 'noreferrer' : '';
if (eligible === null) {
open(
blankURL(), '_blank',
`attributionsrc=${encodeURIComponent(url)}`);
`attributionsrc=${encodeURIComponent(url)} ${feature}`);
} else {
open(url, '_blank', 'attributionsrc');
open(url, '_blank', `attributionsrc ${feature}`);
}
});
return 'navigation';
@ -277,7 +281,7 @@ const registerAttributionSrc = async ({
if (eligible !== null) {
attributionReporting = JSON.parse(eligible);
}
await fetch(url, {credentials, attributionReporting});
await fetch(url, {credentials, attributionReporting, referrerPolicy});
return 'event';
}
case 'xhr':

View file

@ -4,18 +4,18 @@
test(() => {
// Compute Pressure should support at least "cpu"
const sources = PressureObserver.supportedSources;
const sources = PressureObserver.knownSources;
assert_in_array('cpu', sources);
}, 'PressureObserver should support at least "cpu"');
test(() => {
// Compute Pressure should be frozen array
const sources = PressureObserver.supportedSources;
assert_equals(sources, PressureObserver.supportedSources);
const sources = PressureObserver.knownSources;
assert_equals(sources, PressureObserver.knownSources);
}, 'PressureObserver must return always the same array');
test(() => {
// Compute Pressure should be frozen array
let sources = PressureObserver.supportedSources;
assert_equals(Object.isFrozen(), true);
let sources = PressureObserver.knownSources;
assert_equals(Object.isFrozen(sources), true);
}, 'PressureObserver must return a frozen array');

View file

@ -1,37 +0,0 @@
<!DOCTYPE html>
<link rel="stylesheet" href="/fonts/ahem.css">
<style>
body {
font: 20px/1 Ahem;
margin: 0;
}
#placefiller-above-anchor {
height: 200px;
}
#placefiller-before-anchor {
display: inline-block;
width: 50px;
}
#inner-anchored {
color: green;
position: fixed;
left: 70px;
top: 180px;
}
#outer-anchored {
color: yellow;
position: fixed;
left: 70px;
top: 220px;
}
</style>
<div id="placefiller-above-anchor"></div>
<div id="placefiller-before-anchor"></div>
<span id="anchor">anchor</span>
<div id="inner-anchored">inner-anchored</div>
<div id="outer-anchored">outer-anchored</div>

View file

@ -1,67 +0,0 @@
<!DOCTYPE html>
<title>Basic of anchor positioned scrolling: anchored elements should be "pinned" to the anchor when anchor is scrolled in overflow:hidden</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-1/">
<link rel="match" href="anchor-scroll-overflow-hidden-ref.html">
<link rel="stylesheet" href="/fonts/ahem.css">
<style>
body {
font: 20px/1 Ahem;
margin: 0;
}
#scroll-container {
width: 400px;
height: 400px;
overflow: hidden;
}
#scroll-contents {
width: 1000px;
height: 1000px;
}
#placefiller-above-anchor {
height: 500px;
}
#placefiller-before-anchor {
display: inline-block;
width: 500px;
}
#anchor {
anchor-name: --anchor;
}
#inner-anchored {
color: green;
position: absolute;
left: anchor(--anchor left);
bottom: anchor(--anchor top);
position-anchor: --anchor;
}
#outer-anchored {
color: yellow;
position: absolute;
left: anchor(--anchor left);
top: anchor(--anchor bottom);
position-anchor: --anchor;
}
</style>
<div id="scroll-container">
<div id="scroll-contents">
<div id="placefiller-above-anchor"></div>
<div id="placefiller-before-anchor"></div>
<span id="anchor">anchor</span>
<div id="inner-anchored">inner-anchored</div>
</div>
</div>
<div id="outer-anchored">outer-anchored</div>
<script>
const scroller = document.getElementById('scroll-container');
scroller.scrollTop = 300;
scroller.scrollLeft = 450;
</script>

View file

@ -0,0 +1,14 @@
<!doctype html>
<meta charset="utf-8">
<style>
.flex {
display: flex;
width: 100px;
border: 1px solid;
}
</style>
<div class="flex">
<div>
<div style="background: green; width: 150px; height: 50px;"></div>
</div>
</div>

View file

@ -0,0 +1,18 @@
<!doctype html>
<meta charset="utf-8">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#min-size-auto">
<link rel="match" href="min-size-auto-overflow-clip-ref.html">
<title>overflow: visible and clip behave the same for min-size purposes</title>
<style>
.flex {
display: flex;
width: 100px;
border: 1px solid;
}
</style>
<div class="flex">
<div style="overflow: clip">
<div style="background: green; width: 150px; height: 50px;"></div>
</div>
</div>

View file

@ -0,0 +1,18 @@
<!doctype html>
<meta charset="utf-8">
<style>
.flex {
display: flex;
flex-direction: column;
}
.grid {
display: grid;
flex-basis: 20px;
border: 1px solid;
}
</style>
<div class="flex">
<div class="grid">
<div style="height: 50px;"></div>
</div>
</div>

View file

@ -0,0 +1,22 @@
<!doctype html>
<meta charset="utf-8">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="help" href="https://drafts.csswg.org/css-grid/#min-size-auto">
<link rel="match" href="min-size-auto-overflow-clip-ref.html">
<title>overflow: visible and clip behave the same for min-size purposes</title>
<style>
.flex {
display: flex;
flex-direction: column;
}
.grid {
display: grid;
flex-basis: 20px;
border: 1px solid;
}
</style>
<div class="flex">
<div class="grid" style="overflow: clip">
<div style="height: 50px;"></div>
</div>
</div>

View file

@ -0,0 +1,47 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Repeating linear gradients in HSL and OKLCH space</title>
<link rel="author" title="Ashley Hale" href="mailto:ahale@mozilla.com">
<style>
body {
background: #fff;
}
.a {
width: 100px;
height: 100px;
background: repeating-linear-gradient(
to bottom,
hsl(180 50% 70%) 0px 20px,
hsl(0 50% 50%) 20px 40px,
hsl(180 50% 70%) 40px 60px,
hsl(0 50% 50%) 60px 80px,
hsl(180 50% 70%) 80px 100px
);
}
.b {
width: 100px;
height: 100px;
background: repeating-linear-gradient(
to bottom,
oklch(70% 50% 180) 0px 20px,
oklch(50% 50% 0) 20px 40px,
oklch(70% 50% 180) 40px 60px,
oklch(50% 50% 0) 60px 80px,
oklch(70% 50% 180) 80px 100px
);
}
</style>
</head>
<body>
<p>repeating-linear-gradient with HSL</p>
<div class="a"></div>
<p>repeating-linear-gradient with OKLCH</p>
<div class="b"></div>
</body>
</html>

View file

@ -0,0 +1,44 @@
<!doctype html>
<html lang="en">
<meta name=fuzzy content="maxDifference=0-1;totalPixels=0-2000">
<head>
<meta charset="utf-8">
<title>Repeating linear gradients in HSL and OKLCH space</title>
<link rel="author" title="Ashley Hale" href="mailto:ahale@mozilla.com">
<link rel="help" href="https://www.w3.org/TR/css-color-4/#interpolation">
<meta name="assert" content="Tests that a multi-stop shorter hue gradient and a single-stop longer hue (wrapping) gradient match in appearance">
<link rel="match" href="repeating-gradient-hsl-and-oklch-ref.html">
<style>
body {
background: #fff;
}
.a {
width: 100px;
height: 100px;
background: repeating-linear-gradient(
to bottom,
hsl(180 50% 70%) 0px 20px,
hsl(0 50% 50%) 20px 40px
);
}
.b {
width: 100px;
height: 100px;
background: repeating-linear-gradient(
to bottom,
oklch(70% 50% 180) 0px 20px,
oklch(50% 50% 0) 20px 40px
);
}
</style>
</head>
<body>
<p>repeating-linear-gradient with HSL</p>
<div class="a"></div>
<p>repeating-linear-gradient with OKLCH</p>
<div class="b"></div>
</body>
</html>

View file

@ -0,0 +1,32 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<style>
body {
margin: 0;
}
.pencil {
background-color: black;
mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGEuOTk2Ljk5NiAwIDAgMCAwLTEuNDFsLTIuMzQtMi4zNGEuOTk2Ljk5NiAwIDAgMC0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzeiIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=);
mask-repeat: no-repeat;
width: 36px;
height: 36px;
}
.fakepage {
position: relative;
height: 100vh;
}
</style>
<div class="fakepage">
<div style="position:absolute; bottom:0; right:0;">
<div class="pencil"></div>
</div>
When printed, there should be two pages. There should be a black pencil in the
bottom right corner on both pages.
</div>
<div class="fakepage">
<div style="position:absolute; bottom:0; right:0;">
<div class="pencil"></div>
</div>
Page 2.
</div>

View file

@ -0,0 +1,24 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="http://crbug.com/337791467">
<link rel="match" href="fixedpos-009-print-ref.html">
<style>
body {
margin: 0;
}
.pencil {
background-color: black;
mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGEuOTk2Ljk5NiAwIDAgMCAwLTEuNDFsLTIuMzQtMi4zNGEuOTk2Ljk5NiAwIDAgMC0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzeiIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=);
mask-repeat: no-repeat;
width: 36px;
height: 36px;
}
</style>
<div style="position:fixed; bottom:0; right:0;">
<div class="pencil"></div>
</div>
When printed, there should be two pages. There should be a black pencil in the
bottom right corner on both pages.
<div style="break-before:page;">
Page 2.
</div>

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<style>
@page {
size: 400px;
margin: 0;
}
@page large {
size: 500px 400px;
}
body {
margin: 0;
}
</style>
This page should <em>not</em> have a blue box.
<div style="page:large;">
<div style="float:right; margin-top:300px; width:100px; height:100px; background:blue;"></div>
<div style="width:400px;">
This page should have a blue box in the bottom right corner.
</div>
<div style="break-before:page;">
<div style="float:right; margin-top:300px; width:100px; height:100px; background:blue;"></div>
<div style="width:400px;">
This page should have a blue box in the bottom right corner.
</div>
</div>
</div>
This page should <em>not</em> have a blue box.

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-position-3/#valdef-position-fixed">
<link rel="match" href="fixedpos-010-print-ref.html">
<style>
@page {
size: 400px;
margin: 0;
}
@page large {
size: 500px 400px;
}
body {
margin: 0;
}
</style>
<div style="position:fixed; right:-100px; bottom:0; width:100px; height:100px; background:blue;"></div>
This page should <em>not</em> have a blue box.
<div style="page:large; width:400px;">
This page should have a blue box in the bottom right corner.
<div style="break-before:page;">
This page should have a blue box in the bottom right corner.
</div>
</div>
This page should <em>not</em> have a blue box.

View file

@ -5,32 +5,58 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/css-transitions/support/helper.js"></script>
<div id="container" style="width: 200px">
<div id="target" style="display: none"></div>
</div>
<body>
</body>
<style>
#container {
container-type: inline-size;
width: 100px;
}
#target {
transition-property: background-color;
transition-duration: 100s;
transition-timing-function: steps(2, start);
background-color: lime;
display: none;
}
@container (width > 300px) {
@starting-style {
#target { background-color: white; }
}
}
@container (width < 300px) {
@container ((width > 200px) and (width < 300px)) {
#target {
display: block;
}
@starting-style {
#target { background-color: white; }
}
}
@container (width < 200px) {
@starting-style {
#target { background-color: red; }
}
}
</style>
<script>
function setup(test) {
let container = document.createElement("div");
container.id = "container";
document.body.appendChild(container);
let target = document.createElement("div");
target.id = "target";
container.appendChild(target);
test.add_cleanup(() => {
target.remove();
container.remove();
});
return [container, target];
}
promise_test(async t => {
let [container, target] = setup(t);
await waitForAnimationFrames(2);
assert_equals(getComputedStyle(target).backgroundColor, "rgb(0, 255, 0)",
"No transition while display:none");
@ -38,6 +64,21 @@
target.style.display = "block";
await waitForAnimationFrames(2);
assert_equals(getComputedStyle(target).backgroundColor, "rgb(128, 255, 128)",
"@starting-style based on the size query evaluation from the same frame");
}, "Triggered transition from first style update based on up-to-date container query");
"@starting-style based on the size query evaluation from " +
"the same frame");
}, "Triggered transition from first style update based on up-to-date " +
"container query");
promise_test(async t => {
let [container, target] = setup(t);
await waitForAnimationFrames(2);
assert_equals(getComputedStyle(target).backgroundColor, "rgb(0, 255, 0)",
"No transition while display:none");
container.style.width = "250px";
await waitForAnimationFrames(2);
assert_equals(getComputedStyle(target).backgroundColor, "rgb(128, 255, 128)",
"@starting-style based on the size query evaluation from " +
"the same frame");
}, "Triggered transition from the display change inside the up-to-date " +
"container query");
</script>

View file

@ -0,0 +1,34 @@
<!doctype HTML>
<html>
<head>
<style>
html {
background: lightpink;
}
div {
position: relative;
width: 200px;
height: 200px;
}
.outer {
background-color: blue;
box-shadow: -50px -50px 0px 0px rgba(0,0,0,1);
left: 100px;
top: 100px;
}
.inner {
background-color: red;
left: 50px;
top: 50px;
}
</style>
</head>
<body>
</body>
<div class="outer">
<div class="inner"></div>
</div>
</html>

View file

@ -0,0 +1,50 @@
<!DOCTYPE html>
<html class=reftest-wait>
<title>View transitions: capture opacity elements</title>
<link rel="help" href="https://drafts.csswg.org/css-view-transitions-1/">
<link rel="author" href="mailto:mattwoodrow@apple.com">
<link rel="match" href="new-content-ancestor-clipped-ref.html">
<script src="/common/reftest-wait.js"></script>
<style>
.outer {
background-color: blue;
overflow: hidden;
box-shadow: -50px -50px 0px 0px rgba(0,0,0,1);
position: relative;
left: 100px;
top: 100px;
width: 200px;
height: 200px;
view-transition-name: outer;
}
.inner {
background-color: red;
position: relative;
left: 50px;
top: 50px;
width: 200px;
height: 200px;
view-transition-name: inner;
}
/* We're verifying what we capture, so just display the new contents for 5 minutes. */
html::view-transition-group(*) { animation-duration: 300s; }
html::view-transition-new(*) { animation: unset; opacity: 1; }
html::view-transition-old(*) { animation: unset; opacity: 0; }
/* hide the root so we show transition background to ensure we're in a transition */
html::view-transition-group(root) { animation: unset; opacity: 0; }
html::view-transition { background: lightpink; }
</style>
<div class="outer">
<div class="inner"></div>
</div>
<script>
failIfNot(document.startViewTransition, "Missing document.startViewTransition");
async function runTest() {
let t = document.startViewTransition(() => {
requestAnimationFrame(() => requestAnimationFrame(takeScreenshot));
});
}
onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
</script>

View file

@ -0,0 +1,4 @@
<!doctype html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<div style="font-size: 4em; line-height: 4lh">ABC</div>

View file

@ -0,0 +1,13 @@
<!doctype html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="author" title="Mozilla" href="https://mozilla.org">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1892676">
<link rel="help" href="https://drafts.csswg.org/css-viewport/#zoom-property">
<link rel="match" href="relative-units-from-parent-ref.html">
<!--
The font-size and line-height use the parent sizes, but should still
multiply by our own zoom.
-->
<div style="zoom: 2; font-size: 2em; line-height: 2lh">ABC</div>

View file

@ -0,0 +1,42 @@
<!doctype html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="author" title="Mozilla" href="https://mozilla.org">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1892676">
<link rel="help" href="https://drafts.csswg.org/css-viewport/#zoom-property">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
:root,
#zoomed {
font-size: 10px;
line-height: 10px;
zoom: 2;
}
</style>
<div id="outside"></div>
<div id="zoomed">
<div id="inside"></div>
</div>
<script>
function test_unit(unit, outside, zoomed, inside = zoomed) {
test(function() {
let values = { outside, zoomed, inside };
for (let id of ["outside", "zoomed", "inside"]) {
let el = document.getElementById(id);
el.style.height = "1" + unit;
// approx_equals is needed because innerHeight / innerWidth round.
assert_approx_equals(el.getBoundingClientRect().height, values[id], 1, `${unit} in ${id}`);
el.style.height = "";
}
});
}
test_unit("em", 20, 40);
test_unit("rem", 20, 40);
test_unit("lh", 20, 40);
test_unit("rlh", 20, 40);
test_unit("vh", 2 * innerHeight / 100, 4 * innerHeight / 100);
test_unit("vw", 2 * innerWidth / 100, 4 * innerWidth / 100);
</script>

View file

@ -24,7 +24,6 @@
margin: 1px;
top:10x;
left: 10x;
}
.one {
position: relative;
@ -36,7 +35,7 @@
top: 20px;
left: 20px;
zoom: 2;
}
}
.three {
position: absolute;
@ -54,18 +53,18 @@
<div id="unzoomed_two" class="square two"></div>
<div id="unzoomed_three" class="square three"></div>
</div>
<div style="zoom:3" class=outer_div>
<div style="zoom:3" class="outer_div">
<div id="zoomed_one" class="square one"></div>
<div id="zoomed_two" class="square two"></div>
<div id="zoomed_three" class="square three"></div>
</div>
<div class ="outer_div" style="margin: 30px;" id="outer_div">
<div class="outer_div" style="margin: 30px;" id="outer_div">
<div id="zoomed_middle" style="margin: 10px; zoom:2">
<div class="square" id="unzoomed_inner"></div>
</div>
</div>
<div class = outer_div style="margin: 30px;">
<div class="outer_div" style="margin: 30px;">
<div id="unzoomed_middle">
<div class="square" id="zoomed_inner" style="zoom:2; width: 100px; height: 100px; border: 1px solid black;"></div>
</div>
@ -90,12 +89,12 @@ test(() => {
assert_equals(unzoomed_inner.offsetLeft, 11, 'unzoomed_inner.offsetLeft');
assert_equals(zoomed_inner.offsetTop, 0, 'zoomed_inner.offsetTop');
assert_equals(zoomed_inner.offsetLeft, 1, 'zoomed_inner.offsetLeft');
}, 'Verifies that offsetTop and offsetLeft find the right OffsetParent and return values excluding the target zoom');
// check that offset is equal between elements when one of them has css zoom
test(() => {
assert_equals(unzoomed_one.offsetWidth, zoomed_one.offsetWidth, "offsetWidth");
assert_equals(unzoomed_one.offsetHeight, zoomed_one.offsetHeight, "offsetHeight");
assert_equals(zoomed_inner.offsetWidth, outer_div.offsetWidth, "offsetWidth for nested element");
assert_equals(zoomed_inner.offsetHeight, outer_div.offsetHeight, "offsetHeight for nested element");
}, 'Verifies that offsetTop and offsetLeft find the right OffsetParent and return values excluding the target zoom');
}, 'check that offset is equal between elements when one of them has css zoom');
</script>

View file

@ -0,0 +1,6 @@
<!DOCTYPE html>
<link rel="help" href="https://crbug.com/338071841">
<div id="p"><span></span><!-- comment --></div>
<script>
p.moveBefore(p.lastChild, p.firstChild);
</script>

View file

@ -0,0 +1,85 @@
<!DOCTYPE html>
<title>moveBefore should not automatically clear focus</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<section id="old_parent">
<button id="button" tabindex="1">Button</button>
</section>
<section id="new_parent">
</section>
<section id="inert_parent" inert>
</section>
<section id="hidden_parent" hidden>
</section>
<script>
function eventually_blurred(t, item, timeout = 1000) {
return new Promise((resolve, reject) => {
function onblur() {
resolve();
item.removeEventListener("blur", onblur);
}
item.addEventListener("blur", onblur);
t.step_timeout(reject, timeout);
});
}
test(t => {
const old_parent = document.querySelector("#old_parent");
const button = document.querySelector("#button");
t.add_cleanup(() => old_parent.append(button));
button.focus();
assert_equals(document.activeElement, button);
new_parent.moveBefore(button, null);
assert_equals(document.activeElement, button);
}, "when reparenting an element, don't automatically reset the document focus");
promise_test(async t => {
const old_parent = document.querySelector("#old_parent");
const button = document.querySelector("#button");
t.add_cleanup(() => old_parent.append(button));
const inert_parent = document.querySelector("#inert_parent");
button.focus();
assert_equals(document.activeElement, button);
inert_parent.moveBefore(button, null);
// The button will still be considered the active element. It will blur asynchronously.
assert_equals(document.activeElement, button);
await eventually_blurred(t, button);
assert_equals(document.activeElement, document.body);
}, "when reparenting a focused element into an inert parent, reset the document focus");
promise_test(async t => {
const old_parent = document.querySelector("#old_parent");
const button = document.querySelector("#button");
t.add_cleanup(() => old_parent.append(button));
const hidden_parent = document.querySelector("#hidden_parent");
button.focus();
assert_equals(document.activeElement, button);
hidden_parent.moveBefore(button, null);
// The button will still be considered the active element. It will blur asynchronously.
// This is similar to other operations that can cause a blur due to change in inert trees,
// e.g. a style change that makes an ancestor `display: none`.
assert_equals(document.activeElement, button);
await eventually_blurred(t, button);
assert_equals(document.activeElement, document.body);
}, "when reparenting a focused element into a hidden parent, reset the document focus");
promise_test(async t => {
const old_parent = document.querySelector("#old_parent");
const button = document.querySelector("#button");
t.add_cleanup(() => document.body.append(old_parent));
const hidden_parent = document.querySelector("#hidden_parent");
button.focus();
assert_equals(document.activeElement, button);
hidden_parent.moveBefore(old_parent, null);
// The button will still be considered the active element. It will blur asynchronously.
assert_equals(document.activeElement, button);
await eventually_blurred(t, button);
assert_equals(document.activeElement, document.body);
}, "when reparenting an ancestor of an focused element into a hidden parent, reset the document focus");
</script>

View file

@ -0,0 +1,57 @@
// META: script=/resources/testdriver.js
// META: script=/common/utils.js
// META: script=resources/fledge-util.sub.js
// META: script=/common/subset-tests.js
// META: timeout=long
"use strict;"
// These tests focus on the browserSignals argument passed to scoreAd().
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let biddingLogicURL = createBiddingScriptURL(
{
generateBid:
`
return {
bid: 1,
render: { url: interestGroup.ads[0].renderURL,
width: '100sw',
height: '50px' }
};
`
});
let decisionLogicURL = createDecisionScriptURL(uuid,
{
scoreAd:
`
if (!browserSignals.hasOwnProperty('renderSize')) {
throw 'Missing renderSize member in browserSignals.';
}
if (browserSignals.renderSize.width !== '100sw' ||
browserSignals.renderSize.height !== '50px') {
throw 'Incorrect renderSize width or height.';
}
`
}
);
await joinGroupAndRunBasicFledgeTestExpectingWinner(
test,
{
uuid: uuid,
interestGroupOverrides: {
name: uuid,
biddingLogicURL: biddingLogicURL,
ads: [{ renderURL: createRenderURL(uuid), sizeGroup: 'group1' }],
adSizes: { 'size1': { width: '100sw', height: '50px' } },
sizeGroups: { 'group1': ['size1'] }
},
auctionConfigOverrides: {
decisionLogicURL: decisionLogicURL
}
});
}, 'ScoreAd browserSignals renderSize test.');

View file

@ -0,0 +1,28 @@
<!DOCTYPE html>
<link rel=author href="mailto:jarhar@chromium.org">
<link rel=help href="https://html.spec.whatwg.org/#inert-subtrees">
<link rel=help href="https://issues.chromium.org/issues/336832613">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=host>
<template shadowrootmode=open>
<dialog>
<div>inside shadowroot</div>
<slot></slot>
</dialog>
</template>
<div>slotted</div>
</div>
<script>
document.getElementById('host').shadowRoot.querySelector('dialog').showModal();
test(() => {
assert_true(window.find('inside shadowroot'));
}, 'Text inside a dialog inside a shadowroot should be findable.');
test(() => {
assert_true(window.find('slotted'));
}, 'Text slotted into a dialog which is inside a shadowroot should be findable.');
</script>

View file

@ -2,3 +2,4 @@
[TestDriver click on a document in an iframe]
expected:
if product == "chrome": [PASS, FAIL] # https://github.com/web-platform-tests/wpt/issues/26295
if os == "mac" and product == "firefox": [PASS, FAIL] # https://github.com/web-platform-tests/wpt/issues/45987

View file

@ -21,7 +21,7 @@ interface PressureObserver {
undefined disconnect();
sequence<PressureRecord> takeRecords();
[SameObject] static readonly attribute FrozenArray<PressureSource> supportedSources;
[SameObject] static readonly attribute FrozenArray<PressureSource> knownSources;
};
[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]

View file

@ -0,0 +1,142 @@
<!DOCTYPE html>
<!--
Tentative; contingent on merge of:
https://github.com/w3c/pointerevents/pull/495
This manual test validates the behavior of PointerEvent.deviceProperties.uniqueId.
Specifically, this test ensures that pointing devices get their own unique id, and
that the unique id is persistent over the session.
In order to run this test, it is necessary to have multiple pointing devices; such as a
pen and a mouse. Please follow the instructions exactly as written in order to ensure
the correct results are obtained.
-->
<title>DeviceProperties.uniqueId is unique for pointer events from different devices</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
#instructions {
display: inline-block;
border-right: 1px solid black;
padding-right: 10px;
width: 600px;
}
#testcontainer {
display: inline-block;
width: 300px;
touch-action: none;
}
#currentuniqueid {
display: inline-block;
}
.point1 {
height: 50px;
width: 50px;
background-color: #00eeee;
display: inline-block;
}
.point2 {
height: 50px;
width: 50px;
background-color: #aa33aa;
display: inline-block;
float: right;
}
.testarea {
border: 1px solid #000000;
margin-bottom: 50px;
width: 100%;
}
p {
padding-bottom: 10px;
}
html {
font-family: Arial, Helvetica, sans-serif;
}
</style>
<html>
<div id="instructions">
<h2>Instructions</h2>
<p>1. With one pointing device (pointing device #1), drag the pointer from A to B</p>
<p>2. With another pointing device (pointing device #2), drag the pointer from C to D</p>
<p>3. Repeat step 1.</p>
<p>4. Repeat step 2.</p>
<p>5. Click finish and verify the test passes. There should be 4 passing test cases. </p>
</div>
<div id="testcontainer">
<div>
Current pointer's unique id: <p id="currentuniqueid"></p>
</div>
<div class="testarea" id="device1">
<div class="point1">A</div>
<div class="point2">B</div>
</div>
<div class="testarea" id="device2">
<div class="point1">C</div>
<div class="point2">D</div>
</div>
<p>Click on the button below after completing. If a "PASS" result appears the test
passes, otherwise it fails</p>
<button onclick="Finish()">Finish Test</button>
</div>
</html>
<script>
let device1Ids = [];
let device2Ids = [];
setup({explicit_timeout: true, explicit_done: true});
function LogDeviceId(event, list) {
if (event.deviceProperties) {
const uniqueId = event.deviceProperties.uniqueId;
currentuniqueid.innerText = uniqueId ? uniqueId : "Unknown";
if (!uniqueId) {
return;
}
list.push(uniqueId);
}
}
function LogDeviceId1(event) {
LogDeviceId(event, device1Ids);
}
function LogDeviceId2(event) {
LogDeviceId(event, device2Ids);
}
function Finish() {
let device1UniqueIds = new Set(device1Ids);
let device2UniqueIds = new Set(device2Ids);
test(function () {
assert_greater_than(device1Ids.length, 1, "Events from Device 1 have uniqueIds.");
assert_equals(device1UniqueIds.size, 1, "Device 1 has a consistent uniqueId.");
}, "uniqueId is consistent for device 1");
test(function () {
assert_greater_than(device2Ids.length, 1, "Events from Device 2 have uniqueIds.");
assert_equals(device2UniqueIds.size, 1, "Device 2 has a consistent uniqueId.");
}, "uniqueId is consistent for device 2");
test(function () {
// Ensure the two sets are different.
assert_equals(device1UniqueIds.intersection(device2UniqueIds).size, 0, "Device 1 and 2 have different uniqueIds.");
}, "uniqueId is unique to device 1 and device 2");
done();
}
device1.addEventListener("pointerdown", LogDeviceId1, false);
device1.addEventListener("pointermove", LogDeviceId1, false);
device1.addEventListener("pointerup", LogDeviceId1, false);
device2.addEventListener("pointerdown", LogDeviceId2, false);
device2.addEventListener("pointermove", LogDeviceId2, false);
device2.addEventListener("pointerup", LogDeviceId2, false);
</script>

View file

@ -0,0 +1,19 @@
async_test(t => {
const i = document.createElement('iframe');
i.src = "/common/blank.html";
i.onload = t.step_func_done(_ => {
assert_equals('undefined', typeof i.contentWindow.navigator.mediaDevices.getAllScreensMedia);
});
document.body.appendChild(i);
}, "No CSP, no exposure.");
async_test(t => {
const i = document.createElement('iframe');
i.src = "/content-security-policy/support/echo-policy.py?policy=" +
encodeURIComponent("script-src 'none'; object-src 'none'; base-uri 'none'; require-trusted-types-for 'script'");
i.onload = t.step_func_done(_ => {
assert_equals("function", typeof i.contentWindow.navigator.mediaDevices.getAllScreensMedia);
});
document.body.appendChild(i);
}, "Strict CSP + TT, exposure.");

View file

@ -1,10 +1,15 @@
const TEST_CACHE_NAME = 'v1';
const MAX_CONDITION_DEPTH = 10;
const routerRules = {
'condition-urlpattern-constructed-source-network': [{
condition: {urlPattern: new URLPattern({pathname: '/**/direct.txt'})},
source: 'network'
}],
'condition-urlpattern-not-source-network': [{
condition: {not: {urlPattern: new URLPattern({pathname: '/**/not.txt'})}},
source: 'network'
}],
'condition-urlpattern-constructed-match-all-source-cache': [
{condition: {urlPattern: new URLPattern({})}, source: 'cache'},
],
@ -43,14 +48,19 @@ const routerRules = {
[{condition: {requestMethod: 'PUT'}, source: 'network'}],
'condition-request-method-delete-network':
[{condition: {requestMethod: 'DELETE'}, source: 'network'}],
'condition-lack-of-condition': [{
source: 'network'
}],
'condition-lack-of-source': [{
condition: {requestMode: 'no-cors'},
}],
'condition-invalid-request-method': [{
condition: {requestMethod: String.fromCodePoint(0x3042)},
source: 'network'
}],
'condition-invalid-or-condition-depth': (() => {
const max = 10;
const addOrCondition = (obj, depth) => {
if (depth > max) {
if (depth > MAX_CONDITION_DEPTH) {
return obj;
}
return {
@ -60,6 +70,17 @@ const routerRules = {
};
return {condition: addOrCondition({}, 0), source: 'network'};
})(),
'condition-invalid-not-condition-depth': (() => {
const generateNotCondition = (depth) => {
if (depth > MAX_CONDITION_DEPTH) {
return {
urlPattern: '/**/example.txt',
};
}
return {not: generateNotCondition(depth + 1)};
};
return {condition: generateNotCondition(0), source: 'network'};
})(),
'condition-invalid-router-size': [...Array(512)].map((val, i) => {
return {
condition: {urlPattern: `/foo-${i}`},

View file

@ -17,8 +17,14 @@ const ROUTER_RULE_KEY_INVALID_REQUEST_METHOD =
'condition-invalid-request-method';
const ROUTER_RULE_KEY_INVALID_OR_CONDITION_DEPTH =
'condition-invalid-or-condition-depth';
const ROUTER_RULE_KEY_INVALID_NOT_CONDITION_DEPTH =
'condition-invalid-not-condition-depth';
const ROUTER_RULE_KEY_INVALID_ROUTER_SIZE =
'condition-invalid-router-size';
const ROUTER_RULE_KEY_LACK_OF_CONDITION =
'condition-lack-of-condition';
const ROUTER_RULE_KEY_LACK_OF_SOURCE =
'condition-lack-of-source';
promise_test(async t => {
const worker = await registerAndActivate(t, ROUTER_RULE_KEY_INVALID_REQUEST_METHOD);
@ -34,6 +40,13 @@ promise_test(async t => {
assert_equals(errors.length, 1);
}, 'addRoutes should raise if or condition exceeds the depth limit');
promise_test(async t => {
const worker = await registerAndActivate(t, ROUTER_RULE_KEY_INVALID_NOT_CONDITION_DEPTH);
t.add_cleanup(() => {reset_info_in_worker(worker)});
const {errors} = await get_info_from_worker(worker);
assert_equals(errors.length, 1);
}, 'addRoutes should raise if not condition exceeds the depth limit');
promise_test(async t => {
const worker = await registerAndActivate(t, ROUTER_RULE_KEY_INVALID_ROUTER_SIZE);
t.add_cleanup(() => {reset_info_in_worker(worker)});
@ -41,5 +54,20 @@ promise_test(async t => {
assert_equals(errors.length, 1);
}, 'addRoutes should raise if the number of router rules exceeds the length limit');
promise_test(async t => {
const worker = await registerAndActivate(t, ROUTER_RULE_KEY_LACK_OF_CONDITION);
t.add_cleanup(() => {reset_info_in_worker(worker)});
const {errors} = await get_info_from_worker(worker);
assert_equals(errors.length, 1);
}, 'addRoutes should raise if the conditon does not exist in the rule');
promise_test(async t => {
const worker = await registerAndActivate(t, ROUTER_RULE_KEY_LACK_OF_SOURCE);
t.add_cleanup(() => {reset_info_in_worker(worker)});
const {errors} = await get_info_from_worker(worker);
assert_equals(errors.length, 1);
}, 'addRoutes should raise if the source does not exiswt in the rule');
</script>
</body>

View file

@ -11,6 +11,7 @@
<body>
<script>
const ROUTER_RULE_KEY = 'condition-urlpattern-constructed-source-network';
const ROUTER_RULE_NOT_KEY = 'condition-urlpattern-not-source-network';
const ROUTER_RULE_KEY_IGNORE_CASE =
'condition-urlpattern-constructed-ignore-case-source-network';
const ROUTER_RULE_KEY_RESPECT_CASE =
@ -23,6 +24,7 @@ const ROUTER_RULE_KEY_URLPATTERN_CACHE_WITH_NAME =
const REGISTERED_ROUTE = 'resources/direct.txt';
const CACHED_ROUTE = 'resources/cache.txt';
const NON_REGISTERED_ROUTE = 'resources/simple.html';
const NOT_ROUTE = 'resources/not.txt';
const host_info = get_host_info();
const path = new URL(".", window.location).pathname;
@ -72,5 +74,20 @@ iframeTest(CACHED_ROUTE, ROUTER_RULE_KEY_URLPATTERN_CACHE_WITH_NAME, async (t, i
assert_equals(requests.length, 0);
assert_equals(iwin.document.body.innerText, "From cache");
}, 'Main resource load matched with the cache source, with specifying the cache name');
iframeTest(NOT_ROUTE, ROUTER_RULE_NOT_KEY, async (t, iwin, worker) => {
const {requests} = await get_info_from_worker(worker);
assert_equals(requests.length, 1);
assert_equals(
requests[0].url,
`${host_info['HTTPS_ORIGIN']}${path}${NOT_ROUTE}`);
assert_equals(requests[0].mode, 'navigate');
}, 'Main resource load should not match the condition with not');
iframeTest(REGISTERED_ROUTE, ROUTER_RULE_NOT_KEY, async (t, iwin, worker) => {
const {requests} = await get_info_from_worker(worker);
assert_equals(requests.length, 0);
assert_equals(iwin.document.body.innerText, "Network\n");
}, 'Main resource load should match the condition without not');
</script>
</body>

View file

@ -27,10 +27,12 @@ const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_MATCH_ALL_CACHE =
const ROUTER_RULE_KEY_URLPATTERN_CACHE_WITH_NAME =
'condition-urlpattern-string-source-cache-with-name';
const ROUTER_RULE_KEY_OR = 'condition-or-source-network'
const ROUTER_RULE_KEY_NOT = 'condition-urlpattern-not-source-network';
const SCOPE = 'resources/';
const HTML_FILE = 'resources/simple.html';
const TXT_FILE = 'resources/direct.txt';
const CSV_FILE = 'resources/simple.csv';
const NOT_FILE = 'resources/not.txt';
// Warning: please prepare the corresponding `*.text.headers` files, otherwise
// iframeTest() fails to load the following files due to MIME mismatches.
const OR_TEST_FILES = [
@ -184,5 +186,17 @@ iframeTest(HTML_FILE, ROUTER_RULE_KEY_URLPATTERN_CACHE_WITH_NAME, async (t, iwin
assert_equals(response_with_param.status, 404);
}, 'Subresource load matched with the cache source, with specifying the cache name');
iframeTest(TXT_FILE, ROUTER_RULE_KEY_NOT, async (t, iwin) => {
const rnd = randomString();
const response = await iwin.fetch(`${NOT_FILE}?nonce=${rnd}`);
assert_equals(await response.text(), rnd);
}, 'Subresource load should not match with the not condition');
iframeTest(TXT_FILE, ROUTER_RULE_KEY_NOT, async (t, iwin) => {
const rnd = randomString();
const response = await iwin.fetch('?nonce=' + rnd);
assert_equals(await response.text(), "Network\n");
}, 'Subresource load should match with a file other than not');
</script>
</body>

View file

@ -1,4 +1,5 @@
<!DOCTYPE html>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>

View file

@ -0,0 +1,29 @@
<!doctype html>
<html class="reftest-wait">
<title>&lt;marker> element added after first paint</title>
<script src="/common/reftest-wait.js"></script>
<script src="/common/rendering-utils.js"></script>
<link rel="match" href="../../struct/reftests/reference/green-100x100.html">
<svg>
<path d="M0,0h100" marker-start="url(#m)"/>
</svg>
<script>
function createSvgElement(name, attrData) {
const svgNs = 'http://www.w3.org/2000/svg';
const element = document.createElementNS(svgNs, name);
attrData.forEach(([name, value]) => element.setAttribute(name, value));
return element;
}
waitForAtLeastOneFrame().then(() => {
const svgNs = 'http://www.w3.org/2000/svg';
const markerElement = createSvgElement('marker', [
['id', 'm'], ['orient', '0'], ['overflow', 'visible']
]);
markerElement.appendChild(createSvgElement('rect', [
['width', '100'], ['height', '100'], ['fill', 'green']
]));
const svg = document.querySelector('svg');
svg.insertBefore(markerElement, svg.firstElementChild);
takeScreenshot();
});
</script>

View file

@ -1,6 +1,6 @@
steps:
# The conflicting google-chrome and chromedriver casks are first uninstalled.
# The raw google-chrome-dev cask URL is used to bypass caching.
# The raw google-chrome@dev.rb cask URL is used to bypass caching.
- script: |
set -eux -o pipefail
HOMEBREW_NO_AUTO_UPDATE=1 brew uninstall --cask google-chrome || true

View file

@ -1,9 +1,8 @@
steps:
# This is equivalent to `Homebrew/homebrew-cask-versions/firefox-nightly`,
# but the raw URL is used to bypass caching.
# The raw firefox@nightly.rb cask URL is used to bypass caching.
- script: |
set -eux -o pipefail
curl https://raw.githubusercontent.com/Homebrew/homebrew-cask-versions/master/Casks/firefox-nightly.rb > firefox-nightly.rb
HOMEBREW_NO_AUTO_UPDATE=1 brew install --cask firefox-nightly.rb
curl https://raw.githubusercontent.com/Homebrew/homebrew-cask/HEAD/Casks/f/firefox@nightly.rb > firefox@nightly.rb
HOMEBREW_NO_AUTO_UPDATE=1 brew install --cask firefox@nightly.rb
displayName: 'Install Firefox Nightly'
condition: and(succeeded(), eq(variables['Agent.OS'], 'Darwin'))

View file

@ -829,7 +829,8 @@ def start_http_server(logger, host, port, paths, routes, bind_address, config, *
key_file=None,
certificate=None,
latency=kwargs.get("latency"))
except Exception:
except Exception as error:
logger.critical(f"start_http_server: Caught exception from wptserve.WebTestHttpd: {error}")
startup_failed(logger)
@ -847,7 +848,8 @@ def start_https_server(logger, host, port, paths, routes, bind_address, config,
certificate=config.ssl_config["cert_path"],
encrypt_after_connect=config.ssl_config["encrypt_after_connect"],
latency=kwargs.get("latency"))
except Exception:
except Exception as error:
logger.critical(f"start_https_server: Caught exception from wptserve.WebTestHttpd: {error}")
startup_failed(logger)
@ -868,7 +870,8 @@ def start_http2_server(logger, host, port, paths, routes, bind_address, config,
encrypt_after_connect=config.ssl_config["encrypt_after_connect"],
latency=kwargs.get("latency"),
http2=True)
except Exception:
except Exception as error:
logger.critical(f"start_http2_server: Caught exception from wptserve.WebTestHttpd: {error}")
startup_failed(logger)
@ -935,7 +938,8 @@ def start_ws_server(logger, host, port, paths, routes, bind_address, config, **k
config.paths["ws_doc_root"],
bind_address,
ssl_config=None)
except Exception:
except Exception as error:
logger.critical(f"start_ws_server: Caught exception from WebSocketDomain: {error}")
startup_failed(logger)
@ -947,7 +951,8 @@ def start_wss_server(logger, host, port, paths, routes, bind_address, config, **
config.paths["ws_doc_root"],
bind_address,
config.ssl_config)
except Exception:
except Exception as error:
logger.critical(f"start_wss_server: Caught exception from WebSocketDomain: {error}")
startup_failed(logger)

View file

@ -1,5 +1,5 @@
html5lib==1.1
mozdebug==0.3.0
mozdebug==0.3.1
mozinfo==1.2.3 # https://bugzilla.mozilla.org/show_bug.cgi?id=1621226
mozlog==8.0.0
mozprocess==1.3.1
@ -7,4 +7,4 @@ packaging==24.0
pillow==9.5.0
requests==2.31.0
six==1.16.0
urllib3==2.0.7
urllib3==2.2.1

View file

@ -6,5 +6,5 @@ mozleak==0.2
mozprofile==3.0.0
mozrunner==8.3.1
mozversion==2.4.0
psutil==5.9.5
psutil==5.9.8
redo==2.0.4

View file

@ -1 +1 @@
psutil==5.9.5
psutil==5.9.8

View file

@ -0,0 +1,9 @@
// Returns a promise that resolves with a Security Policy Violation (spv)
// even when it is received.
function promise_spv() {
return new Promise((resolve, reject) => {
window.addEventListener("securitypolicyviolation", e => {
resolve(e);
}, { once: true });
});
}

View file

@ -0,0 +1,107 @@
<!DOCTYPE html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./support/resolve-spv.js"></script>
<meta http-equiv="Content-Security-Policy"
content="require-trusted-types-for 'script'">
</head>
<body>
<div id="log"></div>
<svg id="svg"><script id="script">"some script text";</script></svg>
<script>
const policy = trustedTypes.createPolicy("policy", {
createScript: x => x, createHTML: x => x, createScriptURL: x => x });
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
assert_throws_js(TypeError, _ => {
elem.href.baseVal = "about:blank";
});
document.getElementById("svg").appendChild(elem);
return promise_spv();
}, "Assign string to SVGScriptElement.href.baseVal.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.href.baseVal = policy.createScriptURL("about:blank");
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign TrustedScriptURL to SVGScriptElement.href.baseVal.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
assert_throws_js(TypeError, _ => {
elem.setAttribute("href", "about:blank");
});
document.getElementById("svg").appendChild(elem);
return promise_spv();
}, "Assign string to non-attached SVGScriptElement.href via setAttribute.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.setAttribute("href", policy.createScriptURL("about:blank"));
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign TrustedScriptURL to non-attached SVGScriptElement.href via setAttribute.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
document.getElementById("svg").appendChild(elem);
assert_throws_js(TypeError, _ => {
elem.setAttribute("href", "about:blank");
});
return promise_spv();
}, "Assign string to attached SVGScriptElement.href via setAttribute.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
document.getElementById("svg").appendChild(elem);
elem.setAttribute("href", policy.createScriptURL("about:blank"));
return Promise.resolve();
}, "Assign TrustedScriptURL to attached SVGScriptElement.href via setAttribute.");
// Default policy test: We repate the string assignment tests above,
// but now expect all of them to pass.
promise_test(t => {
trustedTypes.createPolicy("default", {
createScript: x => x, createHTML: x => x, createScriptURL: x => x });
return Promise.resolve();
}, "Setup default policy");
promise_test(t => {
document.getElementById("script").innerHTML = "'modified via innerHTML';";
return Promise.resolve();
}, "Assign String to SVGScriptElement.innerHTML w/ default policy.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.href.baseVal = "about:blank";
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign string to SVGScriptElement.href.baseVal w/ default policy.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.setAttribute("href", "about:blank");
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign string to non-attached SVGScriptElement.href via setAttribute w/ default policy.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
document.getElementById("svg").appendChild(elem);
elem.setAttribute("href", "about:blank");
return Promise.resolve();
}, "Assign string to attached SVGScriptElement.href via setAttribute w/ default policy.");
</script>
</body>

View file

@ -2,6 +2,7 @@
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./support/resolve-spv.js"></script>
<meta http-equiv="Content-Security-Policy"
content="require-trusted-types-for 'script'">
</head>
@ -9,16 +10,6 @@
<div id="log"></div>
<svg id="svg"><script id="script">"some script text";</script></svg>
<script>
// Returns a promise that resolves with a Security Policy Violation (spv)
// even when it is received.
function promise_spv() {
return new Promise((resolve, reject) => {
window.addEventListener("securitypolicyviolation", e => {
resolve(e);
}, { once: true });
});
}
const policy = trustedTypes.createPolicy("policy", {
createScript: x => x, createHTML: x => x, createScriptURL: x => x });
@ -49,96 +40,5 @@
document.getElementById("svg").appendChild(elem);
return promise_spv();
}, "Modify SVGScriptElement via DOM manipulation.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
assert_throws_js(TypeError, _ => {
elem.href.baseVal = "about:blank";
});
document.getElementById("svg").appendChild(elem);
return promise_spv();
}, "Assign string to SVGScriptElement.href.baseVal.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.href.baseVal = policy.createScriptURL("about:blank");
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign TrustedScriptURL to SVGScriptElement.href.baseVal.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
assert_throws_js(TypeError, _ => {
elem.setAttribute("href", "about:blank");
});
document.getElementById("svg").appendChild(elem);
return promise_spv();
}, "Assign string to non-attached SVGScriptElement.href via setAttribute.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.setAttribute("href", policy.createScriptURL("about:blank"));
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign TrustedScriptURL to non-attached SVGScriptElement.href via setAttribute.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
document.getElementById("svg").appendChild(elem);
assert_throws_js(TypeError, _ => {
elem.setAttribute("href", "about:blank");
});
return promise_spv();
}, "Assign string to attached SVGScriptElement.href via setAttribute.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
document.getElementById("svg").appendChild(elem);
elem.setAttribute("href", policy.createScriptURL("about:blank"));
return Promise.resolve();
}, "Assign TrustedScriptURL to attached SVGScriptElement.href via setAttribute.");
// Default policy test: We repate the string assignment tests above,
// but now expect all of them to pass.
promise_test(t => {
trustedTypes.createPolicy("default", {
createScript: x => x, createHTML: x => x, createScriptURL: x => x });
return Promise.resolve();
}, "Setup default policy");
promise_test(t => {
document.getElementById("script").innerHTML = "'modified via innerHTML';";
return Promise.resolve();
}, "Assign String to SVGScriptElement.innerHTML w/ default policy.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.href.baseVal = "about:blank";
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign string to SVGScriptElement.href.baseVal w/ default policy.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
elem.setAttribute("href", "about:blank");
document.getElementById("svg").appendChild(elem);
return Promise.resolve();
}, "Assign string to non-attached SVGScriptElement.href via setAttribute w/ default policy.");
promise_test(t => {
const elem = document.createElementNS(
"http://www.w3.org/2000/svg", "script");
document.getElementById("svg").appendChild(elem);
elem.setAttribute("href", "about:blank");
return Promise.resolve();
}, "Assign string to attached SVGScriptElement.href via setAttribute w/ default policy.");
</script>
</body>

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API argMin/Max operations
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-argminmax
testWebNNOperation(['argMin', 'argMax'], buildOperationWithSingleInput);
runWebNNConformanceTests(['argMin', 'argMax'], buildOperationWithSingleInput);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API batchNormalization operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-batchnorm
testWebNNOperation('batchNormalization', buildBatchNorm);
runWebNNConformanceTests('batchNormalization', buildBatchNorm);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API buffer operations
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,10 +9,11 @@
// https://webmachinelearning.github.io/webnn/#api-mlbuffer
testCreateWebNNBuffer("create", 4);
testDestroyWebNNBuffer('destroyTwice');
testReadWebNNBuffer('read');
testWriteWebNNBuffer('write');
if (navigator.ml) {
testCreateWebNNBuffer('create', 4);
testDestroyWebNNBuffer('destroyTwice');
testReadWebNNBuffer('read');
testWriteWebNNBuffer('write');
} else {
test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
}

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API cast operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-cast
testWebNNOperation('cast', buildCast);
runWebNNConformanceTests('cast', buildCast);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API clamp operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-clamp
testWebNNOperation('clamp', buildOperationWithSingleInput);
runWebNNConformanceTests('clamp', buildOperationWithSingleInput);

View file

@ -0,0 +1,61 @@
// META: title=test WebNN MLContext.compute() for ArrayBufferView created from bigger ArrayBuffer
// META: global=window,dedicatedworker
// META: variant=?gpu
// META: script=../resources/utils.js
'use strict';
// These tests are used to reproduce the Chromium issue:
// https://issues.chromium.org/issues/332151809
if (navigator.ml) {
const variant = location.search.substring(1);
const contextOptions = kContextOptionsForVariant[variant];
let context;
let builder;
promise_setup(async () => {
let supported = false;
try {
context = await navigator.ml.createContext(contextOptions);
supported = true;
} catch (e) {
}
assert_implements(
supported, `Unable to create context for ${variant} variant`);
builder = new MLGraphBuilder(context);
});
promise_test(async t => {
const a = builder.input('a', {dataType: 'float32', dimensions: [2]});
const b = builder.relu(a);
const graph = await builder.build({b});
const arraybuffer = new ArrayBuffer(100);
const aBuffer =
new Float32Array(arraybuffer, /*byteOffset*/ 4, /*length*/ 2)
aBuffer.set([1, -1]);
const bBuffer = new Float32Array(2);
const results =
await context.compute(graph, {'a': aBuffer}, {'b': bBuffer});
assert_array_approx_equals_ulp(
results.outputs.b, [1, 0], /*nulp*/ 0, 'float32');
}, 'Test compute() working for input ArrayBufferView created from bigger ArrayBuffer');
promise_test(async t => {
const a = builder.input('a', {dataType: 'float32', dimensions: [2]});
const b = builder.relu(a);
const graph = await builder.build({b});
const aBuffer = new Float32Array(2);
aBuffer.set([1, -1]);
const arraybuffer = new ArrayBuffer(100);
const bBuffer =
new Float32Array(arraybuffer, /*byteOffset*/ 8, /*length*/ 2);
const results =
await context.compute(graph, {'a': aBuffer}, {'b': bBuffer});
assert_array_approx_equals_ulp(
results.outputs.b, [1, 0], /*nulp*/ 0, 'float32');
}, 'Test compute() working for output ArrayBufferView created from bigger ArrayBuffer');
} else {
test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
}

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API concat operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-concat
testWebNNOperation('concat', buildConcat);
runWebNNConformanceTests('concat', buildConcat);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API constant
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-constant-range
testWebNNOperation('constant', buildConstantRange);
runWebNNConformanceTests('constant', buildConstantRange);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API conv2d operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-conv2d
testWebNNOperation('conv2d', buildConv2d);
runWebNNConformanceTests('conv2d', buildConv2d);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API convTranspose2d operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-convtranspose2d
testWebNNOperation('convTranspose2d', buildConvTranspose2d);
runWebNNConformanceTests('convTranspose2d', buildConvTranspose2d);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API element-wise binary operations
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,6 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-binary
testWebNNOperation(['add', 'sub', 'mul', 'div', 'max', 'min', 'pow'], buildOperationWithTwoInputs);
runWebNNConformanceTests(
['add', 'sub', 'mul', 'div', 'max', 'min', 'pow'],
buildOperationWithTwoInputs);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API element-wise logical operations
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,14 +9,17 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-logical
testWebNNOperation(
[
'equal',
'greater',
'greaterOrEqual',
'lesser',
'lesserOrEqual',
],
buildOperationWithTwoInputs
);
testWebNNOperation('logicalNot', buildOperationWithSingleInput);
if (navigator.ml) {
testWebNNOperation(
[
'equal',
'greater',
'greaterOrEqual',
'lesser',
'lesserOrEqual',
],
buildOperationWithTwoInputs);
testWebNNOperation('logicalNot', buildOperationWithSingleInput);
} else {
test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
}

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API element-wise unary operations
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,7 +9,9 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-unary
testWebNNOperation(
['abs', 'ceil', 'cos', 'erf', 'exp', 'floor', 'identity', 'log', 'neg', 'reciprocal', 'sin', 'sqrt', 'tan'],
buildOperationWithSingleInput
);
runWebNNConformanceTests(
[
'abs', 'ceil', 'cos', 'erf', 'exp', 'floor', 'identity', 'log', 'neg',
'reciprocal', 'sin', 'sqrt', 'tan'
],
buildOperationWithSingleInput);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API elu operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-elu
testWebNNOperation('elu', buildOperationWithSingleInput);
runWebNNConformanceTests('elu', buildOperationWithSingleInput);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API expand operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,5 +9,5 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-expand
// reuse buildReshape method
testWebNNOperation('expand', buildReshape);
// Reuse buildReshape method
runWebNNConformanceTests('expand', buildReshape);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API gather operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-gather
testWebNNOperation('gather', buildOperationWithTwoInputs);
runWebNNConformanceTests('gather', buildOperationWithTwoInputs);

View file

@ -1,5 +1,7 @@
// META: title=test WebNN API gemm operation
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: script=../resources/utils.js
// META: timeout=long
@ -7,4 +9,4 @@
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-gemm
testWebNNOperation('gemm', buildGemm);
runWebNNConformanceTests('gemm', buildGemm);

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API argMin/Max operations
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-argminmax
testWebNNOperation(['argMin', 'argMax'], buildOperationWithSingleInput, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API batchNormalization operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-batchnorm
testWebNNOperation('batchNormalization', buildBatchNorm, 'gpu');

View file

@ -1,16 +0,0 @@
// META: title=test WebNN API buffer operations
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlbuffer
testCreateWebNNBuffer("create", 4, 'gpu');
testDestroyWebNNBuffer('destroyTwice', 'gpu');
testReadWebNNBuffer('read', 'gpu');
testWriteWebNNBuffer('write', 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API cast operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-cast
testWebNNOperation('cast', buildCast, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API clamp operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-clamp
testWebNNOperation('clamp', buildOperationWithSingleInput, 'gpu');

View file

@ -1,37 +0,0 @@
// META: title=test WebNN MLContext.compute() for ArrayBufferView created from bigger ArrayBuffer
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
'use strict';
// These tests are used to reproduce the Chromium issue:
// https://issues.chromium.org/issues/332151809
promise_test(async t => {
const context = await navigator.ml.createContext({deviceType: 'gpu'});
const builder = new MLGraphBuilder(context);
const a = builder.input('a', {dataType: 'float32', dimensions: [2]});
const b = builder.relu(a);
const graph = await builder.build({b});
const arraybuffer = new ArrayBuffer(100);
const aBuffer = new Float32Array(arraybuffer, /*byteOffset*/ 4, /*length*/ 2)
aBuffer.set([1, -1]);
const bBuffer = new Float32Array(2);
const results = await context.compute(graph, {'a': aBuffer}, {'b': bBuffer});
assert_array_approx_equals_ulp(
results.outputs.b, [1, 0], /*nulp*/ 0, 'float32');
}, 'Test compute() working for input ArrayBufferView created from bigger ArrayBuffer');
promise_test(async t => {
const context = await navigator.ml.createContext({deviceType: 'gpu'});
const builder = new MLGraphBuilder(context);
const a = builder.input('a', {dataType: 'float32', dimensions: [2]});
const b = builder.relu(a);
const graph = await builder.build({b});
const aBuffer = new Float32Array(2);
aBuffer.set([1, -1]);
const arraybuffer = new ArrayBuffer(100);
const bBuffer = new Float32Array(arraybuffer, /*byteOffset*/ 8, /*length*/ 2);
const results = await context.compute(graph, {'a': aBuffer}, {'b': bBuffer});
assert_array_approx_equals_ulp(
results.outputs.b, [1, 0], /*nulp*/ 0, 'float32');
}, 'Test compute() working for output ArrayBufferView created from bigger ArrayBuffer');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API concat operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-concat
testWebNNOperation('concat', buildConcat, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API constant
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-constant-range
testWebNNOperation('constant', buildConstantRange, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API conv2d operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-conv2d
testWebNNOperation('conv2d', buildConv2d, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API convTranspose2d operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-convtranspose2d
testWebNNOperation('convTranspose2d', buildConvTranspose2d, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API element-wise binary operations
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-binary
testWebNNOperation(['add', 'sub', 'mul', 'div', 'max', 'min', 'pow'], buildOperationWithTwoInputs, 'gpu');

View file

@ -1,20 +0,0 @@
// META: title=test WebNN API element-wise logical operations
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-logical
testWebNNOperation(
[
'equal',
'greater',
'greaterOrEqual',
'lesser',
'lesserOrEqual',
],
buildOperationWithTwoInputs, 'gpu'
);
testWebNNOperation('logicalNot', buildOperationWithSingleInput, 'gpu');

View file

@ -1,13 +0,0 @@
// META: title=test WebNN API element-wise unary operations
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-unary
testWebNNOperation(
['abs', 'ceil', 'cos', 'erf', 'exp', 'floor', 'identity', 'log', 'neg', 'reciprocal', 'sin', 'sqrt', 'tan'],
buildOperationWithSingleInput, 'gpu'
);

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API elu operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-elu
testWebNNOperation('elu', buildOperationWithSingleInput, 'gpu');

View file

@ -1,11 +0,0 @@
// META: title=test WebNN API expand operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-expand
// reuse buildReshape method
testWebNNOperation('expand', buildReshape, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API gather operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-gather
testWebNNOperation('gather', buildOperationWithTwoInputs, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API gemm operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-gemm
testWebNNOperation('gemm', buildGemm, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API hardSigmoid operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-hard-sigmoid
testWebNNOperation('hardSigmoid', buildOperationWithSingleInput, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API tanh operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-hard-swish
testWebNNOperation('hardSwish', buildOperationWithSingleInput, 'gpu');

View file

@ -1,10 +0,0 @@
// META: title=test WebNN API instanceNormalization operation
// META: global=window,dedicatedworker
// META: script=../../resources/utils.js
// META: timeout=long
'use strict';
// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-instancenorm
testWebNNOperation('instanceNormalization', buildLayerNorm, 'gpu');

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