servo/tests/wpt/web-platform-tests/speculation-rules/prefetch/document-rules.https.html

170 lines
6.3 KiB
HTML

<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="resources/utils.sub.js"></script>
<script src="/common/subset-tests-by-key.js"></script>
<meta name="variant" content="?include=defaultPredicate">
<meta name="variant" content="?include=hrefMatches">
<meta name="variant" content="?include=and">
<meta name="variant" content="?include=or">
<meta name="variant" content="?include=not">
<meta name="variant" content="?include=invalidPredicate">
<meta name="variant" content="?include=linkInShadowTree">
<meta name="variant" content="?include=linkHrefChanged">
<meta name="variant" content="?include=newRuleSetAdded">
<body>
<script>
subsetTestByKey('defaultPredicate', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
const url = getPrefetchUrl();
addLink(url);
insertDocumentRule();
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url), 1);
}, 'test document rule with no predicate');
subsetTestByKey('hrefMatches', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
insertDocumentRule({ href_matches: '*\\?uuid=*&foo=bar' });
const url_1 = getPrefetchUrl({foo: 'bar'});
addLink(url_1);
const url_2 = getPrefetchUrl({foo: 'buzz'});
addLink(url_2)
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url_1), 1);
assert_equals(await isUrlPrefetched(url_2), 0);
}, 'test href_matches document rule');
subsetTestByKey('and', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
insertDocumentRule({
'and': [
{ href_matches: '*\\?*foo=bar*' },
{ href_matches: '*\\?*fizz=buzz*' }]
});
const url_1 = getPrefetchUrl({foo: 'bar'});
const url_2 = getPrefetchUrl({fizz: 'buzz'});
const url_3 = getPrefetchUrl({foo: 'bar', fizz: 'buzz'});
[url_1, url_2, url_3].forEach(url => addLink(url));
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url_1), 0);
assert_equals(await isUrlPrefetched(url_2), 0);
assert_equals(await isUrlPrefetched(url_3), 1);
}, 'test document rule with conjunction predicate');
subsetTestByKey('or', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
insertDocumentRule({
'or': [
{ href_matches: '*\\?*foo=bar*' },
{ href_matches: '*\\?*fizz=buzz*' }]
});
const url_1 = getPrefetchUrl({ foo: 'buzz' });
const url_2 = getPrefetchUrl({ fizz: 'buzz' });
const url_3 = getPrefetchUrl({ foo: 'bar'});
[url_1, url_2, url_3].forEach(url => addLink(url));
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url_1), 0);
assert_equals(await isUrlPrefetched(url_2), 1);
assert_equals(await isUrlPrefetched(url_3), 1);
}, 'test document rule with disjunction predicate');
subsetTestByKey('not', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
"Speculation Rules not supported");
insertDocumentRule({ not: { href_matches: '*\\?uuid=*&foo=bar' } });
const url_1 = getPrefetchUrl({foo: 'bar'});
addLink(url_1);
const url_2 = getPrefetchUrl({foo: 'buzz'});
addLink(url_2)
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url_1), 0);
assert_equals(await isUrlPrefetched(url_2), 1);
}, 'test document rule with negation predicate');
subsetTestByKey('invalidPredicate', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
const url = getPrefetchUrl();
addLink(url);
insertDocumentRule({invalid: 'predicate'});
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url), 0);
}, 'invalid predicate should not throw error or start prefetch');
subsetTestByKey('linkInShadowTree', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
insertDocumentRule();
// Create shadow root.
const shadowHost = document.createElement('div');
document.body.appendChild(shadowHost);
const shadowRoot = shadowHost.attachShadow({mode: 'open'});
const url = getPrefetchUrl();
addLink(url, shadowRoot);
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url), 1);
}, 'test that matching link in a shadow tree is prefetched');
subsetTestByKey('linkHrefChanged', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
insertDocumentRule({href_matches: "*\\?*foo=bar*"});
const url = getPrefetchUrl();
const link = addLink(url);
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url), 0);
const matching_url = getPrefetchUrl({foo: 'bar'});
link.href = matching_url;
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(matching_url), 1);
}, 'test that changing the href of an invalid link to a matching value triggers a prefetch');
subsetTestByKey('newRuleSetAdded', promise_test, async t => {
assert_implements(HTMLScriptElement.supports('speculationrules'),
'Speculation Rules not supported');
insertDocumentRule({href_matches: "*\\?*foo=bar*"});
const url = getPrefetchUrl({fizz: "buzz"});
addLink(url);
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url), 0);
insertDocumentRule({href_matches: "*\\?*fizz=buzz*"});
await new Promise(resolve => t.step_timeout(resolve, 2000));
assert_equals(await isUrlPrefetched(url), 1);
}, 'test that adding a second rule set triggers prefetch');
</script>
</body>