Auto merge of #23452 - servo-wpt-sync:wpt_update_24-05-2019, r=servo-wpt-sync

Sync WPT with upstream (24-05-2019)

Automated downstream sync of changes from upstream as of 24-05-2019.
[no-wpt-sync]
This commit is contained in:
bors-servo 2019-05-24 10:00:14 -04:00 committed by GitHub
commit 2181872973
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
1754 changed files with 6528 additions and 3662 deletions

View file

@ -37,6 +37,3 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
[new-fc-separates-from-float-3.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[line-breaking-018.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[line-breaking-019.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[no-transition-from-ua-to-blocking-stylesheet.html]
expected: FAIL

View file

@ -74,3 +74,6 @@
[opacity end]
expected: FAIL
[border-left-width end]
expected: FAIL

View file

@ -0,0 +1,2 @@
[backdrop-filter-clipped.html]
expected: FAIL

View file

@ -0,0 +1,2 @@
[backdrop-filter-update.html]
expected: FAIL

View file

@ -312,9 +312,6 @@
[<iframe>: separate response Content-Type: text/plain */*;charset=gbk]
expected: FAIL
[<iframe>: combined response Content-Type: */* text/html]
expected: FAIL
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
@ -333,3 +330,9 @@
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: separate response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;charset=gbk text/plain text/html]
expected: FAIL

View file

@ -11,3 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
[Content-Type-Options%3A%20nosniff]
expected: FAIL

View file

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

View file

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

View file

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

View file

@ -1,10 +0,0 @@
[non-active-document.html]
[DOMParser]
expected: FAIL
[createHTMLDocument]
expected: FAIL
[<template>]
expected: FAIL

View file

@ -1,5 +1,4 @@
[sharedworker-in-worker.html]
expected: ERROR
[Base URL in workers: new SharedWorker()]
expected: FAIL

View file

@ -1,2 +0,0 @@
[transition_calc_implicit.html]
expected: TIMEOUT

View file

@ -138,6 +138,74 @@ jobs:
parameters:
directory: tools/wpt/
- job: tools_unittest_win
displayName: 'tools/ unittests (Windows)'
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
pool:
vmImage: 'windows-2019'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '2.7.x'
- template: tools/ci/azure/checkout.yml
- template: tools/ci/azure/tox_pytest.yml
parameters:
directory: tools/
toxenv: py27
- job: tools_unittest_win_py3
displayName: 'tools/ unittests (Windows Python 3)'
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.tools_unittest']
pool:
vmImage: 'windows-2019'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.6.x'
- template: tools/ci/azure/checkout.yml
- template: tools/ci/azure/tox_pytest.yml
parameters:
directory: tools/
toxenv: py36
- job: wptrunner_unittest_win
displayName: 'tools/wptrunner/ unittests (Windows)'
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wptrunner_unittest']
pool:
vmImage: 'windows-2019'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '2.7.x'
- template: tools/ci/azure/checkout.yml
- template: tools/ci/azure/tox_pytest.yml
parameters:
directory: tools/wptrunner/
- job: wpt_integration_win
displayName: 'tools/wpt/ tests (Windows)'
dependsOn: decision
condition: dependencies.decision.outputs['test_jobs.wpt_integration']
pool:
vmImage: 'windows-2019'
steps:
# full checkout required
- task: UsePythonVersion@0
inputs:
versionSpec: '2.7.x'
# currently just using the outdated Chrome/Firefox on the VM rather than
# figuring out how to install Chrome Dev channel on Windows
# - template: tools/ci/azure/install_chrome.yml
# - template: tools/ci/azure/install_firefox.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- template: tools/ci/azure/tox_pytest.yml
parameters:
directory: tools/wpt/
- job: infrastructure_win10
displayName: 'infrastructure/ tests (Windows 10)'
# This job is only triggered manually until it has been shown to be robust.

View file

@ -0,0 +1 @@
* -text

View file

@ -4,7 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<iframe src="support/frame-with-csp.sub.html?csp=script-src%20%27self%27"></iframe>
<iframe src="support/frame-with-csp.sub.html?csp=script-src%20%27unsafe-inline%27"></iframe>
<div onclick="frames[0].location.href = 'javascript:parent.postMessage(\'executed\', \'*\')'" id="special_div"></div>
<script>
var t = async_test("Should have executed the javascript url");

View file

@ -26,7 +26,8 @@
// Without 'secure'
set_prefixed_cookie_via_http_test({
prefix: "__Secure-",
params: "Path=/;domain=" + CROSS_SITE_HOST,
// SameSite=None is necessary because cross-site origins cannot set SameSite cookies via fetch.
params: "Path=/;SameSite=None;domain=" + CROSS_SITE_HOST,
origin: SECURE_CROSS_SITE_ORIGIN,
shouldExistViaHTTP: false,
title: "__Secure: secure origin: Should not set 'Path=/;domain=" + CROSS_SITE_HOST + "'"
@ -35,7 +36,8 @@
// With 'secure'
set_prefixed_cookie_via_http_test({
prefix: "__Secure-",
params: "Secure;Path=/;domain=" + CROSS_SITE_HOST,
// SameSite=None is necessary because cross-site origins cannot set SameSite cookies via fetch.
params: "Secure;SameSite=None;Path=/;domain=" + CROSS_SITE_HOST,
origin: SECURE_CROSS_SITE_ORIGIN,
shouldExistViaHTTP: true,
title: "__Secure: secure origin: Should set 'Secure;Path=/;domain=" + CROSS_SITE_HOST + "'"

View file

@ -142,6 +142,7 @@ async function resetSameSiteCookies(origin, value) {
assert_dom_cookie("samesite_strict", value, false);
assert_dom_cookie("samesite_lax", value, false);
assert_dom_cookie("samesite_none", value, false);
assert_dom_cookie("samesite_unspecified", value, false);
}
w.postMessage({type: "set", value: value, useOwnOrigin: true}, "*");
@ -150,6 +151,7 @@ async function resetSameSiteCookies(origin, value) {
assert_dom_cookie("samesite_strict", value, true);
assert_dom_cookie("samesite_lax", value, true);
assert_dom_cookie("samesite_none", value, true);
assert_dom_cookie("samesite_unspecified", value, true);
}
} finally {
w.close();
@ -159,7 +161,8 @@ async function resetSameSiteCookies(origin, value) {
// Given an |expectedStatus| and |expectedValue|, assert the |cookies| contains the
// proper set of cookie names and values.
function verifySameSiteCookieState(expectedStatus, expectedValue, cookies) {
assert_equals(cookies["samesite_none"], expectedValue, "Non-SameSite cookies are always sent.");
assert_equals(cookies["samesite_none"], expectedValue, "SameSite=None cookies are always sent.");
assert_equals(cookies["samesite_unspecified"], expectedValue, "Unspecified-SameSite cookies are always sent.");
if (expectedStatus == SameSiteStatus.CROSS_SITE) {
assert_not_equals(cookies["samesite_strict"], expectedValue, "SameSite=Strict cookies are not sent with cross-site requests.");
assert_not_equals(cookies["samesite_lax"], expectedValue, "SameSite=Lax cookies are not sent with cross-site requests.");
@ -172,6 +175,32 @@ function verifySameSiteCookieState(expectedStatus, expectedValue, cookies) {
}
}
// Same as above except this expects samesite_unspecified to act the same as
// samesite_lax (which is the behavior expected when SameSiteByDefault is
// enabled).
function verifySameSiteCookieStateWithSameSiteByDefault(expectedStatus, expectedValue, cookies) {
assert_equals(cookies["samesite_none"], expectedValue, "SameSite=None cookies are always sent.");
if (expectedStatus == SameSiteStatus.CROSS_SITE) {
assert_not_equals(cookies["samesite_strict"], expectedValue, "SameSite=Strict cookies are not sent with cross-site requests.");
assert_not_equals(cookies["samesite_lax"], expectedValue, "SameSite=Lax cookies are not sent with cross-site requests.");
assert_not_equals(cookies["samesite_unspecified"], expectedValue, "Unspecified-SameSite cookies are not sent with cross-site requests.");
} else if (expectedStatus == SameSiteStatus.LAX) {
assert_not_equals(cookies["samesite_strict"], expectedValue, "SameSite=Strict cookies are not sent with lax requests.");
assert_equals(cookies["samesite_lax"], expectedValue, "SameSite=Lax cookies are sent with lax requests.");
assert_equals(cookies["samesite_unspecified"], expectedValue, "Unspecified-SameSite cookies are are sent with lax requests.")
} else if (expectedStatus == SameSiteStatus.STRICT) {
assert_equals(cookies["samesite_strict"], expectedValue, "SameSite=Strict cookies are sent with strict requests.");
assert_equals(cookies["samesite_lax"], expectedValue, "SameSite=Lax cookies are sent with strict requests.");
assert_equals(cookies["samesite_unspecified"], expectedValue, "Unspecified-SameSite cookies are are sent with strict requests.")
}
}
// Get the proper verifier based on the test's variant type.
function getSameSiteVerifier() {
return (location.search && location.search === "?samesite-by-default-cookies.tentative") ?
verifySameSiteCookieStateWithSameSiteByDefault : verifySameSiteCookieState;
}
//
// LeaveSecureCookiesAlone-specific test helpers:
//
@ -196,6 +225,22 @@ return credFetch(origin + "/cookies/resources/dropSecure.py")
})
}
// Reset SameSite=None test cookies on |origin|. If |origin| matches
// `self.origin`, assert (via `document.cookie`) that they were properly
// removed.
function resetSameSiteNoneCookies(origin, value) {
return credFetch(origin + "/cookies/resources/dropSameSiteNone.py")
.then(_ => {
if (origin == self.origin) {
assert_dom_cookie("samesite_none_insecure", value, false);
assert_dom_cookie("samesite_none_secure", value, false);
}
})
.then(_ => {
return credFetch(origin + "/cookies/resources/setSameSiteNone.py?" + value);
})
}
//
// DOM based cookie manipulation APIs
//

View file

@ -1,12 +1,13 @@
from helpers import makeDropCookie, readParameter, setNoCacheAndCORSHeaders
from helpers import makeDropCookie, setNoCacheAndCORSHeaders
def main(request, response):
"""Respond to `/cookie/same-site/resources/dropSameSite.py by dropping the
three cookies set by setSameSiteCookies.py"""
four cookies set by setSameSiteCookies.py"""
headers = setNoCacheAndCORSHeaders(request, response)
# Expire the cookies, and return a JSON-encoded success code.
headers.append(makeDropCookie("samesite_strict", False))
headers.append(makeDropCookie("samesite_lax", False))
headers.append(makeDropCookie("samesite_none", False))
headers.append(makeDropCookie("samesite_unspecified", False))
return headers, '{"success": true}'

View file

@ -0,0 +1,11 @@
from helpers import makeDropCookie, setNoCacheAndCORSHeaders
def main(request, response):
"""Respond to `/cookies/resources/dropSameSiteNone.py by dropping the
two cookies set by setSameSiteNone.py"""
headers = setNoCacheAndCORSHeaders(request, response)
# Expire the cookies, and return a JSON-encoded success code.
headers.append(makeDropCookie("samesite_none_insecure", False))
headers.append(makeDropCookie("samesite_none_secure", True))
return headers, '{"success": true}'

View file

@ -1,14 +1,29 @@
from helpers import makeCookieHeader, readParameter, setNoCacheAndCORSHeaders
from helpers import makeCookieHeader, setNoCacheAndCORSHeaders
def main(request, response):
"""Respond to `/cookie/set/samesite?{value}` by setting three cookies:
"""Respond to `/cookie/set/samesite?{value}` by setting four cookies:
1. `samesite_strict={value};SameSite=Strict;path=/`
2. `samesite_lax={value};SameSite=Lax;path=/`
3. `samesite_none={value};path=/`"""
3. `samesite_none={value};SameSite=None;path=/`
4. `samesite_unspecified={value};path=/`
Then navigate to a page that will post a message back to the opener with the set cookies"""
headers = setNoCacheAndCORSHeaders(request, response)
value = request.url_parts.query
headers.append(("Content-Type", "text/html; charset=utf-8"))
headers.append(makeCookieHeader("samesite_strict", value, {"SameSite":"Strict","path":"/"}))
headers.append(makeCookieHeader("samesite_lax", value, {"SameSite":"Lax","path":"/"}))
headers.append(makeCookieHeader("samesite_none", value, {"path":"/"}))
return headers, '{"success": true}'
headers.append(makeCookieHeader("samesite_none", value, {"SameSite":"None", "path":"/"}))
headers.append(makeCookieHeader("samesite_unspecified", value, {"path":"/"}))
document = """
<!DOCTYPE html>
<script>
// A same-site navigation, which should attach all cookies including SameSite ones.
// This is necessary because this page may have been reached via a cross-site navigation, so
// we might not have access to some SameSite cookies from here.
window.location = "../samesite/resources/echo-cookies.html";
</script>
"""
return headers, document

View file

@ -0,0 +1,14 @@
from helpers import makeCookieHeader, setNoCacheAndCORSHeaders
def main(request, response):
"""Respond to `/cookies/resources/setSameSiteNone.py?{value}` by setting two cookies:
1. `samesite_none_insecure={value};SameSite=None;path=/`
2. `samesite_none_secure={value};SameSite=None;Secure;path=/`
"""
headers = setNoCacheAndCORSHeaders(request, response)
value = request.url_parts.query
headers.append(makeCookieHeader("samesite_none_insecure", value, {"SameSite":"None", "path":"/"}))
headers.append(makeCookieHeader("samesite_none_secure", value, {"SameSite":"None", "Secure":"", "path":"/"}))
return headers, '{"success": true}'

View file

@ -0,0 +1,20 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
<script>
promise_test(t => {
var value = "" + Math.random();
return resetSameSiteNoneCookies(SECURE_ORIGIN, value)
.then(_ => {
return credFetch(SECURE_ORIGIN + "/cookies/resources/list.py")
.then(r => r.json())
.then(cookies => {
assert_not_equals(cookies["samesite_none_insecure"], value, "Non-Secure SameSite=None cookie is rejected.");
assert_equals(cookies["samesite_none_secure"], value, "Secure SameSite=None cookie is set.");
})
});
}, "SameSite=None cookies are rejected unless the Secure attribute is set.");
</script>

View file

@ -1,6 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -13,7 +15,7 @@
return credFetch(target + "/cookies/resources/list.py")
.then(r => r.json())
.then(cookies => verifySameSiteCookieState(expectedStatus, value, cookies));
.then(cookies => getSameSiteVerifier()(expectedStatus, value, cookies));
});
}, title);
}

View file

@ -1,5 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -28,7 +30,7 @@
var reloaded = false;
var msgHandler = e => {
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
} catch (e) {
reject(e);
}

View file

@ -1,6 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -31,7 +33,7 @@
window.removeEventListener("message", msgHandler);
e.source.close();
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
resolve("Popup received the cookie.");
} catch (e) {
reject(e);

View file

@ -1,5 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -18,7 +20,7 @@
var reloaded = false;
var msgHandler = e => {
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
} catch (e) {
reject(e);
}

View file

@ -1,6 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -20,7 +22,7 @@
window.removeEventListener("message", msgHandler);
e.source.close();
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
resolve("Popup received the cookie.");
} catch (e) {
reject(e);

View file

@ -1,6 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -19,7 +21,7 @@
var reloaded = false;
var msgHandler = e => {
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
} catch (e) {
reject(e);
}

View file

@ -1,6 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -22,7 +24,7 @@
document.body.removeChild(iframe);
window.removeEventListener("message", msgHandler);
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
resolve();
} catch(e) {
reject(e);

View file

@ -1,6 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -38,15 +40,21 @@
var value = "" + Math.random();
return resetSameSiteCookies(origin, value)
.then(_ => {
return Promise.all([
assert_cookie_present(target, "samesite_none", value),
expectedStatus == SameSiteStatus.STRICT ?
assert_cookie_present(target, "samesite_strict", value) :
assert_cookie_absent(target, "samesite_strict", value),
expectedStatus == SameSiteStatus.CROSS_SITE ?
assert_cookie_absent(target, "samesite_lax", value) :
assert_cookie_present(target, "samesite_lax", value)
]);
var asserts = [assert_cookie_present(target, "samesite_none", value),
expectedStatus == SameSiteStatus.STRICT ?
assert_cookie_present(target, "samesite_strict", value) :
assert_cookie_absent(target, "samesite_strict", value),
expectedStatus == SameSiteStatus.CROSS_SITE ?
assert_cookie_absent(target, "samesite_lax", value) :
assert_cookie_present(target, "samesite_lax", value)];
if (location.search && location.search === "?samesite-by-default-cookies.tentative") {
asserts.push(expectedStatus == SameSiteStatus.CROSS_SITE ?
assert_cookie_absent(target, "samesite_unspecified", value) :
assert_cookie_present(target, "samesite_unspecified", value));
} else {
asserts.push(assert_cookie_present(target, "samesite_unspecified", value));
}
return Promise.all(asserts);
});
}, title);
}

View file

@ -0,0 +1,5 @@
<!DOCTYPE html>
<meta charset="utf-8">
<script>
window.opener.postMessage({ type: 'COOKIES_SET', cookies: document.cookie }, '*');
</script>

View file

@ -0,0 +1,27 @@
<!DOCTYPE html>
<meta charset="utf-8">
<script src="/cookies/resources/cookie-helper.sub.js"></script>
<script>
window.addEventListener('load', function() {
window.opener.postMessage({ type: 'READY' }, '*');
});
window.addEventListener('message', function(e) {
if (ORIGIN !== window.location.origin)
return;
if (window.location.origin !== e.origin)
return;
if (e.data.type === "navigate") {
window.location = e.data.url;
}
if (e.data.type === "post-form") {
var f = document.createElement('form');
f.action = e.data.url;
f.method = "POST";
document.body.appendChild(f);
f.submit();
}
});
</script>

View file

@ -1,5 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -13,6 +15,7 @@
assert_dom_cookie("samesite_strict", e.data.value, true);
assert_dom_cookie("samesite_lax", e.data.value, true);
assert_dom_cookie("samesite_none", e.data.value, true);
assert_dom_cookie("samesite_unspecified", e.data.value, true);
w.close();
}, "Same-site window should be able to set `SameSite=Lax` or `SameSite=Strict` cookies.");
@ -25,6 +28,8 @@
assert_dom_cookie("samesite_strict", e.data.value, false);
assert_dom_cookie("samesite_lax", e.data.value, false);
assert_dom_cookie("samesite_none", e.data.value, true);
assert_dom_cookie("samesite_unspecified", e.data.value,
location.search !== "?samesite-by-default-cookies.tentative");
w.close();
}, "Cross-site window shouldn't be able to set `SameSite=Lax` or `SameSite=Strict` cookies.");
</script>

View file

@ -0,0 +1,44 @@
<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
<script>
function assert_samesite_cookies_present(cookies, value) {
let samesite_cookie_names = ["samesite_strict", "samesite_lax", "samesite_none", "samesite_unspecified"];
for (name of samesite_cookie_names) {
let re = new RegExp("(?:^|; )" + name + "=" + value + "(?:$|;)");
assert_true(re.test(cookies), "`" + name + "=" + value + "` in cookies");
}
}
// Navigate from ORIGIN to |origin_to|, expecting the navigation to set SameSite
// cookies on |origin_to|.
function navigate_test(method, origin_to, title) {
promise_test(async function(t) {
// The cookies don't need to be cleared on each run because |value| is
// a new random value on each run, so on each run we are overwriting and
// checking for a cookie with a different random value.
let value = "" + Math.random();
let url_from = ORIGIN + "/cookies/samesite/resources/navigate.html";
let url_to = origin_to + "/cookies/resources/setSameSite.py?" + value;
var w = window.open(url_from);
await wait_for_message('READY', ORIGIN);
assert_equals(ORIGIN, window.origin);
assert_equals(ORIGIN, w.origin);
let command = (method === "POST") ? "post-form" : "navigate";
w.postMessage({ type: command, url: url_to }, "*");
let message = await wait_for_message('COOKIES_SET', origin_to);
assert_samesite_cookies_present(message.data.cookies, value);
w.close();
}, title);
}
navigate_test("GET", ORIGIN, "Same-site top-level navigation should be able to set SameSite=* cookies.");
navigate_test("GET", CROSS_SITE_ORIGIN, "Cross-site top-level navigation should be able to set SameSite=* cookies.");
navigate_test("POST", ORIGIN, "Same-site top-level POST should be able to set SameSite=* cookies.");
navigate_test("POST", CROSS_SITE_ORIGIN, "Cross-site top-level POST should be able to set SameSite=* cookies.");
</script>

View file

@ -1,5 +1,7 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -15,7 +17,7 @@
var reloaded = false;
var msgHandler = e => {
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
} catch (e) {
reject(e);
}

View file

@ -1,5 +1,8 @@
<!DOCTYPE html>
<meta charset="utf-8"/>
<meta name="timeout" content="long">
<meta name="variant" content="">
<meta name="variant" content="?samesite-by-default-cookies.tentative">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/cookies/resources/cookie-helper.sub.js"></script>
@ -16,7 +19,7 @@
window.removeEventListener("message", msgHandler);
w.close();
try {
verifySameSiteCookieState(expectedStatus, value, e.data);
getSameSiteVerifier()(expectedStatus, value, e.data);
resolve("Popup received the cookie.");
} catch (e) {
reject(e);

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<link rel="help" href="https://www.w3.org/TR/CSS22/visuren.html#bfc-next-to-float" title="9.5 Floats">
<meta name="assert" content="Although the 'clear' property isn't specified in this test, a new formatting context that doesn't fit below a float that would otherwise be adjoining will need to separate its margin from the float, so that it doesn't affect the float. This is very similar to clearance.">
<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div style="display: flow-root; width: 100px; background: red; position: relative;">
<div>
<div style="float: right; width: 50px; height: 30px; background: green;"></div>
<div>
<div style="overflow: hidden; width: 100px; height: 70px; margin-top: 100px; background: green;"></div>
</div>
<div style="position: absolute; width: 50px; height: 30px; top: 0; left: 0; background: green;"></div>
</div>
</div>

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<title>Inheritance of CSS Color Adjust properties</title>
<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#property-index">
<meta name="assert" content="Properties inherit according to the spec.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/inheritance-testcommon.js"></script>
<div id="container">
<div id="target"></div>
</div>
<script>
assert_inherited('color-scheme', 'auto', 'light dark');
</script>

View file

@ -0,0 +1,24 @@
<!DOCTYPE html>
<title>CSS Color Adjust: getComputedStyle for color-scheme</title>
<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-prop">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
<div id="target"></div>
<script>
test_computed_value("color-scheme", "", "auto");
test_computed_value("color-scheme", "auto");
test_computed_value("color-scheme", "light dark");
test_computed_value("color-scheme", "dark light");
test_computed_value("color-scheme", "light unknown");
test_computed_value("color-scheme", "only light");
test_computed_value("color-scheme", "light light");
test_computed_value("color-scheme", "light only");
// reserved and css-wide keywords.
test_computed_value("color-scheme", "initial", "auto");
test_computed_value("color-scheme", "inherit", "auto");
test_computed_value("color-scheme", "unset", "auto");
test_computed_value("color-scheme", "revert", "auto");
test_computed_value("color-scheme", "default", "auto");
test_computed_value("color-scheme", "none", "auto");
</script>

View file

@ -0,0 +1,25 @@
<!DOCTYPE html>
<title>CSS Color Adjust: parsing color-scheme with invalid values</title>
<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-prop">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
<script>
test_invalid_value("color-scheme", "none");
test_invalid_value("color-scheme", "only");
test_invalid_value("color-scheme", "only only");
test_invalid_value("color-scheme", "only auto");
test_invalid_value("color-scheme", "only light dark");
test_invalid_value("color-scheme", "only light light");
test_invalid_value("color-scheme", "only light purple");
test_invalid_value("color-scheme", "auto dark");
test_invalid_value("color-scheme", "auto purple");
test_invalid_value("color-scheme", "light auto");
test_invalid_value("color-scheme", "light none");
test_invalid_value("color-scheme", "light, dark");
test_invalid_value("color-scheme", "light inherit");
test_invalid_value("color-scheme", "light initial");
test_invalid_value("color-scheme", "light unset");
test_invalid_value("color-scheme", "light revert");
test_invalid_value("color-scheme", "light default");
</script>

View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<title>CSS Color Adjust: parsing color-scheme with valid values</title>
<link rel="help" href="https://drafts.csswg.org/css-color-adjust/#color-scheme-prop">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
<script>
test_valid_value("color-scheme", "auto");
test_valid_value("color-scheme", "light");
test_valid_value("color-scheme", "dark");
test_valid_value("color-scheme", "light dark");
test_valid_value("color-scheme", "dark light");
test_valid_value("color-scheme", "only light");
test_valid_value("color-scheme", "light only");
test_valid_value("color-scheme", "light light");
test_valid_value("color-scheme", "dark dark");
test_valid_value("color-scheme", "light purple");
test_valid_value("color-scheme", "purple dark interesting");
test_valid_value("color-scheme", "inherit");
test_valid_value("color-scheme", "initial");
test_valid_value("color-scheme", "unset");
test_valid_value("color-scheme", "revert");
</script>

View file

@ -0,0 +1,42 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<title>CSS Containment Test: 'contain: paint' applies to 'table' elements</title>
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
<link rel="help" href="https://www.w3.org/TR/css-contain-1/#containment-paint">
<link rel="match" href="reference/contain-paint-047-ref.html">
<meta content="This test checks that paint containment applies to table elements. Therefore the content of the table element should be clipped to the padding edge of its principal box." name="assert">
<meta name="flags" content="">
<style>
div#table
{
display: table;
font-family: monospace;
font-size: 100px;
table-layout: fixed;
width: 4ch;
contain: paint;
}
div.cell
{
display: table-cell;
color: green;
}
span
{
background-color: red;
color: yellow;
}
</style>
<p>Test passes if there is <strong>no red</strong>.
<div id="table">
<div class="cell">PASS<span>FAIL</span></div>
</div>

View file

@ -0,0 +1,50 @@
<!DOCTYPE html>
<meta charset="UTF-8">
<title>CSS Containment Test: 'contain: paint' applies to 'table' elements</title>
<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
<link rel="help" href="https://www.w3.org/TR/css-contain-1/#containment-paint">
<link rel="match" href="reference/contain-paint-047-ref.html">
<meta content="This test checks that paint containment applies to table elements. Therefore the content of the table element (including its caption) should be clipped to the padding edge of its principal box." name="assert">
<meta name="flags" content="">
<style>
div#table
{
display: table;
font-family: monospace;
font-size: 100px;
table-layout: fixed;
width: 4ch;
contain: paint;
}
div.caption
{
display: table-caption;
color: green;
/* We have to limit the width of the caption here, or else the caption's
intrinsic width (including the "FAIL" span) would "prop up" the width
of the table to be a size that'd be larger than its specified width.
Really, we want the table to be *only* 4 characters wide (as wide as
the text "PASS"), with "FAIL" overflowing and getting clipped by
"contain:paint" on the table wrapper box. */
width: 4ch;
}
span
{
background-color: red;
color: yellow;
}
</style>
<p>Test passes if there is <strong>no red</strong>.
<div id="table">
<div class="caption">
PASS<span>FAIL</span>
</div>
</div>

View file

@ -0,0 +1,45 @@
<!doctype html>
<html lang=en>
<meta charset=utf-8>
<title>CSS-contain test: layout/paint containment on subgrid</title>
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
<meta name=assert content="layout/paint containment inhibits subgrid">
<link rel="match" href="reference/contain-subgrid-001.html">
<link rel=help href="https://drafts.csswg.org/css-contain/#containment-layout">
<link rel=help href="https://drafts.csswg.org/css-contain/#containment-paint">
<link rel=help href="https://drafts.csswg.org/css-grid-2/">
<style>
.grid {
display: grid;
width: 40px;
height: 40px;
grid: [a] repeat(2,15px) [b] / [a] repeat(2,15px) [b];
gap: 10px;
}
.subgrid {
display: grid;
grid: subgrid;
background: lightgrey;
grid-area:1/1/3/3;
}
.layout { contain: layout; }
.paint { contain: paint; }
.inner {
background: blue;
grid-area:a/a/b/b;
}
.p {
place-self: start;
width:100%;
height:100%;
}
</style>
<div class="grid"><div class="subgrid layout"><div class="inner"></div></div></div>
<div class="grid"><div class="subgrid paint"><div class="inner"></div></div></div>
<div class="grid"><div class="subgrid layout"><div class="inner p"></div></div></div>
<div class="grid"><div class="subgrid paint"><div class="inner p"></div></div></div>

View file

@ -0,0 +1,35 @@
<!doctype html>
<html lang=en>
<meta charset=utf-8>
<title>CSS-contain reference: layout/paint containment on subgrid</title>
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
<style>
.grid {
display: grid;
width: 40px;
height: 40px;
grid: [a] repeat(2,15px) [b] / [a] repeat(2,15px) [b];
gap: 10px;
}
.subgrid {
display: grid;
grid: none;
background: lightgrey;
grid-area:1/1/3/3;
}
.layout { contain: layout; }
.paint { contain: paint; }
.inner {
background: blue;
grid-area:a/a/b/b;
}
</style>
<div class="grid"><div class="subgrid layout"><div class="inner"></div></div></div>
<div class="grid"><div class="subgrid paint"><div class="inner"></div></div></div>
<div class="grid"><div class="subgrid layout"><div class="inner"></div></div></div>
<div class="grid"><div class="subgrid paint"><div class="inner"></div></div></div>

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Scroll Snap: getComputedValue().scrollPaddingBlock</title>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-block">
<meta name="assert" content="scroll-padding-block computed value is per side, either the keyword auto or a computed <length-percentage> value.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
</head>
<body>
<div id="target"></div>
<style>
#target {
font-size: 40px;
}
</style>
<script>
test_computed_value("scroll-padding-block-start", "auto");
test_computed_value("scroll-padding-block-start", "10px");
test_computed_value("scroll-padding-block-start", "20%");
test_computed_value("scroll-padding-block-start", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-block-start", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-block-start", "calc(50% + 60px)");
test_computed_value("scroll-padding-block-end", "auto");
test_computed_value("scroll-padding-block-end", "10px");
test_computed_value("scroll-padding-block-end", "20%");
test_computed_value("scroll-padding-block-end", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-block-end", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-block-end", "calc(50% + 60px)");
test_computed_value("scroll-padding-block", "auto");
test_computed_value("scroll-padding-block", "10px");
test_computed_value("scroll-padding-block", "20%");
test_computed_value("scroll-padding-block", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-block", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-block", "calc(50% + 60px)");
test_computed_value("scroll-padding-block", "1px 2px");
test_computed_value("scroll-padding-block", "1px auto");
test_computed_value("scroll-padding-block", "auto auto", "auto");
</script>
</body>
</html>

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Scroll Snap Test: scroll-padding-block with invalid values</title>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-block">
<meta name="assert" content="scroll-padding-block supports only the grammar '[ auto | <length-percentage> ]{1,2}'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_invalid_value("scroll-padding-block-start", "none");
test_invalid_value("scroll-padding-block-start", "-10px");
test_invalid_value("scroll-padding-block-start", "10px 20%");
test_invalid_value("scroll-padding-block-end", "none");
test_invalid_value("scroll-padding-block-end", "-10px");
test_invalid_value("scroll-padding-block-end", "10px 20%");
test_invalid_value("scroll-padding-block", "none");
test_invalid_value("scroll-padding-block", "-10px");
test_invalid_value("scroll-padding-block", "10px 20px 30px 40px 50px");
</script>
</body>
</html>

View file

@ -0,0 +1,71 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Scroll Snap: getComputedValue().scrollPadding</title>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding">
<meta name="assert" content="scroll-padding computed value is per side, either the keyword auto or a computed <length-percentage> value.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
</head>
<body>
<div id="target"></div>
<style>
#target {
font-size: 40px;
}
</style>
<script>
test_computed_value("scroll-padding-top", "auto");
test_computed_value("scroll-padding-top", "0", "0px");
test_computed_value("scroll-padding-top", "10px");
test_computed_value("scroll-padding-top", "20%");
test_computed_value("scroll-padding-top", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-top", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-top", "calc(50% + 60px)");
test_computed_value("scroll-padding-right", "auto");
test_computed_value("scroll-padding-right", "0", "0px");
test_computed_value("scroll-padding-right", "10px");
test_computed_value("scroll-padding-right", "20%");
test_computed_value("scroll-padding-right", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-right", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-right", "calc(50% + 60px)");
test_computed_value("scroll-padding-bottom", "auto");
test_computed_value("scroll-padding-bottom", "0", "0px");
test_computed_value("scroll-padding-bottom", "10px");
test_computed_value("scroll-padding-bottom", "20%");
test_computed_value("scroll-padding-bottom", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-bottom", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-bottom", "calc(50% + 60px)");
test_computed_value("scroll-padding-left", "auto");
test_computed_value("scroll-padding-left", "0", "0px");
test_computed_value("scroll-padding-left", "10px");
test_computed_value("scroll-padding-left", "20%");
test_computed_value("scroll-padding-left", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-left", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-left", "calc(50% + 60px)");
test_computed_value("scroll-padding", "auto");
test_computed_value("scroll-padding", "10px");
test_computed_value("scroll-padding", "0", "0px");
test_computed_value("scroll-padding", "20%");
test_computed_value("scroll-padding", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding", "1px 2px");
test_computed_value("scroll-padding", "1px 2px 3%");
test_computed_value("scroll-padding", "1px 2px 3% 4px");
test_computed_value("scroll-padding", "1px auto");
test_computed_value("scroll-padding", "0 0 0 0", "0px");
test_computed_value("scroll-padding", "auto auto auto auto", "auto");
</script>
</body>
</html>

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Scroll Snap: getComputedValue().scrollPaddingInline</title>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-inline">
<meta name="assert" content="scroll-padding-inline computed value is per side, either the keyword auto or a computed <length-percentage> value.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/computed-testcommon.js"></script>
</head>
<body>
<div id="target"></div>
<style>
#target {
font-size: 40px;
}
</style>
<script>
test_computed_value("scroll-padding-inline-start", "auto");
test_computed_value("scroll-padding-inline-start", "10px");
test_computed_value("scroll-padding-inline-start", "20%");
test_computed_value("scroll-padding-inline-start", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-inline-start", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-inline-start", "calc(50% + 60px)");
test_computed_value("scroll-padding-inline-end", "auto");
test_computed_value("scroll-padding-inline-end", "10px");
test_computed_value("scroll-padding-inline-end", "20%");
test_computed_value("scroll-padding-inline-end", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-inline-end", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-inline-end", "calc(50% + 60px)");
test_computed_value("scroll-padding-inline", "auto");
test_computed_value("scroll-padding-inline", "10px");
test_computed_value("scroll-padding-inline", "20%");
test_computed_value("scroll-padding-inline", "calc(10px + 0.5em)", "30px");
test_computed_value("scroll-padding-inline", "calc(10px - 0.5em)", "0px");
test_computed_value("scroll-padding-inline", "calc(50% + 60px)");
test_computed_value("scroll-padding-inline", "1px 2px");
test_computed_value("scroll-padding-inline", "1px auto");
test_computed_value("scroll-padding-inline", "auto auto", "auto");
</script>
</body>
</html>

View file

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS Scroll Snap Test: scroll-padding-inline with invalid values</title>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#propdef-scroll-padding-inline">
<meta name="assert" content="scroll-padding-inline supports only the grammar '[ auto | <length-percentage> ]{1,2}'.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/support/parsing-testcommon.js"></script>
</head>
<body>
<script>
test_invalid_value("scroll-padding-inline-start", "none");
test_invalid_value("scroll-padding-inline-start", "-10px");
test_invalid_value("scroll-padding-inline-start", "10px 20%");
test_invalid_value("scroll-padding-inline-end", "none");
test_invalid_value("scroll-padding-inline-end", "-10px");
test_invalid_value("scroll-padding-inline-end", "10px 20%");
test_invalid_value("scroll-padding-inline", "none");
test_invalid_value("scroll-padding-inline", "-10px");
test_invalid_value("scroll-padding-inline", "10px 20px 30px 40px 50px");
</script>
</body>
</html>

View file

@ -13,22 +13,32 @@
<script>
test_invalid_value("scroll-padding-top", "20");
test_invalid_value("scroll-padding-top", "-20px");
test_invalid_value("scroll-padding-top", "none");
test_invalid_value("scroll-padding-top", "10px 20%");
test_invalid_value("scroll-padding-right", "20");
test_invalid_value("scroll-padding-right", "-20px");
test_invalid_value("scroll-padding-right", "none");
test_invalid_value("scroll-padding-right", "10px 20%");
test_invalid_value("scroll-padding-bottom", "20");
test_invalid_value("scroll-padding-bottom", "-20px");
test_invalid_value("scroll-padding-bottom", "none");
test_invalid_value("scroll-padding-bottom", "10px 20%");
test_invalid_value("scroll-padding-left", "20");
test_invalid_value("scroll-padding-left", "-20px");
test_invalid_value("scroll-padding-left", "none");
test_invalid_value("scroll-padding-left", "10px 20%");
test_invalid_value("scroll-padding", "20");
test_invalid_value("scroll-padding", "-20px");
test_invalid_value("scroll-padding", "none");
test_invalid_value("scroll-padding", "10px 20px 30px 40px 50px");
</script>
</body>
</html>

View file

@ -0,0 +1,78 @@
<!DOCTYPE html>
<meta charset=utf-8>
<title>CSS Text — out-of-flow element adjacent to a potential line-break</title>
<meta name=assert content="An abs-pos out-of-flow must not introduce a soft line break
between the border and content of the enclosing inline">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
<link rel=match href="reference/line-breaking-018-ref.html">
<link rel=author title="Jonathan Kew" href="jkew@mozilla.com">
<style>
.outer { float: left; padding: 0 1em; margin: 1em; border: 1px solid silver; }
.outer div { font-family: monospace; line-height: 2; margin: 1em 0; border: 1px dotted silver; }
.test20 div { width: 20ch; }
.test27 div { width: 27ch; }
.test30 div { width: 30ch; }
b { color: blue; border-left: 2px solid red; border-right: 2px solid green; }
.test::before,
.test::after,
.before,
.after { position: absolute; }
.test::before { content: ""; }
.test::after { content: ""; }
</style>
<div>Test passes if all the examples in each group render the same:</div>
<div class="outer test30">
<!-- Using ::before and ::after to insert abs-pos elements with empty content: -->
<div>
Preceding text <b class=test>target element</b> following text.
</div>
<!-- With explicit spans just inside the target element: -->
<div>
Preceding text <b><span class=before></span>target element<span class=after></span></b> following text.
</div>
<!-- With explicit spans just outside the target element: -->
<div>
Preceding text <span class=before></span><b>target element</b><span class=after></span> following text.
</div>
<!-- With explicit line breaks: -->
<div>
Preceding text <b>target element</b><br>following text.
</div>
</div>
<div class="outer test27">
<div>
Preceding text <b class=test>target element</b> following text.
</div>
<div>
Preceding text <b><span class=before></span>target element<span class=after></span></b> following text.
</div>
<div>
Preceding text <span class=before></span><b>target element</b><span class=after></span> following text.
</div>
<div>
Preceding text <b>target<br>element</b> following text.
</div>
</div>
<div class="outer test20">
<div>
Preceding text <b class=test>target element</b> following text.
</div>
<div>
Preceding text <b><span class=before></span>target element<span class=after></span></b> following text.
</div>
<div>
Preceding text <span class=before></span><b>target element</b><span class=after></span> following text.
</div>
<div>
Preceding text<br><b>target element</b><br>following text.
</div>
</div>

View file

@ -0,0 +1,88 @@
<!DOCTYPE html>
<meta charset=utf-8>
<title>CSS Text — out-of-flow element adjacent to a potential line-break</title>
<meta name=assert content="The anchor of an out-of-flow should not migrate across a soft line break">
<!-- NOTE: I'm not sure the spec explicitly addresses this exact point, but it seems like a clear
bug in Firefox, hence this test (which passes as expected in Chrome and Safari). -->
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
<link rel=match href="reference/line-breaking-019-ref.html">
<link rel=author title="Jonathan Kew" href="jkew@mozilla.com">
<style>
.outer { float: left; padding: 0 1em; margin: 1em; border: 1px solid silver; }
.outer div { font-family: monospace; line-height: 2; margin: 1em 0; border: 1px dotted silver; }
.test20 div { width: 20ch; }
.test27 div { width: 27ch; }
.test30 div { width: 30ch; }
b { color: blue; border-left: 2px solid red; border-right: 2px solid green; }
/* adjust for the width of the target element's border */
div > .before { margin-left: 2px; }
div > .after { margin-left: -2px; }
.test::before,
.test::after,
.before,
.after { position: absolute; font-size: 0.5em; }
.test::before { content: "before"; }
.test::after { content: "after"; }
.before,
.test::before { color: red; font-weight: normal; }
.after,
.test::after { color: green; font-weight: normal; }
</style>
<div>Test passes if all the examples in each group render the same:</div>
<div class="outer test30">
<!-- Using ::before and ::after to insert abs-pos elements with non-empty content: -->
<div>
Preceding text <b class=test>target element</b> following text.
</div>
<!-- With explicit spans just inside the target element: -->
<div>
Preceding text <b><span class=before>before</span>target element<span class=after>after</span></b> following text.
</div>
<!-- With explicit spans just outside the target element: -->
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span> following text.
</div>
<!-- With explicit line breaks: -->
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
</div>
<div class="outer test27">
<div>
Preceding text <b class=test>target element</b> following text.
</div>
<div>
Preceding text <b><span class=before>before</span>target element<span class=after>after</span></b> following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span> following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target<br>element</b><span class=after>after</span> following text.
</div>
</div>
<div class="outer test20">
<div>
Preceding text <b class=test>target element</b> following text.
</div>
<div>
Preceding text <b><span class=before>before</span>target element<span class=after>after</span></b> following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span> following text.
</div>
<div>
Preceding text<br><span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
</div>

View file

@ -0,0 +1,62 @@
<!DOCTYPE html>
<meta charset=utf-8>
<title>CSS Text — reference</title>
<link rel=author title="Jonathan Kew" href="jkew@mozilla.com">
<style>
.outer { float: left; padding: 0 1em; margin: 1em; border: 1px solid silver; }
.outer div { font-family: monospace; line-height: 2; margin: 1em 0; border: 1px dotted silver; }
.test20 div { width: 20ch; }
.test27 div { width: 27ch; }
.test30 div { width: 30ch; }
b { color: blue; border-left: 2px solid red; border-right: 2px solid green; }
</style>
<div>Test passes if all the examples in each group render the same:</div>
<div class="outer test30">
<div>
Preceding text <b>target element</b><br>following text.
</div>
<div>
Preceding text <b>target element</b><br>following text.
</div>
<div>
Preceding text <b>target element</b><br>following text.
</div>
<div>
Preceding text <b>target element</b><br>following text.
</div>
</div>
<div class="outer test27">
<div>
Preceding text <b>target<br>element</b> following text.
</div>
<div>
Preceding text <b>target<br>element</b> following text.
</div>
<div>
Preceding text <b>target<br>element</b> following text.
</div>
<div>
Preceding text <b>target<br>element</b> following text.
</div>
</div>
<div class="outer test20">
<div>
Preceding text<br><b>target element</b><br>following text.
</div>
<div>
Preceding text<br><b>target element</b><br>following text.
</div>
<div>
Preceding text<br><b>target element</b><br>following text.
</div>
<div>
Preceding text<br><b>target element</b><br>following text.
</div>
</div>

View file

@ -0,0 +1,72 @@
<!DOCTYPE html>
<meta charset=utf-8>
<title>CSS Text — reference</title>
<link rel=author title="Jonathan Kew" href="jkew@mozilla.com">
<style>
.outer { float: left; padding: 0 1em; margin: 1em; border: 1px solid silver; }
.outer div { font-family: monospace; line-height: 2; margin: 1em 0; border: 1px dotted silver; }
.test20 div { width: 20ch; }
.test27 div { width: 27ch; }
.test30 div { width: 30ch; }
b { color: blue; border-left: 2px solid red; border-right: 2px solid green; }
/* adjust for the width of the target element's border */
div > .before { margin-left: 2px; }
div > .after { margin-left: -2px; }
.before,
.after { position: absolute; font-size: 0.5em; }
.before { color: red; font-weight: normal; }
.after { color: green; font-weight: normal; }
</style>
<div>Test passes if all the examples in each group render the same:</div>
<div class="outer test30">
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
</div>
<div class="outer test27">
<div>
Preceding text <span class=before>before</span><b>target<br>element</b><span class=after>after</span> following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target<br>element</b><span class=after>after</span> following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target<br>element</b><span class=after>after</span> following text.
</div>
<div>
Preceding text <span class=before>before</span><b>target<br>element</b><span class=after>after</span> following text.
</div>
</div>
<div class="outer test20">
<div>
Preceding text<br><span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
<div>
Preceding text<br><span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
<div>
Preceding text<br><span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
<div>
Preceding text<br><span class=before>before</span><b>target element</b><span class=after>after</span><br>following text.
</div>
</div>

View file

@ -3,6 +3,6 @@
<p>
Should read "Pass" below
</p>
<p>
<p style="font-kerning: none">
Pass
</p>

View file

@ -9,6 +9,6 @@
<p>
Should read "Pass" below
</p>
<p style="text-transform: capitalize">
<p style="text-transform: capitalize; font-kerning: none">
p<span style="position: absolute"></span>ass
</p>

View file

@ -0,0 +1,3 @@
<!DOCTYPE html>
<title>CSS Transitions Test: Reference</title>
<div style="color:green">This text should be green on load.</div>

View file

@ -0,0 +1,6 @@
<!DOCTYPE html>
<title>CSS Transitions Test: No color transition from initial to blocking stylesheet value</title>
<link rel="help" href="https://drafts.csswg.org/css-transitions/#style-change-event">
<link rel="match" href="no-transition-from-ua-to-blocking-stylesheet-ref.html">
<link rel="stylesheet" href="support/a-green-transition.css">
<div class="a">This text should be green on load.</div>

View file

@ -0,0 +1 @@
.a { color: green; transition: 10s; transition-timing-function: step-end; }

View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>backdrop-filter: Basic operation of filter</title>
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
<p>Expected: A green box</p>
<div id="colorbox"></div>
<style>
div {
position: absolute;
width: 100px;
height: 100px;
left: 10px;
top: 50px;
background: green;
}
</style>

View file

@ -0,0 +1,34 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>backdrop-filter: A rounded-corner clip rect parent should not form a Backdrop Root</title>
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
<link rel="match" href="backdrop-filter-clipped-ref.html">
<p>Expected: A green box</p>
<div class="colorbox"></div>
<div class="clipper">
<div class="filterbox"></div>
</div>
<style>
div {
position: absolute;
width: 100px;
height: 100px;
left: 10px;
top: 50px;
}
.colorbox {
background: #ff7fff;
}
.clipper {
overflow: hidden;
border-radius: 0.001px;
}
.filterbox {
top:0;
left:0;
backdrop-filter: invert(1);
}
</style>

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>backdrop-filter: Update filter value</title>
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
<p>Expected: A green box</p>
<div id="colorbox"></div>
<style>
div {
position: absolute;
width: 100px;
height: 100px;
left: 10px;
top: 50px;
background: green;
}
</style>

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html class="reftest-wait">
<meta charset="utf-8">
<title>backdrop-filter: Update filter value</title>
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
<link rel="match" href="backdrop-filter-update-ref.html">
<p>Expected: A green box</p>
<div id="colorbox"></div>
<div id="filterbox"></div>
<style>
div {
position: absolute;
width: 100px;
height: 100px;
left: 10px;
top: 50px;
}
#colorbox {
background: #ff7fff;
}
#filterbox {
backdrop-filter: invert(0);
}
</style>
<script>
window.onload = function(e) {
requestAnimationFrame(() => {
requestAnimationFrame(() => {
let filt = document.getElementById("filterbox");
filt.style.backdropFilter = "invert(1)";
document.documentElement.classList.remove('reftest-wait');
});
});
}
</script>

View file

@ -0,0 +1,62 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#targetDiv {
width: 200px;
height: 200px;
overflow: scroll;
}
#innerDiv {
width: 400px;
height: 400px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="targetDiv">
<div id="innerDiv">
</div>
</div>
</body>
<script>
var target_div = document.getElementById('targetDiv');
var overscrolled_x_delta = 0;
var overscrolled_y_delta = 0;
function onOverscroll(event) {
assert_false(event.cancelable);
// overscroll events are bubbled when the target node is document.
assert_true(event.bubbles);
overscrolled_x_delta = event.deltaX;
overscrolled_y_delta = event.deltaY;
}
document.addEventListener("overscroll", onOverscroll);
function runTest() {
promise_test (async (t) => {
// Make sure that no overscroll event is sent to target_div.
target_div.addEventListener("overscroll",
t.unreached_func("target_div got unexpected overscroll event."));
await waitForCompositorCommit();
// Scroll up on target div and wait for the doc to get overscroll event.
await touchScrollInTarget(300, target_div, 'up');
await waitFor(() => { return overscrolled_y_delta < 0; },
'Document did not receive overscroll event after scroll up on target.');
assert_equals(target_div.scrollTop, 0);
// Scroll left on target div and wait for the doc to get overscroll event.
await touchScrollInTarget(300, target_div, 'left');
await waitFor(() => { return overscrolled_x_delta < 0; },
'Document did not receive overscroll event after scroll left on target.');
assert_equals(target_div.scrollLeft, 0);
}, 'Tests that the document gets overscroll event when no element scrolls ' +
'after touch scrolling.');
}
</script>

View file

@ -0,0 +1,92 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#overscrollXDiv {
width: 600px;
height: 600px;
overflow: scroll;
overscroll-behavior-x: contain;
}
#overscrollYDiv {
width: 500px;
height: 500px;
overflow: scroll;
overscroll-behavior-y: none;
}
#targetDiv {
width: 400px;
height: 400px;
overflow: scroll;
}
.content {
width:800px;
height:800px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="overscrollXDiv">
<div class=content>
<div id="overscrollYDiv">
<div class=content>
<div id="targetDiv">
<div class="content">
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
var target_div = document.getElementById('targetDiv');
var overscrolled_x_delta = 0;
var overscrolled_y_delta = 0;
function onOverscrollX(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
overscrolled_x_delta = event.deltaX;
}
function onOverscrollY(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
overscrolled_y_delta = event.deltaY;
}
// Test that both "onoverscroll" and addEventListener("overscroll"... work.
document.getElementById('overscrollXDiv').onoverscroll = onOverscrollX;
document.getElementById('overscrollYDiv').
addEventListener("overscroll", onOverscrollY);
function runTest() {
promise_test (async (t) => {
// Make sure that no overscroll event is sent to document or target_div.
document.addEventListener("overscroll",
t.unreached_func("Document got unexpected overscroll event."));
target_div.addEventListener("overscroll",
t.unreached_func("target_div got unexpected overscroll event."));
await waitForCompositorCommit();
// Scroll up on target div and wait for the element with overscroll-y to get
// overscroll event.
await touchScrollInTarget(300, target_div, 'up');
await waitFor(() => { return overscrolled_y_delta < 0; },
'Expected element did not receive overscroll event after scroll up on ' +
'target.');
assert_equals(target_div.scrollTop, 0);
// Scroll left on target div and wait for the element with overscroll-x to
// get overscroll event.
await touchScrollInTarget(300, target_div, 'left');
await waitFor(() => { return overscrolled_x_delta < 0; },
'Expected element did not receive overscroll event after scroll left ' +
'on target.');
assert_equals(target_div.scrollLeft, 0);
}, 'Tests that the last element in the cut scroll chain gets overscroll ' +
'event when no element scrolls by touch.');
}
</script>

View file

@ -0,0 +1,65 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#scrollableDiv {
width: 200px;
height: 200px;
overflow: scroll;
}
#innerDiv {
width: 400px;
height: 400px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="scrollableDiv">
<div id="innerDiv">
</div>
</div>
</body>
<script>
var scrolling_div = document.getElementById('scrollableDiv');
var overscrolled_x_delta = 0;
var overscrolled_y_delta = 0;
function onOverscroll(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
overscrolled_x_delta = event.deltaX;
overscrolled_y_delta = event.deltaY;
}
scrolling_div.addEventListener("overscroll", onOverscroll);
function runTest() {
promise_test (async (t) => {
// Make sure that no overscroll event is sent to document.
document.addEventListener("overscroll",
t.unreached_func("Document got unexpected overscroll event."));
await waitForCompositorCommit();
// Do a horizontal scroll and wait for overscroll event.
await touchScrollInTarget(300, scrolling_div , 'right');
await waitFor(() => { return overscrolled_x_delta > 0; },
'Scroller did not receive overscroll event after horizontal scroll.');
assert_equals(scrolling_div.scrollWidth - scrolling_div.scrollLeft,
scrolling_div.clientWidth);
overscrolled_x_delta = 0;
overscrolled_y_delta = 0;
// Do a vertical scroll and wait for overscroll event.
await touchScrollInTarget(300, scrolling_div, 'down');
await waitFor(() => { return overscrolled_y_delta > 0; },
'Scroller did not receive overscroll event after vertical scroll.');
assert_equals(scrolling_div.scrollHeight - scrolling_div.scrollTop,
scrolling_div.clientHeight);
}, 'Tests that the scrolled element gets overscroll event after fully scrolling by touch.');
}
</script>

View file

@ -0,0 +1,52 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#targetDiv {
width: 200px;
height: 200px;
overflow: scroll;
}
#innerDiv {
width: 400px;
height: 400px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="targetDiv">
<div id="innerDiv">
</div>
</div>
</body>
<script>
var target_div = document.getElementById('targetDiv');
var window_received_overscroll = false;
function onOverscroll(event) {
assert_false(event.cancelable);
// overscroll events targetting document are bubbled to the window.
assert_true(event.bubbles);
window_received_overscroll = true;
}
window.addEventListener("overscroll", onOverscroll);
function runTest() {
promise_test (async (t) => {
// Make sure that no overscroll event is sent to target_div.
target_div.addEventListener("overscroll",
t.unreached_func("target_div got unexpected overscroll event."));
// Scroll up on target div and wait for the window to get overscroll event.
await touchScrollInTarget(300, target_div, 'up');
await waitFor(() => { return window_received_overscroll; },
'Window did not receive overscroll event after scroll up on target.');
}, 'Tests that the window gets overscroll event when no element scrolls' +
'after touch scrolling.');
}
</script>

View file

@ -0,0 +1,85 @@
const MAX_FRAME = 700;
const MAX_UNCHANGED_FRAMES = 20;
// Returns a promise that resolves when the given condition is met or rejects
// after MAX_FRAME animation frames.
function waitFor(condition, error_message = 'Reaches the maximum frames.') {
return new Promise((resolve, reject) => {
function tick(frames) {
// We requestAnimationFrame either for MAX_FRAM frames or until condition
// is met.
if (frames >= MAX_FRAME)
reject(error_message);
else if (condition())
resolve();
else
requestAnimationFrame(tick.bind(this, frames + 1));
}
tick(0);
});
}
function waitForCompositorCommit() {
return new Promise((resolve) => {
// rAF twice.
window.requestAnimationFrame(() => {
window.requestAnimationFrame(resolve);
});
});
}
function waitForAnimationEnd(getValue) {
var last_changed_frame = 0;
var last_position = getValue();
return new Promise((resolve, reject) => {
function tick(frames) {
// We requestAnimationFrame either for MAX_FRAME or until
// MAX_UNCHANGED_FRAMES with no change have been observed.
if (frames >= MAX_FRAME || frames - last_changed_frame > MAX_UNCHANGED_FRAMES) {
resolve();
} else {
current_value = getValue();
if (last_position != current_value) {
last_changed_frame = frames;
last_position = current_value;
}
requestAnimationFrame(tick.bind(this, frames + 1));
}
}
tick(0);
})
}
function touchScrollInTarget(pixels_to_scroll, target, direction, pause_time_in_ms = 100) {
var x_delta = 0;
var y_delta = 0;
const num_movs = 5;
if (direction == "down") {
y_delta = -1 * pixels_to_scroll / num_movs;
} else if (direction == "up") {
y_delta = pixels_to_scroll / num_movs;
} else if (direction == "right") {
x_delta = -1 * pixels_to_scroll / num_movs;
} else if (direction == "left") {
x_delta = pixels_to_scroll / num_movs;;
} else {
throw("scroll direction '" + direction + "' is not expected, direction should be 'down', 'up', 'left' or 'right'");
}
return new test_driver.Actions()
.addPointer("pointer1", "touch")
.pointerMove(0, 0, {origin: target})
.pointerDown()
.pointerMove(x_delta, y_delta, {origin: target})
.pointerMove(2 * x_delta, 2 * y_delta, {origin: target})
.pointerMove(3 * x_delta, 3 * y_delta, {origin: target})
.pointerMove(4 * x_delta, 4 * y_delta, {origin: target})
.pointerMove(5 * x_delta, 5 * y_delta, {origin: target})
.pause(pause_time_in_ms)
.pointerUp()
.send();
}
// Trigger fling by doing pointerUp right after pointerMoves.
function touchFlingInTarget(pixels_to_scroll, target, direction) {
touchScrollInTarget(pixels_to_scroll, target, direction, 0 /* pause_time */);
}

View file

@ -0,0 +1,86 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
div {
position: absolute;
}
#scroller {
width: 500px;
height: 500px;
overflow: scroll;
scroll-snap-type: both mandatory;
border: solid black 5px;
}
#space {
width: 2000px;
height: 2000px;
}
.target {
width: 200px;
height: 200px;
scroll-snap-align: start;
background-color: blue;
}
</style>
<body style="margin:0" onload=runTests()>
<div id="scroller">
<div id="space"></div>
<div class="target" style="left: 0px; top: 0px;"></div>
<div class="target" style="left: 80px; top: 80px;"></div>
<div class="target" style="left: 200px; top: 200px;"></div>
</div>
</body>
<script>
var scroller = document.getElementById("scroller");
var space = document.getElementById("space");
const MAX_FRAME_COUNT = 700;
const MAX_UNCHANGED_FRAME = 20;
function scrollTop() {
return scroller.scrollTop;
}
var scroll_arrived_after_scroll_end = false;
var scroll_end_arrived = false;
scroller.addEventListener("scroll", () => {
if (scroll_end_arrived)
scroll_arrived_after_scroll_end = true;
});
scroller.addEventListener("scrollend", () => {
scroll_end_arrived = true;
});
function runTests() {
promise_test (async () => {
await waitForCompositorCommit();
await touchScrollInTarget(100, scroller, 'down');
// Wait for the scroll snap animation to finish.
await waitForAnimationEnd(scrollTop);
await waitFor(() => { return scroll_end_arrived; });
// Verify that scroll snap animation has finished before firing scrollend event.
assert_false(scroll_arrived_after_scroll_end);
}, "Tests that scrollend is fired after scroll snap animation completion.");
promise_test (async () => {
// Reset scroll state.
scroller.scrollTo(0, 0);
await waitForCompositorCommit();
scroll_end_arrived = false;
scroll_arrived_after_scroll_end = false;
await touchFlingInTarget(50, scroller, 'down');
// Wait for the scroll snap animation to finish.
await waitForAnimationEnd(scrollTop);
await waitFor(() => { return scroll_end_arrived; });
// Verify that scroll snap animation has finished before firing scrollend event.
assert_false(scroll_arrived_after_scroll_end);
}, "Tests that scrollend is fired after fling snap animation completion.");
}
</script>

View file

@ -0,0 +1,67 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#targetDiv {
width: 200px;
height: 200px;
overflow: scroll;
}
#innerDiv {
width: 400px;
height: 400px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="targetDiv">
<div id="innerDiv">
</div>
</div>
</body>
<script>
var target_div = document.getElementById('targetDiv');
var horizontal_scrollend_arrived = false;
var vertical_scrollend_arrived = false;
function onHorizontalScrollEnd(event) {
assert_false(event.cancelable);
// scrollend events are bubbled when the target node is document.
assert_true(event.bubbles);
horizontal_scrollend_arrived = true;
}
function onVerticalScrollEnd(event) {
assert_false(event.cancelable);
// scrollend events are bubbled when the target node is document.
assert_true(event.bubbles);
vertical_scrollend_arrived = true;
}
document.addEventListener("scrollend", onHorizontalScrollEnd);
document.addEventListener("scrollend", onVerticalScrollEnd);
function runTest() {
promise_test (async (t) => {
// Make sure that no scrollend event is sent to target_div.
target_div.addEventListener("scrollend",
t.unreached_func("target_div got unexpected scrollend event."));
await waitForCompositorCommit();
// Scroll left on target div and wait for the doc to get scrollend event.
await touchScrollInTarget(300, target_div, 'left');
await waitFor(() => { return horizontal_scrollend_arrived; },
'Document did not receive scrollend event after scroll left on target.');
assert_equals(target_div.scrollLeft, 0);
// Scroll up on target div and wait for the doc to get scrollend event.
await touchScrollInTarget(300, target_div, 'up');
await waitFor(() => { return vertical_scrollend_arrived; },
'Document did not receive scrollend event after scroll up on target.');
assert_equals(target_div.scrollTop, 0);
}, 'Tests that the document gets scrollend event when no element scrolls by ' +
'touch.');
}
</script>

View file

@ -0,0 +1,93 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#overscrollXDiv {
width: 600px;
height: 600px;
overflow: scroll;
overscroll-behavior-x: contain;
}
#overscrollYDiv {
width: 500px;
height: 500px;
overflow: scroll;
overscroll-behavior-y: none;
}
#targetDiv {
width: 400px;
height: 400px;
overflow: scroll;
}
.content {
width:800px;
height:800px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="overscrollXDiv">
<div class=content>
<div id="overscrollYDiv">
<div class=content>
<div id="targetDiv">
<div class="content">
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
var target_div = document.getElementById('targetDiv');
var horizontal_scrollend_arrived = false;
var vertical_scrollend_arrived = false;
function onHorizontalScrollEnd(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
horizontal_scrollend_arrived = true;
}
function onVerticalScrollEnd(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
vertical_scrollend_arrived = true;
}
// Test that both "onscrollend" and addEventListener("scrollend"... work.
document.getElementById('overscrollXDiv').onscrollend = onHorizontalScrollEnd;
document.getElementById('overscrollYDiv').
addEventListener("scrollend", onVerticalScrollEnd);
function runTest() {
promise_test (async (t) => {
// Make sure that no scrollend event is sent to document or target_div.
document.addEventListener("scrollend",
t.unreached_func("Document got unexpected scrollend event."));
target_div.addEventListener("scrollend",
t.unreached_func("target_div got unexpected scrollend event."));
await waitForCompositorCommit();
// Scroll left on target div and wait for the element with overscroll-x to
// get scrollend event.
await touchScrollInTarget(300, target_div, 'left');
await waitFor(() => { return horizontal_scrollend_arrived; },
'Expected element did not receive scrollend event after scroll left ' +
'on target.');
assert_equals(target_div.scrollLeft, 0);
// Scroll up on target div and wait for the element with overscroll-y to get
// scrollend event.
await touchScrollInTarget(300, target_div, 'up');
await waitFor(() => { return vertical_scrollend_arrived; },
'Expected element did not receive scrollend event after scroll up on ' +
'target.');
assert_equals(target_div.scrollTop, 0);
}, 'Tests that the last element in the cut scroll chain gets scrollend ' +
'event when no element scrolls by touch.');
}
</script>

View file

@ -0,0 +1,67 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#scrollableDiv {
width: 200px;
height: 200px;
overflow: scroll;
}
#innerDiv {
width: 400px;
height: 400px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="scrollableDiv">
<div id="innerDiv">
</div>
</div>
</body>
<script>
var scrolling_div = document.getElementById('scrollableDiv');
var horizontal_scrollend_arrived = false;
var vertical_scrollend_arrived = false;
function onHorizontalScrollEnd(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
horizontal_scrollend_arrived = true;
}
function onVerticalScrollEnd(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
vertical_scrollend_arrived = true;
}
scrolling_div.addEventListener("scrollend", onHorizontalScrollEnd);
scrolling_div.addEventListener("scrollend", onVerticalScrollEnd);
function runTest() {
promise_test (async (t) => {
// Make sure that no scrollend event is sent to document.
document.addEventListener("scrollend",
t.unreached_func("Document got unexpected scrollend event."));
await waitForCompositorCommit();
// Do a horizontal scroll and wait for scrollend event.
await touchScrollInTarget(300, scrolling_div, 'right');
await waitFor(() => { return horizontal_scrollend_arrived; },
'Scroller did not receive scrollend event after horizontal scroll.');
assert_equals(scrolling_div.scrollWidth - scrolling_div.scrollLeft,
scrolling_div.clientWidth);
// Do a vertical scroll and wait for scrollend event.
await touchScrollInTarget(300, scrolling_div, 'down');
await waitFor(() => { return vertical_scrollend_arrived; },
'Scroller did not receive scrollend event after vertical scroll.');
assert_equals(scrolling_div.scrollHeight - scrolling_div.scrollTop,
scrolling_div.clientHeight);
}, 'Tests that the scrolled element gets scrollend event at the end of touch scrolling.');
}
</script>

View file

@ -0,0 +1,54 @@
<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="scroll_support.js"></script>
<style>
#targetDiv {
width: 200px;
height: 200px;
overflow: scroll;
}
#innerDiv {
width: 400px;
height: 400px;
}
</style>
<body style="margin:0" onload=runTest()>
<div id="targetDiv">
<div id="innerDiv">
</div>
</div>
</body>
<script>
var target_div = document.getElementById('targetDiv');
var scrollend_arrived = false;
function onScrollEnd(event) {
assert_false(event.cancelable);
// scrollend events targetting document are bubbled to the window.
assert_true(event.bubbles);
scrollend_arrived = true;
}
window.addEventListener("scrollend", onScrollEnd);
function runTest() {
promise_test (async (t) => {
// Make sure that no scrollend event is sent to target_div.
target_div.addEventListener("scrollend",
t.unreached_func("target_div got unexpected scrollend event."));
await waitForCompositorCommit();
// Scroll up on target div and wait for the doc to get scrollend event.
await touchScrollInTarget(300, target_div, 'up');
await waitFor(() => { return scrollend_arrived; },
'Window did not receive scrollend event after scroll up on target.');
assert_equals(target_div.scrollTop, 0);
}, 'Tests that the window gets scrollend event when no element scrolls ' +
'after touch scrolling.');
}
</script>

View file

@ -1,6 +1,6 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Element Timing: observe image in shadow tree</title>
<title>Element Timing: do not observe image in shadow tree</title>
<style>
body {
margin: 0;
@ -19,13 +19,7 @@ body {
}
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
const pathname = window.location.origin + '/element-timing/resources/square100.png';
checkElement(entry, pathname, 'my_image', 'my_id', beforeRender, img);
// Assume viewport has size at least 100, so the element is fully visible.
checkRect(entry, [0, 100, 0, 100]);
checkNaturalSize(entry, 100, 100);
assert_unreached('Should not observe elements in shadow trees!');
})
);
observer.observe({entryTypes: ['element']});
@ -40,6 +34,10 @@ body {
const shadowRoot = document.getElementById('target').attachShadow({mode: 'closed'});
shadowRoot.appendChild(img);
beforeRender = performance.now();
t.step_timeout(() => {
// Assume entry was not dispatched, so test passes.
t.done();
}, 500);
};
}, 'Image in shadow tree with elementtiming attribute is observable.');
}, 'Image in shadow tree with elementtiming attribute is not observable.');
</script>

View file

@ -56,9 +56,9 @@ protected_mime_types = [
"application/x-gzip",
"application/x-protobuf",
"application/zip",
// TODO(lukasza): https://crbug.com/802836: Add application/pdf and text/csv
// to the list of content types tested here (after https://crbug.com/929300 is
// resolved).
// TODO(lukasza): https://crbug.com/944162: Add application/pdf and
// text/csv to the list of content types tested here (after
// kMimeHandlerViewInCrossProcessFrame gets enabled by default).
]
protected_mime_types.forEach(function(type) {
test(type, true /* is_blocking_expected */);

View file

@ -1,19 +0,0 @@
<!DOCTYPE html>
<title>HTMLAnchorElement.rel getter</title>
<link rel="author" title="TheKK" href="mailto:thumbd03803@gmail.com">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-a-rel">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<div>
<a id="test" href="a" rel="noreferrer"></a>
</div>
<script>
test(function() {
var a = document.getElementById("test");
test(function() {
assert_equals(a.rel, "noreferrer");
}, "Test anchor's rel getter");
});
</script>

View file

@ -1,20 +0,0 @@
<!DOCTYPE html>
<title>HTMLAnchorElement.rel setter</title>
<link rel="author" title="TheKK" href="mailto:thumbd03803@gmail.com">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-a-rel">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<div>
<a id="test" href="a"></a>
</div>
<script>
test(function() {
var a = document.getElementById("test");
test(function() {
a.rel = "noreferrer";
assert_equals(a.getAttribute("rel"), "noreferrer");
}, "Test anchor's rel setter");
});
</script>

View file

@ -1,66 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>HTMLDataElement.value getting</title>
<link rel="author" title="ofekd" href="mailto:ofek@outlook.com">
<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#dom-data-value">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
</head>
<body>
<div id="log"></div>
<div id="container">
<data value=""></data>
<data value="40">Forty</data>
</div>
<script>
var newData, datasArr, container;
container = document.getElementById('container')
newData = document.createElement('data');
newData.textContent = 'Five';
newData.setAttribute('value', '5');
container.appendChild(newData);
datasArr = container.getElementsByTagName('data');
test(function () {
test(function() {
assert_equals(datasArr[0].value, '');
}, 'data[value] #0 getter test');
test(function() {
assert_equals(datasArr[1].value, '40');
}, 'data[value] #1 getter test');
test(function() {
assert_equals(datasArr[2].value, '5');
}, 'data[value] #2 getter test');
}, 'Getter tests');
test(function () {
var i;
for (i = 0; i < datasArr.length; i++) {
datasArr[i].textContent = 'Twenty';
datasArr[i].value = 20;
test(function() {
assert_equals(datasArr[i].getAttribute('value'), '20');
}, 'data[value] #' + i + ' setter test');
}
newData = document.createElement('data');
newData.textContent = 'Twenty';
newData.value = '20';
container.appendChild(newData);
test(function() {
assert_equals(datasArr[3].getAttribute('value'), '20');
}, 'data[value] #3 setter test');
}, 'Setter tests');
</script>
</body>
</html>

View file

@ -0,0 +1,126 @@
// META: script=resources/test-helpers.js
promise_test(async t => cleanupSandboxedFileSystem(),
'Cleanup to setup test environment');
promise_test(async t => {
const handle = await createEmptyFile(t, 'empty_blob');
const stream = await handle.createWritable();
await stream.write(0, new Blob([]));
assert_equals(await getFileContents(handle), '');
assert_equals(await getFileSize(handle), 0);
}, 'write() with an empty blob to an empty file');
promise_test(async t => {
const handle = await createEmptyFile(t, 'valid_blob');
const stream = await handle.createWritable();
await stream.write(0, new Blob(['1234567890']));
assert_equals(await getFileContents(handle), '1234567890');
assert_equals(await getFileSize(handle), 10);
}, 'write() a blob to an empty file');
promise_test(async t => {
const handle = await createEmptyFile(t, 'blob_with_offset');
const stream = await handle.createWritable();
await stream.write(0, new Blob(['1234567890']));
await stream.write(4, new Blob(['abc']));
assert_equals(await getFileContents(handle), '1234abc890');
assert_equals(await getFileSize(handle), 10);
}, 'write() called with a blob and a valid offset');
promise_test(async t => {
const handle = await createEmptyFile(t, 'bad_offset');
const stream = await handle.createWritable();
await promise_rejects(t, 'InvalidStateError', stream.write(4, new Blob(['abc'])));
assert_equals(await getFileContents(handle), '');
assert_equals(await getFileSize(handle), 0);
}, 'write() called with an invalid offset');
promise_test(async t => {
const handle = await createEmptyFile(t, 'empty_string');
const stream = await handle.createWritable();
await stream.write(0, '');
assert_equals(await getFileContents(handle), '');
assert_equals(await getFileSize(handle), 0);
}, 'write() with an empty string to an empty file');
promise_test(async t => {
const handle = await createEmptyFile(t, 'valid_utf8_string');
const stream = await handle.createWritable();
await stream.write(0, 'foo🤘');
assert_equals(await getFileContents(handle), 'foo🤘');
assert_equals(await getFileSize(handle), 7);
}, 'write() with a valid utf-8 string');
promise_test(async t => {
const handle = await createEmptyFile(t, 'string_with_unix_line_ending');
const stream = await handle.createWritable();
await stream.write(0, 'foo\n');
assert_equals(await getFileContents(handle), 'foo\n');
assert_equals(await getFileSize(handle), 4);
}, 'write() with a string with unix line ending preserved');
promise_test(async t => {
const handle = await createEmptyFile(t, 'string_with_windows_line_ending');
const stream = await handle.createWritable();
await stream.write(0, 'foo\r\n');
assert_equals(await getFileContents(handle), 'foo\r\n');
assert_equals(await getFileSize(handle), 5);
}, 'write() with a string with windows line ending preserved');
promise_test(async t => {
const handle = await createEmptyFile(t, 'empty_array_buffer');
const stream = await handle.createWritable();
let buf = new ArrayBuffer(0);
await stream.write(0, buf);
assert_equals(await getFileContents(handle), '');
assert_equals(await getFileSize(handle), 0);
}, 'write() with an empty array buffer to an empty file');
promise_test(async t => {
const handle = await createEmptyFile(t, 'valid_string_typed_byte_array');
const stream = await handle.createWritable();
let buf = new ArrayBuffer(3);
let intView = new Uint8Array(buf);
intView[0] = 0x66;
intView[1] = 0x6f;
intView[2] = 0x6f;
await stream.write(0, buf);
assert_equals(await getFileContents(handle), 'foo');
assert_equals(await getFileSize(handle), 3);
}, 'write() with a valid typed array buffer');
promise_test(async t => {
const handle = await createEmptyFile(t, 'trunc_shrink');
const stream = await handle.createWritable();
await stream.write(0, new Blob(['1234567890']));
await stream.truncate(5);
assert_equals(await getFileContents(handle), '12345');
assert_equals(await getFileSize(handle), 5);
}, 'truncate() to shrink a file');
promise_test(async t => {
const handle = await createEmptyFile(t, 'trunc_grow');
const stream = await handle.createWritable();
await stream.write(0, new Blob(['abc']));
await stream.truncate(5);
assert_equals(await getFileContents(handle), 'abc\0\0');
assert_equals(await getFileSize(handle), 5);
}, 'truncate() to grow a file');

View file

@ -96,7 +96,7 @@ The ```./generic/tools/clean.py``` utility will only work if there is a valid ``
## Updating the tests
The main test logic lives in ```./generic/referrer-policy-test-case.js``` with helper functions defined in ```./common/security-features/resources/common.js``` so you should probably start there.
The main test logic lives in ```./generic/referrer-policy-test-case.sub.js``` with helper functions defined in ```./common/security-features/resources/common.js``` so you should probably start there.
For updating the test suite you will most likely do **a subset** of the following:
@ -105,7 +105,7 @@ For updating the test suite you will most likely do **a subset** of the followin
* Add a sanity check test for a sub-resource to ```./generic/subresource-test/```.
* Implement new or update existing assertions in ```./generic/referrer-policy-test-case.js```.
* Implement new or update existing assertions in ```./generic/referrer-policy-test-case.sub.js```.
* Exclude or add some tests by updating ```spec.src.json``` test expansions.

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="never">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="never">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="never">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="never">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="never">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="never">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

View file

@ -7,7 +7,7 @@
<script src="/common/utils.js"></script>
<!-- Common global functions for referrer-policy tests. -->
<script src="/common/security-features/resources/common.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.js"></script>
<script src="/referrer-policy/generic/referrer-policy-test-case.sub.js"></script>
<meta name="referrer" content="origin">
</head>
<body>

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