# HG changeset patch # User Luca Greco Bug 1227462 - Test tabs.update URLs. r=kmag --- .../test/browser/browser_ext_tabs_update.js | 154 +++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_update.js b/browser/components/extensions/test/browser/browser_ext_tabs_update.js index 8e56a74..1c59bc5 100644 --- a/browser/components/extensions/test/browser/browser_ext_tabs_update.js +++ b/browser/components/extensions/test/browser/browser_ext_tabs_update.js @@ -38,8 +38,162 @@ add_task(function* () { ok(gBrowser.selectedTab == tab2, "correct tab selected"); yield extension.unload(); yield BrowserTestUtils.removeTab(tab1); yield BrowserTestUtils.removeTab(tab2); }); + +Components.utils.import("resource://gre/modules/Services.jsm"); +let ConsoleAPIStorage = Components.classes["@mozilla.org/consoleAPI-storage;1"] + .getService(Components.interfaces.nsIConsoleAPIStorage); + +function* testTabsUpdateURL(existentTabURL, tabsUpdateURL) { + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + "backgound": { scripts: ["background.js"] }, + "permissions": ["tabs"], + "webAccessibleResources": [ "tab.html" ], + }, + + files: { + "tab.html": ` + + + + + + +

tab page

+ + + `, + }, + background: function() { + browser.test.sendMessage("ready", browser.runtime.getURL("tab.html")); + browser.test.onMessage.addListener((msg, tabsUpdateURL) => { + browser.tabs.query({ lastFocusedWindow: true }, function(tabs) { + let updates = []; + + for (let tab of tabs.slice(1)) { + updates.push(new Promise((resolve, reject) => { + browser.tabs.update(tab.id, { + url: tabsUpdateURL, + }, resolve); + })); + } + + Promise.all(updates).then(() => { + browser.test.sendMessage("done"); + }); + }); + }); + }, + }); + + yield extension.startup(); + + let mozExtTabURL = yield extension.awaitMessage("ready"); + + if (existentTabURL == "self") { + existentTabURL = mozExtTabURL; + } + + if (tabsUpdateURL == "self") { + tabsUpdateURL = mozExtTabURL; + } + + info(`tab.update URL "${tabsUpdateURL}" on tab with URL "${existentTabURL}"`); + + let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, existentTabURL); + gBrowser.selectedTab = tab1; + + extension.sendMessage("start", tabsUpdateURL); + yield extension.awaitMessage("done"); + + yield BrowserTestUtils.removeTab(tab1); + yield extension.unload(); + + let errors = Services.console.getMessageArray() || []; + + Services.console.reset(); + ConsoleAPIStorage.clearEvents(); + + return errors; +} + +add_task(function* () { + info("Start testing tabs.update on javascript URLs"); + + let errorRegExp = /Permission denied on tabs.update/; + + let dataURLPage = ` + data:text/html, + + + + + +

data url page

+ + `; + + let existentTabURLList = [ + "http://example.net", "self", "about:blank", "about:robots", "about:addons", dataURLPage, + ]; + + let checkList = [ + { + tabsUpdateURL: "http://example.net", + expectedError: false, + }, + { + tabsUpdateURL: "self", + expectedError: false, + }, + { + tabsUpdateURL: "about:blank", + expectedError: false, + }, + { + tabsUpdateURL: "about:robots", + expectedError: false, + }, + { + tabsUpdateURL: "about:addons", + expectedError: true, + }, + { + tabsUpdateURL: "javascript:console.log('tabs.update execute javascript')", + expectedError: true, + }, + { + tabsUpdateURL: dataURLPage, + expectedError: true, + }, + ]; + + let testCases = existentTabURLList.reduce((acc, existentTabURL) => { + let testSet = checkList + .map((check) => Object.assign({}, check, { existentTabURL })) + .filter(el => el.tabsUpdateURL != el.existentTabURL); + + return acc.concat(testSet); + }, []); + + for (let { existentTabURL, tabsUpdateURL, expectedError } of testCases) { + let errors = yield* testTabsUpdateURL(existentTabURL, tabsUpdateURL); + + let errorCount = errors.filter((error) => errorRegExp.test(error)).length; + + let msg = `should be logged on update a "${existentTabURL}" tab with an "${tabsUpdateURL}" url`; + + if (expectedError) { + is(errorCount, 1, `An error ${msg}`); + } else { + is(errorCount, 0, `No errors ${msg}`); + } + } + + info("done"); +});