Bug 1611678 - Clean up outdated plugin preferences in SeaMonkey. r=IanN
authorFrank-Rainer Grahl <frgrahl@gmx.net>
Thu, 05 Mar 2020 22:25:44 +0100
changeset 38616 6d347949d057b7efe4efe049f210a24bacf6ef80
parent 38615 1c4d7e7606f26b68cf972ec9be1e8a7020514673
child 38617 444f141ebc17217944af4c2b3839f721ca9cb31e
push id400
push userclokep@gmail.com
push dateMon, 04 May 2020 18:56:09 +0000
reviewersIanN
bugs1611678, 1277905, 874167, 1090864, 836415
Bug 1611678 - Clean up outdated plugin preferences in SeaMonkey. r=IanN Port Bug 1277905 "Remove plugincheck links from Firefox". Port Bug 874167 part A "remove nsNPAPIPlugin::RunPluginOOP and unused code paths" which landed with the wrong bug number Bug 1090864. Port Bug 836415 Kill PFS. Remove a few unneeded Ci. consts.
suite/app/profile/suite-prefs.js
suite/browser/test/browser/browser_pluginnotification.js
suite/browser/test/browser/browser_pluginplaypreview.js
suite/components/bindings/notification.xml
suite/components/nsSuiteGlue.js
suite/locales/en-US/chrome/common/notification.properties
suite/themes/classic/communicator/communicator.css
suite/themes/classic/mac/communicator/communicator.css
suite/themes/modern/communicator/communicator.css
--- a/suite/app/profile/suite-prefs.js
+++ b/suite/app/profile/suite-prefs.js
@@ -743,36 +743,26 @@ pref("dom.disable_window_move_resize", t
 // prevent JS from raising or lowering windows
 pref("dom.disable_window_flip",        true);
 // prevent JS from disabling or replacing context menus
 pref("dom.event.contextmenu.enabled",  true);
 
 pref("dom.identity.enabled", false);
 
 #ifdef XP_MACOSX
-// On mac, the default pref is per-architecture
-pref("dom.ipc.plugins.enabled.i386", true);
-pref("dom.ipc.plugins.enabled.x86_64", true);
-
 // This pref governs whether we attempt to work around problems caused by
 // plugins using OS calls to manipulate the cursor while running out-of-
 // process.  These workarounds all involve intercepting (hooking) certain
 // OS calls in the plugin process, then arranging to make certain OS calls
 // in the browser process.  Eventually plugins will be required to use the
 // NPAPI to manipulate the cursor, and these workarounds will be removed.
 // See bug 621117.
 pref("dom.ipc.plugins.nativeCursorSupport", true);
-#else
-pref("dom.ipc.plugins.enabled", true);
 #endif
 
-// plugin finder service url
-pref("pfs.datasource.url", "https://pfs.mozilla.org/plugins/PluginFinderService.php?mimetype=%PLUGIN_MIMETYPE%&appID=%APP_ID%&appVersion=%APP_VERSION%&clientOS=%CLIENT_OS%&chromeLocale=%CHROME_LOCALE%");
-pref("plugins.update.url", "https://www.mozilla.org/%LOCALE%/plugincheck/");
-pref("plugins.update.notifyUser", false);
 pref("plugins.hide_infobar_for_outdated_plugin", false);
 pref("plugins.hide_infobar_for_missing_plugin", false);
 pref("plugins.click_to_play", true);
 pref("plugin.disable", false);
 
 // Digital Rights Management, Encrypted Media Extensions
 pref("media.eme.enabled", false);
 
--- a/suite/browser/test/browser/browser_pluginnotification.js
+++ b/suite/browser/test/browser/browser_pluginnotification.js
@@ -101,52 +101,44 @@ function pageLoad() {
 function prepareTest(nextTest, url) {
   gNextTest = nextTest;
   gTestBrowser.contentWindow.location = url;
 }
 
 // Tests a page with an unknown plugin in it.
 function test1() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(notificationBox.getNotificationWithValue("missing-plugins"), "Test 1, Should have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 1, Should not have displayed the blocked plugin notification");
-  ok(notificationBox._missingPlugins, "Test 1, Should be a missing plugin list");
-  ok(notificationBox.missingPlugins.has("application/x-unknown"), "Test 1, Should know about application/x-unknown");
-  ok(!notificationBox.missingPlugins.has("application/x-test"), "Test 1, Should not know about application/x-test");
 
   var pluginNode = gTestBrowser.contentDocument.getElementById("unknown");
   ok(pluginNode, "Test 1, Found plugin in page");
   var objLoadingContent = pluginNode.QueryInterface(Ci.nsIObjectLoadingContent);
   is(objLoadingContent.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_UNSUPPORTED, "Test 1, plugin fallback type should be PLUGIN_UNSUPPORTED");
 
   var plugin = getTestPlugin();
   ok(plugin, "Should have a test plugin");
   plugin.enabledState = Ci.nsIPluginTag.STATE_ENABLED;
   prepareTest(test2, gTestRoot + "plugin_test.html");
 }
 
 // Tests a page with a working plugin in it.
 function test2() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 2, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 2, Should not have displayed the blocked plugin notification");
-  ok(!notificationBox._missingPlugins, "Test 2, Should not be a missing plugin list");
 
   var plugin = getTestPlugin();
   ok(plugin, "Should have a test plugin");
   plugin.enabledState = Ci.nsIPluginTag.STATE_DISABLED;
   prepareTest(test3, gTestRoot + "plugin_test.html");
 }
 
 // Tests a page with a disabled plugin in it.
 function test3() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 3, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 3, Should not have displayed the blocked plugin notification");
