browser_test_APZ.js (3401B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 Services.scriptloader.loadSubScript( 8 "chrome://mochitests/content/browser/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js", 9 this 10 ); 11 12 /** 13 * Test accessible is has correct offscreen state before and after 14 * APZ. 15 */ 16 addAccessibleTask( 17 ` 18 <div id="test" style="background:green; height: 100px; width: 100px;">I am square</div> 19 <div style="height: 70vh;">hello world I am large</div><br> 20 <h1 id="heading" style="display: inline-block;">I am a heading</h1> 21 `, 22 async function (browser, accDoc) { 23 const test = findAccessibleChildByID(accDoc, "test"); 24 const heading = findAccessibleChildByID(accDoc, "heading"); 25 26 info("Verifying offscreen state"); 27 await untilCacheOk(() => { 28 const [states] = getStates(test); 29 return (states & STATE_OFFSCREEN) == 0; 30 }, "test div should be ON screen"); 31 await untilCacheOk(() => { 32 const [states] = getStates(heading); 33 return (states & STATE_OFFSCREEN) == 0; 34 }, "heading should be ON screen"); 35 36 info("Pinch zooming..."); 37 await SpecialPowers.spawn(browser, [], async () => { 38 const visualScrollPromise = new Promise(resolve => { 39 content.window.visualViewport.addEventListener("scroll", resolve, { 40 once: true, 41 }); 42 }); 43 const utils = SpecialPowers.getDOMWindowUtils(content.window); 44 utils.setResolutionAndScaleTo(2); 45 utils.scrollToVisual( 46 200, 47 200, 48 utils.UPDATE_TYPE_MAIN_THREAD, 49 utils.SCROLL_MODE_INSTANT 50 ); 51 await visualScrollPromise; 52 }); 53 info("Verifying offscreen state"); 54 await untilCacheOk(() => { 55 const [states] = getStates(test); 56 return (states & STATE_OFFSCREEN) != 0; 57 }, "test div should be OFF screen"); 58 await untilCacheOk(() => { 59 const [states] = getStates(heading); 60 return (states & STATE_OFFSCREEN) != 0; 61 }, "heading should be OFF screen"); 62 63 info("Scrolling to bottom of page..."); 64 // We have to use the APZ scroll util here, we can't rely on 65 // body.scrollTo, because the thing that we've created scroll 66 // bars on is the visual viewport "element". 67 await SpecialPowers.spawn(browser, [], async () => { 68 const visualScrollPromise = new Promise(resolve => { 69 content.window.visualViewport.addEventListener("scroll", resolve, { 70 once: true, 71 }); 72 }); 73 const utils = SpecialPowers.getDOMWindowUtils(content.window); 74 utils.scrollToVisual( 75 0, 76 content.visualViewport.height, 77 utils.UPDATE_TYPE_MAIN_THREAD, 78 utils.SCROLL_MODE_INSTANT 79 ); 80 await visualScrollPromise; 81 }); 82 83 info("Verifying offscreen state"); 84 await untilCacheOk(() => { 85 const [states] = getStates(test); 86 return (states & STATE_OFFSCREEN) != 0; 87 }, "test div should be OFF screen"); 88 89 await untilCacheOk(() => { 90 const [states] = getStates(heading); 91 return (states & STATE_OFFSCREEN) == 0; 92 }, "heading should be ON screen"); 93 }, 94 // APZ only happens on the top-level document, which means iframe tests 95 // will assert differently than classic remote doc tests. 96 { iframe: false, remoteIframe: false } 97 );