mirror of
https://github.com/servo/servo.git
synced 2025-10-17 16:59:27 +01:00
170 lines
6.3 KiB
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>
|