/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; Services.scriptloader.loadSubScript( "chrome://mochitests/content/browser/gfx/layers/apz/test/mochitest/apz_test_utils.js", this ); Services.scriptloader.loadSubScript( "chrome://mochitests/content/browser/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js", this ); async function runTest() { await SpecialPowers.pushPrefEnv({ set: [ ...getPrefs("TOUCH_EVENTS:PAN"), ["apz.test.logging_enabled", true], // Set content response timeout to 0 to avoid bug 2043764. ["apz.content_response_timeout", 0], ], }); const URL_ROOT = getRootDirectory(gTestPath).replace( "chrome://mochitests/content/", "http://mochi.test:8888/" ); const tab = await BrowserTestUtils.openNewForegroundTab( gBrowser, URL_ROOT + "helper_bug2043349_browser.html" ); const browser = tab.linkedBrowser; // Setup an active touchstart event listener, it does nothing, thus it should // not prevent scrolling. const touchstartPromise = SpecialPowers.spawn(browser, [], () => { return new Promise(resolve => { content.addEventListener("touchstart", () => resolve(), { passive: false, }); }); }); // Setup a passive touchmove event listener causing 3000ms busy state. // This busy state should not prevent scrolling by APZ, to check it poll // APZ scroll offsets and see if scrolling is on-going. const apzScrolledPromise = SpecialPowers.spawn(browser, [], () => { return new Promise(resolve => { content.addEventListener( "touchmove", () => { const utils = SpecialPowers.getDOMWindowUtils(content); const start = content.performance.now(); while (content.performance.now() - start < 3000) { const samples = utils.getCompositorAPZTestData().sampledResults || []; for (const sample of samples) { if (SpecialPowers.wrap(sample).scrollOffsetY > 0) { resolve(true); return; } } } resolve(false); }, { passive: true, once: true } ); }); }); // Flush above spawned tasks. await SpecialPowers.spawn(browser, [], () => {}); await synthesizeNativeTouch( browser, 100, 200, SpecialPowers.DOMWindowUtils.TOUCH_CONTACT ); await touchstartPromise; // Now extend the content response timeout longer than the busy state // so that timeout won't happen during it. await SpecialPowers.pushPrefEnv({ set: [["apz.content_response_timeout", 5000]], }); await synthesizeNativeTouch( browser, 100, 150, SpecialPowers.DOMWindowUtils.TOUCH_CONTACT ); await synthesizeNativeTouch( browser, 100, 100, SpecialPowers.DOMWindowUtils.TOUCH_CONTACT ); await synthesizeNativeTouch( browser, 100, 50, SpecialPowers.DOMWindowUtils.TOUCH_CONTACT ); await synthesizeNativeTouch( browser, 100, 50, SpecialPowers.DOMWindowUtils.TOUCH_REMOVE ); const apzScrolled = await apzScrolledPromise; BrowserTestUtils.removeTab(tab); return apzScrolled; } // Two subtests, each with a multi-second busy-wait, on potentially slow CI. requestLongerTimeout(2); add_task(async () => { await SpecialPowers.pushPrefEnv({ set: [["apz.fastpath_apz_aware_listener.enabled", false]], }); ok( await runTest(), "APZ scrolled during the busy-wait with fast-path disabled " + "(no unnecessary wait for first touchmove)" ); }); add_task(async () => { await SpecialPowers.pushPrefEnv({ set: [["apz.fastpath_apz_aware_listener.enabled", true]], }); ok( await runTest(), "APZ scrolled during the busy-wait with fast-path enabled " + "(no unnecessary wait for first touchmove)" ); });