-  ok(!notificationBox._missingPlugins, "Test 3, Should not be a missing plugin list");
 
   new TabOpenListener("about:addons", test4, prepareTest5);
 
   var pluginNode = gTestBrowser.contentDocument.getElementById("test");
   ok(pluginNode, "Test 3, Found plugin in page");
   var objLoadingContent = pluginNode.QueryInterface(Ci.nsIObjectLoadingContent);
   is(objLoadingContent.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_DISABLED, "Test 3, plugin fallback type should be PLUGIN_DISABLED");
   var manageLink = gTestBrowser.contentDocument.getAnonymousElementByAttribute(pluginNode, "anonid", "managePluginsLink");
@@ -168,82 +160,66 @@ function prepareTest5() {
       info("prepareTest5 callback");
       prepareTest(test5, gTestRoot + "plugin_test.html");
     });
 }
 
 // Tests a page with a blocked plugin in it.
 function test5() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 5, Should not have displayed the missing plugin notification");
   ok(notificationBox.getNotificationWithValue("blocked-plugins"), "Test 5, Should have displayed the blocked plugin notification");
-  ok(notificationBox._missingPlugins, "Test 5, Should be a missing plugin list");
-  ok(notificationBox.missingPlugins.has("application/x-test"), "Test 5, Should know about application/x-test");
-  ok(!notificationBox.missingPlugins.has("application/x-unknown"), "Test 5, Should not know about application/x-unknown");
   var pluginNode = gTestBrowser.contentDocument.getElementById("test");
   ok(pluginNode, "Test 5, Found plugin in page");
   var objLoadingContent = pluginNode.QueryInterface(Ci.nsIObjectLoadingContent);
   is(objLoadingContent.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_BLOCKLISTED, "Test 5, plugin fallback type should be PLUGIN_BLOCKLISTED");
 
   prepareTest(test6, gTestRoot + "plugin_both.html");
 }
 
 // Tests a page with a blocked and unknown plugin in it.
 function test6() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(notificationBox.getNotificationWithValue("missing-plugins"), "Test 6, Should have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 6, Should not have displayed the blocked plugin notification");
-  ok(notificationBox._missingPlugins, "Test 6, Should be a missing plugin list");
-  ok(notificationBox.missingPlugins.has("application/x-unknown"), "Test 6, Should know about application/x-unknown");
-  ok(notificationBox.missingPlugins.has("application/x-test"), "Test 6, Should know about application/x-test");
 
   prepareTest(test7, gTestRoot + "plugin_both2.html");
 }
 
 // Tests a page with a blocked and unknown plugin in it (alternate order to above).
 function test7() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(notificationBox.getNotificationWithValue("missing-plugins"), "Test 7, Should have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 7, Should not have displayed the blocked plugin notification");
