summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_browserAction_context.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_browserAction_context.js398
1 files changed, 398 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_browserAction_context.js b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
new file mode 100644
index 000000000..8a26dbb3c
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js
@@ -0,0 +1,398 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+function* runTests(options) {
+ async function background(getTests) {
+ async function checkDetails(expecting, tabId) {
+ let title = await browser.browserAction.getTitle({tabId});
+ browser.test.assertEq(expecting.title, title,
+ "expected value from getTitle");
+
+ let popup = await browser.browserAction.getPopup({tabId});
+ browser.test.assertEq(expecting.popup, popup,
+ "expected value from getPopup");
+
+ let badge = await browser.browserAction.getBadgeText({tabId});
+ browser.test.assertEq(expecting.badge, badge,
+ "expected value from getBadge");
+
+ let badgeBackgroundColor = await browser.browserAction.getBadgeBackgroundColor({tabId});
+ browser.test.assertEq(String(expecting.badgeBackgroundColor),
+ String(badgeBackgroundColor),
+ "expected value from getBadgeBackgroundColor");
+ }
+
+ let expectDefaults = expecting => {
+ return checkDetails(expecting);
+ };
+
+ let tabs = [];
+ let tests = getTests(tabs, expectDefaults);
+
+ {
+ let tabId = 0xdeadbeef;
+ let calls = [
+ () => browser.browserAction.enable(tabId),
+ () => browser.browserAction.disable(tabId),
+ () => browser.browserAction.setTitle({tabId, title: "foo"}),
+ () => browser.browserAction.setIcon({tabId, path: "foo.png"}),
+ () => browser.browserAction.setPopup({tabId, popup: "foo.html"}),
+ () => browser.browserAction.setBadgeText({tabId, text: "foo"}),
+ () => browser.browserAction.setBadgeBackgroundColor({tabId, color: [0xff, 0, 0, 0xff]}),
+ ];
+
+ for (let call of calls) {
+ await browser.test.assertRejects(
+ new Promise(resolve => resolve(call())),
+ RegExp(`Invalid tab ID: ${tabId}`),
+ "Expected invalid tab ID error");
+ }
+ }
+
+ // Runs the next test in the `tests` array, checks the results,
+ // and passes control back to the outer test scope.
+ function nextTest() {
+ let test = tests.shift();
+
+ test(async expecting => {
+ // Check that the API returns the expected values, and then
+ // run the next test.
+ let tabs = await browser.tabs.query({active: true, currentWindow: true});
+ await checkDetails(expecting, tabs[0].id);
+
+ // Check that the actual icon has the expected values, then
+ // run the next test.
+ browser.test.sendMessage("nextTest", expecting, tests.length);
+ });
+ }
+
+ browser.test.onMessage.addListener((msg) => {
+ if (msg != "runNextTest") {
+ browser.test.fail("Expecting 'runNextTest' message");
+ }
+
+ nextTest();
+ });
+
+ browser.tabs.query({active: true, currentWindow: true}, resultTabs => {
+ tabs[0] = resultTabs[0].id;
+
+ nextTest();
+ });
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: options.manifest,
+
+ files: options.files || {},
+
+ background: `(${background})(${options.getTests})`,
+ });
+
+ let browserActionId;
+ function checkDetails(details) {
+ if (!browserActionId) {
+ browserActionId = `${makeWidgetId(extension.id)}-browser-action`;
+ }
+
+ let button = document.getElementById(browserActionId);
+
+ ok(button, "button exists");
+
+ let title = details.title || options.manifest.name;
+
+ is(getListStyleImage(button), details.icon, "icon URL is correct");
+ is(button.getAttribute("tooltiptext"), title, "image title is correct");
+ is(button.getAttribute("label"), title, "image label is correct");
+ is(button.getAttribute("badge"), details.badge, "badge text is correct");
+ is(button.getAttribute("disabled") == "true", Boolean(details.disabled), "disabled state is correct");
+
+ if (details.badge && details.badgeBackgroundColor) {
+ let badge = button.ownerDocument.getAnonymousElementByAttribute(
+ button, "class", "toolbarbutton-badge");
+
+ let badgeColor = window.getComputedStyle(badge).backgroundColor;
+ let color = details.badgeBackgroundColor;
+ let expectedColor = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
+
+ is(badgeColor, expectedColor, "badge color is correct");
+ }
+
+
+ // TODO: Popup URL.
+ }
+
+ let awaitFinish = new Promise(resolve => {
+ extension.onMessage("nextTest", (expecting, testsRemaining) => {
+ checkDetails(expecting);
+
+ if (testsRemaining) {
+ extension.sendMessage("runNextTest");
+ } else {
+ resolve();
+ }
+ });
+ });
+
+ yield extension.startup();
+
+ yield awaitFinish;
+
+ yield extension.unload();
+}
+
+add_task(function* testTabSwitchContext() {
+ yield runTests({
+ manifest: {
+ "browser_action": {
+ "default_icon": "default.png",
+ "default_popup": "__MSG_popup__",
+ "default_title": "Default __MSG_title__",
+ },
+
+ "default_locale": "en",
+
+ "permissions": ["tabs"],
+ },
+
+ "files": {
+ "_locales/en/messages.json": {
+ "popup": {
+ "message": "default.html",
+ "description": "Popup",
+ },
+
+ "title": {
+ "message": "Title",
+ "description": "Title",
+ },
+ },
+
+ "default.png": imageBuffer,
+ "default-2.png": imageBuffer,
+ "1.png": imageBuffer,
+ "2.png": imageBuffer,
+ },
+
+ getTests(tabs, expectDefaults) {
+ const DEFAULT_BADGE_COLOR = [0xd9, 0, 0, 255];
+
+ let details = [
+ {"icon": browser.runtime.getURL("default.png"),
+ "popup": browser.runtime.getURL("default.html"),
+ "title": "Default Title",
+ "badge": "",
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR},
+ {"icon": browser.runtime.getURL("1.png"),
+ "popup": browser.runtime.getURL("default.html"),
+ "title": "Default Title",
+ "badge": "",
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR},
+ {"icon": browser.runtime.getURL("2.png"),
+ "popup": browser.runtime.getURL("2.html"),
+ "title": "Title 2",
+ "badge": "2",
+ "badgeBackgroundColor": [0xff, 0, 0, 0xff],
+ "disabled": true},
+ {"icon": browser.runtime.getURL("1.png"),
+ "popup": browser.runtime.getURL("default-2.html"),
+ "title": "Default Title 2",
+ "badge": "d2",
+ "badgeBackgroundColor": [0, 0xff, 0, 0xff],
+ "disabled": true},
+ {"icon": browser.runtime.getURL("1.png"),
+ "popup": browser.runtime.getURL("default-2.html"),
+ "title": "Default Title 2",
+ "badge": "d2",
+ "badgeBackgroundColor": [0, 0xff, 0, 0xff],
+ "disabled": false},
+ {"icon": browser.runtime.getURL("default-2.png"),
+ "popup": browser.runtime.getURL("default-2.html"),
+ "title": "Default Title 2",
+ "badge": "d2",
+ "badgeBackgroundColor": [0, 0xff, 0, 0xff]},
+ ];
+
+ return [
+ async expect => {
+ browser.test.log("Initial state, expect default properties.");
+
+ await expectDefaults(details[0]);
+ expect(details[0]);
+ },
+ async expect => {
+ browser.test.log("Change the icon in the current tab. Expect default properties excluding the icon.");
+ browser.browserAction.setIcon({tabId: tabs[0], path: "1.png"});
+
+ await expectDefaults(details[0]);
+ expect(details[1]);
+ },
+ async expect => {
+ browser.test.log("Create a new tab. Expect default properties.");
+ let tab = await browser.tabs.create({active: true, url: "about:blank?0"});
+ tabs.push(tab.id);
+
+ await expectDefaults(details[0]);
+ expect(details[0]);
+ },
+ async expect => {
+ browser.test.log("Change properties. Expect new properties.");
+ let tabId = tabs[1];
+ browser.browserAction.setIcon({tabId, path: "2.png"});
+ browser.browserAction.setPopup({tabId, popup: "2.html"});
+ browser.browserAction.setTitle({tabId, title: "Title 2"});
+ browser.browserAction.setBadgeText({tabId, text: "2"});
+ browser.browserAction.setBadgeBackgroundColor({tabId, color: "#ff0000"});
+ browser.browserAction.disable(tabId);
+
+ await expectDefaults(details[0]);
+ expect(details[2]);
+ },
+ expect => {
+ browser.test.log("Navigate to a new page. Expect no changes.");
+
+ // TODO: This listener should not be necessary, but the |tabs.update|
+ // callback currently fires too early in e10s windows.
+ browser.tabs.onUpdated.addListener(function listener(tabId, changed) {
+ if (tabId == tabs[1] && changed.url) {
+ browser.tabs.onUpdated.removeListener(listener);
+ expect(details[2]);
+ }
+ });
+
+ browser.tabs.update(tabs[1], {url: "about:blank?1"});
+ },
+ async expect => {
+ browser.test.log("Switch back to the first tab. Expect previously set properties.");
+ await browser.tabs.update(tabs[0], {active: true});
+ expect(details[1]);
+ },
+ async expect => {
+ browser.test.log("Change default values, expect those changes reflected.");
+ browser.browserAction.setIcon({path: "default-2.png"});
+ browser.browserAction.setPopup({popup: "default-2.html"});
+ browser.browserAction.setTitle({title: "Default Title 2"});
+ browser.browserAction.setBadgeText({text: "d2"});
+ browser.browserAction.setBadgeBackgroundColor({color: [0, 0xff, 0, 0xff]});
+ browser.browserAction.disable();
+
+ await expectDefaults(details[3]);
+ expect(details[3]);
+ },
+ async expect => {
+ browser.test.log("Re-enable by default. Expect enabled.");
+ browser.browserAction.enable();
+
+ await expectDefaults(details[4]);
+ expect(details[4]);
+ },
+ async expect => {
+ browser.test.log("Switch back to tab 2. Expect former value, unaffected by changes to defaults in previous step.");
+ await browser.tabs.update(tabs[1], {active: true});
+
+ await expectDefaults(details[3]);
+ expect(details[2]);
+ },
+ async expect => {
+ browser.test.log("Delete tab, switch back to tab 1. Expect previous results again.");
+ await browser.tabs.remove(tabs[1]);
+ expect(details[4]);
+ },
+ async expect => {
+ browser.test.log("Create a new tab. Expect new default properties.");
+ let tab = await browser.tabs.create({active: true, url: "about:blank?2"});
+ tabs.push(tab.id);
+ expect(details[5]);
+ },
+ async expect => {
+ browser.test.log("Delete tab.");
+ await browser.tabs.remove(tabs[2]);
+ expect(details[4]);
+ },
+ ];
+ },
+ });
+});
+
+add_task(function* testDefaultTitle() {
+ yield runTests({
+ manifest: {
+ "name": "Foo Extension",
+
+ "browser_action": {
+ "default_icon": "icon.png",
+ },
+
+ "permissions": ["tabs"],
+ },
+
+ files: {
+ "icon.png": imageBuffer,
+ },
+
+ getTests(tabs, expectDefaults) {
+ const DEFAULT_BADGE_COLOR = [0xd9, 0, 0, 255];
+
+ let details = [
+ {"title": "Foo Extension",
+ "popup": "",
+ "badge": "",
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
+ "icon": browser.runtime.getURL("icon.png")},
+ {"title": "Foo Title",
+ "popup": "",
+ "badge": "",
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
+ "icon": browser.runtime.getURL("icon.png")},
+ {"title": "Bar Title",
+ "popup": "",
+ "badge": "",
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
+ "icon": browser.runtime.getURL("icon.png")},
+ {"title": "",
+ "popup": "",
+ "badge": "",
+ "badgeBackgroundColor": DEFAULT_BADGE_COLOR,
+ "icon": browser.runtime.getURL("icon.png")},
+ ];
+
+ return [
+ async expect => {
+ browser.test.log("Initial state. Expect extension title as default title.");
+
+ await expectDefaults(details[0]);
+ expect(details[0]);
+ },
+ async expect => {
+ browser.test.log("Change the title. Expect new title.");
+ browser.browserAction.setTitle({tabId: tabs[0], title: "Foo Title"});
+
+ await expectDefaults(details[0]);
+ expect(details[1]);
+ },
+ async expect => {
+ browser.test.log("Change the default. Expect same properties.");
+ browser.browserAction.setTitle({title: "Bar Title"});
+
+ await expectDefaults(details[2]);
+ expect(details[1]);
+ },
+ async expect => {
+ browser.test.log("Clear the title. Expect new default title.");
+ browser.browserAction.setTitle({tabId: tabs[0], title: ""});
+
+ await expectDefaults(details[2]);
+ expect(details[2]);
+ },
+ async expect => {
+ browser.test.log("Set default title to null string. Expect null string from API, extension title in UI.");
+ browser.browserAction.setTitle({title: ""});
+
+ await expectDefaults(details[3]);
+ expect(details[3]);
+ },
+ ];
+ },
+ });
+});