/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const kContentFileUrl = kBaseUrlForContent + "simple_navigator_clipboard_readText.html"; // @param aBrowser browser object of the content tab. // @param aContentElementId the ID of the element to be tapped. function promiseTouchTapContent(aBrowser, aContentElementId) { return SpecialPowers.spawn( aBrowser, [aContentElementId], async _contentElementId => { await content.wrappedJSObject.waitUntilApzStable(); const contentElement = content.document.getElementById(_contentElementId); let promise = new Promise(resolve => { contentElement.addEventListener( "click", function (e) { resolve({ x: e.screenX, y: e.screenY }); }, { once: true } ); }); EventUtils.synthesizeTouchAtCenter( contentElement, { asyncEnabled: true }, content.window ); return promise; } ); } add_task(async function test_paste_button_position_touch() { if ( AppConstants.platform == "macosx" && Services.prefs.getBoolPref("widget.macos.native-anchored-menus", false) ) { ok(true, "Skipping test_paste_button_position_touch with native menus"); return; } // Ensure there's text on the clipboard. await promiseWritingRandomTextToClipboard(); await BrowserTestUtils.withNewTab(kContentFileUrl, async function (browser) { const pasteButtonIsShown = promisePasteButtonIsShown(); const coordsOfClickInContentRelativeToScreenInDevicePixels = await promiseTouchTapContent(browser, "invokeReadTextOnceId"); info( "coordsOfClickInContentRelativeToScreenInDevicePixels: " + coordsOfClickInContentRelativeToScreenInDevicePixels.x + ", " + coordsOfClickInContentRelativeToScreenInDevicePixels.y ); const pasteButtonCoordsRelativeToScreenInDevicePixels = await pasteButtonIsShown; info( "pasteButtonCoordsRelativeToScreenInDevicePixels: " + pasteButtonCoordsRelativeToScreenInDevicePixels.x + ", " + pasteButtonCoordsRelativeToScreenInDevicePixels.y ); const mouseCoordsRelativeToScreenInDevicePixels = getMouseCoordsRelativeToScreenInDevicePixels(); info( "mouseCoordsRelativeToScreenInDevicePixels: " + mouseCoordsRelativeToScreenInDevicePixels.x + ", " + mouseCoordsRelativeToScreenInDevicePixels.y ); // Asserting not overlapping is important; otherwise, when the // "Paste" button is shown via a `mousedown` event, the following // `mouseup` event could accept the "Paste" button unnoticed by the // user. ok( isCloselyLeftOnTopOf( mouseCoordsRelativeToScreenInDevicePixels, pasteButtonCoordsRelativeToScreenInDevicePixels ), "'Paste' button is closely left on top of the mouse pointer." ); ok( isCloselyLeftOnTopOf( coordsOfClickInContentRelativeToScreenInDevicePixels, pasteButtonCoordsRelativeToScreenInDevicePixels ), "Coords of click in content are closely left on top of the 'Paste' button." ); // To avoid disturbing subsequent tests. const pasteButtonIsHidden = promisePasteButtonIsHidden(); await promiseClickPasteButton(); await pasteButtonIsHidden; }); });