fune/browser/components/extensions/test/browser/browser_ext_windows_update.js

189 lines
6.2 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(async function() {
function promiseWaitForFocus(window) {
return new Promise(resolve => {
waitForFocus(function() {
ok(Services.focus.activeWindow === window, "correct window focused");
resolve();
}, window);
});
}
let window1 = window;
let window2 = await BrowserTestUtils.openNewBrowserWindow();
Services.focus.activeWindow = window2;
await promiseWaitForFocus(window2);
let extension = ExtensionTestUtils.loadExtension({
background: function() {
browser.windows.getAll(undefined, function(wins) {
browser.test.assertEq(wins.length, 2, "should have two windows");
// Sort the unfocused window to the lower index.
wins.sort(function(win1, win2) {
if (win1.focused === win2.focused) {
return 0;
}
return win1.focused ? 1 : -1;
});
browser.windows.update(wins[0].id, {focused: true}, function() {
browser.test.sendMessage("check");
});
});
},
});
await Promise.all([extension.startup(), extension.awaitMessage("check")]);
await promiseWaitForFocus(window1);
await extension.unload();
await BrowserTestUtils.closeWindow(window2);
});
add_task(async function testWindowUpdate() {
let extension = ExtensionTestUtils.loadExtension({
async background() {
let _checkWindowPromise;
browser.test.onMessage.addListener(msg => {
if (msg == "checked-window") {
_checkWindowPromise.resolve();
_checkWindowPromise = null;
}
});
let os;
function checkWindow(expected) {
return new Promise(resolve => {
_checkWindowPromise = {resolve};
browser.test.sendMessage("check-window", expected);
});
}
let currentWindowId;
async function updateWindow(windowId, params, expected) {
let window = await browser.windows.update(windowId, params);
browser.test.assertEq(currentWindowId, window.id, "Expected WINDOW_ID_CURRENT to refer to the same window");
for (let key of Object.keys(params)) {
if (key == "state" && os == "mac" && params.state == "normal") {
// OS-X doesn't have a hard distinction between "normal" and
// "maximized" states.
browser.test.assertTrue(window.state == "normal" || window.state == "maximized",
`Expected window.state (currently ${window.state}) to be "normal" but will accept "maximized"`);
} else {
browser.test.assertEq(params[key], window[key], `Got expected value for window.${key}`);
}
}
return checkWindow(expected);
}
try {
let windowId = browser.windows.WINDOW_ID_CURRENT;
({os} = await browser.runtime.getPlatformInfo());
let window = await browser.windows.getCurrent();
currentWindowId = window.id;
await updateWindow(windowId, {state: "maximized"}, {state: "STATE_MAXIMIZED"});
await updateWindow(windowId, {state: "minimized"}, {state: "STATE_MINIMIZED"});
await updateWindow(windowId, {state: "normal"}, {state: "STATE_NORMAL"});
await updateWindow(windowId, {state: "fullscreen"}, {state: "STATE_FULLSCREEN"});
await updateWindow(windowId, {state: "normal"}, {state: "STATE_NORMAL"});
browser.test.notifyPass("window-update");
} catch (e) {
browser.test.fail(`${e} :: ${e.stack}`);
browser.test.notifyFail("window-update");
}
},
});
extension.onMessage("check-window", expected => {
if (expected.state != null) {
let {windowState} = window;
if (window.fullScreen) {
windowState = window.STATE_FULLSCREEN;
}
// Temporarily accepting STATE_MAXIMIZED on Linux because of bug 1307759.
if (expected.state == "STATE_NORMAL" && (AppConstants.platform == "macosx" || AppConstants.platform == "linux")) {
ok(windowState == window.STATE_NORMAL || windowState == window.STATE_MAXIMIZED,
`Expected windowState (currently ${windowState}) to be STATE_NORMAL but will accept STATE_MAXIMIZED`);
} else {
is(windowState, window[expected.state],
`Expected window state to be ${expected.state}`);
}
}
extension.sendMessage("checked-window");
});
await extension.startup();
await extension.awaitFinish("window-update");
await extension.unload();
});
add_task(async function() {
let window2 = await BrowserTestUtils.openNewBrowserWindow();
let extension = ExtensionTestUtils.loadExtension({
background: function() {
browser.windows.getAll(undefined, function(wins) {
browser.test.assertEq(wins.length, 2, "should have two windows");
let unfocused = wins.find(win => !win.focused);
browser.windows.update(unfocused.id, {drawAttention: true}, function() {
browser.test.sendMessage("check");
});
});
},
});
await Promise.all([extension.startup(), extension.awaitMessage("check")]);
await extension.unload();
await BrowserTestUtils.closeWindow(window2);
});
// Tests that incompatible parameters can't be used together.
add_task(async function testWindowUpdateParams() {
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"`;
let windowId = browser.windows.WINDOW_ID_CURRENT;
await browser.test.assertRejects(
browser.windows.update(windowId, {state, [param]: 100}),
RegExp(expected),
`Got expected error for create(${param}=100`);
}
}
browser.test.notifyPass("window-update-params");
} catch (e) {
browser.test.fail(`${e} :: ${e.stack}`);
browser.test.notifyFail("window-update-params");
}
},
});
await extension.startup();
await extension.awaitFinish("window-update-params");
await extension.unload();
});