summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_pluginBlocklistCtp.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_pluginBlocklistCtp.js')
-rw-r--r--toolkit/mozapps/extensions/test/xpcshell/test_pluginBlocklistCtp.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_pluginBlocklistCtp.js b/toolkit/mozapps/extensions/test/xpcshell/test_pluginBlocklistCtp.js
new file mode 100644
index 000000000..8d7e944e2
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_pluginBlocklistCtp.js
@@ -0,0 +1,181 @@
+/* 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 nsIBLS = Components.interfaces.nsIBlocklistService;
+Components.utils.import("resource://testing-common/httpd.js");
+
+var gBlocklistService = null;
+var gNotifier = null;
+var gNextTest = null;
+var gPluginHost = null;
+
+var gServer = new HttpServer();
+gServer.start(-1);
+gPort = gServer.identity.primaryPort;
+mapFile("/data/test_pluginBlocklistCtp.xml", gServer);
+mapFile("/data/test_pluginBlocklistCtpUndo.xml", gServer);
+
+var PLUGINS = [{
+ // severity=0, vulnerabilitystatus=0 -> outdated
+ name: "test_plugin_0",
+ version: "5",
+ disabled: false,
+ blocklisted: false
+},
+{
+ // severity=0, vulnerabilitystatus=1 -> update available
+ name: "test_plugin_1",
+ version: "5",
+ disabled: false,
+ blocklisted: false
+},
+{
+ // severity=0, vulnerabilitystatus=2 -> no update
+ name: "test_plugin_2",
+ version: "5",
+ disabled: false,
+ blocklisted: false
+},
+{
+ // no severity field -> severity=3 by default -> hardblock
+ name: "test_plugin_3",
+ version: "5",
+ disabled: false,
+ blocklisted: false
+},
+{
+ // severity=1, vulnerabilitystatus=2 -> softblock
+ name: "test_plugin_4",
+ version: "5",
+ disabled: false,
+ blocklisted: false
+},
+{
+ // not in the blocklist -> not blocked
+ name: "test_plugin_5",
+ version: "5",
+ disabled: false,
+ blocklisted: false
+}];
+
+function test_basic() {
+ var blocklist = Components.classes["@mozilla.org/extensions/blocklist;1"].getService(nsIBLS);
+
+ do_check_true(blocklist.getPluginBlocklistState(PLUGINS[0], "1", "1.9") == nsIBLS.STATE_OUTDATED);
+
+ do_check_true(blocklist.getPluginBlocklistState(PLUGINS[1], "1", "1.9") == nsIBLS.STATE_VULNERABLE_UPDATE_AVAILABLE);
+
+ do_check_true(blocklist.getPluginBlocklistState(PLUGINS[2], "1", "1.9") == nsIBLS.STATE_VULNERABLE_NO_UPDATE);
+
+ do_check_true(blocklist.getPluginBlocklistState(PLUGINS[3], "1", "1.9") == nsIBLS.STATE_BLOCKED);
+
+ do_check_true(blocklist.getPluginBlocklistState(PLUGINS[4], "1", "1.9") == nsIBLS.STATE_SOFTBLOCKED);
+
+ do_check_true(blocklist.getPluginBlocklistState(PLUGINS[5], "1", "1.9") == nsIBLS.STATE_NOT_BLOCKED);
+
+ gNextTest = test_is_not_clicktoplay;
+ do_execute_soon(gNextTest);
+}
+
+function get_test_plugin() {
+ var pluginHost = Components.classes["@mozilla.org/plugin/host;1"].getService(Components.interfaces.nsIPluginHost);
+ for (var plugin of pluginHost.getPluginTags()) {
+ if (plugin.name == "Test Plug-in")
+ return plugin;
+ }
+ do_check_true(false);
+ return null;
+}
+
+// At this time, the blocklist does not have an entry for the test plugin,
+// so it shouldn't be click-to-play.
+function test_is_not_clicktoplay() {
+ var plugin = get_test_plugin();
+ var blocklistState = gBlocklistService.getPluginBlocklistState(plugin, "1", "1.9");
+ do_check_neq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_UPDATE_AVAILABLE);
+ do_check_neq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_NO_UPDATE);
+
+ Services.prefs.setCharPref("extensions.blocklist.url", "http://localhost:" + gPort + "/data/test_pluginBlocklistCtpUndo.xml");
+ gNextTest = test_is_clicktoplay;
+ gNotifier.notify(null);
+}
+
+// Here, we've updated the blocklist to have a block for the test plugin,
+// so it should be click-to-play.
+function test_is_clicktoplay() {
+ var plugin = get_test_plugin();
+ var blocklistState = gBlocklistService.getPluginBlocklistState(plugin, "1", "1.9");
+ do_check_eq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_NO_UPDATE);
+
+ Services.prefs.setCharPref("extensions.blocklist.url", "http://localhost:" + gPort + "/data/test_pluginBlocklistCtp.xml");
+ gNextTest = test_is_not_clicktoplay2;
+ gNotifier.notify(null);
+}
+
+// But now we've removed that entry from the blocklist (really we've gone back
+// to the old one), so the plugin shouldn't be click-to-play any more.
+function test_is_not_clicktoplay2() {
+ var plugin = get_test_plugin();
+ var blocklistState = gBlocklistService.getPluginBlocklistState(plugin, "1", "1.9");
+ do_check_neq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_UPDATE_AVAILABLE);
+ do_check_neq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_NO_UPDATE);
+
+ Services.prefs.setCharPref("extensions.blocklist.url", "http://localhost:" + gPort + "/data/test_pluginBlocklistCtpUndo.xml");
+ gNextTest = test_disable_blocklist;
+ gNotifier.notify(null);
+}
+
+// Test that disabling the blocklist when a plugin is ctp-blocklisted will
+// result in the plugin not being click-to-play.
+function test_disable_blocklist() {
+ var plugin = get_test_plugin();
+ var blocklistState = gBlocklistService.getPluginBlocklistState(plugin, "1", "1.9");
+ do_check_eq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_NO_UPDATE);
+
+ gNextTest = null;
+ Services.prefs.setBoolPref("extensions.blocklist.enabled", false);
+ blocklistState = gBlocklistService.getPluginBlocklistState(plugin, "1", "1.9");
+ do_check_neq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_NO_UPDATE);
+ do_check_neq(blocklistState, Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_UPDATE_AVAILABLE);
+
+ // it should still be possible to make a plugin click-to-play via the pref
+ // and setting that plugin's enabled state to click-to-play
+ Services.prefs.setBoolPref("plugins.click_to_play", true);
+ let previousEnabledState = plugin.enabledState;
+ plugin.enabledState = Components.interfaces.nsIPluginTag.STATE_CLICKTOPLAY;
+ do_check_eq(gPluginHost.getStateForType("application/x-test"), Components.interfaces.nsIPluginTag.STATE_CLICKTOPLAY);
+ // clean up plugin state
+ plugin.enabledState = previousEnabledState;
+
+ gServer.stop(do_test_finished);
+}
+
+// Observe "blocklist-updated" so we know when to advance to the next test
+function observer() {
+ if (gNextTest)
+ do_execute_soon(gNextTest);
+}
+
+function run_test() {
+ createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9");
+
+ Services.prefs.setCharPref("extensions.blocklist.url", "http://localhost:" + gPort + "/data/test_pluginBlocklistCtp.xml");
+ startupManager();
+
+ gPluginHost = Components.classes["@mozilla.org/plugin/host;1"].getService(Components.interfaces.nsIPluginHost);
+ gBlocklistService = Components.classes["@mozilla.org/extensions/blocklist;1"].getService(Components.interfaces.nsIBlocklistService);
+ gNotifier = Components.classes["@mozilla.org/extensions/blocklist;1"].getService(Components.interfaces.nsITimerCallback);
+ Services.obs.addObserver(observer, "blocklist-updated", false);
+
+ do_register_cleanup(function() {
+ Services.prefs.clearUserPref("extensions.blocklist.url");
+ Services.prefs.clearUserPref("extensions.blocklist.enabled");
+ Services.prefs.clearUserPref("plugins.click_to_play");
+ Services.obs.removeObserver(observer, "blocklist-updated");
+ });
+
+ gNextTest = test_basic;
+ do_test_pending();
+ gNotifier.notify(null);
+}