Bug 1438857 - Remove the Flash plugin infobar. r?felipe,chutten draft
authorPrathiksha <prathikshaprasadsuman@gmail.com>
Sat, 07 Apr 2018 19:34:45 +0530
changeset 780961 0c889e86f22ada2a265f34c779f77ee366723f58
parent 780587 cfe6399e142c71966ef58a16cfd52c0b46dc6b1e
push id106170
push userbmo:prathikshaprasadsuman@gmail.com
push dateThu, 12 Apr 2018 09:42:59 +0000
reviewersfelipe, chutten
bugs1438857
milestone61.0a1
Bug 1438857 - Remove the Flash plugin infobar. r?felipe,chutten MozReview-Commit-ID: BbHAowC87sz
browser/app/profile/firefox.js
browser/base/content/browser-plugins.js
browser/locales/en-US/chrome/browser/browser.properties
browser/modules/PluginContent.jsm
browser/themes/linux/browser.css
browser/themes/osx/browser.css
browser/themes/shared/plugin-doorhanger.inc.css
browser/themes/windows/browser.css
toolkit/components/telemetry/Histograms.json
toolkit/components/telemetry/TelemetryEnvironment.jsm
toolkit/themes/mobile/mozapps/plugins/pluginProblem.css
toolkit/themes/shared/plugins/pluginProblem.css
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -708,19 +708,16 @@ pref("accessibility.support.url", "https
 pref("accessibility.indicator.enabled", false);
 
 pref("plugins.click_to_play", true);
 pref("plugins.testmode", false);
 
 // Should plugins that are hidden show the infobar UI?
 pref("plugins.show_infobar", false);
 
-// Should dismissing the hidden plugin infobar suppress it permanently?
-pref("plugins.remember_infobar_dismissal", true);
-
 pref("plugin.default.state", 1);
 
 // Plugins bundled in XPIs are enabled by default.
 pref("plugin.defaultXpi.state", 2);
 
 // Java is Click-to-Activate by default on all channels.
 pref("plugin.state.java", 1);
 
--- a/browser/base/content/browser-plugins.js
+++ b/browser/base/content/browser-plugins.js
@@ -1,23 +1,20 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
  * 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/. */
 
 var gPluginHandler = {
   PREF_SESSION_PERSIST_MINUTES: "plugin.sessionPermissionNow.intervalInMinutes",
   PREF_PERSISTENT_DAYS: "plugin.persistentPermissionAlways.intervalInDays",
-  PREF_SHOW_INFOBAR: "plugins.show_infobar",
-  PREF_INFOBAR_DISMISSAL_PERMANENT: "plugins.remember_infobar_dismissal",
 
   MESSAGES: [
     "PluginContent:ShowClickToPlayNotification",
     "PluginContent:RemoveNotification",
-    "PluginContent:UpdateHiddenPluginUI",
     "PluginContent:HideNotificationBar",
     "PluginContent:InstallSinglePlugin",
     "PluginContent:ShowPluginCrashedNotification",
     "PluginContent:SubmitReport",
     "PluginContent:LinkClickCallback",
   ],
 
   init() {
@@ -46,21 +43,16 @@ var gPluginHandler = {
     switch (msg.name) {
       case "PluginContent:ShowClickToPlayNotification":
         this.showClickToPlayNotification(msg.target, msg.data.plugins, msg.data.showNow,
                                          msg.principal, msg.data.location);
         break;
       case "PluginContent:RemoveNotification":
         this.removeNotification(msg.target, msg.data.name);
         break;
-      case "PluginContent:UpdateHiddenPluginUI":
-        this.updateHiddenPluginUI(msg.target, msg.data.haveInsecure, msg.data.actions,
-                                  msg.principal, msg.data.location)
-          .catch(Cu.reportError);
-        break;
       case "PluginContent:HideNotificationBar":
         this.hideNotificationBar(msg.target, msg.data.name);
         break;
       case "PluginContent:InstallSinglePlugin":
         this.installSinglePlugin(msg.data.pluginInfo);
         break;
       case "PluginContent:ShowPluginCrashedNotification":
         this.showPluginCrashedNotification(msg.target, msg.data.messageString,
@@ -291,17 +283,16 @@ var gPluginHandler = {
     }
 
     if (notification) {
       // Don't modify the notification UI while it's on the screen, that would be
       // jumpy and might allow clickjacking.
       if (showNow) {
         notification.options.primaryPlugin = primaryPluginPermission;
         notification.reshow();
-        browser.messageManager.sendAsyncMessage("BrowserPlugins:NotificationShown");
       }
       return;
     }
 
     if (plugins.length == 1) {
       let pluginInfo = plugins[0];
       // If a block contains an infoURL, we should always prefer that to the default
       // URL that we construct in-product, even for other blocklist types.
@@ -391,17 +382,16 @@ var gPluginHandler = {
           accessKey: gNavigatorBundle.getString("flashActivate.noAllow.accesskey"),
           dismiss: true,
         }];
       }
 
       PopupNotifications.show(browser, "click-to-play-plugins",
                                              description, "plugins-notification-icon",
                                              mainAction, secondaryActions, options);
-      browser.messageManager.sendAsyncMessage("BrowserPlugins:NotificationShown");
     } else {
       this.removeNotification(browser, "click-to-play-plugins");
     }
   },
 
   removeNotification(browser, name) {
     let notification = PopupNotifications.getNotification(name, browser);
     if (notification)
@@ -410,185 +400,16 @@ var gPluginHandler = {
 
   hideNotificationBar(browser, name) {
     let notificationBox = gBrowser.getNotificationBox(browser);
     let notification = notificationBox.getNotificationWithValue(name);
     if (notification)
       notificationBox.removeNotification(notification, true);
   },
 
-  infobarBlockedForURI(uri) {
-    return new Promise((resolve, reject) => {
-      let tableName = Services.prefs.getStringPref("urlclassifier.flashInfobarTable", "");
-      if (!tableName) {
-        resolve(false);
-      }
-      let classifier = Cc["@mozilla.org/url-classifier/dbservice;1"]
-        .getService(Ci.nsIURIClassifier);
-      classifier.asyncClassifyLocalWithTables(uri, tableName, (c, list) => {
-        resolve(list.length > 0);
-      });
-    });
-  },
-
-  async updateHiddenPluginUI(browser, haveInsecure, actions,
-                                 principal, location) {
-    let origin = principal.originNoSuffix;
-
-    let shouldShowNotification = !(await this.infobarBlockedForURI(browser.documentURI));
-
-    // It is possible that we've received a message from the frame script to show
-    // the hidden plugin notification for a principal that no longer matches the one
-    // that the browser's content now has assigned (ie, the browser has browsed away
-    // after the message was sent, but before the message was received). In that case,
-    // we should just ignore the message.
-    if (!principal.equals(browser.contentPrincipal)) {
-      return;
-    }
-
-    // Data URIs, when linked to from some page, inherit the principal of that
-    // page. That means that we also need to compare the actual locations to
-    // ensure we aren't getting a message from a Data URI that we're no longer
-    // looking at.
-    let receivedURI = Services.io.newURI(location);
-    if (!browser.documentURI.equalsExceptRef(receivedURI)) {
-      return;
-    }
-
-    // Set up the icon
-    document.getElementById("plugins-notification-icon").classList.
-      toggle("plugin-blocked", haveInsecure);
-
-    // Now configure the notification bar
-    let notificationBox = gBrowser.getNotificationBox(browser);
-
-    function hideNotification() {
-      let n = notificationBox.getNotificationWithValue("plugin-hidden");
-      if (n) {
-        notificationBox.removeNotification(n, true);
-      }
-    }
-
-    // There are three different cases when showing an infobar:
-    // 1.  A single type of plugin is hidden on the page. Show the UI for that
-    //     plugin.
-    // 2a. Multiple types of plugins are hidden on the page. Show the multi-UI
-    //     with the vulnerable styling.
-    // 2b. Multiple types of plugins are hidden on the page, but none are
-    //     vulnerable. Show the nonvulnerable multi-UI.
-    function showNotification() {
-      if (!Services.prefs.getBoolPref(gPluginHandler.PREF_SHOW_INFOBAR, true)) {
-        return;
-      }
-
-      let n = notificationBox.getNotificationWithValue("plugin-hidden");
-      if (n) {
-        // If something is already shown, just keep it
-        return;
-      }
-
-      Services.telemetry.getHistogramById("PLUGINS_INFOBAR_SHOWN").
-        add(true);
-
-      let message;
-      // Icons set directly cannot be manipulated using moz-image-region, so
-      // we use CSS classes instead.
-      let brand = document.getElementById("bundle_brand").getString("brandShortName");
-
-      if (actions.length == 1) {
-        let pluginInfo = actions[0];
-        let pluginName = pluginInfo.pluginName;
-
-        switch (pluginInfo.fallbackType) {
-          case Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY:
-          case Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY_QUIET:
-            message = gNavigatorBundle.getFormattedString(
-              "pluginActivationWarning.message",
-              [brand]);
-            break;
-          case Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE:
-            message = gNavigatorBundle.getFormattedString(
-              "pluginActivateOutdated.message",
-              [pluginName, origin, brand]);
-            break;
-          case Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE:
-            message = gNavigatorBundle.getFormattedString(
-              "pluginActivateVulnerable.message",
-              [pluginName, origin, brand]);
-        }
-      } else {
-        // Multi-plugin
-        message = gNavigatorBundle.getFormattedString(
-          "pluginActivateMultiple.message", [origin]);
-      }
-
-      let buttons = [
-        {
-          label: gNavigatorBundle.getString("pluginContinueBlocking.label"),
-          accessKey: gNavigatorBundle.getString("pluginContinueBlocking.accesskey"),
-          callback() {
-            Services.telemetry.getHistogramById("PLUGINS_INFOBAR_BLOCK").
-              add(true);
-
-            Services.perms.addFromPrincipal(principal,
-                                            "plugin-hidden-notification",
-                                            Services.perms.DENY_ACTION);
-          }
-        },
-        {
-          label: gNavigatorBundle.getString("pluginActivateTrigger.label"),
-          accessKey: gNavigatorBundle.getString("pluginActivateTrigger.accesskey"),
-          callback() {
-            Services.telemetry.getHistogramById("PLUGINS_INFOBAR_ALLOW").
-              add(true);
-
-            let curNotification =
-              PopupNotifications.getNotification("click-to-play-plugins",
-                                                 browser);
-            if (curNotification) {
-              curNotification.reshow();
-            }
-          }
-        }
-      ];
-      function notificationCallback(type) {
-        if (type == "dismissed") {
-          Services.telemetry.getHistogramById("PLUGINS_INFOBAR_DISMISSED").
-            add(true);
-          if (Services.prefs.getBoolPref(gPluginHandler.PREF_INFOBAR_DISMISSAL_PERMANENT, false)) {
-            Services.perms.addFromPrincipal(principal,
-                                            "plugin-hidden-notification",
-                                            Services.perms.DENY_ACTION);
-          }
-        }
-      }
-      n = notificationBox.
-        appendNotification(message, "plugin-hidden", null,
-                           notificationBox.PRIORITY_INFO_HIGH, buttons,
-                           notificationCallback);
-      if (haveInsecure) {
-        n.classList.add("pluginVulnerable");
-      }
-    }
-
-    if (actions.length == 0) {
-      shouldShowNotification = false;
-    }
-    if (shouldShowNotification &&
-        Services.perms.testPermissionFromPrincipal(principal, "plugin-hidden-notification") ==
-        Ci.nsIPermissionManager.DENY_ACTION) {
-      shouldShowNotification = false;
-    }
-    if (shouldShowNotification) {
-      showNotification();
-    } else {
-      hideNotification();
-    }
-  },
-
   contextMenuCommand(browser, plugin, command) {
     browser.messageManager.sendAsyncMessage("BrowserPlugins:ContextMenuCommand",
       { command }, { plugin });
   },
 
   // Crashed-plugin observer. Notified once per plugin crash, before events
   // are dispatched to individual plugin instances.
   NPAPIPluginCrashed(subject, topic, data) {
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -277,38 +277,16 @@ crashedpluginsMessage.learnMore=Learn More…
 # loaded a search page for the given word.  An infobar then asks to the user
 # whether he rather wanted to visit the host.  %S is the recognized host.
 keywordURIFixup.message=Did you mean to go to %S?
 keywordURIFixup.goTo=Yes, take me to %S
 keywordURIFixup.goTo.accesskey=Y
 keywordURIFixup.dismiss=No thanks
 keywordURIFixup.dismiss.accesskey=N
 
-## Plugin doorhanger strings
-# LOCALIZATION NOTE (pluginActivate2.message):
-# Used for normal plugin activation if we don't know of a specific security issue.
-# %1$S is the plugin name, %2$S is the domain, and %3$S is brandShortName.
-pluginActivate2.message=Would you like to allow %2$S to run %1$S? Plugins may slow %3$S.
-pluginActivateMultiple.message=Allow %S to run plugins?
-
-# LOCALIZATION NOTE (pluginActivationWarning.message): this should use the
-# same string as "pluginActivationWarning" in pluginproblem.dtd
-pluginActivationWarning.message=This site uses a plugin that may slow %S.
-
-pluginActivate.learnMore=Learn More…
-# LOCALIZATION NOTE (pluginActivateOutdated.message, pluginActivateOutdated.label):
-# These strings are used when an unsafe plugin has an update available.
-# %1$S is the plugin name, %2$S is the domain, and %3$S is brandShortName.
-pluginActivateOutdated.message=%3$S has prevented the outdated plugin “%1$S” from running on %2$S.
-pluginActivateOutdated.label=Outdated plugin
-pluginActivate.updateLabel=Update now…
-# LOCALIZATION NOTE (pluginActivateVulnerable.message):
-# This string is used when an unsafe plugin has no update available.
-# %1$S is the plugin name, %2$S is the domain, and %3$S is brandShortName.
-pluginActivateVulnerable.message=%3$S has prevented the unsafe plugin “%1$S” from running on %2$S.
 pluginInfo.unknownPlugin=Unknown
 
 # LOCALIZATION NOTE (pluginActivateNow.label, pluginActivateAlways.label, pluginBlockNow.label): These should be the same as the matching strings in browser.dtd
 # LOCALIZATION NOTE (pluginActivateNow.label): This button will enable the
 # plugin in the current session for an short time (about an hour), auto-renewed
 # if the site keeps using the plugin.
 pluginActivateNow.label=Allow Now
 pluginActivateNow.accesskey=N
@@ -339,24 +317,16 @@ flashActivate.allow.accesskey=A
 # the best one.
 # The second change is that we removed the period at the end of the phrase, because
 # it's not natural in our UI, and the underline was removed from this, so it doesn't
 # look like a link anymore. We suggest that everyone removes that period too.
 PluginClickToActivate2=Run %S
 PluginVulnerableUpdatable=This plugin is vulnerable and should be updated.
 PluginVulnerableNoUpdate=This plugin has security vulnerabilities.
 
-# infobar UI
-pluginContinueBlocking.label=Continue Blocking
-pluginContinueBlocking.accesskey=B
-# LOCALIZATION NOTE (pluginActivateTrigger): Use the unicode ellipsis char, \u2026,
-# or use "..." if \u2026 doesn't suit traditions in your locale.
-pluginActivateTrigger.label=Allow…
-pluginActivateTrigger.accesskey=A
-
 # Sanitize
 # LOCALIZATION NOTE (sanitizeDialog2.everything.title): When "Time range to
 # clear" is set to "Everything", the Clear Recent History dialog's title is
 # changed to this.  See UI mockup and comment 11 at bug 480169 -->
 sanitizeDialog2.everything.title=Clear All History
 sanitizeButtonOK=Clear Now
 # LOCALIZATION NOTE (sanitizeButtonClearing): The label for the default
 # button between the user clicking it and the window closing.  Indicates the
--- a/browser/modules/PluginContent.jsm
+++ b/browser/modules/PluginContent.jsm
@@ -55,17 +55,16 @@ PluginContent.prototype = {
     global.addEventListener("PluginInstantiated", this, true);
     global.addEventListener("PluginRemoved", this, true);
     global.addEventListener("pagehide", this, true);
     global.addEventListener("pageshow", this, true);
     global.addEventListener("unload", this);
     global.addEventListener("HiddenPlugin", this, true);
 
     global.addMessageListener("BrowserPlugins:ActivatePlugins", this);
-    global.addMessageListener("BrowserPlugins:NotificationShown", this);
     global.addMessageListener("BrowserPlugins:ContextMenuCommand", this);
     global.addMessageListener("BrowserPlugins:NPAPIPluginProcessCrashed", this);
     global.addMessageListener("BrowserPlugins:CrashReportSubmitted", this);
     global.addMessageListener("BrowserPlugins:Test:ClearCrashData", this);
 
     Services.obs.addObserver(this, "decoder-doctor-notification");
   },
 
@@ -79,36 +78,32 @@ PluginContent.prototype = {
     global.removeEventListener("PluginInstantiated", this, true);
     global.removeEventListener("PluginRemoved", this, true);
     global.removeEventListener("pagehide", this, true);
     global.removeEventListener("pageshow", this, true);
     global.removeEventListener("unload", this);
     global.removeEventListener("HiddenPlugin", this, true);
 
     global.removeMessageListener("BrowserPlugins:ActivatePlugins", this);
-    global.removeMessageListener("BrowserPlugins:NotificationShown", this);
     global.removeMessageListener("BrowserPlugins:ContextMenuCommand", this);
     global.removeMessageListener("BrowserPlugins:NPAPIPluginProcessCrashed", this);
     global.removeMessageListener("BrowserPlugins:CrashReportSubmitted", this);
     global.removeMessageListener("BrowserPlugins:Test:ClearCrashData", this);
 
     Services.obs.removeObserver(this, "decoder-doctor-notification");
 
     delete this.global;
     delete this.content;
   },
 
   receiveMessage(msg) {
     switch (msg.name) {
       case "BrowserPlugins:ActivatePlugins":
         this.activatePlugins(msg.data.pluginInfo, msg.data.newState);
         break;
-      case "BrowserPlugins:NotificationShown":
-        setTimeout(() => this.updateNotificationUI(), 0);
-        break;
       case "BrowserPlugins:ContextMenuCommand":
         let contextMenu = this.global.contextMenu;
 
         switch (msg.data.command) {
           case "play":
             this._showClickToPlayNotification(contextMenu.getTarget(msg, "plugin"), true);
             break;
           case "hide":
@@ -142,17 +137,16 @@ PluginContent.prototype = {
       case "decoder-doctor-notification":
         let data = JSON.parse(aData);
         let type = data.type.toLowerCase();
         if (type == "cannot-play" &&
             this.haveShownNotification &&
             aSubject.top.document == this.content.document &&
             data.formats.toLowerCase().includes("application/x-mpegurl", 0)) {
           this.global.content.pluginRequiresReload = true;
-          this.updateNotificationUI(this.content.document);
         }
     }
   },
 
   onPageShow(event) {
     // Ignore events that aren't from the main document.
     if (!this.content || event.target != this.content.document) {
       return;
@@ -470,21 +464,16 @@ PluginContent.prototype = {
       return;
     }
 
     if (eventType == "pageshow") {
       this.onPageShow(event);
       return;
     }
 
-    if (eventType == "PluginRemoved") {
-      this.updateNotificationUI(event.target);
-      return;
-    }
-
     if (eventType == "click") {
       this.onOverlayClick(event);
       return;
     }
 
     if (eventType == "PluginCrashed" &&
         !(event.target instanceof Ci.nsIObjectLoadingContent)) {
       // If the event target is not a plugin object (i.e., an <object> or
@@ -598,17 +587,16 @@ PluginContent.prototype = {
     let overlay = this.getPluginUI(plugin, "main");
     if (eventType != "PluginCrashed") {
       if (overlay != null) {
         this.setVisibility(plugin, overlay,
                            this.computeAndAdjustOverlayDisplay(plugin, overlay));
         let resizeListener = () => {
           this.setVisibility(plugin, overlay,
             this.computeAndAdjustOverlayDisplay(plugin, overlay));
-          this.updateNotificationUI();
         };
         plugin.addEventListener("overflow", resizeListener);
         plugin.addEventListener("underflow", resizeListener);
       }
     }
 
     let closeIcon = this.getPluginUI(plugin, "closeIcon");
     if (closeIcon) {
@@ -804,17 +792,16 @@ PluginContent.prototype = {
     // If there are no instances of the plugin on the page any more, what the
     // user probably needs is for us to allow and then refresh. Additionally, if
     // this is content that requires HLS or we replaced the placeholder the page
     // needs to be refreshed for it to insert its plugins
     if (newState != "block" && newState != "blockalways" && newState != "continueblocking" &&
        (!pluginFound || placeHolderFound || contentWindow.pluginRequiresReload)) {
       this.reloadPage();
     }
-    this.updateNotificationUI();
   },
 
   _showClickToPlayNotification(plugin, showNow) {
     let plugins = [];
 
     // If plugin is null, that means the user has navigated back to a page with
     // plugins, and we need to collect all the plugins.
     if (plugin === null) {
@@ -871,100 +858,16 @@ PluginContent.prototype = {
 
     this.global.sendAsyncMessage("PluginContent:ShowClickToPlayNotification", {
       plugins: [...this.pluginData.values()],
       showNow,
       location,
     }, null, principal);
   },
 
-  /**
-   * Updates the "hidden plugin" notification bar UI.
-   *
-   * @param document (optional)
-   *        Specify the document that is causing the update.
-   *        This is useful when the document is possibly no longer
-   *        the current loaded document (for example, if we're
-   *        responding to a PluginRemoved event for an unloading
-   *        document). If this parameter is omitted, it defaults
-   *        to the current top-level document.
-   */
-  updateNotificationUI(document) {
-    document = document || this.content.document;
-
-    // We're only interested in the top-level document, since that's
-    // the one that provides the Principal that we send back to the
-    // parent.
-    let principal = document.defaultView.top.document.nodePrincipal;
-    let location = document.location.href;
-
-    // Make a copy of the actions from the last popup notification.
-    let haveInsecure = false;
-    let actions = new Map();
-    for (let action of this.pluginData.values()) {
-      switch (action.fallbackType) {
-        // haveInsecure will trigger the red flashing icon and the infobar
-        // styling below
-        case Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE:
-        case Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE:
-          haveInsecure = true;
-          // fall through
-
-        case Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY_QUIET:
-        case Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY:
-          actions.set(action.permissionString, action);
-          continue;
-      }
-    }
-
-    // Remove plugins that are already active, or large enough to show an overlay.
-    let cwu = this.content.QueryInterface(Ci.nsIInterfaceRequestor)
-                          .getInterface(Ci.nsIDOMWindowUtils);
-    for (let plugin of cwu.plugins) {
-      let info = this._getPluginInfo(plugin);
-      if (!actions.has(info.permissionString)) {
-        continue;
-      }
-      let fallbackType = info.fallbackType;
-      if (fallbackType == Ci.nsIObjectLoadingContent.PLUGIN_ACTIVE) {
-        actions.delete(info.permissionString);
-        if (actions.size == 0) {
-          break;
-        }
-        continue;
-      }
-      if (fallbackType != Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY &&
-          fallbackType != Ci.nsIObjectLoadingContent.PLUGIN_CLICK_TO_PLAY_QUIET &&
-          fallbackType != Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_UPDATABLE &&
-          fallbackType != Ci.nsIObjectLoadingContent.PLUGIN_VULNERABLE_NO_UPDATE) {
-        continue;
-      }
-      let overlay = this.getPluginUI(plugin, "main");
-      if (!overlay) {
-        continue;
-      }
-      let overlayDisplayState = this.computeAndAdjustOverlayDisplay(plugin, overlay);
-      this.setVisibility(plugin, overlay, overlayDisplayState);
-      if (overlayDisplayState > OVERLAY_DISPLAY.BLANK) {
-        actions.delete(info.permissionString);
-        if (actions.size == 0) {
-          break;
-        }
-      }
-    }
-
-    // If there are any items remaining in `actions` now, they are hidden
-    // plugins that need a notification bar.
-    this.global.sendAsyncMessage("PluginContent:UpdateHiddenPluginUI", {
-      haveInsecure,
-      actions: [...actions.values()],
-      location,
-    }, null, principal);
-  },
-
   removeNotification(name) {
     this.global.sendAsyncMessage("PluginContent:RemoveNotification", { name });
   },
 
   clearPluginCaches() {
     this.pluginData.clear();
     this.pluginCrashData.clear();
   },
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -547,17 +547,16 @@ notification[value="translation"] menuli
 #statuspanel[mirror] > #statuspanel-inner > #statuspanel-label:-moz-locale-dir(ltr) {
   border-left-style: solid;
   border-top-left-radius: .3em;
   margin-left: 1em;
 }
 
 %include ../shared/fullscreen/warning.inc.css
 %include ../shared/ctrlTab.inc.css
-%include ../shared/plugin-doorhanger.inc.css
 
 .gcli-panel {
   padding: 0;
 }
 
 .gclitoolbar-input-node > .textbox-input-box > html|*.textbox-input::-moz-selection {
   color: hsl(210,11%,16%);
 }
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -1020,17 +1020,16 @@ html|*.addon-webext-perm-list {
 #statuspanel[mirror] > #statuspanel-inner > #statuspanel-label:-moz-locale-dir(ltr) {
   border-left-style: solid;
   border-top-left-radius: .3em;
   margin-left: 1em;
 }
 
 %include ../shared/fullscreen/warning.inc.css
 %include ../shared/ctrlTab.inc.css
-%include ../shared/plugin-doorhanger.inc.css
 
 /* On mac, the popup notification contents are indented by default and so
   the default closebutton margins from notification.css require adjustment */
 
 .click-to-play-plugins-notification-description-box > .popup-notification-closebutton {
   margin-inline-end: -6px;
   margin-top: -7px;
 }
deleted file mode 100644
--- a/browser/themes/shared/plugin-doorhanger.inc.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.messageImage[value="plugin-hidden"] {
-  list-style-image: url(chrome://mozapps/skin/plugins/plugin.svg);
-}
-
-/* Keep any changes to this style in sync with pluginProblem.css */
-notification.pluginVulnerable {
-  background-color: rgb(72,72,72);
-  background-image: url(chrome://mozapps/skin/plugins/contentPluginStripe.png);
-  color: white;
-}
-
-notification.pluginVulnerable .messageImage {
-  list-style-image: url(chrome://mozapps/skin/plugins/plugin-blocked.svg);
-}
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -944,17 +944,16 @@ notification[value="translation"] {
   /* disabled for triggering grayscale AA (bug 659213)
   border-top-left-radius: .3em;
   */
   margin-left: 1em;
 }
 
 %include ../shared/fullscreen/warning.inc.css
 %include ../shared/ctrlTab.inc.css
-%include ../shared/plugin-doorhanger.inc.css
 
 /* Error counter */
 
 #developer-toolbar-toolbox-button[error-count]:before {
   color: #FDF3DE;
   min-width: 16px;
   text-shadow: none;
   background-image: linear-gradient(#B4211B, #8A1915);
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -8003,52 +8003,16 @@
     "releaseChannelCollection": "opt-out",
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": 8,
     "description": "User actions taken in the plugin notification: 0: allownow 1: allowalways 2: block 3: blockalways",
     "bug_numbers": [902075, 1345894, 1398972],
     "alert_emails": ["flashvideo-2015@mozilla.com"]
   },
-  "PLUGINS_INFOBAR_SHOWN": {
-    "record_in_processes": ["main"],
-    "releaseChannelCollection": "opt-out",
-    "expires_in_version": "never",
-    "kind": "boolean",
-    "description": "Count of when the hidden-plugin infobar was displayed.",
-    "bug_numbers": [902075, 1345894],
-    "alert_emails": ["flashvideo-2015@mozilla.com"]
-  },
-  "PLUGINS_INFOBAR_BLOCK": {
-    "record_in_processes": ["main"],
-    "releaseChannelCollection": "opt-out",
-    "expires_in_version": "never",
-    "kind": "boolean",
-    "description": "Count the number of times the user clicked 'block' on the hidden-plugin infobar.",
-    "bug_numbers": [902075, 1345894],
-    "alert_emails": ["flashvideo-2015@mozilla.com"]
-  },
-  "PLUGINS_INFOBAR_ALLOW": {
-    "record_in_processes": ["main"],
-    "releaseChannelCollection": "opt-out",
-    "expires_in_version": "never",
-    "kind": "boolean",
-    "description": "Count the number of times the user clicked 'allow' on the hidden-plugin infobar.",
-    "bug_numbers": [902075, 1345894],
-    "alert_emails": ["flashvideo-2015@mozilla.com"]
-  },
-  "PLUGINS_INFOBAR_DISMISSED": {
-    "record_in_processes": ["main"],
-    "releaseChannelCollection": "opt-out",
-    "expires_in_version": "never",
-    "kind": "boolean",
-    "description": "Count the number of times the user explicitly dismisses the hidden-plugin infobar without choosing allow or continue-blocking.",
-    "bug_numbers": [1368060],
-    "alert_emails": ["flashvideo-2015@mozilla.com"]
-  },
   "POPUP_NOTIFICATION_STATS": {
     "record_in_processes": ["main", "content"],
     "releaseChannelCollection": "opt-out",
     "alert_emails": ["firefox-dev@mozilla.org"],
     "bug_numbers": [1207089],
     "expires_in_version": "55",
     "kind": "enumerated",
     "keyed": true,
--- a/toolkit/components/telemetry/TelemetryEnvironment.jsm
+++ b/toolkit/components/telemetry/TelemetryEnvironment.jsm
@@ -246,17 +246,16 @@ const DEFAULT_ENVIRONMENT_PREFS = new Ma
   ["layers.prefer-opengl", {what: RECORD_PREF_VALUE}],
   ["layout.css.devPixelsPerPx", {what: RECORD_PREF_VALUE}],
   ["marionette.enabled", {what: RECORD_PREF_VALUE}],
   ["network.proxy.autoconfig_url", {what: RECORD_PREF_STATE}],
   ["network.proxy.http", {what: RECORD_PREF_STATE}],
   ["network.proxy.ssl", {what: RECORD_PREF_STATE}],
   ["pdfjs.disabled", {what: RECORD_PREF_VALUE}],
   ["places.history.enabled", {what: RECORD_PREF_VALUE}],
-  ["plugins.remember_infobar_dismissal", {what: RECORD_PREF_VALUE}],
   ["plugins.show_infobar", {what: RECORD_PREF_VALUE}],
   ["privacy.trackingprotection.enabled", {what: RECORD_PREF_VALUE}],
   ["privacy.donottrackheader.enabled", {what: RECORD_PREF_VALUE}],
   ["security.mixed_content.block_active_content", {what: RECORD_PREF_VALUE}],
   ["security.mixed_content.block_display_content", {what: RECORD_PREF_VALUE}],
   ["xpinstall.signatures.required", {what: RECORD_PREF_VALUE}],
 ]);
 
--- a/toolkit/themes/mobile/mozapps/plugins/pluginProblem.css
+++ b/toolkit/themes/mobile/mozapps/plugins/pluginProblem.css
@@ -1,16 +1,15 @@
 /* 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/. */
 
 @namespace html url(http://www.w3.org/1999/xhtml);
 
 /* These styles affect only the bound element, not other page content. */
-/* Keep any changes to these styles in sync with plugin-doorhanger.inc.css */
 .mainBox {
   font: message-box;
   font-size: 12px;
   text-align: center;
   display: table;
   width: 100%;
   height: 100%;
   background-color: rgb(72,72,72);
--- a/toolkit/themes/shared/plugins/pluginProblem.css
+++ b/toolkit/themes/shared/plugins/pluginProblem.css
@@ -1,16 +1,15 @@
 /* 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/. */
 
 @namespace html url(http://www.w3.org/1999/xhtml);
 
 /* These styles affect only the bound element, not other page content. */
-/* Keep any changes to these styles in sync with plugin-doorhanger.inc.css */
 .mainBox {
  --grey-10: #f9f9fa;
  --grey-60: #4a4a4f;
  --grey-70: #38383d;
 }
 
 .mainBox {
   font: message-box;