From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../browser/browser_ext_windows_create_params.js | 249 +++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_windows_create_params.js (limited to 'browser/components/extensions/test/browser/browser_ext_windows_create_params.js') diff --git a/browser/components/extensions/test/browser/browser_ext_windows_create_params.js b/browser/components/extensions/test/browser/browser_ext_windows_create_params.js new file mode 100644 index 0000000000..6d80085433 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_windows_create_params.js @@ -0,0 +1,249 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +const { AddonTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/AddonTestUtils.sys.mjs" +); + +AddonTestUtils.initMochitest(this); + +// Tests that incompatible parameters can't be used together. +add_task(async function testWindowCreateParams() { + let extension = ExtensionTestUtils.loadExtension({ + async background() { + try { + for (let state of ["minimized", "maximized", "fullscreen"]) { + for (let param of ["left", "top", "width", "height"]) { + let expected = `"state": "${state}" may not be combined with "left", "top", "width", or "height"`; + + await browser.test.assertRejects( + browser.windows.create({ state, [param]: 100 }), + RegExp(expected), + `Got expected error from create(${param}=100)` + ); + } + } + + browser.test.notifyPass("window-create-params"); + } catch (e) { + browser.test.fail(`${e} :: ${e.stack}`); + browser.test.notifyFail("window-create-params"); + } + }, + }); + + await extension.startup(); + await extension.awaitFinish("window-create-params"); + await extension.unload(); +}); + +// We do not support the focused param, however we do not want +// to fail despite an error when it is passed. This provides +// better code level compatibility with chrome. +add_task(async function testWindowCreateFocused() { + let extension = ExtensionTestUtils.loadExtension({ + async background() { + async function doWaitForWindow(createOpts, resolve) { + let created; + browser.windows.onFocusChanged.addListener(async function listener( + wid + ) { + if (wid == browser.windows.WINDOW_ID_NONE) { + return; + } + let win = await created; + if (win.id !== wid) { + return; + } + browser.windows.onFocusChanged.removeListener(listener); + // update the window object + let window = await browser.windows.get(wid); + resolve(window); + }); + created = browser.windows.create(createOpts); + } + async function awaitNewFocusedWindow(createOpts) { + return new Promise(resolve => { + // eslint doesn't like an async promise function, so + // we need to wrap it like this. + doWaitForWindow(createOpts, resolve); + }); + } + try { + let window = await awaitNewFocusedWindow({}); + browser.test.assertEq( + window.focused, + true, + "window is focused without focused param" + ); + browser.test.log("removeWindow"); + await browser.windows.remove(window.id); + window = await awaitNewFocusedWindow({ focused: true }); + browser.test.assertEq( + window.focused, + true, + "window is focused with focused: true" + ); + browser.test.log("removeWindow"); + await browser.windows.remove(window.id); + window = await awaitNewFocusedWindow({ focused: false }); + browser.test.assertEq( + window.focused, + true, + "window is focused with focused: false" + ); + browser.test.log("removeWindow"); + await browser.windows.remove(window.id); + browser.test.notifyPass("window-create-params"); + } catch (e) { + browser.test.fail(`${e} :: ${e.stack}`); + browser.test.notifyFail("window-create-params"); + } + }, + }); + + ExtensionTestUtils.failOnSchemaWarnings(false); + let { messages } = await AddonTestUtils.promiseConsoleOutput(async () => { + await extension.startup(); + await extension.awaitFinish("window-create-params"); + await extension.unload(); + }); + + AddonTestUtils.checkMessages( + messages, + { + expected: [ + { + message: + /Warning processing focused: Opening inactive windows is not supported/, + }, + ], + }, + "Expected warning processing focused" + ); + + ExtensionTestUtils.failOnSchemaWarnings(true); +}); + +add_task(async function testPopupTypeWithDimension() { + let extension = ExtensionTestUtils.loadExtension({ + async background() { + await browser.windows.create({ + type: "popup", + left: 123, + top: 123, + width: 151, + height: 152, + }); + await browser.windows.create({ + type: "popup", + left: 123, + width: 152, + height: 153, + }); + await browser.windows.create({ + type: "popup", + top: 123, + width: 153, + height: 154, + }); + await browser.windows.create({ + type: "popup", + left: screen.availWidth * 100, + top: screen.availHeight * 100, + width: 154, + height: 155, + }); + await browser.windows.create({ + type: "popup", + left: -screen.availWidth * 100, + top: -screen.availHeight * 100, + width: 155, + height: 156, + }); + browser.test.sendMessage("windows-created"); + }, + }); + + const baseWindow = await BrowserTestUtils.openNewBrowserWindow(); + baseWindow.resizeTo(150, 150); + baseWindow.moveTo(50, 50); + + let windows = []; + let windowListener = (window, topic) => { + if (topic == "domwindowopened") { + windows.push(window); + } + }; + Services.ww.registerNotification(windowListener); + + await extension.startup(); + await extension.awaitMessage("windows-created"); + await extension.unload(); + + const regularScreen = getScreenAt(0, 0, 150, 150); + const roundedX = roundCssPixcel(123, regularScreen); + const roundedY = roundCssPixcel(123, regularScreen); + + const availRectLarge = getCssAvailRect( + getScreenAt(screen.width * 100, screen.height * 100, 150, 150) + ); + const maxRight = availRectLarge.right; + const maxBottom = availRectLarge.bottom; + + const availRectSmall = getCssAvailRect( + getScreenAt(-screen.width * 100, -screen.height * 100, 150, 150150) + ); + const minLeft = availRectSmall.left; + const minTop = availRectSmall.top; + + const actualCoordinates = windows + .slice(0, 3) + .map(window => `${window.screenX},${window.screenY}`); + const offsetFromBase = 10; + const expectedCoordinates = [ + `${roundedX},${roundedY}`, + // Missing top should be +10 from the last browser window. + `${roundedX},${baseWindow.screenY + offsetFromBase}`, + // Missing left should be +10 from the last browser window. + `${baseWindow.screenX + offsetFromBase},${roundedY}`, + ]; + is( + actualCoordinates.join(" / "), + expectedCoordinates.join(" / "), + "expected popup type windows are opened at given coordinates" + ); + + const actualSizes = windows + .slice(0, 3) + .map(window => `${window.outerWidth}x${window.outerHeight}`); + const expectedSizes = [`151x152`, `152x153`, `153x154`]; + is( + actualSizes.join(" / "), + expectedSizes.join(" / "), + "expected popup type windows are opened with given size" + ); + + const actualRect = { + top: windows[4].screenY, + bottom: windows[3].screenY + windows[3].outerHeight, + left: windows[4].screenX, + right: windows[3].screenX + windows[3].outerWidth, + }; + const maxRect = { + top: minTop, + bottom: maxBottom, + left: minLeft, + right: maxRight, + }; + isRectContained(actualRect, maxRect); + + for (const window of windows) { + window.close(); + } + + Services.ww.unregisterNotification(windowListener); + windows = null; + await BrowserTestUtils.closeWindow(baseWindow); +}); -- cgit v1.2.3