summaryrefslogtreecommitdiff
path: root/browser/base/content/test/browser_plugins_added_dynamically.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/browser_plugins_added_dynamically.js')
-rw-r--r--browser/base/content/test/browser_plugins_added_dynamically.js179
1 files changed, 179 insertions, 0 deletions
diff --git a/browser/base/content/test/browser_plugins_added_dynamically.js b/browser/base/content/test/browser_plugins_added_dynamically.js
new file mode 100644
index 000000000..457a72dcc
--- /dev/null
+++ b/browser/base/content/test/browser_plugins_added_dynamically.js
@@ -0,0 +1,179 @@
+const gTestRoot = "http://mochi.test:8888/browser/browser/base/content/test/";
+
+let gTestBrowser = null;
+let gNextTest = null;
+let gPluginHost = Components.classes["@mozilla.org/plugin/host;1"].getService(Components.interfaces.nsIPluginHost);
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+// Let's do the XPCNativeWrapper dance!
+function addPlugin(browser, type) {
+ let contentWindow = XPCNativeWrapper.unwrap(browser.contentWindow);
+ contentWindow.addPlugin(type);
+}
+
+function test() {
+ waitForExplicitFinish();
+ registerCleanupFunction(function() {
+ clearAllPluginPermissions();
+ Services.prefs.clearUserPref("plugins.click_to_play");
+ getTestPlugin().enabledState = Ci.nsIPluginTag.STATE_ENABLED;
+ getTestPlugin("Second Test Plug-in").enabledState = Ci.nsIPluginTag.STATE_ENABLED;
+ });
+ Services.prefs.setBoolPref("plugins.click_to_play", true);
+ getTestPlugin().enabledState = Ci.nsIPluginTag.STATE_CLICKTOPLAY;
+ getTestPlugin("Second Test Plug-in").enabledState = Ci.nsIPluginTag.STATE_CLICKTOPLAY;
+
+ let newTab = gBrowser.addTab();
+ gBrowser.selectedTab = newTab;
+ gTestBrowser = gBrowser.selectedBrowser;
+ gTestBrowser.addEventListener("load", pageLoad, true);
+ prepareTest(testActivateAddSameTypePart1, gTestRoot + "plugin_add_dynamically.html");
+}
+
+function finishTest() {
+ gTestBrowser.removeEventListener("load", pageLoad, true);
+ gBrowser.removeCurrentTab();
+ window.focus();
+ finish();
+}
+
+function pageLoad() {
+ // 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;
+}
+
+// "Activate" of a given type -> plugins of that type dynamically added should
+// automatically play.
+function testActivateAddSameTypePart1() {
+ let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ ok(!popupNotification, "testActivateAddSameTypePart1: should not have a click-to-play notification");
+ addPlugin(gTestBrowser);
+ let condition = function() PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ waitForCondition(condition, testActivateAddSameTypePart2, "testActivateAddSameTypePart1: waited too long for click-to-play-plugin notification");
+}
+
+function testActivateAddSameTypePart2() {
+ let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ ok(popupNotification, "testActivateAddSameTypePart2: should have a click-to-play notification");
+
+ popupNotification.reshow();
+ testActivateAddSameTypePart3();
+}
+
+function testActivateAddSameTypePart3() {
+ let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ let centerAction = null;
+ for (let action of popupNotification.options.centerActions) {
+ if (action.pluginName == "Test") {
+ centerAction = action;
+ break;
+ }
+ }
+ ok(centerAction, "testActivateAddSameTypePart3: found center action for the Test plugin");
+
+ let centerItem = null;
+ for (let item of PopupNotifications.panel.firstChild.childNodes) {
+ if (item.action && item.action == centerAction) {
+ centerItem = item;
+ break;
+ }
+ }
+ ok(centerItem, "testActivateAddSameTypePart3: found center item for the Test plugin");
+
+ let plugin = gTestBrowser.contentDocument.getElementsByTagName("embed")[0];
+ ok(!plugin.activated, "testActivateAddSameTypePart3: plugin should not be activated");
+
+ // Change the state and click the ok button to activate the Test plugin
+ centerItem.value = "allownow";
+ PopupNotifications.panel.firstChild._primaryButton.click();
+
+ let condition = function() plugin.activated;
+ waitForCondition(condition, testActivateAddSameTypePart4, "testActivateAddSameTypePart3: waited too long for plugin to activate");
+}
+
+function testActivateAddSameTypePart4() {
+ let plugin = gTestBrowser.contentDocument.getElementsByTagName("embed")[0];
+ ok(plugin.activated, "testActivateAddSameTypePart4: plugin should be activated");
+
+ addPlugin(gTestBrowser);
+ let condition = function() {
+ let embeds = gTestBrowser.contentDocument.getElementsByTagName("embed");
+ let allActivated = true;
+ for (let embed of embeds) {
+ if (!embed.activated)
+ allActivated = false;
+ }
+ return allActivated && embeds.length == 2;
+ };
+ waitForCondition(condition, testActivateAddSameTypePart5, "testActivateAddSameTypePart4: waited too long for second plugin to activate"); }
+
+function testActivateAddSameTypePart5() {
+ let embeds = gTestBrowser.contentDocument.getElementsByTagName("embed");
+ for (let embed of embeds) {
+ ok(embed.activated, "testActivateAddSameTypePart5: all plugins should be activated");
+ }
+ clearAllPluginPermissions();
+ prepareTest(testActivateAddDifferentTypePart1, gTestRoot + "plugin_add_dynamically.html");
+}
+
+// "Activate" of a given type -> plugins of other types dynamically added
+// should not automatically play.
+function testActivateAddDifferentTypePart1() {
+ let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ ok(!popupNotification, "testActivateAddDifferentTypePart1: should not have a click-to-play notification");
+ addPlugin(gTestBrowser);
+ let condition = function() PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ waitForCondition(condition, testActivateAddDifferentTypePart2, "testActivateAddDifferentTypePart1: waited too long for click-to-play-plugin notification");
+}
+
+function testActivateAddDifferentTypePart2() {
+ let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ ok(popupNotification, "testActivateAddDifferentTypePart2: should have a click-to-play notification");
+
+ // we have to actually show the panel to get the bindings to instantiate
+ popupNotification.reshow();
+ testActivateAddDifferentTypePart3();
+}
+
+function testActivateAddDifferentTypePart3() {
+ let popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ is(popupNotification.options.centerActions.length, 1, "Should be one plugin action");
+
+ let plugin = gTestBrowser.contentDocument.getElementsByTagName("embed")[0];
+ ok(!plugin.activated, "testActivateAddDifferentTypePart3: plugin should not be activated");
+
+ // "click" the button to activate the Test plugin
+ PopupNotifications.panel.firstChild._primaryButton.click();
+
+ let condition = function() plugin.activated;
+ waitForCondition(condition, testActivateAddDifferentTypePart4, "testActivateAddDifferentTypePart3: waited too long for plugin to activate");
+}
+
+function testActivateAddDifferentTypePart4() {
+ let plugin = gTestBrowser.contentDocument.getElementsByTagName("embed")[0];
+ ok(plugin.activated, "testActivateAddDifferentTypePart4: plugin should be activated");
+
+ addPlugin(gTestBrowser);
+ let condition = function() PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
+ waitForCondition(condition, testActivateAddDifferentTypePart5, "testActivateAddDifferentTypePart5: waited too long for popup notification");
+}
+
+function testActivateAddDifferentTypePart5() {
+ ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser), "testActivateAddDifferentTypePart5: should have popup notification");
+ let embeds = gTestBrowser.contentDocument.getElementsByTagName("embed");
+ for (let embed of embeds) {
+ if (embed.type == "application/x-test")
+ ok(embed.activated, "testActivateAddDifferentTypePart5: Test plugin should be activated");
+ else if (embed.type == "application/x-second-test")
+ ok(!embed.activated, "testActivateAddDifferentTypePart5: Second Test plugin should not be activated");
+ }
+
+ finishTest();
+}