-  ok(notificationBox._missingPlugins, "Test 7, Should be a missing plugin list");
-  ok(notificationBox.missingPlugins.has("application/x-unknown"), "Test 7, Should know about application/x-unknown");
-  ok(notificationBox.missingPlugins.has("application/x-test"), "Test 7, Should know about application/x-test");
 
   Services.prefs.setBoolPref("plugins.click_to_play", true);
   var plugin = getTestPlugin();
   plugin.enabledState = Ci.nsIPluginTag.STATE_CLICKTOPLAY;
   getTestPlugin("Second Test Plug-in").enabledState = Ci.nsIPluginTag.STATE_CLICKTOPLAY;
 
   setAndUpdateBlocklist(gHttpTestRoot + "blockNoPlugins.xml", function() {
     prepareTest(test8, gTestRoot + "plugin_test.html");
   });
 }
 
 // Tests a page with a working plugin that is click-to-play
 function test8() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 8, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 8, Should not have displayed the blocked plugin notification");
-  ok(!notificationBox._missingPlugins, "Test 8, Should not be a missing plugin list");
   ok(PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser), "Test 8, Should have a click-to-play notification");
 
   var pluginNode = gTestBrowser.contentDocument.getElementById("test");
   ok(pluginNode, "Test 8, Found plugin in page");
   var objLoadingContent = pluginNode.QueryInterface(Ci.nsIObjectLoadingContent);
   is(objLoadingContent.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY, "Test 8, plugin fallback type should be PLUGIN_CLICK_TO_PLAY");
 
   prepareTest(test9a, gTestRoot + "plugin_test2.html");
 }
 
 // Tests that activating one click-to-play plugin will activate only that plugin (part 1/3)
 function test9a() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 9a, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 9a, Should not have displayed the blocked plugin notification");
-  ok(!notificationBox._missingPlugins, "Test 9a, Should not be a missing plugin list");
   var notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
   ok(notification, "Test 9a, Should have a click-to-play notification");
   ok(notification.options.centerActions.length == 1, "Test 9a, Should have only one type of plugin in the notification");
 
   var doc = gTestBrowser.contentDocument;
   var plugin1 = doc.getElementById("test1");
   var rect = doc.getAnonymousElementByAttribute(plugin1, "anonid", "main").getBoundingClientRect();
   ok(rect.width == 200, "Test 9a, Plugin with id=" + plugin1.id + " overlay rect should have 200px width before being clicked");
@@ -262,19 +238,17 @@ function test9a() {
   var objLoadingContent = plugin1.QueryInterface(Ci.nsIObjectLoadingContent);
   var condition = () => objLoadingContent.activated;
   waitForCondition(condition, test9b, "Test 9a, Waited too long for plugin to activate");
 }
 
 // Tests that activating one click-to-play plugin will activate only that plugin (part 2/3)
 function test9b() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 9b, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 9b, Should not have displayed the blocked plugin notification");
-  ok(!notificationBox._missingPlugins, "Test 9b, Should not be a missing plugin list");
   var notification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
   ok(notification, "Test 9b, Click to play notification should not be removed now");
   ok(notification.options.centerActions.length == 1, "Test 9b, Should have only one type of plugin in the notification");
 
   var doc = gTestBrowser.contentDocument;
   var plugin1 = doc.getElementById("test1");
   var pluginRect1 = doc.getAnonymousElementByAttribute(plugin1, "anonid", "main").getBoundingClientRect();
   ok(pluginRect1.width == 0, "Test 9b, Plugin with id=" + plugin1.id + " should have click-to-play overlay with zero width");
@@ -294,19 +268,17 @@ function test9b() {
   var condition = () => objLoadingContent.activated;
   waitForCondition(condition, test9c, "Test 9b, Waited too long for plugin to activate");
 }
 
 //
 // Tests that activating one click-to-play plugin will activate only that plugin (part 3/3)
 function test9c() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 9c, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 9c, Should not have displayed the blocked plugin notification");
