diff --git a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm index 5f7f47ea1263..fd6bf2ce37b2 100644 --- a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm +++ b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm @@ -476,6 +476,8 @@ this.BrowserTestUtils = { * event is the expected one, or false if it should be ignored and * listening should continue. If not specified, the first event with * the specified name resolves the returned promise. + * @param {bool} wantsUntrusted [optional] + * True to receive synthetic events dispatched by web content. * * @note Because this function is intended for testing, any error in checkFn * will cause the returned promise to be rejected instead of waiting for @@ -484,7 +486,7 @@ this.BrowserTestUtils = { * @returns {Promise} * @resolves The Event object. */ - waitForEvent(subject, eventName, capture, checkFn) { + waitForEvent(subject, eventName, capture, checkFn, wantsUntrusted) { return new Promise((resolve, reject) => { subject.addEventListener(eventName, function listener(event) { try { @@ -501,7 +503,7 @@ this.BrowserTestUtils = { } reject(ex); } - }, capture); + }, capture, wantsUntrusted); }); }, diff --git a/toolkit/mozapps/extensions/test/browser/browser-common.ini b/toolkit/mozapps/extensions/test/browser/browser-common.ini index 835f2923470a..b10b410b8943 100644 --- a/toolkit/mozapps/extensions/test/browser/browser-common.ini +++ b/toolkit/mozapps/extensions/test/browser/browser-common.ini @@ -67,4 +67,4 @@ skip-if = os == 'win' # Disabled on Windows due to intermittent failures (bug 11 [browser_pluginprefs.js] skip-if = buildapp == 'mulet' [browser_CTP_plugins.js] -skip-if = buildapp == 'mulet' || e10s +skip-if = buildapp == 'mulet' diff --git a/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js b/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js index aef5cbe76d61..d6c6b560030a 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js +++ b/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js @@ -1,11 +1,4 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - const gHttpTestRoot = "http://127.0.0.1:8888/" + RELATIVE_DIR + "/"; -var gManagerWindow; -var gTestPluginId; -var gPluginBrowser; function updateBlocklist(aCallback) { var blocklistNotifier = Cc["@mozilla.org/extensions/blocklist;1"] @@ -31,204 +24,151 @@ function resetBlocklist(aCallback) { Services.prefs.setCharPref("extensions.blocklist.url", _originalBlocklistURL); } -function test() { - waitForExplicitFinish(); - Services.prefs.setBoolPref("plugins.click_to_play", true); - Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true); +add_task(function*() { + SpecialPowers.pushPrefEnv({"set": [ + ["plugins.click_to_play", true], + ["extensions.blocklist.suppressUI", true] + ]}); + registerCleanupFunction(function*() { + let pluginTag = getTestPluginTag(); + pluginTag.enabledState = Ci.nsIPluginTag.STATE_ENABLED; + yield new Promise(resolve => { + setAndUpdateBlocklist(gHttpTestRoot + "blockNoPlugins.xml", resolve); + }); + resetBlocklist(); + }); + let pluginTag = getTestPluginTag(); pluginTag.enabledState = Ci.nsIPluginTag.STATE_CLICKTOPLAY; - open_manager("addons://list/plugin", part1); -} + let managerWindow = yield new Promise(resolve => open_manager("addons://list/plugin", resolve)); -function part1(aWindow) { - gManagerWindow = aWindow; - AddonManager.getAddonsByTypes(["plugin"], part2); -} + let plugins = yield new Promise(resolve => AddonManager.getAddonsByTypes(["plugin"], resolve)); -function part2(aPlugins) { - for (let plugin of aPlugins) { + let testPluginId; + for (let plugin of plugins) { if (plugin.name == "Test Plug-in") { - gTestPluginId = plugin.id; + testPluginId = plugin.id; break; } } - ok(gTestPluginId, "part2: Test Plug-in should exist"); - AddonManager.getAddonByID(gTestPluginId, part3); -} + ok(testPluginId, "part2: Test Plug-in should exist"); -function part3(aTestPlugin) { - let pluginEl = get_addon_element(gManagerWindow, gTestPluginId); + let testPlugin = yield new Promise(resolve => AddonManager.getAddonByID(testPluginId, resolve)); + + let pluginEl = get_addon_element(managerWindow, testPluginId); pluginEl.parentNode.ensureElementIsVisible(pluginEl); - let enableButton = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "enable-btn"); + let enableButton = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "enable-btn"); is_element_hidden(enableButton, "part3: enable button should not be visible"); - let disableButton = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "enable-btn"); + let disableButton = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "enable-btn"); is_element_hidden(disableButton, "part3: disable button should not be visible"); - let menu = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "state-menulist"); + let menu = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "state-menulist"); is_element_visible(menu, "part3: state menu should be visible"); - let askToActivateItem = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "ask-to-activate-menuitem"); + let askToActivateItem = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "ask-to-activate-menuitem"); is(menu.selectedItem, askToActivateItem, "part3: state menu should have 'Ask To Activate' selected"); - gBrowser.selectedTab = gBrowser.addTab(); - gPluginBrowser = gBrowser.selectedBrowser; - gPluginBrowser.addEventListener("PluginBindingAttached", part4, true, true); - gPluginBrowser.contentWindow.location = gHttpTestRoot + "plugin_test.html"; -} + let pluginTab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, gHttpTestRoot + "plugin_test.html"); + let pluginBrowser = pluginTab.linkedBrowser; -function part4() { - let condition = () => PopupNotifications.getNotification("click-to-play-plugins", gPluginBrowser); - waitForCondition(condition, () => { - gPluginBrowser.removeEventListener("PluginBindingAttached", part4); - gBrowser.removeCurrentTab(); + let condition = () => PopupNotifications.getNotification("click-to-play-plugins", pluginBrowser); + yield BrowserTestUtils.waitForCondition(condition, "part4: should have a click-to-play notification"); - let pluginEl = get_addon_element(gManagerWindow, gTestPluginId); - let menu = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "state-menulist"); - let alwaysActivateItem = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "always-activate-menuitem"); - menu.selectedItem = alwaysActivateItem; - alwaysActivateItem.doCommand(); - gBrowser.selectedTab = gBrowser.addTab(); - gPluginBrowser = gBrowser.selectedBrowser; - gPluginBrowser.addEventListener("load", part5, true); - gPluginBrowser.contentWindow.location = gHttpTestRoot + "plugin_test.html"; - }, "part4: should have a click-to-play notification"); -} + yield BrowserTestUtils.removeTab(pluginTab); -function part5() { - let testPlugin = gPluginBrowser.contentDocument.getElementById("test"); - ok(testPlugin, "part5: should have a plugin element in the page"); - let objLoadingContent = testPlugin.QueryInterface(Ci.nsIObjectLoadingContent); - let condition = () => objLoadingContent.activated; - waitForCondition(condition, part6, "part5: waited too long for plugin to activate"); -} + let alwaysActivateItem = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "always-activate-menuitem"); + menu.selectedItem = alwaysActivateItem; + alwaysActivateItem.doCommand(); -function part6() { - let testPlugin = gPluginBrowser.contentDocument.getElementById("test"); - ok(testPlugin, "part6: should have a plugin element in the page"); - let objLoadingContent = testPlugin.QueryInterface(Ci.nsIObjectLoadingContent); - ok(objLoadingContent.activated, "part6: plugin should be activated"); - gPluginBrowser.removeEventListener("load", part5); - gBrowser.removeCurrentTab(); + pluginTab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, gHttpTestRoot + "plugin_test.html"); - let pluginEl = get_addon_element(gManagerWindow, gTestPluginId); - let menu = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "state-menulist"); - let neverActivateItem = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "never-activate-menuitem"); + yield ContentTask.spawn(pluginTab.linkedBrowser, null, function*() { + let testPlugin = content.document.getElementById("test"); + ok(testPlugin, "part5: should have a plugin element in the page"); + let objLoadingContent = testPlugin.QueryInterface(Ci.nsIObjectLoadingContent); + let condition = () => objLoadingContent.activated; + yield ContentTaskUtils.waitForCondition(condition, "part5: waited too long for plugin to activate"); + ok(objLoadingContent.activated, "part6: plugin should be activated"); + }); + + yield BrowserTestUtils.removeTab(pluginTab); + + let neverActivateItem = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "never-activate-menuitem"); menu.selectedItem = neverActivateItem; neverActivateItem.doCommand(); - gBrowser.selectedTab = gBrowser.addTab(); - gPluginBrowser = gBrowser.selectedBrowser; - gPluginBrowser.addEventListener("PluginBindingAttached", part7, true, true); - gPluginBrowser.contentWindow.location = gHttpTestRoot + "plugin_test.html"; -} -function part7() { - let condition = () => PopupNotifications.getNotification("click-to-play-plugins", gPluginBrowser); - waitForCondition(condition, () => { - let testPlugin = gPluginBrowser.contentDocument.getElementById("test"); + pluginTab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, gHttpTestRoot + "plugin_test.html"); + pluginBrowser = pluginTab.linkedBrowser; + + condition = () => PopupNotifications.getNotification("click-to-play-plugins", pluginBrowser); + yield BrowserTestUtils.waitForCondition(condition, "part7: disabled plugins still show a notification"); + yield ContentTask.spawn(pluginTab.linkedBrowser, null, function*() { + let testPlugin = content.document.getElementById("test"); ok(testPlugin, "part7: should have a plugin element in the page"); let objLoadingContent = testPlugin.QueryInterface(Ci.nsIObjectLoadingContent); ok(!objLoadingContent.activated, "part7: plugin should not be activated"); + }); - gPluginBrowser.removeEventListener("PluginBindingAttached", part7); - gBrowser.removeCurrentTab(); + yield BrowserTestUtils.removeTab(pluginTab); - let pluginEl = get_addon_element(gManagerWindow, gTestPluginId); - let details = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "details-btn"); - is_element_visible(details, "part7: details link should be visible"); - EventUtils.synthesizeMouseAtCenter(details, {}, gManagerWindow); - wait_for_view_load(gManagerWindow, part8); - }, "part7: disabled plugins still show a notification"); -} + let details = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "details-btn"); + is_element_visible(details, "part7: details link should be visible"); + EventUtils.synthesizeMouseAtCenter(details, {}, managerWindow); + yield BrowserTestUtils.waitForEvent(managerWindow.document, "ViewChanged"); -function part8() { - let enableButton = gManagerWindow.document.getElementById("detail-enable-btn"); is_element_hidden(enableButton, "part8: detail enable button should be hidden"); - let disableButton = gManagerWindow.document.getElementById("detail-disable-btn"); is_element_hidden(disableButton, "part8: detail disable button should be hidden"); - let menu = gManagerWindow.document.getElementById("detail-state-menulist"); is_element_visible(menu, "part8: detail state menu should be visible"); - let neverActivateItem = gManagerWindow.document.getElementById("detail-never-activate-menuitem"); is(menu.selectedItem, neverActivateItem, "part8: state menu should have 'Never Activate' selected"); - let alwaysActivateItem = gManagerWindow.document.getElementById("detail-always-activate-menuitem"); menu.selectedItem = alwaysActivateItem; alwaysActivateItem.doCommand(); - gBrowser.selectedTab = gBrowser.addTab(); - gPluginBrowser = gBrowser.selectedBrowser; - gPluginBrowser.addEventListener("load", part9, true); - gPluginBrowser.contentWindow.location = gHttpTestRoot + "plugin_test.html"; -} -function part9() { - let testPlugin = gPluginBrowser.contentDocument.getElementById("test"); - ok(testPlugin, "part9: should have a plugin element in the page"); - let objLoadingContent = testPlugin.QueryInterface(Ci.nsIObjectLoadingContent); - let condition = () => objLoadingContent.activated; - waitForCondition(condition, part10, "part9: waited too long for plugin to activate"); -} + pluginTab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, gHttpTestRoot + "plugin_test.html"); + pluginBrowser = pluginTab.linkedBrowser; -function part10() { - let testPlugin = gPluginBrowser.contentDocument.getElementById("test"); - ok(testPlugin, "part10: should have a plugin element in the page"); - let objLoadingContent = testPlugin.QueryInterface(Ci.nsIObjectLoadingContent); - ok(objLoadingContent.activated, "part10: plugin should be activated"); - gPluginBrowser.removeEventListener("load", part9); - gBrowser.removeCurrentTab(); + yield ContentTask.spawn(pluginTab.linkedBrowser, null, function*() { + let testPlugin = content.document.getElementById("test"); + ok(testPlugin, "part9: should have a plugin element in the page"); + let objLoadingContent = testPlugin.QueryInterface(Ci.nsIObjectLoadingContent); + let condition = () => objLoadingContent.activated; + yield ContentTaskUtils.waitForCondition(condition, "part9: waited too long for plugin to activate"); + ok(objLoadingContent.activated, "part10: plugin should be activated"); + }); + + yield BrowserTestUtils.removeTab(pluginTab); - let menu = gManagerWindow.document.getElementById("detail-state-menulist"); - let askToActivateItem = gManagerWindow.document.getElementById("detail-ask-to-activate-menuitem"); menu.selectedItem = askToActivateItem; askToActivateItem.doCommand(); - gBrowser.selectedTab = gBrowser.addTab(); - gPluginBrowser = gBrowser.selectedBrowser; - gPluginBrowser.addEventListener("PluginBindingAttached", part11, true, true); - gPluginBrowser.contentWindow.location = gHttpTestRoot + "plugin_test.html"; -} -function part11() { - let condition = () => PopupNotifications.getNotification("click-to-play-plugins", gPluginBrowser); - waitForCondition(condition, () => { - gPluginBrowser.removeEventListener("PluginBindingAttached", part11); - gBrowser.removeCurrentTab(); + pluginTab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, gHttpTestRoot + "plugin_test.html"); + pluginBrowser = pluginTab.linkedBrowser; - let pluginTag = getTestPluginTag(); + condition = () => PopupNotifications.getNotification("click-to-play-plugins", pluginBrowser); + yield BrowserTestUtils.waitForCondition(condition, "part11: should have a click-to-play notification"); + + yield BrowserTestUtils.removeTab(pluginTab); // causes appDisabled to be set + managerWindow = yield new Promise(resolve => { setAndUpdateBlocklist(gHttpTestRoot + "blockPluginHard.xml", - function() { - close_manager(gManagerWindow, function() { - open_manager("addons://list/plugin", part12); - }); - }); - }, "part11: should have a click-to-play notification"); -} + () => { + close_manager(managerWindow, function() { + open_manager("addons://list/plugin", resolve); + }); + } + ); + }); -function part12(aWindow) { - gManagerWindow = aWindow; - let pluginEl = get_addon_element(gManagerWindow, gTestPluginId); + pluginEl = get_addon_element(managerWindow, testPluginId); pluginEl.parentNode.ensureElementIsVisible(pluginEl); - let menu = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "state-menulist"); + menu = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "state-menulist"); is(menu.disabled, true, "part12: state menu should be disabled"); - let details = gManagerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "details-btn"); - EventUtils.synthesizeMouseAtCenter(details, {}, gManagerWindow); - wait_for_view_load(gManagerWindow, part13); -} + details = managerWindow.document.getAnonymousElementByAttribute(pluginEl, "anonid", "details-btn"); + EventUtils.synthesizeMouseAtCenter(details, {}, managerWindow); + yield BrowserTestUtils.waitForEvent(managerWindow.document, "ViewChanged"); -function part13() { - let menu = gManagerWindow.document.getElementById("detail-state-menulist"); + menu = managerWindow.document.getElementById("detail-state-menulist"); is(menu.disabled, true, "part13: detail state menu should be disabled"); - setAndUpdateBlocklist(gHttpTestRoot + "blockNoPlugins.xml", function() { - run_next_test(); - }); -} - -function end_test() { - Services.prefs.clearUserPref("plugins.click_to_play"); - Services.prefs.clearUserPref("extensions.blocklist.suppressUI"); - let pluginTag = getTestPluginTag(); - pluginTag.enabledState = Ci.nsIPluginTag.STATE_ENABLED; - resetBlocklist(); - close_manager(gManagerWindow, function() { - finish(); - }); -} + managerWindow.close(); +});