test_useractivation_scrollbar.html (3978B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>User activation test: consume transient flag</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <script src="/tests/SimpleTest/EventUtils.js"></script> 7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 8 </head> 9 <body> 10 <textarea style="height: 100px; resize: none"> 11   12   13   14   15   16   17   18   19   20   21   22   23   24 </textarea> 25 <div id="target" style="height: 100px; width: 200px; overflow: scroll"> 26  <br> 27  <br> 28  <br> 29  <br> 30  <br> 31  <br> 32  <br> 33  <br> 34  <br> 35  <br> 36  <br> 37  <br> 38  <br> 39 </div> 40 <div style="height: 2000px; width: 500px; background-color: green;"></div> 41 <script> 42 43 // Open a new window to ensure scrollbar is always visible. 44 if (!opener) { 45 add_task(async function init() { 46 // Turn on the prefs that force overlay scrollbars to always be visible. 47 await SpecialPowers.pushPrefEnv({ 48 set: [["layout.testing.overlay-scrollbars.always-visible", true]], 49 }); 50 }); 51 52 async function testOnNewWindow(aPrefValue) { 53 await SpecialPowers.pushPrefEnv({ 54 set: [["dom.user_activation.ignore_scrollbars", aPrefValue]], 55 }); 56 57 let win = window.open(location); 58 // wait for message 59 await new Promise((aResolve) => { 60 window.addEventListener("message", function listener(event) { 61 if ("done" == event.data) { 62 window.removeEventListener("message", listener); 63 aResolve(); 64 } 65 }); 66 }); 67 win.close(); 68 } 69 70 add_task(async function test_pref_on() { 71 await testOnNewWindow(true); 72 }); 73 74 add_task(async function test_pref_off() { 75 await testOnNewWindow(false); 76 }); 77 } else { 78 SimpleTest.waitForFocus(async function() { 79 function waitForEvent(aTarget, aEvent) { 80 return new Promise((aResolve) => { 81 aTarget.addEventListener(aEvent, function listener() { 82 aResolve(); 83 }, { once: true }); 84 }); 85 } 86 87 let ignoreScrollbars = SpecialPowers.getBoolPref("dom.user_activation.ignore_scrollbars"); 88 89 SpecialPowers.wrap(document).clearUserGestureActivation(); 90 let textarea = document.querySelector("textarea"); 91 var rect = textarea.getBoundingClientRect(); 92 93 // click scrollbar of textarea 94 let promise = waitForEvent(textarea, "scroll"); 95 synthesizeMouse(textarea, rect.width - 5, rect.height / 2, {}); 96 await promise; 97 98 opener.is(SpecialPowers.wrap(document).hasBeenUserGestureActivated, 99 !ignoreScrollbars, "check has-been-user-activated"); 100 opener.is(SpecialPowers.wrap(document).hasValidTransientUserGestureActivation, 101 !ignoreScrollbars, "check has-valid-transient-user-activation"); 102 103 SpecialPowers.wrap(document).clearUserGestureActivation(); 104 let div = document.querySelector("div[id=target]"); 105 rect = div.getBoundingClientRect(); 106 107 // click scrollbar of div 108 promise = waitForEvent(div, "scroll"); 109 synthesizeMouse(div, rect.width - 5, rect.height / 2, {}); 110 await promise; 111 112 opener.is(SpecialPowers.wrap(document).hasBeenUserGestureActivated, 113 !ignoreScrollbars, "check has-been-user-activated"); 114 opener.is(SpecialPowers.wrap(document).hasValidTransientUserGestureActivation, 115 !ignoreScrollbars, "check has-valid-transient-user-activation"); 116 117 SpecialPowers.wrap(document).clearUserGestureActivation(); 118 let body = document.querySelector("body"); 119 120 // click scrollbar of page 121 promise = waitForEvent(document, "scroll"); 122 synthesizeMouse(body, innerWidth - 10, innerHeight / 2, {}); 123 await promise; 124 125 opener.is(SpecialPowers.wrap(document).hasBeenUserGestureActivated, 126 !ignoreScrollbars, "check has-been-user-activated"); 127 opener.is(SpecialPowers.wrap(document).hasValidTransientUserGestureActivation, 128 !ignoreScrollbars, "check has-valid-transient-user-activation"); 129 130 opener.postMessage("done", "*"); 131 }, window); 132 } 133 134 </script> 135 </body>