forked from mirrors/gecko-dev
Depends on D179819 Differential Revision: https://phabricator.services.mozilla.com/D179820
450 lines
11 KiB
JavaScript
450 lines
11 KiB
JavaScript
"use strict";
|
|
|
|
const { AddonSettings } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/addons/AddonSettings.sys.mjs"
|
|
);
|
|
|
|
// This test checks whether the theme experiments work
|
|
add_task(async function test_experiment_static_theme() {
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
useAddonManager: "temporary",
|
|
manifest: {
|
|
theme: {
|
|
colors: {
|
|
some_color_property: "#ff00ff",
|
|
},
|
|
images: {
|
|
some_image_property: "background.jpg",
|
|
},
|
|
properties: {
|
|
some_random_property: "no-repeat",
|
|
},
|
|
},
|
|
theme_experiment: {
|
|
colors: {
|
|
some_color_property: "--some-color-property",
|
|
},
|
|
images: {
|
|
some_image_property: "--some-image-property",
|
|
},
|
|
properties: {
|
|
some_random_property: "--some-random-property",
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
const root = window.document.documentElement;
|
|
|
|
is(
|
|
root.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
is(
|
|
root.style.getPropertyValue("--some-image-property"),
|
|
"",
|
|
"Image property should be unset"
|
|
);
|
|
is(
|
|
root.style.getPropertyValue("--some-random-property"),
|
|
"",
|
|
"Generic Property should be unset."
|
|
);
|
|
|
|
await extension.startup();
|
|
|
|
const testExperimentApplied = rootEl => {
|
|
if (AddonSettings.EXPERIMENTS_ENABLED) {
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-color-property"),
|
|
hexToCSS("#ff00ff"),
|
|
"Color property should be parsed and set."
|
|
);
|
|
ok(
|
|
rootEl.style
|
|
.getPropertyValue("--some-image-property")
|
|
.startsWith("url("),
|
|
"Image property should be parsed."
|
|
);
|
|
ok(
|
|
rootEl.style
|
|
.getPropertyValue("--some-image-property")
|
|
.endsWith("background.jpg)"),
|
|
"Image property should be set."
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-random-property"),
|
|
"no-repeat",
|
|
"Generic Property should be set."
|
|
);
|
|
} else {
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-image-property"),
|
|
"",
|
|
"Image property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-random-property"),
|
|
"",
|
|
"Generic Property should be unset."
|
|
);
|
|
}
|
|
};
|
|
|
|
info("Testing that current window updated with the experiment applied");
|
|
testExperimentApplied(root);
|
|
|
|
info("Testing that new window initialized with the experiment applied");
|
|
const newWindow = await BrowserTestUtils.openNewBrowserWindow();
|
|
const newWindowRoot = newWindow.document.documentElement;
|
|
testExperimentApplied(newWindowRoot);
|
|
|
|
await extension.unload();
|
|
|
|
info("Testing that both windows unapplied the experiment");
|
|
for (const rootEl of [root, newWindowRoot]) {
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-image-property"),
|
|
"",
|
|
"Image property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-random-property"),
|
|
"",
|
|
"Generic Property should be unset."
|
|
);
|
|
}
|
|
await BrowserTestUtils.closeWindow(newWindow);
|
|
});
|
|
|
|
add_task(async function test_experiment_dynamic_theme() {
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
useAddonManager: "temporary",
|
|
manifest: {
|
|
permissions: ["theme"],
|
|
theme_experiment: {
|
|
colors: {
|
|
some_color_property: "--some-color-property",
|
|
},
|
|
images: {
|
|
some_image_property: "--some-image-property",
|
|
},
|
|
properties: {
|
|
some_random_property: "--some-random-property",
|
|
},
|
|
},
|
|
},
|
|
background() {
|
|
const theme = {
|
|
colors: {
|
|
some_color_property: "#ff00ff",
|
|
},
|
|
images: {
|
|
some_image_property: "background.jpg",
|
|
},
|
|
properties: {
|
|
some_random_property: "no-repeat",
|
|
},
|
|
};
|
|
browser.test.onMessage.addListener(msg => {
|
|
if (msg === "update-theme") {
|
|
browser.theme.update(theme).then(() => {
|
|
browser.test.sendMessage("theme-updated");
|
|
});
|
|
} else {
|
|
browser.theme.reset().then(() => {
|
|
browser.test.sendMessage("theme-reset");
|
|
});
|
|
}
|
|
});
|
|
},
|
|
});
|
|
|
|
await extension.startup();
|
|
|
|
const root = window.document.documentElement;
|
|
|
|
is(
|
|
root.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
is(
|
|
root.style.getPropertyValue("--some-image-property"),
|
|
"",
|
|
"Image property should be unset"
|
|
);
|
|
is(
|
|
root.style.getPropertyValue("--some-random-property"),
|
|
"",
|
|
"Generic Property should be unset."
|
|
);
|
|
|
|
extension.sendMessage("update-theme");
|
|
await extension.awaitMessage("theme-updated");
|
|
|
|
const testExperimentApplied = rootEl => {
|
|
if (AddonSettings.EXPERIMENTS_ENABLED) {
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-color-property"),
|
|
hexToCSS("#ff00ff"),
|
|
"Color property should be parsed and set."
|
|
);
|
|
ok(
|
|
rootEl.style
|
|
.getPropertyValue("--some-image-property")
|
|
.startsWith("url("),
|
|
"Image property should be parsed."
|
|
);
|
|
ok(
|
|
rootEl.style
|
|
.getPropertyValue("--some-image-property")
|
|
.endsWith("background.jpg)"),
|
|
"Image property should be set."
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-random-property"),
|
|
"no-repeat",
|
|
"Generic Property should be set."
|
|
);
|
|
} else {
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-image-property"),
|
|
"",
|
|
"Image property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-random-property"),
|
|
"",
|
|
"Generic Property should be unset."
|
|
);
|
|
}
|
|
};
|
|
testExperimentApplied(root);
|
|
|
|
const newWindow = await BrowserTestUtils.openNewBrowserWindow();
|
|
const newWindowRoot = newWindow.document.documentElement;
|
|
|
|
testExperimentApplied(newWindowRoot);
|
|
|
|
extension.sendMessage("reset-theme");
|
|
await extension.awaitMessage("theme-reset");
|
|
|
|
for (const rootEl of [root, newWindowRoot]) {
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-image-property"),
|
|
"",
|
|
"Image property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-random-property"),
|
|
"",
|
|
"Generic Property should be unset."
|
|
);
|
|
}
|
|
|
|
extension.sendMessage("update-theme");
|
|
await extension.awaitMessage("theme-updated");
|
|
|
|
testExperimentApplied(root);
|
|
testExperimentApplied(newWindowRoot);
|
|
|
|
await extension.unload();
|
|
|
|
for (const rootEl of [root, newWindowRoot]) {
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-image-property"),
|
|
"",
|
|
"Image property should be unset"
|
|
);
|
|
is(
|
|
rootEl.style.getPropertyValue("--some-random-property"),
|
|
"",
|
|
"Generic Property should be unset."
|
|
);
|
|
}
|
|
|
|
await BrowserTestUtils.closeWindow(newWindow);
|
|
});
|
|
|
|
add_task(async function test_experiment_stylesheet() {
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
useAddonManager: "temporary",
|
|
manifest: {
|
|
theme: {
|
|
colors: {
|
|
menu_button_background: "#ff00ff",
|
|
},
|
|
},
|
|
theme_experiment: {
|
|
stylesheet: "experiment.css",
|
|
colors: {
|
|
menu_button_background: "--menu-button-background",
|
|
},
|
|
},
|
|
},
|
|
files: {
|
|
"experiment.css": `#PanelUI-menu-button {
|
|
background-color: var(--menu-button-background);
|
|
fill: white;
|
|
}`,
|
|
},
|
|
});
|
|
|
|
const root = window.document.documentElement;
|
|
const menuButton = document.getElementById("PanelUI-menu-button");
|
|
const computedStyle = window.getComputedStyle(menuButton);
|
|
const expectedColor = hexToCSS("#ff00ff");
|
|
const expectedFill = hexToCSS("#ffffff");
|
|
|
|
is(
|
|
root.style.getPropertyValue("--menu-button-background"),
|
|
"",
|
|
"Variable should be unset"
|
|
);
|
|
isnot(
|
|
computedStyle.backgroundColor,
|
|
expectedColor,
|
|
"Menu button should not have custom background"
|
|
);
|
|
isnot(
|
|
computedStyle.fill,
|
|
expectedFill,
|
|
"Menu button should not have stylesheet fill"
|
|
);
|
|
|
|
await extension.startup();
|
|
|
|
if (AddonSettings.EXPERIMENTS_ENABLED) {
|
|
// Wait for stylesheet load.
|
|
await BrowserTestUtils.waitForCondition(
|
|
() => computedStyle.fill === expectedFill
|
|
);
|
|
|
|
is(
|
|
root.style.getPropertyValue("--menu-button-background"),
|
|
expectedColor,
|
|
"Variable should be parsed and set."
|
|
);
|
|
is(
|
|
computedStyle.backgroundColor,
|
|
expectedColor,
|
|
"Menu button should be have correct background"
|
|
);
|
|
is(
|
|
computedStyle.fill,
|
|
expectedFill,
|
|
"Menu button should be have correct fill"
|
|
);
|
|
} else {
|
|
is(
|
|
root.style.getPropertyValue("--menu-button-background"),
|
|
"",
|
|
"Variable should be unset"
|
|
);
|
|
isnot(
|
|
computedStyle.backgroundColor,
|
|
expectedColor,
|
|
"Menu button should not have custom background"
|
|
);
|
|
isnot(
|
|
computedStyle.fill,
|
|
expectedFill,
|
|
"Menu button should not have stylesheet fill"
|
|
);
|
|
}
|
|
|
|
await extension.unload();
|
|
|
|
is(
|
|
root.style.getPropertyValue("--menu-button-background"),
|
|
"",
|
|
"Variable should be unset"
|
|
);
|
|
isnot(
|
|
computedStyle.backgroundColor,
|
|
expectedColor,
|
|
"Menu button should not have custom background"
|
|
);
|
|
isnot(
|
|
computedStyle.fill,
|
|
expectedFill,
|
|
"Menu button should not have stylesheet fill"
|
|
);
|
|
});
|
|
|
|
// This test checks whether the theme experiments are allowed for non privileged
|
|
// theme installed non-temporarily if AddonSettings.EXPERIMENTS_ENABLED is true.
|
|
add_task(async function test_experiment_installed_non_temporarily() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["extensions.experiments.enabled", true]],
|
|
});
|
|
|
|
if (!AddonSettings.EXPERIMENTS_ENABLED) {
|
|
info(
|
|
"Skipping test case on build where AddonSettings.EXPERIMENTS_ENABLED is false"
|
|
);
|
|
return;
|
|
}
|
|
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
manifest: {
|
|
theme: {
|
|
colors: {
|
|
some_color_property: "#ff00ff",
|
|
},
|
|
},
|
|
theme_experiment: {
|
|
colors: {
|
|
some_color_property: "--some-color-property",
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
const root = window.document.documentElement;
|
|
|
|
is(
|
|
root.style.getPropertyValue("--some-color-property"),
|
|
"",
|
|
"Color property should be unset"
|
|
);
|
|
|
|
await extension.startup();
|
|
|
|
is(
|
|
root.style.getPropertyValue("--some-color-property"),
|
|
hexToCSS("#ff00ff"),
|
|
"Color property should be parsed and set."
|
|
);
|
|
|
|
await extension.unload();
|
|
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|