-  ok(!notificationBox._missingPlugins, "Test 9c, Should not be a missing plugin list");
   ok(!PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser), "Test 9c, Click to play notification should be removed now");
 
   var doc = gTestBrowser.contentDocument;
   var plugin1 = doc.getElementById("test1");
   var pluginRect1 = doc.getAnonymousElementByAttribute(plugin1, "anonid", "main").getBoundingClientRect();
   ok(pluginRect1.width == 0, "Test 9c, Plugin with id=" + plugin1.id + " should have click-to-play overlay with zero width");
   ok(pluginRect1.height == 0, "Test 9c, Plugin with id=" + plugin1.id + " should have click-to-play overlay with zero height");
   var objLoadingContent = plugin1.QueryInterface(Ci.nsIObjectLoadingContent);
@@ -320,19 +292,17 @@ function test9c() {
   ok(objLoadingContent.activated, "Test 9c, Plugin with id=" + plugin2.id + " should be activated");
 
   prepareTest(test10a, gTestRoot + "plugin_test3.html");
 }
 
 // Tests that activating a hidden click-to-play plugin through the notification works (part 1/2)
 function test10a() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 10a, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 10a, Should not have displayed the blocked plugin notification");
-  ok(!notificationBox._missingPlugins, "Test 10a, Should not be a missing plugin list");
   var popupNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
   ok(popupNotification, "Test 10a, Should have a click-to-play notification");
   var plugin = gTestBrowser.contentDocument.getElementById("test");
   var objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
   ok(!objLoadingContent.activated, "Test 10a, Plugin should not be activated");
 
   popupNotification.mainAction.callback();
   var condition = () => objLoadingContent.activated;
@@ -605,18 +575,16 @@ function test16d() {
   prepareTest(test17, gTestRoot + "plugin_bug749455.html");
 }
 
 // Tests that mContentType is used for click-to-play plugins, and not the
 // inspected type.
 function test17() {
   var clickToPlayNotification = PopupNotifications.getNotification("click-to-play-plugins", gTestBrowser);
   ok(clickToPlayNotification, "Test 17, Should have a click-to-play notification");
-  var missingNotification = PopupNotifications.getNotification("missing-plugins", gTestBrowser);
-  ok(!missingNotification, "Test 17, Should not have a missing plugin notification");
 
   setAndUpdateBlocklist(gHttpTestRoot + "blockPluginVulnerableUpdatable.xml",
   function() {
     prepareTest(test18a, gHttpTestRoot + "plugin_test.html");
   });
 }
 
 const Cm = Components.manager;
