diff --git a/browser/base/content/browser-plugins.js b/browser/base/content/browser-plugins.js index 44d1d92793fe..f2f90d86f592 100644 --- a/browser/base/content/browser-plugins.js +++ b/browser/base/content/browser-plugins.js @@ -708,6 +708,15 @@ var gPluginHandler = { centerActions.push(pluginInfo); } + + if (centerActions.length == 0) { + // TODO: this is a temporary band-aid to avoid broken doorhangers + // until bug 926605 is landed. + notification.options.centerActions = []; + setTimeout(() => PopupNotifications.remove(notification), 0); + return; + } + centerActions.sort(function(a, b) { return a.pluginName.localeCompare(b.pluginName); }); diff --git a/browser/base/content/test/general/browser.ini b/browser/base/content/test/general/browser.ini index 162f8131077e..49613cab8df5 100644 --- a/browser/base/content/test/general/browser.ini +++ b/browser/base/content/test/general/browser.ini @@ -59,6 +59,7 @@ support-files = plugin_clickToPlayDeny.html plugin_data_url.html plugin_hidden_to_visible.html + plugin_iframe.html plugin_small.html plugin_test.html plugin_test2.html @@ -79,6 +80,7 @@ support-files = [browser_CTP_data_urls.js] [browser_CTP_drag_drop.js] +[browser_CTP_iframe.js] [browser_CTP_nonplugins.js] [browser_CTP_resize.js] [browser_URLBarSetURI.js] diff --git a/browser/base/content/test/general/browser_CTP_iframe.js b/browser/base/content/test/general/browser_CTP_iframe.js new file mode 100644 index 000000000000..a88fa860ab0d --- /dev/null +++ b/browser/base/content/test/general/browser_CTP_iframe.js @@ -0,0 +1,135 @@ +var rootDir = getRootDirectory(gTestPath); +const gTestRoot = rootDir; +const gHttpTestRoot = rootDir.replace("chrome://mochitests/content/", "http://127.0.0.1:8888/"); + +var gTestBrowser = null; +var gNextTest = null; +var gPluginHost = Components.classes["@mozilla.org/plugin/host;1"].getService(Components.interfaces.nsIPluginHost); +var gPageLoads = 0; + +Components.utils.import("resource://gre/modules/Services.jsm"); + +// This listens for the next opened tab and checks it is of the right url. +// opencallback is called when the new tab is fully loaded +// closecallback is called when the tab is closed +function TabOpenListener(url, opencallback, closecallback) { + this.url = url; + this.opencallback = opencallback; + this.closecallback = closecallback; + + gBrowser.tabContainer.addEventListener("TabOpen", this, false); +} + +TabOpenListener.prototype = { + url: null, + opencallback: null, + closecallback: null, + tab: null, + browser: null, + + handleEvent: function(event) { + if (event.type == "TabOpen") { + gBrowser.tabContainer.removeEventListener("TabOpen", this, false); + this.tab = event.originalTarget; + this.browser = this.tab.linkedBrowser; + gBrowser.addEventListener("pageshow", this, false); + } else if (event.type == "pageshow") { + if (event.target.location.href != this.url) + return; + gBrowser.removeEventListener("pageshow", this, false); + this.tab.addEventListener("TabClose", this, false); + var url = this.browser.contentDocument.location.href; + is(url, this.url, "Should have opened the correct tab"); + this.opencallback(this.tab, this.browser.contentWindow); + } else if (event.type == "TabClose") { + if (event.originalTarget != this.tab) + return; + this.tab.removeEventListener("TabClose", this, false); + this.opencallback = null; + this.tab = null; + this.browser = null; + // Let the window close complete + executeSoon(this.closecallback); + this.closecallback = null; + } + } +}; + +function test() { + waitForExplicitFinish(); + registerCleanupFunction(function() { + clearAllPluginPermissions(); + Services.prefs.clearUserPref("extensions.blocklist.suppressUI"); + }); + Services.prefs.setBoolPref("extensions.blocklist.suppressUI", true); + + var newTab = gBrowser.addTab(); + gBrowser.selectedTab = newTab; + gTestBrowser = gBrowser.selectedBrowser; + gTestBrowser.addEventListener("load", pageLoad, true); + + Services.prefs.setBoolPref("plugins.click_to_play", true); + setTestPluginEnabledState(Ci.nsIPluginTag.STATE_CLICKTOPLAY); + + prepareTest(runAfterPluginBindingAttached(test1), gHttpTestRoot + "plugin_iframe.html"); +} + +function finishTest() { + clearAllPluginPermissions(); + gTestBrowser.removeEventListener("load", pageLoad, true); + gBrowser.removeCurrentTab(); + window.focus(); + finish(); +} + +function pageLoad() { + // Wait for the iframe to be loaded as well. + if (gPageLoads++ < 1) + return; + + // The plugin events are async dispatched and can come after the load event + // This just allows the events to fire before we then go on to test the states. + executeSoon(gNextTest); +} + +function prepareTest(nextTest, url) { + gNextTest = nextTest; + gTestBrowser.contentWindow.location = url; +} + +// Due to layout being async, "PluginBindAttached" may trigger later. +// This wraps a function to force a layout flush, thus triggering it, +// and schedules the function execution so they're definitely executed +// afterwards. +function runAfterPluginBindingAttached(func) { + return function() { + let doc = gTestBrowser.contentDocument.getElementById('frame').contentDocument; + let elems = doc.getElementsByTagName('embed'); + if (elems.length < 1) { + elems = doc.getElementsByTagName('object'); + } + elems[0].clientTop; + executeSoon(func); + }; +} + +// Test that we don't show a doorhanger after removing the last plugin +// when the plugin was in an iframe. + +function test1() { + let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser); + ok(popupNotification, "Test 1, Should have a click-to-play notification"); + + let frame = gTestBrowser.contentDocument.getElementById("frame"); + frame.parentElement.removeChild(frame); + + let condition = () => { + let notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser); + if (notification) { + notification.reshow(); + } + return !notification; + } + + waitForCondition(condition, finishTest, "Test1, Waited too long for notification too be removed"); +} diff --git a/browser/base/content/test/general/plugin_iframe.html b/browser/base/content/test/general/plugin_iframe.html new file mode 100644 index 000000000000..eed5819d7151 --- /dev/null +++ b/browser/base/content/test/general/plugin_iframe.html @@ -0,0 +1,11 @@ + + + + + + + + +