| Nick Burris | 97e6b87 | 2019-12-11 19:06:38 | [diff] [blame] | 1 | <!doctype html> |
| 2 | <title>Navigating to a text fragment directive</title> |
| 3 | <meta charset=utf-8> |
| 4 | <link rel="help" href="https://wicg.github.io/ScrollToTextFragment/"> |
| 5 | <script src="/resources/testharness.js"></script> |
| 6 | <script src="/resources/testharnessreport.js"></script> |
| 7 | <script src="/resources/testdriver.js"></script> |
| 8 | <script src="/resources/testdriver-vendor.js"></script> |
| 9 | <script src="/common/utils.js"></script> |
| 10 | <script src="stash.js"></script> |
| 11 | <script> |
| 12 | // Test security restriction for user activation |
| 13 | for (let user_activation of [true, false]) { |
| 14 | promise_test(t => new Promise((resolve, reject) => { |
| 15 | let key = token(); |
| 16 | |
| 17 | if (user_activation) { |
| 18 | test_driver.bless('Open a URL with a text fragment directive', () => { |
| 19 | window.open(`scroll-to-text-fragment-target.html?key=${key}#:~:text=test`, '_blank', 'noopener'); |
| 20 | }); |
| 21 | } else { |
| 22 | window.open(`scroll-to-text-fragment-target.html?key=${key}#:~:text=test`, '_blank', 'noopener'); |
| 23 | } |
| 24 | |
| 25 | fetchResults(key, resolve, reject); |
| 26 | }).then(data => { |
| 27 | assert_equals(data.href.indexOf(':~:'), -1, 'Expected fragment directive to be stripped from the URL.'); |
| 28 | |
| 29 | if (user_activation) { |
| 30 | assert_equals(data.scrollPosition, 'text', 'Expected window.open() with a user activation to scroll to text.'); |
| 31 | } else { |
| 32 | assert_equals(data.scrollPosition, 'top', 'Expected window.open() with no user activation to not activate text fragment directive.'); |
| 33 | } |
| 34 | }), `Test that a text fragment directive requires a user activation (user_activation=${user_activation}).`); |
| 35 | } |
| 36 | |
| 37 | // Test security restriction for no window opener |
| 38 | for (let noopener of [true, false]) { |
| 39 | promise_test(t => new Promise((resolve, reject) => { |
| 40 | let key = token(); |
| 41 | |
| 42 | test_driver.bless('Open a URL with a text fragment directive', () => { |
| 43 | if (noopener) { |
| 44 | window.open(`scroll-to-text-fragment-target.html?key=${key}#:~:text=test`, '_blank', 'noopener'); |
| 45 | } else { |
| 46 | window.open(`scroll-to-text-fragment-target.html?key=${key}#:~:text=test`, '_blank'); |
| 47 | } |
| 48 | }); |
| 49 | |
| 50 | fetchResults(key, resolve, reject); |
| 51 | }).then(data => { |
| 52 | assert_equals(data.href.indexOf(':~:'), -1, 'Expected fragment directive to be stripped from the URL.'); |
| 53 | |
| 54 | if (noopener) { |
| 55 | assert_equals(data.scrollPosition, 'text', 'Expected window.open() with noopener to scroll to text.'); |
| 56 | } else { |
| 57 | assert_equals(data.scrollPosition, 'top', 'Expected window.open() with opener to not activate text fragment directive.'); |
| 58 | } |
| 59 | }), `Test that a text fragment directive is not activated when there is a window opener (noopener=${noopener}).`); |
| 60 | } |
| 61 | |
| 62 | // Test security restriction for no activation in an iframe |
| 63 | promise_test(t => new Promise((resolve, reject) => { |
| 64 | let key = token(); |
| 65 | |
| 66 | let frame = document.createElement('iframe'); |
| 67 | document.body.appendChild(frame); |
| 68 | |
| 69 | test_driver.bless('Navigate the iframe with a text fragment directive', () => { |
| 70 | frame.src = `scroll-to-text-fragment-target.html?key=${key}#:~:text=test`; |
| 71 | }); |
| 72 | |
| 73 | fetchResults(key, resolve, reject); |
| 74 | }).then(data => { |
| 75 | assert_equals(data.href.indexOf(':~:'), -1, 'Expected fragment directive to be stripped from the URL.'); |
| 76 | assert_equals(data.scrollPosition, 'top', 'Expected iframe navigation to not activate text fragment directive.'); |
| 77 | }), 'Test that a text fragment directive is not activated within an iframe.'); |
| 78 | </script> |