summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js')
-rw-r--r--toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js203
1 files changed, 203 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js b/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js
new file mode 100644
index 0000000000..4a379edfbf
--- /dev/null
+++ b/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js
@@ -0,0 +1,203 @@
+"use strict";
+
+// This test checks whether browser.theme.getCurrent() works correctly in different
+// configurations and with different parameter.
+
+// PNG image data for a simple red dot.
+const BACKGROUND_1 =
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
+// PNG image data for the Mozilla dino head.
+const BACKGROUND_2 =
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==";
+
+add_task(async function test_get_current() {
+ let extension = ExtensionTestUtils.loadExtension({
+ async background() {
+ const ACCENT_COLOR_1 = "#a14040";
+ const TEXT_COLOR_1 = "#fac96e";
+
+ const ACCENT_COLOR_2 = "#03fe03";
+ const TEXT_COLOR_2 = "#0ef325";
+
+ const theme1 = {
+ images: {
+ theme_frame: "image1.png",
+ },
+ colors: {
+ frame: ACCENT_COLOR_1,
+ tab_background_text: TEXT_COLOR_1,
+ },
+ };
+
+ const theme2 = {
+ images: {
+ theme_frame: "image2.png",
+ },
+ colors: {
+ frame: ACCENT_COLOR_2,
+ tab_background_text: TEXT_COLOR_2,
+ },
+ };
+
+ function ensureWindowFocused(winId) {
+ browser.test.log("Waiting for focused window to be " + winId);
+ // eslint-disable-next-line no-async-promise-executor
+ return new Promise(async resolve => {
+ let listener = windowId => {
+ if (windowId === winId) {
+ browser.windows.onFocusChanged.removeListener(listener);
+ resolve();
+ }
+ };
+ // We first add a listener and then check whether the window is
+ // focused using .get(), because the .get() Promise resolving
+ // could race with the listener running, in which case we'd
+ // never be notified.
+ browser.windows.onFocusChanged.addListener(listener);
+ let { focused } = await browser.windows.get(winId);
+ if (focused) {
+ browser.windows.onFocusChanged.removeListener(listener);
+ resolve();
+ }
+ });
+ }
+
+ function testTheme1(returnedTheme) {
+ browser.test.assertTrue(
+ returnedTheme.images.theme_frame.includes("image1.png"),
+ "Theme 1 theme_frame image should be applied"
+ );
+ browser.test.assertEq(
+ ACCENT_COLOR_1,
+ returnedTheme.colors.frame,
+ "Theme 1 frame color should be applied"
+ );
+ browser.test.assertEq(
+ TEXT_COLOR_1,
+ returnedTheme.colors.tab_background_text,
+ "Theme 1 tab_background_text color should be applied"
+ );
+ }
+
+ function testTheme2(returnedTheme) {
+ browser.test.assertTrue(
+ returnedTheme.images.theme_frame.includes("image2.png"),
+ "Theme 2 theme_frame image should be applied"
+ );
+ browser.test.assertEq(
+ ACCENT_COLOR_2,
+ returnedTheme.colors.frame,
+ "Theme 2 frame color should be applied"
+ );
+ browser.test.assertEq(
+ TEXT_COLOR_2,
+ returnedTheme.colors.tab_background_text,
+ "Theme 2 tab_background_text color should be applied"
+ );
+ }
+
+ function testEmptyTheme(returnedTheme) {
+ browser.test.assertEq(
+ JSON.stringify({ colors: null, images: null, properties: null }),
+ JSON.stringify(returnedTheme),
+ JSON.stringify(returnedTheme, null, 2)
+ );
+ }
+
+ browser.test.log("Testing getCurrent() with initial unthemed window");
+ const firstWin = await browser.windows.getCurrent();
+ testEmptyTheme(await browser.theme.getCurrent());
+ testEmptyTheme(await browser.theme.getCurrent(firstWin.id));
+
+ browser.test.log("Testing getCurrent() with after theme.update()");
+ await browser.theme.update(theme1);
+ testTheme1(await browser.theme.getCurrent());
+ testTheme1(await browser.theme.getCurrent(firstWin.id));
+
+ browser.test.log(
+ "Testing getCurrent() with after theme.update(windowId)"
+ );
+ const secondWin = await browser.windows.create();
+ await ensureWindowFocused(secondWin.id);
+ await browser.theme.update(secondWin.id, theme2);
+ testTheme2(await browser.theme.getCurrent());
+ testTheme1(await browser.theme.getCurrent(firstWin.id));
+ testTheme2(await browser.theme.getCurrent(secondWin.id));
+
+ browser.test.log("Testing getCurrent() after window focus change");
+ let focusChanged = ensureWindowFocused(firstWin.id);
+ await browser.windows.update(firstWin.id, { focused: true });
+ await focusChanged;
+ testTheme1(await browser.theme.getCurrent());
+ testTheme1(await browser.theme.getCurrent(firstWin.id));
+ testTheme2(await browser.theme.getCurrent(secondWin.id));
+
+ browser.test.log(
+ "Testing getCurrent() after another window focus change"
+ );
+ focusChanged = ensureWindowFocused(secondWin.id);
+ await browser.windows.update(secondWin.id, { focused: true });
+ await focusChanged;
+ testTheme2(await browser.theme.getCurrent());
+ testTheme1(await browser.theme.getCurrent(firstWin.id));
+ testTheme2(await browser.theme.getCurrent(secondWin.id));
+
+ browser.test.log("Testing getCurrent() after theme.reset(windowId)");
+ await browser.theme.reset(firstWin.id);
+ testTheme2(await browser.theme.getCurrent());
+ testTheme1(await browser.theme.getCurrent(firstWin.id));
+ testTheme2(await browser.theme.getCurrent(secondWin.id));
+
+ browser.test.log(
+ "Testing getCurrent() after reset and window focus change"
+ );
+ focusChanged = ensureWindowFocused(firstWin.id);
+ await browser.windows.update(firstWin.id, { focused: true });
+ await focusChanged;
+ testTheme1(await browser.theme.getCurrent());
+ testTheme1(await browser.theme.getCurrent(firstWin.id));
+ testTheme2(await browser.theme.getCurrent(secondWin.id));
+
+ browser.test.log("Testing getCurrent() after theme.update(windowId)");
+ await browser.theme.update(firstWin.id, theme1);
+ testTheme1(await browser.theme.getCurrent());
+ testTheme1(await browser.theme.getCurrent(firstWin.id));
+ testTheme2(await browser.theme.getCurrent(secondWin.id));
+
+ browser.test.log("Testing getCurrent() after theme.reset()");
+ await browser.theme.reset();
+ testEmptyTheme(await browser.theme.getCurrent());
+ testEmptyTheme(await browser.theme.getCurrent(firstWin.id));
+ testEmptyTheme(await browser.theme.getCurrent(secondWin.id));
+
+ browser.test.log("Testing getCurrent() after closing a window");
+ await browser.windows.remove(secondWin.id);
+ testEmptyTheme(await browser.theme.getCurrent());
+ testEmptyTheme(await browser.theme.getCurrent(firstWin.id));
+
+ browser.test.log("Testing update calls with invalid window ID");
+ await browser.test.assertRejects(
+ browser.theme.reset(secondWin.id),
+ /Invalid window/,
+ "Invalid window should throw"
+ );
+ await browser.test.assertRejects(
+ browser.theme.update(secondWin.id, theme2),
+ /Invalid window/,
+ "Invalid window should throw"
+ );
+ browser.test.notifyPass("get_current");
+ },
+ manifest: {
+ permissions: ["theme"],
+ },
+ files: {
+ "image1.png": BACKGROUND_1,
+ "image2.png": BACKGROUND_2,
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitFinish("get_current");
+ await extension.unload();
+});