From 29636e2d6e9259a4d3b5f1d96eed4e12fffa12e9 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sun, 15 Nov 2015 02:01:44 -0800 Subject: [PATCH] Bug 1190321: [webext] Complete test coverage for the browserAction API. r=gabor --HG-- rename : browser/components/extensions/test/browser/browser_ext_pageAction_popup.js => browser/components/extensions/test/browser/browser_ext_browserAction_popup.js extra : commitid : KNrOPlO2bOP extra : rebase_source : 367ab2d367b76512485920a17c8f979b0668beb3 extra : histedit_source : 2d114fc7778b21a9e5cd085a1b78d21b172376bd --- .../extensions/test/browser/browser.ini | 1 + .../browser_ext_browserAction_context.js | 86 ++++++---- .../browser_ext_browserAction_popup.js | 147 ++++++++++++++++++ 3 files changed, 201 insertions(+), 33 deletions(-) create mode 100644 browser/components/extensions/test/browser/browser_ext_browserAction_popup.js diff --git a/browser/components/extensions/test/browser/browser.ini b/browser/components/extensions/test/browser/browser.ini index 796101df104b9c..38a9b5d5fba92f 100644 --- a/browser/components/extensions/test/browser/browser.ini +++ b/browser/components/extensions/test/browser/browser.ini @@ -14,6 +14,7 @@ support-files = [browser_ext_browserAction_disabled.js] [browser_ext_pageAction_context.js] [browser_ext_pageAction_popup.js] +[browser_ext_browserAction_popup.js] [browser_ext_contextMenus.js] [browser_ext_getViews.js] [browser_ext_tabs_executeScript.js] diff --git a/browser/components/extensions/test/browser/browser_ext_browserAction_context.js b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js index 77a7348c712205..74bc7dd76baa06 100644 --- a/browser/components/extensions/test/browser/browser_ext_browserAction_context.js +++ b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js @@ -56,18 +56,24 @@ add_task(function* testTabSwitchContext() { var tests = [ expect => { browser.test.log("Initial state, expect default properties."); - expect(details[0]); + expectDefaults(details[0]).then(() => { + expect(details[0]); + }); }, 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" }); - expect(details[1]); + expectDefaults(details[0]).then(() => { + expect(details[1]); + }); }, expect => { browser.test.log("Create a new tab. Expect default properties."); browser.tabs.create({ active: true, url: "about:blank?0" }, tab => { tabs.push(tab.id); - expect(details[0]); + expectDefaults(details[0]).then(() => { + expect(details[0]); + }); }); }, expect => { @@ -80,7 +86,9 @@ add_task(function* testTabSwitchContext() { browser.browserAction.setBadgeBackgroundColor({ tabId, color: [0xff, 0, 0] }); browser.browserAction.disable(tabId); - expect(details[2]); + expectDefaults(details[0]).then(() => { + expect(details[2]); + }); }, expect => { browser.test.log("Navigate to a new page. Expect no changes."); @@ -110,17 +118,23 @@ add_task(function* testTabSwitchContext() { browser.browserAction.setBadgeText({ text: "d2" }); browser.browserAction.setBadgeBackgroundColor({ color: [0, 0xff, 0] }); browser.browserAction.disable(); - expect(details[3]); + expectDefaults(details[3]).then(() => { + expect(details[3]); + }); }, expect => { browser.test.log("Re-enable by default. Expect enabled."); browser.browserAction.enable(); - expect(details[4]); + expectDefaults(details[4]).then(() => { + expect(details[4]); + }); }, expect => { browser.test.log("Switch back to tab 2. Expect former value, unaffected by changes to defaults in previous step."); browser.tabs.update(tabs[1], { active: true }, () => { - expect(details[2]); + expectDefaults(details[3]).then(() => { + expect(details[2]); + }); }); }, expect => { @@ -146,18 +160,13 @@ add_task(function* testTabSwitchContext() { // Gets the current details of the browser action, and returns a // promise that resolves to an object containing them. - function getDetails() { - return new Promise(resolve => { - return browser.tabs.query({ active: true, currentWindow: true }, resolve); - }).then(tabs => { - var tabId = tabs[0].id; - - return Promise.all([ - new Promise(resolve => browser.browserAction.getTitle({tabId}, resolve)), - new Promise(resolve => browser.browserAction.getPopup({tabId}, resolve)), - new Promise(resolve => browser.browserAction.getBadgeText({tabId}, resolve)), - new Promise(resolve => browser.browserAction.getBadgeBackgroundColor({tabId}, resolve))]) - }).then(details => { + function getDetails(tabId) { + return Promise.all([ + new Promise(resolve => browser.browserAction.getTitle({tabId}, resolve)), + new Promise(resolve => browser.browserAction.getPopup({tabId}, resolve)), + new Promise(resolve => browser.browserAction.getBadgeText({tabId}, resolve)), + new Promise(resolve => browser.browserAction.getBadgeBackgroundColor({tabId}, resolve))] + ).then(details => { return Promise.resolve({ title: details[0], popup: details[1], badge: details[2], @@ -165,6 +174,26 @@ add_task(function* testTabSwitchContext() { }); } + function checkDetails(expecting, tabId) { + return getDetails(tabId).then(details => { + browser.test.assertEq(expecting.title, details.title, + "expected value from getTitle"); + + browser.test.assertEq(expecting.popup, details.popup, + "expected value from getPopup"); + + browser.test.assertEq(expecting.badge, details.badge, + "expected value from getBadge"); + + browser.test.assertEq(String(expecting.badgeBackgroundColor), + String(details.badgeBackgroundColor), + "expected value from getBadgeBackgroundColor"); + }); + } + + function expectDefaults(expecting) { + return checkDetails(expecting); + } // Runs the next test in the `tests` array, checks the results, // and passes control back to the outer test scope. @@ -174,20 +203,11 @@ add_task(function* testTabSwitchContext() { test(expecting => { // Check that the API returns the expected values, and then // run the next test. - getDetails().then(details => { - browser.test.assertEq(expecting.title, details.title, - "expected value from getTitle"); - - browser.test.assertEq(expecting.popup, details.popup, - "expected value from getPopup"); - - browser.test.assertEq(expecting.badge, details.badge, - "expected value from getBadge"); - - browser.test.assertEq(String(expecting.badgeBackgroundColor), - String(details.badgeBackgroundColor), - "expected value from getBadgeBackgroundColor"); - + new Promise(resolve => { + return browser.tabs.query({ active: true, currentWindow: true }, resolve); + }).then(tabs => { + return checkDetails(expecting, tabs[0].id); + }).then(() => { // Check that the actual icon has the expected values, then // run the next test. browser.test.sendMessage("nextTest", expecting, tests.length); diff --git a/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js b/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js new file mode 100644 index 00000000000000..9b0a542c403ba5 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js @@ -0,0 +1,147 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +function promisePopupShown(popup) { + return new Promise(resolve => { + if (popup.popupOpen) { + resolve(); + } else { + let onPopupShown = event => { + popup.removeEventListener("popupshown", onPopupShown); + resolve(); + }; + popup.addEventListener("popupshown", onPopupShown); + } + }); +} + +add_task(function* testPageActionPopup() { + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "background": { + "page": "data/background.html" + }, + "browser_action": { + "default_popup": "popup-a.html" + } + }, + + files: { + "popup-a.html": ``, + "popup-a.js": function() { + browser.runtime.sendMessage("from-popup-a"); + }, + + "data/popup-b.html": ``, + "data/popup-b.js": function() { + browser.runtime.sendMessage("from-popup-b"); + }, + + "data/background.html": ``, + + "data/background.js": function() { + var tests = [ + () => { + sendClick({ expectEvent: false, expectPopup: "a" }); + }, + () => { + sendClick({ expectEvent: false, expectPopup: "a" }); + }, + () => { + browser.browserAction.setPopup({ popup: "popup-b.html" }); + sendClick({ expectEvent: false, expectPopup: "b" }); + }, + () => { + sendClick({ expectEvent: false, expectPopup: "b" }); + }, + () => { + browser.browserAction.setPopup({ popup: "" }); + sendClick({ expectEvent: true, expectPopup: null }); + }, + () => { + sendClick({ expectEvent: true, expectPopup: null }); + }, + () => { + browser.browserAction.setPopup({ popup: "/popup-a.html" }); + sendClick({ expectEvent: false, expectPopup: "a" }); + }, + ]; + + var expect = {}; + function sendClick({ expectEvent, expectPopup }) { + expect = { event: expectEvent, popup: expectPopup }; + browser.test.sendMessage("send-click"); + } + + browser.runtime.onMessage.addListener(msg => { + if (expect.popup) { + browser.test.assertEq(msg, `from-popup-${expect.popup}`, + "expected popup opened"); + } else { + browser.test.fail("unexpected popup"); + } + + expect.popup = null; + browser.test.sendMessage("next-test"); + }); + + browser.browserAction.onClicked.addListener(() => { + if (expect.event) { + browser.test.succeed("expected click event received"); + } else { + browser.test.fail("unexpected click event"); + } + + expect.event = false; + browser.test.sendMessage("next-test"); + }); + + browser.test.onMessage.addListener((msg) => { + if (msg != "next-test") { + browser.test.fail("Expecting 'next-test' message"); + } + + if (tests.length) { + var test = tests.shift(); + test(); + } else { + browser.test.notifyPass("browseraction-tests-done"); + } + }); + + browser.test.sendMessage("next-test"); + }, + }, + }); + + let browserActionId = makeWidgetId(extension.id) + "-browser-action"; + let panelId = makeWidgetId(extension.id) + "-panel"; + + extension.onMessage("send-click", () => { + let button = document.getElementById(browserActionId); + + EventUtils.synthesizeMouseAtCenter(button, {}, window); + }); + + extension.onMessage("next-test", Task.async(function* () { + let panel = document.getElementById(panelId); + if (panel) { + yield promisePopupShown(panel); + panel.hidePopup(); + + panel = document.getElementById(panelId); + is(panel, undefined, "panel successfully removed from document after hiding"); + } + + extension.sendMessage("next-test"); + })); + + + yield Promise.all([extension.startup(), extension.awaitFinish("browseraction-tests-done")]); + + yield extension.unload(); + + let panel = document.getElementById(panelId); + is(panel, undefined, "browserAction panel removed from document"); +});