diff options
Diffstat (limited to 'testing/web-platform/tests/scroll-to-text-fragment/find-range-from-text-directive.html')
-rw-r--r-- | testing/web-platform/tests/scroll-to-text-fragment/find-range-from-text-directive.html | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/testing/web-platform/tests/scroll-to-text-fragment/find-range-from-text-directive.html b/testing/web-platform/tests/scroll-to-text-fragment/find-range-from-text-directive.html new file mode 100644 index 0000000000..229f082747 --- /dev/null +++ b/testing/web-platform/tests/scroll-to-text-fragment/find-range-from-text-directive.html @@ -0,0 +1,305 @@ +<!doctype html> +<title>Tests find-a-range-from-a-text-directive algorithm</title> +<meta charset=utf-8> +<link rel="help" href="https://wicg.github.io/scroll-to-text-fragment/#find-a-range-from-a-text-directive"> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/common/utils.js"></script> +<script src="stash.js"></script> +<!-- + This test suite performs scroll to text navigations to + find-range-from-text-directive-target.html and then checks the results, which are + communicated back from the target page via the WPT Stash server (see stash.py). + This structure is necessary because scroll to text security restrictions + specifically restrict the navigator from being able to observe the result of + the navigation, e.g. the target page cannot have a window opener. +--> +<script> +// This test suite specifically exercises the "find a range from a text +// directive" algorithm in the spec. + +let test_cases = [ + { + fragment: '#:~:text=jumped', + expect_to_scroll: true, + description: 'Basic smoke test - full word match' + }, + { + // Step 2.2.1 + fragment: '#:~:text=u-,mped', + expect_to_scroll: false, + description: 'Prefix must start on a word boundary' + }, + { + // Step 2.2.1 + fragment: '#:~:text=ju-,mped', + expect_to_scroll: true, + description: 'Prefix need not end on a word boundary' + }, + { + // Step 2.2.2 + fragment: '#:~:text=null-,The%20quick', + expect_to_scroll: false, + description: 'Prefix doesn\'t exist' + }, + { + // Step 2.2.3 + fragment: '#:~:text=foo%20foo-,bar', + expect_to_scroll: true, + description: 'Multiple overlapping prefixes' + }, + { + // Step 2.2.3 + fragment: '#:~:text=a%20a-,b', + expect_to_scroll: true, + description: 'Multiple overlapping one letter prefixes' + }, + { + // Step 2.2.4 + fragment: '#:~:text=quick%20brown-,brown%20fox', + expect_to_scroll: false, + description: 'Prefix overlaps match text' + }, + { + // Step 2.2.4 + fragment: '#:~:text=quick%20brown-,fox', + expect_to_scroll: true, + description: 'Match text after prefix' + }, + { + // Step 2.2.5 + fragment: '#:~:text=Lorem-,Ipsum', + expect_to_scroll: true, + description: 'Search invisible content between prefix and match' + }, + { + // Step 2.2.6 + fragment: '#:~:text=end%20of%20the%20document-,test', + expect_to_scroll: false, + description: 'Prefix appears at end of document' + }, + { + // Step 2.2.8 + fragment: '#:~:text=fox-,jum,over', + expect_to_scroll: false, + description: '|end| forces |start| to end on word boundary' + }, + { + // Step 2.2.8 + fragment: '#:~:text=fox-,jum', + expect_to_scroll: false, + description: 'no |end| or suffix forces |start| to end on word boundary' + }, + { + // Step 2.2.8 + fragment: '#:~:text=fox-,jum,-ped', + expect_to_scroll: true, + description: 'suffix means |start| need not end on word boundary' + }, + { + // Step 2.2.9 + fragment: '#:~:text=jum-,ped', + expect_to_scroll: true, + description: '|start| doesn\'t need to start on word boundary' + }, + { + // Step 2.2.10 + fragment: '#:~:text=jumped-,null', + expect_to_scroll: false, + description: 'prefix with non-existent exact match' + }, + { + // Step 2.2.10 + fragment: '#:~:text=jumped-,null,lazy', + expect_to_scroll: false, + description: 'prefix with non-existent range match' + }, + { + // Step 2.2.11 + fragment: '#:~:text=brown-,jumped', + expect_to_scroll: false, + description: 'match doesn\'t immediately follow prefix' + }, + { + // Step 2.2.11 + fragment: '#:~:text=foo-,bar', + expect_to_scroll: true, + description: 'match doesn\'t immediately follow first prefix instance' + }, + { + // Step 2.3.1 + fragment: '#:~:text=jum,over', + expect_to_scroll: false, + description: 'no-prefix; |end| forces |start| to end on word boundary' + }, + { + // Step 2.3.1 + fragment: '#:~:text=jum', + expect_to_scroll: false, + description: 'no-prefix; no |end| or suffix forces |start| to end on word boundary' + }, + { + // Step 2.3.1 + fragment: '#:~:text=jum,-ped', + expect_to_scroll: true, + description: 'no-prefix; suffix means |start| need not end on word boundary' + }, + { + // Step 2.3.2 + fragment: '#:~:text=umped', + expect_to_scroll: false, + description: '|start| must start on a word boundary' + }, + { + // Step 2.3.3 + fragment: '#:~:text=null', + expect_to_scroll: false, + description: 'non-existent exact match' + }, + { + // Step 2.3.3 + fragment: '#:~:text=null,lazy', + expect_to_scroll: false, + description: 'non-existent range match' + }, + { + // Step 2.3.4 + fragment: '#:~:text=b%20b,-c', + expect_to_scroll: true, + description: 'overlapping exact matches with suffix' + }, + { + // Step 2.3.4 + fragment: '#:~:text=foo%20foo,-bar', + expect_to_scroll: true, + description: 'overlapping one letter exact matches with suffix' + }, + { + // Step 2.5.1 + fragment: '#:~:text=brown,fox', + expect_to_scroll: true, + description: 'matching range search' + }, + { + // Step 2.4 + fragment: '#:~:text=brown,quick', + expect_to_scroll: false, + description: 'inverted range search' + }, + { + // Step 2.5.1.1 + fragment: '#:~:text=quick,bro', + expect_to_scroll: false, + description: 'no suffix forces |end| to be end bounded' + }, + { + // Step 2.5.1.1 + fragment: '#:~:text=quick,bro,-wn', + expect_to_scroll: true, + description: 'suffix means |end| need not be end bounded' + }, + { + // Step 2.5.1.2 + fragment: '#:~:text=quick,ro,-wn', + expect_to_scroll: false, + description: '|end| must be start bounded' + }, + { + // Step 2.5.1.2 + fragment: '#:~:text=bro,wn', + expect_to_scroll: false, + description: '|end| must be start bounded even if full range is word bounded' + }, + { + // Step 2.5.1.3 + fragment: '#:~:text=quick,null', + expect_to_scroll: false, + description: 'non-existent |end|' + }, + { + // Step 2.5.1.4 + fragment: '#:~:text=quick,jumped,-fox', + expect_to_scroll: false, + description: 'Range with preceeding suffix' + }, + { + // Step 2.5.3 + fragment: '#:~:text=The-,quick,brown', + expect_to_scroll: true, + description: 'Match with no suffix' + }, + { + // Step 2.5.4 + fragment: '#:~:text=The-,quick,fox,-brown', + expect_to_scroll: false, + description: 'Suffix comes before |end|' + }, + { + // Step 2.5.5 + fragment: '#:~:text=Lorem-,Ipsum,Whitespace,-Dipsum', + expect_to_scroll: true, + description: 'Search invisible content between |end| and suffix' + }, + { + // Step 2.5.6 + fragment: '#:~:text=quick,-bro', + expect_to_scroll: false, + description: 'Suffix must be end bounded' + }, + { + // Step 2.5.6 + fragment: '#:~:text=qu,-ick', + expect_to_scroll: true, + description: 'Suffix need not be start bounded' + }, + { + // Step 2.5.7 + fragment: '#:~:text=quick,-null', + expect_to_scroll: false, + description: 'Non-existent suffix' + }, + { + // Step 2.5.8 + fragment: '#:~:text=quick,-fox', + expect_to_scroll: false, + description: 'Content appears between match and suffix' + }, + { + // Step 2.5.9 + fragment: '#:~:text=match,-suffix2', + expect_to_scroll: true, + description: 'Non-matching suffix in first potential match' + }, + { + // Step 2.5.9 + fragment: '#:~:text=prefix-,match,-suffix3', + expect_to_scroll: true, + description: 'Non-matching suffix search continues to prefix match' + }, + { + // Step 2.5.10 + fragment: '#:~:text=prefix-,match,matchEnd,-suffix5', + expect_to_scroll: true, + description: 'Range end matches correct suffix' + } +]; + +for (const test_case of test_cases) { + promise_test(t => new Promise((resolve, reject) => { + let key = token(); + + test_driver.bless('Open a URL with a text fragment directive', () => { + window.open(`find-range-from-text-directive-target.html?key=${key}${test_case.fragment}`, '_blank', 'noopener'); + }); + + fetchResults(key, resolve, reject); + }).then(data => { + const expectation_string = test_case.expect_to_scroll ? 'to scroll' : 'not to scroll'; + assert_equals(data.didScroll, test_case.expect_to_scroll, + `Expected ${expectation_string}`); + }), `${test_case.description}.`); +} +</script> |