@@ -635,26 +603,25 @@ function test18a() {
   var objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
   is(objLoadingContent.pluginFallbackType, Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE, "Test 18a, plugin fallback type should be PLUGIN_VULNERABLE_UPDATABLE");
   ok(!objLoadingContent.activated, "Test 18a, Plugin should not be activated");
   var overlay = doc.getAnonymousElementByAttribute(plugin, "anonid", "main");
   ok(overlay.style.visibility != "hidden", "Test 18a, Plugin overlay should exist, not be hidden");
   var updateLink = doc.getAnonymousElementByAttribute(plugin, "anonid", "checkForUpdatesLink");
   ok(updateLink.style.visibility != "hidden", "Test 18a, Plugin should have an update link");
 
-  var tabOpenListener = new TabOpenListener(Services.urlFormatter.formatURLPref("plugins.update.url"), false, false);
+  var tabOpenListener = new TabOpenListener(null, false, false);
   tabOpenListener.handleEvent = function(event) {
     if (event.type == "TabOpen") {
       gBrowser.tabContainer.removeEventListener("TabOpen", this);
       this.tab = event.originalTarget;
       this.browser = this.tab.linkedBrowser;
       gBrowser.addEventListener("pageshow", this);
     } else if (event.type == "pageshow") {
       gBrowser.removeEventListener("pageshow", this);
-      is(this.browser.contentDocument.location.href, this.url, "Test 18a, Update link should open up the plugin check page");
       gBrowser.removeTab(this.tab);
       test18b();
     }
   };
   EventUtils.synthesizeMouseAtCenter(updateLink, {}, gTestBrowser.contentWindow);
 }
 
 function test18b() {
--- a/suite/browser/test/browser/browser_pluginplaypreview.js
+++ b/suite/browser/test/browser/browser_pluginplaypreview.js
@@ -188,17 +188,16 @@ function prepareTest(nextTest, url, skip
   gNextTest = nextTest;
   gNextTestSkip = skip;
   gTestBrowser.contentWindow.location = url;
 }
 
 // Tests a page with normal play preview registration (1/2)
 function test1a() {
   var notificationBox = gBrowser.getNotificationBox(gTestBrowser);
-  ok(!notificationBox.getNotificationWithValue("missing-plugins"), "Test 1a, Should not have displayed the missing plugin notification");
   ok(!notificationBox.getNotificationWithValue("blocked-plugins"), "Test 1a, Should not have displayed the blocked plugin notification");
 
   var pluginInfo = getTestPlugin();
   ok(pluginInfo, "Should have a test plugin");
 
   var doc = gTestBrowser.contentDocument;
   var plugin = doc.getElementById("test");
   var objLoadingContent = plugin.QueryInterface(Ci.nsIObjectLoadingContent);
--- a/suite/components/bindings/notification.xml
+++ b/suite/components/bindings/notification.xml
@@ -475,20 +475,16 @@
                   if (outdatedNotification)
                     this.removeNotification(outdatedNotification);
                 }
 
                 if (aData == "plugins.hide_infobar_for_missing_plugin") {
                   if (!Services.prefs.getBoolPref(aData))
                     return;
 
-                  var missingNotification = this.getNotificationWithValue("missing-plugins");
-                  if (missingNotification)
-                    this.removeNotification(missingNotification);
-
                   var disabledNotification = this.getNotificationWithValue("disabled-plugins");
                   if (disabledNotification)
                     this.removeNotification(disabledNotification);
 
                   var blockedNotification = this.getNotificationWithValue("blocked-plugins");
                   if (blockedNotification)
                     this.removeNotification(blockedNotification);
                 }
@@ -589,17 +585,16 @@
 
             if (Services.prefs.getBoolPref(aPref || "plugins.hide_infobar_for_missing_plugin"))
               return;
 
             var notification;
             var notifications = [
               "blocked-plugins",
               "disabled-plugins",
-              "missing-plugins",
               "outdated-plugins",
             ];
 
             // Remove lower priority notifications.
             for (var i = 0; notifications[i] != aNotification; i++) {
               notification = this.getNotificationWithValue(notifications[i]);
               if (notification)
                 notification.close();
@@ -620,47 +615,44 @@
         </body>
       </method>
 
       <method name="canActivatePlugin">
         <parameter name="aPlugin"/>
         <parameter name="aSkipFallbackType"/>
         <body>
           <![CDATA[
-            const nsIObjectLoadingContent = Ci.nsIObjectLoadingContent;
-            var objLoadingContent = aPlugin.QueryInterface(nsIObjectLoadingContent);
+            var objLoadingContent = aPlugin.QueryInterface(Ci.nsIObjectLoadingContent);
             var actualType = objLoadingContent.actualType;
-            if (objLoadingContent.getContentTypeForMIMEType(actualType) != nsIObjectLoadingContent.TYPE_PLUGIN ||
+            if (objLoadingContent.getContentTypeForMIMEType(actualType) != Ci.nsIObjectLoadingContent.TYPE_PLUGIN ||
                 objLoadingContent.activated ||
                 (!aSkipFallbackType &&
-                 (objLoadingContent.pluginFallbackType < nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY ||
-                  objLoadingContent.pluginFallbackType > nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE)))
+                 (objLoadingContent.pluginFallbackType < Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY ||
+                  objLoadingContent.pluginFallbackType > Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE)))
               return false;
 
             var ph = Cc["@mozilla.org/plugin/host;1"]
                        .getService(Ci.nsIPluginHost);
             var permissionString = ph.getPermissionStringForType(actualType);
-            const nsIPermissionManager = Ci.nsIPermissionManager;
             var pm = Cc["@mozilla.org/permissionmanager;1"]
-                       .getService(nsIPermissionManager);
+                       .getService(Ci.nsIPermissionManager);
             var pluginPermission = pm.testPermission(this.activeBrowser.currentURI, permissionString);
-            return pluginPermission != nsIPermissionManager.DENY_ACTION;
+            return pluginPermission != Ci.nsIPermissionManager.DENY_ACTION;
           ]]>
         </body>
       </method>
 
       <method name="setPermissionForPlugins">
         <parameter name="aPermission"/>
         <body>
           <![CDATA[
             var ph = Cc["@mozilla.org/plugin/host;1"]
                        .getService(Ci.nsIPluginHost);
-            const nsIPermissionManager = Ci.nsIPermissionManager;
             var pm = Cc["@mozilla.org/permissionmanager;1"]
-                       .getService(nsIPermissionManager);
+                       .getService(Ci.nsIPermissionManager);
             for (var type of this.clickToPlayTypes) {
               var permissionString = ph.getPermissionStringForType(type);
               pm.add(this.activeBrowser.currentURI, permissionString, aPermission);
             }
           ]]>
         </body>
       </method>
 
@@ -2024,45 +2016,32 @@
                                       null, priority, buttons);
             }
           }
         ]]>
       </handler>
 
       <handler event="PluginBindingAttached" phase="capturing" allowuntrusted="true">
         <![CDATA[
-          var nsIObjectLoadingContent = Ci.nsIObjectLoadingContent;
           var plugin = event.target;
           // Since we are expecting also untrusted events, make sure
           // that the target is a plugin
-          if (!(plugin instanceof nsIObjectLoadingContent))
+          if (!(plugin instanceof Ci.nsIObjectLoadingContent))
             return;
 
           var closeIcon = this.getPluginUI(plugin, "closeIcon");
           this.addLinkClickCallback(closeIcon, this.hidePluginOverlay, plugin);
 
           var notification, message, buttons, pref;
           switch (plugin.pluginFallbackType) {
-            case nsIObjectLoadingContent.PLUGIN_UNSUPPORTED:
-              notification = "missing-plugins";
-              message = this._stringBundle.GetStringFromName("missingpluginsMessage.title");
-              if ("goPreferences" in window) {
-                buttons = [{
-                  label: this._stringBundle.GetStringFromName("missingpluginsMessage.button.label"),
-                  accessKey: this._stringBundle.GetStringFromName("missingpluginsMessage.button.accesskey"),
-                  popup: null,
-                  callback: function() {
-                    goPreferences("scripts_pane");
-                    return true;
-                  }
-                }];
-              }
-              break;
+            case Ci.nsIObjectLoadingContent.PLUGIN_UNSUPPORTED:
+              // NOP. Plugin finder service (PFS) is dead.
+              return;
 
-            case nsIObjectLoadingContent.PLUGIN_DISABLED:
+            case Ci.nsIObjectLoadingContent.PLUGIN_DISABLED:
               if (!this.canActivatePlugin(plugin, true))
                 return;
 
               notification = "disabled-plugins";
               message = this._stringBundle.GetStringFromName("missingpluginsMessage.title");
               if ("toEM" in window) {
                 buttons = [{
                   label: this._stringBundle.GetStringFromName("addonInstallManageButton"),
@@ -2073,55 +2052,53 @@
                   }
                 }];
 
                 var manageLink = this.getPluginUI(plugin, "managePluginsLink");
                 this.addLinkClickCallback(manageLink, window.toEM, "addons://list/plugin");
               }
               break;
 
-            case nsIObjectLoadingContent.PLUGIN_BLOCKLISTED:
+            case Ci.nsIObjectLoadingContent.PLUGIN_BLOCKLISTED:
               notification = "blocked-plugins";
               message = this._stringBundle.GetStringFromName("blockedpluginsMessage.title");
               buttons = [{
                 label: this._stringBundle.GetStringFromName("blockedpluginsMessage.infoButton.label"),
                 accessKey: this._stringBundle.GetStringFromName("blockedpluginsMessage.infoButton.accesskey"),
                 popup: null,
                 callback: this.openURLPref.bind(this, "extensions.blocklist.detailsURL")
               }];
               break;
 
-            case nsIObjectLoadingContent.PLUGIN_OUTDATED:
+            case Ci.nsIObjectLoadingContent.PLUGIN_OUTDATED:
               notification = "outdated-plugins";
               message = this._stringBundle.GetStringFromName("outdatedpluginsMessage.title");
               buttons = [{
                 label: this._stringBundle.GetStringFromName("outdatedpluginsMessage.button.label"),
                 accessKey: this._stringBundle.GetStringFromName("outdatedpluginsMessage.button.accesskey"),
                 popup: null,
-                callback: this.openURLPref.bind(this, "plugins.update.url")
+                callback: null,
               }];
               pref = "plugins.hide_infobar_for_outdated_plugin";
               break;
 
-            case nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE:
-              var updateLink = this.getPluginUI(plugin, "checkForUpdatesLink");
-              this.addLinkClickCallback(updateLink, this.openURLPref, "plugins.update.url");
+            case Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE:
               // fall through
-            case nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE:
+            case Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE:
               var eventType = this.getBindingType(plugin);
               // When we got here, we deal with a vulnerable plugin object, so setup UI elements for this case
               var vulnerabilityString = this._stringBundle.GetStringFromName(eventType);
               var vulnerabilityText = this.getPluginUI(plugin, "vulnerabilityStatus");
               vulnerabilityText.textContent = vulnerabilityString;
               // fall through
-            case nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY:
+            case Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY:
               this.setupPluginClickToPlay(plugin, true);
               return;
 
-            case nsIObjectLoadingContent.PLUGIN_PLAY_PREVIEW:
+            case Ci.nsIObjectLoadingContent.PLUGIN_PLAY_PREVIEW:
               this.handlePlayPreviewEvent(plugin);
               return;
 
             default:
               return;
           }
           this.pluginUnavailable(plugin, notification, message, buttons, pref);
         ]]>
@@ -2409,23 +2386,19 @@
             for (let [pluginName, namedPluginArray] of pluginsDictionary) {
               let plugin = namedPluginArray[0];
               let warn = false;
               let warningText = "";
               let updateLink = "";
 
               if (plugin.pluginFallbackType) {
                 if (plugin.pluginFallbackType ==
-                      Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE) {
-                  updateLink = this._urlFormatter.formatURLPref("plugins.update.url");
-                  warn = true;
-                  warningText = this._stringBundle.GetStringFromName("vulnerableUpdatablePluginWarning");
-                }
-                else if (plugin.pluginFallbackType ==
-                           Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE) {
+                      Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE ||
+                    plugin.pluginFallbackType ==
+                      Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE) {
                   warn = true;
                   warningText = this._stringBundle.GetStringFromName("vulnerableNoUpdatePluginWarning");
                 }
               }
 
               let action = {
                 message: pluginName,
                 warn: warn,
--- a/suite/components/nsSuiteGlue.js
+++ b/suite/components/nsSuiteGlue.js
@@ -588,19 +588,16 @@ SuiteGlue.prototype = {
           Cu.reportError(e);
         }
       }
     }
   },
 
   // Browser startup complete. All initial windows have opened.
   _onBrowserStartup: function(aWindow) {
-    if (Services.prefs.getBoolPref("plugins.update.notifyUser"))
-      this._showPluginUpdatePage(aWindow);
-
     // For any add-ons that were installed disabled and can be enabled offer
     // them to the user.
     var browser = aWindow.getBrowser();
     var changedIDs = AddonManager.getStartupChanges(AddonManager.STARTUP_CHANGE_INSTALLED);
     if (changedIDs.length) {
       AddonManager.getAddonsByIDs(changedIDs, function(aAddons) {
         aAddons.forEach(function(aAddon) {
           // If the add-on isn't user disabled or can't be enabled then skip it.
@@ -824,24 +821,16 @@ SuiteGlue.prototype = {
             Services.prefs.setIntPref("browser.startup.page", 3);
           }
         }
         break;
       }
     }
   },
 
-  _showPluginUpdatePage: function(aWindow) {
-    Services.prefs.setBoolPref("plugins.update.notifyUser", false);
-
-    var url = Services.urlFormatter.formatURLPref("plugins.update.url");
-
-    aWindow.getBrowser().addTab(url, { focusNewTab: true });
-  },
-
   /*
    * _shouldShowRights - Determines if the user should be shown the
    * about:rights notification. The notification should *not* be shown if
    * we've already shown the current version, or if the override pref says to
    * never show it. The notification *should* be shown if it's never been seen
    * before, if a newer version is available, or if the override pref says to
    * always show it.
    */
--- a/suite/locales/en-US/chrome/common/notification.properties
+++ b/suite/locales/en-US/chrome/common/notification.properties
@@ -2,18 +2,16 @@
 # 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/.
 
 outdatedpluginsMessage.title=Some plugins used by this page are out of date.
 outdatedpluginsMessage.button.label=Update Plugins…
 outdatedpluginsMessage.button.accesskey=U
 
 missingpluginsMessage.title=Additional plugins are required to display all the media on this page.
-missingpluginsMessage.button.label=Preferences
-missingpluginsMessage.button.accesskey=P
 
 blockedpluginsMessage.title=Some plugins required by this page have been blocked for your protection.
 blockedpluginsMessage.infoButton.label=Details…
 blockedpluginsMessage.infoButton.accesskey=D
 
 crashedpluginsMessage.title=The %S plugin has crashed.
 crashedpluginsMessage.reloadButton.label=Reload page
 crashedpluginsMessage.reloadButton.accesskey=R
--- a/suite/themes/classic/communicator/communicator.css
+++ b/suite/themes/classic/communicator/communicator.css
@@ -157,17 +157,16 @@ treecols:-moz-lwtheme {
 /* ::::: notification bars ::::: */
 
 .messageImage[value="refresh-blocked"] {
   list-style-image: url("chrome://communicator/skin/icons/application.png");
 }
 
 .messageImage[value="blocked-plugins"],
 .messageImage[value="disabled-plugins"],
-.messageImage[value="missing-plugins"],
 .messageImage[value="outdated-plugins"],
 .messageImage[value="click-to-play-plugins"],
 .messageImage[value="plugin-crashed"] {
   list-style-image: url("chrome://mozapps/skin/plugins/pluginGeneric-16.png");
 }
 
 .messageImage[value="geolocation"] {
   list-style-image: url("chrome://communicator/skin/icons/geo.png");
--- a/suite/themes/classic/mac/communicator/communicator.css
+++ b/suite/themes/classic/mac/communicator/communicator.css
@@ -167,17 +167,16 @@ treecols:-moz-lwtheme {
 /* ::::: notification bars ::::: */
 
 .messageImage[value="refresh-blocked"] {
   list-style-image: url("chrome://communicator/skin/icons/application.png");
 }
 
 .messageImage[value="blocked-plugins"],
 .messageImage[value="disabled-plugins"],
-.messageImage[value="missing-plugins"],
 .messageImage[value="outdated-plugins"],
 .messageImage[value="click-to-play-plugins"],
 .messageImage[value="plugin-crashed"] {
   list-style-image: url("chrome://mozapps/skin/plugins/pluginGeneric-16.png");
 }
 
 .messageImage[value="geolocation"] {
   list-style-image: url("chrome://communicator/skin/icons/geo.png");
--- a/suite/themes/modern/communicator/communicator.css
+++ b/suite/themes/modern/communicator/communicator.css
@@ -119,17 +119,16 @@ toolbar[iconsize="small"] > #print-butto
 /* ::::: notification bars ::::: */
 
 .messageImage[value="refresh-blocked"] {
   list-style-image: url("chrome://communicator/skin/icons/application.png");
 }
 
 .messageImage[value="blocked-plugins"],
 .messageImage[value="disabled-plugins"],
-.messageImage[value="missing-plugins"],
 .messageImage[value="outdated-plugins"],
 .messageImage[value="click-to-play-plugins"],
 .messageImage[value="plugin-crashed"] {
   list-style-image: url("chrome://mozapps/skin/plugins/pluginGeneric-16.png");
 }
 
 .messageImage[value="geolocation"] {
   list-style-image: url("chrome://communicator/skin/icons/geo.png");