Bug 391728: No placeholder for disabled plugins (frontend). r=gavin
authorDave Townsend <dtownsend@oxymoronical.com>
Tue, 30 Sep 2008 07:31:19 +0100
changeset 19904 0020c60ff9f59a6411c0c1318468b0330184f22d
parent 19903 1e78ac76746af4c9a92641db56c5fbb8400e9b6c
child 19905 dd633cd932529abec99848555fd469ac14fb04ae
push id1
push userroot
push dateTue, 26 Apr 2011 22:38:44 +0000
treeherdermozilla-beta@bfdb6e623a36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgavin
bugs391728
milestone1.9.1b1pre
Bug 391728: No placeholder for disabled plugins (frontend). r=gavin
browser/base/content/browser.js
toolkit/locales/en-US/chrome/mozapps/plugins/plugins.dtd
toolkit/mozapps/plugins/content/missingPlugin.xml
toolkit/mozapps/plugins/content/missingPluginBinding.css
toolkit/themes/gnomestripe/mozapps/jar.mn
toolkit/themes/gnomestripe/mozapps/plugins/pluginBlocked-16.png
toolkit/themes/gnomestripe/mozapps/plugins/pluginBlocked.png
toolkit/themes/gnomestripe/mozapps/plugins/pluginDisabled.png
toolkit/themes/pinstripe/mozapps/jar.mn
toolkit/themes/pinstripe/mozapps/plugins/missingPlugin.css
toolkit/themes/pinstripe/mozapps/plugins/pluginBlocked-16.png
toolkit/themes/pinstripe/mozapps/plugins/pluginBlocked.png
toolkit/themes/pinstripe/mozapps/plugins/pluginDisabled.png
toolkit/themes/winstripe/mozapps/jar.mn
toolkit/themes/winstripe/mozapps/plugins/missingPlugin.css
toolkit/themes/winstripe/mozapps/plugins/pluginBlocked-16-aero.png
toolkit/themes/winstripe/mozapps/plugins/pluginBlocked-16.png
toolkit/themes/winstripe/mozapps/plugins/pluginBlocked-aero.png
toolkit/themes/winstripe/mozapps/plugins/pluginBlocked.png
toolkit/themes/winstripe/mozapps/plugins/pluginDisabled-aero.png
toolkit/themes/winstripe/mozapps/plugins/pluginDisabled.png
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -833,16 +833,17 @@ function HandleAppCommandEvent(evt) {
 }
 
 function prepareForStartup() {
   gBrowser.addEventListener("DOMUpdatePageReport", gPopupBlockerObserver.onUpdatePageReport, false);
   // Note: we need to listen to untrusted events, because the pluginfinder XBL
   // binding can't fire trusted ones (runs with page privileges).
   gBrowser.addEventListener("PluginNotFound", gMissingPluginInstaller.newMissingPlugin, true, true);
   gBrowser.addEventListener("PluginBlocklisted", gMissingPluginInstaller.newMissingPlugin, true, true);
+  gBrowser.addEventListener("PluginDisabled", gMissingPluginInstaller.newDisabledPlugin, true, true);
   gBrowser.addEventListener("NewPluginInstalled", gMissingPluginInstaller.refreshBrowser, false);
   gBrowser.addEventListener("NewTab", BrowserOpenTab, false);
   window.addEventListener("AppCommand", HandleAppCommandEvent, true);
 
   var webNavigation;
   try {
     // Create the browser instance component.
     appCore = Components.classes["@mozilla.org/appshell/component/browser/instance;1"]
@@ -5421,30 +5422,35 @@ var MailIntegration = {
     var extProtocolSvc =
        Components.classes["@mozilla.org/uriloader/external-protocol-service;1"]
                  .getService(Components.interfaces.nsIExternalProtocolService);
     if (extProtocolSvc)
       extProtocolSvc.loadUrl(aURL);
   }
 };
 
-function BrowserOpenAddonsMgr()
+function BrowserOpenAddonsMgr(aPane)
 {
   const EMTYPE = "Extension:Manager";
   var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                      .getService(Components.interfaces.nsIWindowMediator);
   var theEM = wm.getMostRecentWindow(EMTYPE);
   if (theEM) {
     theEM.focus();
+    if (aPane)
+      theEM.showView(aPane);
     return;
   }
 
   const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
   const EMFEATURES = "chrome,menubar,extra-chrome,toolbar,dialog=no,resizable";
-  window.openDialog(EMURL, "", EMFEATURES);
+  if (aPane)
+    window.openDialog(EMURL, "", EMFEATURES, aPane);
+  else
+    window.openDialog(EMURL, "", EMFEATURES);
 }
 
 function escapeNameValuePair(aName, aValue, aIsFormUrlEncoded)
 {
   if (aIsFormUrlEncoded)
     return escape(aName + "=" + aValue);
   else
     return escape(aName) + "=" + escape(aValue);
@@ -5513,19 +5519,16 @@ function AddKeywordForSearchField()
 }
 
 function SwitchDocumentDirection(aWindow) {
   aWindow.document.dir = (aWindow.document.dir == "ltr" ? "rtl" : "ltr");
   for (var run = 0; run < aWindow.frames.length; run++)
     SwitchDocumentDirection(aWindow.frames[run]);
 }
 
-function missingPluginInstaller(){
-}
-
 function getPluginInfo(pluginElement)
 {
   var tagMimetype;
   var pluginsPage;
   if (pluginElement instanceof HTMLAppletElement) {
     tagMimetype = "application/x-java-vm";
   } else {
     if (pluginElement instanceof HTMLObjectElement) {
@@ -5551,29 +5554,37 @@ function getPluginInfo(pluginElement)
     if (tagMimetype == "") {
       tagMimetype = pluginElement.type;
     }
   }
 
   return {mimetype: tagMimetype, pluginsPage: pluginsPage};
 }
 
+function missingPluginInstaller(){
+}
+
 missingPluginInstaller.prototype.installSinglePlugin = function(aEvent){
   var missingPluginsArray = {};
 
   var pluginInfo = getPluginInfo(aEvent.target);
   missingPluginsArray[pluginInfo.mimetype] = pluginInfo;
 
   if (missingPluginsArray) {
     window.openDialog("chrome://mozapps/content/plugins/pluginInstallerWizard.xul",
                       "PFSWindow", "chrome,centerscreen,resizable=yes",
                       {plugins: missingPluginsArray, browser: gBrowser.selectedBrowser});
   }
 
-  aEvent.preventDefault();
+  aEvent.stopPropagation();
+}
+
+missingPluginInstaller.prototype.managePlugins = function(aEvent){
+  BrowserOpenAddonsMgr("plugins");
+  aEvent.stopPropagation();
 }
 
 missingPluginInstaller.prototype.newMissingPlugin = function(aEvent){
   // Since we are expecting also untrusted events, make sure
   // that the target is a plugin
   if (!(aEvent.target instanceof Components.interfaces.nsIObjectLoadingContent))
     return;
 
@@ -5581,89 +5592,92 @@ missingPluginInstaller.prototype.newMiss
   // that the user can click the plugin replacement to get the new
   // plugin. Object tags can, and often do, deal with that themselves,
   // so don't stomp on the page developers toes.
 
   if (aEvent.type != "PluginBlocklisted" &&
       !(aEvent.target instanceof HTMLObjectElement)) {
     aEvent.target.addEventListener("click",
                                    gMissingPluginInstaller.installSinglePlugin,
-                                   false);
+                                   true);
   }
 
   try {
     if (gPrefService.getBoolPref("plugins.hide_infobar_for_missing_plugin"))
       return;
   } catch (ex) {} // if the pref is missing, treat it as false, which shows the infobar
 
-  const browsers = gBrowser.mPanelContainer.childNodes;
-
-  var contentWindow = aEvent.target.ownerDocument.defaultView.top;
-
-  var i = 0;
-  for (; i < browsers.length; i++) {
-    if (gBrowser.getBrowserAtIndex(i).contentWindow == contentWindow)
-      break;
-  }
-
-  var browser = gBrowser.getBrowserAtIndex(i);
+  var browser = gBrowser.getBrowserForDocument(aEvent.target.ownerDocument
+                                                     .defaultView.top.document);
   if (!browser.missingPlugins)
     browser.missingPlugins = {};
 
   var pluginInfo = getPluginInfo(aEvent.target);
 
   browser.missingPlugins[pluginInfo.mimetype] = pluginInfo;
 
   var notificationBox = gBrowser.getNotificationBox(browser);
 
   // If there is already a missing plugin notification then do nothing
   if (notificationBox.getNotificationWithValue("missing-plugins"))
     return;
-
-  var bundle_browser = document.getElementById("bundle_browser");
   var blockedNotification = notificationBox.getNotificationWithValue("blocked-plugins");
-  const priority = notificationBox.PRIORITY_WARNING_MEDIUM;
-  const iconURL = "chrome://mozapps/skin/plugins/pluginGeneric-16.png";
-
-  if (aEvent.type == "PluginBlocklisted" && !blockedNotification) {
-    var messageString = bundle_browser.getString("blockedpluginsMessage.title");
-    var buttons = [{
-      label: bundle_browser.getString("blockedpluginsMessage.infoButton.label"),
-      accessKey: bundle_browser.getString("blockedpluginsMessage.infoButton.accesskey"),
+  var priority = notificationBox.PRIORITY_WARNING_MEDIUM;
+
+  if (aEvent.type == "PluginBlocklisted") {
+    if (blockedNotification)
+      return;
+
+    let iconURL = "chrome://mozapps/skin/plugins/pluginBlocked-16.png";
+    let messageString = gNavigatorBundle.getString("blockedpluginsMessage.title");
+    let buttons = [{
+      label: gNavigatorBundle.getString("blockedpluginsMessage.infoButton.label"),
+      accessKey: gNavigatorBundle.getString("blockedpluginsMessage.infoButton.accesskey"),
       popup: null,
       callback: blocklistInfo
     }, {
-      label: bundle_browser.getString("blockedpluginsMessage.searchButton.label"),
-      accessKey: bundle_browser.getString("blockedpluginsMessage.searchButton.accesskey"),
+      label: gNavigatorBundle.getString("blockedpluginsMessage.searchButton.label"),
+      accessKey: gNavigatorBundle.getString("blockedpluginsMessage.searchButton.accesskey"),
       popup: null,
       callback: pluginsMissing
     }];
 
     notificationBox.appendNotification(messageString, "blocked-plugins",
                                        iconURL, priority, buttons);
   }
-
-  if (aEvent.type == "PluginNotFound") {
+  else if (aEvent.type == "PluginNotFound") {
     // Cancel any notification about blocklisting
     if (blockedNotification)
       blockedNotification.close();
 
-    var messageString = bundle_browser.getString("missingpluginsMessage.title");
-    var buttons = [{
-      label: bundle_browser.getString("missingpluginsMessage.button.label"),
-      accessKey: bundle_browser.getString("missingpluginsMessage.button.accesskey"),
+    let iconURL = "chrome://mozapps/skin/plugins/pluginGeneric-16.png";
+    let messageString = gNavigatorBundle.getString("missingpluginsMessage.title");
+    let buttons = [{
+      label: gNavigatorBundle.getString("missingpluginsMessage.button.label"),
+      accessKey: gNavigatorBundle.getString("missingpluginsMessage.button.accesskey"),
       popup: null,
       callback: pluginsMissing
     }];
-
+  
     notificationBox.appendNotification(messageString, "missing-plugins",
                                        iconURL, priority, buttons);
   }
 }
 
+missingPluginInstaller.prototype.newDisabledPlugin = function(aEvent){
+  // Since we are expecting also untrusted events, make sure
+  // that the target is a plugin
+  if (!(aEvent.target instanceof Components.interfaces.nsIObjectLoadingContent))
+    return;
+
+  aEvent.target.addEventListener("click",
+                                 gMissingPluginInstaller.managePlugins,
+                                 true);
+}
+
 missingPluginInstaller.prototype.refreshBrowser = function(aEvent) {
   var browser = aEvent.target;
   var notificationBox = gBrowser.getNotificationBox(browser);
   var notification = notificationBox.getNotificationWithValue("missing-plugins");
 
   // clear the plugin list, now that at least one plugin has been installed
   browser.missingPlugins = null;
   if (notification) {
--- a/toolkit/locales/en-US/chrome/mozapps/plugins/plugins.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/plugins/plugins.dtd
@@ -18,8 +18,10 @@
 <!ENTITY pluginWizard.finalPage.description.label            "&brandShortName; finished installing the missing plugins:">
 
 <!ENTITY pluginWizard.finalPage.moreInfo.label               "Find out more about Plugins or manually find missing plugins.">
 <!ENTITY pluginWizard.finalPage.restart.label                "&brandShortName; needs to be restarted for the plugin(s) to work.">
   
 <!ENTITY missingPlugin.label                                 "Click here to download plugin.">
 <!ENTITY disabledPlugin.label                                "The plugin for this content has been disabled. Click here to manage your plugins.">
 <!ENTITY blockedPlugin.label                                 "This plugin has been blocked for your protection.">
+<!ENTITY disabledPlugin.label                                "The plugin for this content has been disabled. Click here to manage your plugins.">
+<!ENTITY blockedPlugin.label                                 "This plugin has been blocked for your protection.">
--- a/toolkit/mozapps/plugins/content/missingPlugin.xml
+++ b/toolkit/mozapps/plugins/content/missingPlugin.xml
@@ -45,18 +45,20 @@
     </resources>
 
     <content>
       <!-- This uses html:a instead of something like a div so that it can be
            tabbed to and just generically behaves more like something clickable
            (i.e. for a11y reasons. see Bug 245349).
         -->
       <html:a href="#">
-        <xul:image id="missingPluginPlaceholder"/>
-        &missingPlugin.label;
+        <xul:vbox>
+          <xul:image id="missingPluginPlaceholder"/>
+          <xul:description>&missingPlugin.label;</xul:description>
+        </xul:vbox>
       </html:a>
 
       <!-- Make our fallback content disappear (XBL requires this) -->
       <html:div style="display:none;"><children/></html:div>
     </content>
 
     <handlers>
       <handler event="click" button="0">
@@ -67,9 +69,62 @@
           var ev = document.createEvent("Events");
           ev.initEvent("PluginNotFound", true, true);
           this.dispatchEvent(ev);
         ]]>
       </handler>
     </handlers>
   </binding>
   
+  <binding id="disabledPlugin" inheritstyle="false">
+    <resources>
+      <stylesheet src="chrome://mozapps/skin/plugins/missingPlugin.css"/>
+    </resources>
+
+    <content>
+      <!-- This uses html:a instead of something like a div so that it can be
+           tabbed to and just generically behaves more like something clickable
+           (i.e. for a11y reasons. see Bug 245349).
+        -->
+      <html:a href="#">
+        <xul:vbox>
+          <xul:image id="disabledPluginPlaceholder"/>
+          <xul:description>&disabledPlugin.label;</xul:description>
+        </xul:vbox>
+      </html:a>
+
+      <!-- Make our fallback content disappear (XBL requires this) -->
+      <html:div style="display:none;"><children/></html:div>
+    </content>
+
+    <handlers>
+      <handler event="click" button="0">
+        <![CDATA[
+          event.preventDefault();
+
+          // Fire a PluginDisabled event to trigger the infobar
+          var ev = document.createEvent("Events");
+          ev.initEvent("PluginDisabled", true, true);
+          this.dispatchEvent(ev);
+        ]]>
+      </handler>
+    </handlers>
+  </binding>
+  
+  <binding id="blockedPlugin" inheritstyle="false">
+    <resources>
+      <stylesheet src="chrome://mozapps/skin/plugins/missingPlugin.css"/>
+    </resources>
+
+    <content>
+      <html:div>
+        <xul:vbox>
+          <xul:image id="blockedPluginPlaceholder"/>
+          <xul:description>&blockedPlugin.label;</xul:description>
+        </xul:vbox>
+      </html:div>
+
+      <!-- Make our fallback content disappear (XBL requires this) -->
+      <html:div style="display:none;"><children/></html:div>
+    </content>
+  </binding>
+  
 </bindings>
--- a/toolkit/mozapps/plugins/content/missingPluginBinding.css
+++ b/toolkit/mozapps/plugins/content/missingPluginBinding.css
@@ -36,9 +36,17 @@
 
 @namespace url(http://www.w3.org/1999/xhtml); /* set default namespace to HTML */
 
 embed:-moz-type-unsupported, applet:-moz-type-unsupported,
 object:-moz-has-handlerref:-moz-type-unsupported {
   -moz-binding: url('chrome://mozapps/content/plugins/missingPlugin.xml#missingPlugin') !important;
 }
 
+embed:-moz-handler-disabled, applet:-moz-handler-disabled,
+object:-moz-has-handlerref:-moz-handler-disabled {
+  -moz-binding: url('chrome://mozapps/content/plugins/missingPlugin.xml#disabledPlugin') !important;
+}
 
+embed:-moz-handler-blocked, applet:-moz-handler-blocked,
+object:-moz-has-handlerref:-moz-handler-blocked {
+  -moz-binding: url('chrome://mozapps/content/plugins/missingPlugin.xml#blockedPlugin') !important;
+}
--- a/toolkit/themes/gnomestripe/mozapps/jar.mn
+++ b/toolkit/themes/gnomestripe/mozapps/jar.mn
@@ -6,15 +6,18 @@ classic.jar:
 + skin/classic/mozapps/extensions/notifyBadges.png         (extensions/notifyBadges.png)
 + skin/classic/mozapps/extensions/extensionIcons.png       (extensions/extensionIcons.png)
 + skin/classic/mozapps/extensions/extensions.css           (extensions/extensions.css)
 + skin/classic/mozapps/extensions/ratings.png              (extensions/ratings.png)
 + skin/classic/mozapps/extensions/themeGeneric.png         (extensions/themeGeneric.png)
 + skin/classic/mozapps/extensions/viewButtons.png          (extensions/viewButtons.png)
 + skin/classic/mozapps/passwordmgr/key.png                 (passwordmgr/key.png)
 + skin/classic/mozapps/plugins/pluginGeneric.png           (plugins/pluginGeneric.png)
++ skin/classic/mozapps/plugins/pluginDisabled.png          (plugins/pluginDisabled.png)
++ skin/classic/mozapps/plugins/pluginBlocked.png           (plugins/pluginBlocked.png)
 + skin/classic/mozapps/plugins/pluginGeneric-16.png        (plugins/pluginGeneric-16.png)
++ skin/classic/mozapps/plugins/pluginBlocked-16.png        (plugins/pluginBlocked-16.png)
 + skin/classic/mozapps/viewsource/viewsource.css           (viewsource/viewsource.css)
 + skin/classic/mozapps/xpinstall/xpinstallItemGeneric.png  (xpinstall/xpinstallItemGeneric.png)
 #ifdef MOZ_PLACES
 + skin/classic/mozapps/places/defaultFavicon.png           (places/defaultFavicon.png)
 + skin/classic/mozapps/places/tagContainerIcon.png         (places/tagContainerIcon.png)
 #endif
copy from toolkit/themes/gnomestripe/mozapps/plugins/pluginGeneric-16.png
copy to toolkit/themes/gnomestripe/mozapps/plugins/pluginBlocked-16.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9aef96a2bdbbfd9bdbe28171a739ae875afb062
GIT binary patch
literal 1295
zc$@(b1@QWbP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H11dK^UK~z|U&6itm6Gs?^pP4;)ZRadQNWv*VK}AAv(W+`I)QeWB
zpf{C}dQnxCxamcu{(wmBujt`|%S!zPEu;hk7p>F-s6wb5D}{0<i5-)8W3#iKonCn3
z*v{Ix5|oa#nwf9DnfIOd`(}1m7-M*mMZQq<{{sR0X%6}Gr$4rA>r)fyy-{TPgp_xQ
z%mrmfpB*`TWD#KIr<qNjvAzWHs@8g&5W*LTn_*3V^X@xGzU>NNjOqBCId}4d-!A@A
zQ7SM|6qzWBj8cKQ_u!7spPRY0=6Ck|kGB>V7qr&e7!w(-wOOtB=GWhUuADh{@`G*|
zA}I-H&(6Fr1m6iEGGn9T?0xBFq?D*Ipjxd^S}rm-H&<Uk2ms!A?J${4marBQ1W)iQ
zW&XZB$I9{wmb8{56MZ!G_R$~Ou{IExot@2Eu9<)H^|!L+@(P8*JQEW;NPB7gN||zb
znWa(@-(Tgx{)1#P8E*V_o#CNjHgDR33IkRvK9846EES844Clz@Hu1-$3#(BmN2jKy
zR=ehaw9WBtTX)z}3JQfq%6^$kmoK7}!m%A}$0p@^Om5$W)-`;;%=ngZ?mxK4-TQY?
zL4XPsw(a0L4k`>tdmf{sW7hnmN5_G$x)BfvGre_UTk6j%ml^0E<j}!aux%SDBwE)9
zRKT6Pw|O}KfZdaO0JwE~j=_N;_U+rB=zI106()D?_U7jwP6J;94cS|cVgCH-qa!1^
zVb^gfE)^Ib+lpg5$T-djfs__~{aH$nmm2eyO2w|eOQj-d&tsr}aA@}IsrNc7Aoya}
z&fRIH6xmFcFjP2>jSzxLwL<ktg-UgmO0^!wFbr`VrzhWPwaWJGJ2ER*S3U<C$=FaJ
zpFefLOL>R-vi&F(Fg`Xxp}2_emr*Lf7(=aALn%d2Rcy|UqO}I-$yX^we|7-ZaS!J6
zrw(jXz>?E@_v~}SP+^Q=aA1g<t}jxpR;bl#7!0nR!W&7Gay?wv0qEH`iXtX=?s9M3
zyfzJd*h0V<b1awJEToX6(;1#u$z(F}`i*PHHYxzFQUMEvM|65au3b6;(PV7ui?x<$
zn$t8x2)vXB7&nOkT5HPwO8thbuiU7c7ip;x8$epgw$8C+>-(>TfH4LsBu2Cm=n=Su
zK-&hI*Xc+AKuU>eh}da&y(!Y7L=&;*5GNBbok6<oPPC10+(6xD?f7;l&|!CpfE|b>
zs?>=<-Dr@)O3Z<tcGqD}i*FkN89Pc{(||xqi4?N6Zf_^rtk`C)_eGOEt_2dUH9`p4
ztbnY=tdeseIh!{mY7coMWkUf8M7F5w<gCe3KZb2N&;_Jh4kVq5^>E_|A+#McNolPS
zbUB8-o{E;(CzpD-Ndd}^u^g?n4#UtI=pO<MEthfU&brmCk2km1$Lj4M2+(y296;Fd
zh+bG&JaKa7`%eJNw5{6SPqO`szAlv>p8zyqM67@Z^Z{wWqB&sCwwM^W3i!Yi5r10C
z7}(<Z|1Cu^32lst8lUCjX_@nki-~~~e@y<%^1^>k{{cE9c#3T33sV39002ovPDHLk
FV1nE4UR3}9
copy from toolkit/themes/gnomestripe/mozapps/plugins/pluginGeneric.png
copy to toolkit/themes/gnomestripe/mozapps/plugins/pluginDisabled.png
--- a/toolkit/themes/pinstripe/mozapps/jar.mn
+++ b/toolkit/themes/pinstripe/mozapps/jar.mn
@@ -16,17 +16,20 @@ classic.jar:
   skin/classic/mozapps/extensions/about.css                       (extensions/about.css)
   skin/classic/mozapps/extensions/extensions.css                  (extensions/extensions.css)
   skin/classic/mozapps/extensions/extensions.xml                  (extensions/extensions.xml)
   skin/classic/mozapps/extensions/update.css                      (extensions/update.css)
   skin/classic/mozapps/extensions/eula.css                        (extensions/eula.css)
   skin/classic/mozapps/passwordmgr/key.png                        (passwordmgr/key.png)
   skin/classic/mozapps/plugins/missingPlugin.css                  (plugins/missingPlugin.css)
   skin/classic/mozapps/plugins/pluginGeneric.png                  (plugins/pluginGeneric.png)
+  skin/classic/mozapps/plugins/pluginDisabled.png                 (plugins/pluginDisabled.png)
+  skin/classic/mozapps/plugins/pluginBlocked.png                  (plugins/pluginBlocked.png)
   skin/classic/mozapps/plugins/pluginGeneric-16.png               (plugins/pluginGeneric-16.png)
+  skin/classic/mozapps/plugins/pluginBlocked-16.png               (plugins/pluginBlocked-16.png)
   skin/classic/mozapps/profile/profileicon.png                    (profile/profileicon.png)
   skin/classic/mozapps/profile/profileSelection.css               (profile/profileSelection.css)
   skin/classic/mozapps/update/warning.gif                         (update/warning.gif)
   skin/classic/mozapps/update/updates.css                         (update/updates.css)
   skin/classic/mozapps/update/update.png                          (update/update.png)
   skin/classic/mozapps/viewsource/viewsource.css                  (viewsource/viewsource.css)
   skin/classic/mozapps/xpinstall/xpinstallItemGeneric.png         (xpinstall/xpinstallItemGeneric.png)
   skin/classic/mozapps/xpinstall/xpinstallConfirm.css             (xpinstall/xpinstallConfirm.css)
--- a/toolkit/themes/pinstripe/mozapps/plugins/missingPlugin.css
+++ b/toolkit/themes/pinstripe/mozapps/plugins/missingPlugin.css
@@ -19,31 +19,50 @@ html|applet:not([height]), html|applet[h
 
 html|object > *|*,
 html|embed > *|*,
 html|applet > *|* {
   width: inherit;
   height: inherit;
 }
 
-html|a {
-  text-align: -moz-center;
+html|a, html|div {
   display: inline-block;
   /* overflow:hidden makes baseline vertical-alignment act like plugins */
   overflow: hidden;
   vertical-align: inherit;
   border: 1px outset;
   padding: 5px;
   font-size: 12px;
   font-family: sans-serif;
   background: white;
   -moz-user-select: none;
   text-decoration: none;
   color: black;
 }
 
+vbox {
+  width: inherit;
+  height: inherit;
+  -moz-box-align: center;
+  -moz-box-pack: center;
+}
+
 #missingPluginPlaceholder {
   list-style-image: url(chrome://mozapps/skin/plugins/pluginGeneric.png);
+}
+
+#disabledPluginPlaceholder {
+  list-style-image: url(chrome://mozapps/skin/plugins/pluginDisabled.png);
+}
+
+#blockedPluginPlaceholder {
+  list-style-image: url(chrome://mozapps/skin/plugins/pluginBlocked.png);
+}
+
+#missingPluginPlaceholder,
+#disabledPluginPlaceholder,
+#blockedPluginPlaceholder {
   display: block;
   border: 0px;
   width: 32px;
   height: 32px;
 }
copy from toolkit/themes/pinstripe/mozapps/plugins/pluginGeneric-16.png
copy to toolkit/themes/pinstripe/mozapps/plugins/pluginBlocked-16.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e056995a3c0cf94554c7b4c9b1f463404b592c5
GIT binary patch
literal 1997
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
copy from toolkit/themes/pinstripe/mozapps/plugins/pluginGeneric.png
copy to toolkit/themes/pinstripe/mozapps/plugins/pluginDisabled.png
--- a/toolkit/themes/winstripe/mozapps/jar.mn
+++ b/toolkit/themes/winstripe/mozapps/jar.mn
@@ -21,17 +21,20 @@ classic.jar:
         skin/classic/mozapps/handling/handling.css                 (handling/handling.css)
         skin/classic/mozapps/passwordmgr/key.png                   (passwordmgr/key.png)
 #ifdef MOZ_PLACES
         skin/classic/mozapps/places/defaultFavicon.png             (places/defaultFavicon.png)
         skin/classic/mozapps/places/tagContainerIcon.png           (places/tagContainerIcon.png)
 #endif
         skin/classic/mozapps/plugins/missingPlugin.css             (plugins/missingPlugin.css)
         skin/classic/mozapps/plugins/pluginGeneric.png             (plugins/pluginGeneric.png)
+        skin/classic/mozapps/plugins/pluginDisabled.png            (plugins/pluginDisabled.png)
+        skin/classic/mozapps/plugins/pluginBlocked.png             (plugins/pluginBlocked.png)
         skin/classic/mozapps/plugins/pluginGeneric-16.png          (plugins/pluginGeneric-16.png)
+        skin/classic/mozapps/plugins/pluginBlocked-16.png          (plugins/pluginBlocked-16.png)
         skin/classic/mozapps/plugins/pluginInstallerWizard.css     (plugins/pluginInstallerWizard.css)
         skin/classic/mozapps/profile/profileicon.png               (profile/profileicon.png)
         skin/classic/mozapps/profile/profileSelection.css          (profile/profileSelection.css)
         skin/classic/mozapps/update/extensionalert.png             (update/extensionalert.png)
         skin/classic/mozapps/update/update.png                     (update/update.png)
         skin/classic/mozapps/update/warning.gif                    (update/warning.gif)
         skin/classic/mozapps/update/updates.css                    (update/updates.css)
         skin/classic/mozapps/viewsource/viewsource.css             (viewsource/viewsource.css)
@@ -59,17 +62,20 @@ classic.jar:
         skin/classic/aero/mozapps/handling/handling.css                    (handling/handling.css)
         skin/classic/aero/mozapps/passwordmgr/key.png                      (passwordmgr/key-aero.png)
 #ifdef MOZ_PLACES
         skin/classic/aero/mozapps/places/defaultFavicon.png                (places/defaultFavicon-aero.png)
         skin/classic/aero/mozapps/places/tagContainerIcon.png              (places/tagContainerIcon-aero.png)
 #endif
         skin/classic/aero/mozapps/plugins/missingPlugin.css                (plugins/missingPlugin.css)
         skin/classic/aero/mozapps/plugins/pluginGeneric.png                (plugins/pluginGeneric-aero.png)
+        skin/classic/aero/mozapps/plugins/pluginDisabled.png               (plugins/pluginDisabled-aero.png)
+        skin/classic/aero/mozapps/plugins/pluginBlocked.png                (plugins/pluginBlocked-aero.png)
         skin/classic/aero/mozapps/plugins/pluginGeneric-16.png             (plugins/pluginGeneric-16-aero.png)
+        skin/classic/aero/mozapps/plugins/pluginBlocked-16.png             (plugins/pluginBlocked-16-aero.png)
         skin/classic/aero/mozapps/plugins/pluginInstallerWizard.css        (plugins/pluginInstallerWizard.css)
         skin/classic/aero/mozapps/profile/profileicon.png                  (profile/profileicon-aero.png)
         skin/classic/aero/mozapps/profile/profileSelection.css             (profile/profileSelection.css)
         skin/classic/aero/mozapps/update/extensionalert.png                (update/extensionalert-aero.png)
         skin/classic/aero/mozapps/update/update.png                        (update/update-aero.png)
         skin/classic/aero/mozapps/update/warning.gif                       (update/warning.gif)
         skin/classic/aero/mozapps/update/updates.css                       (update/updates.css)
         skin/classic/aero/mozapps/viewsource/viewsource.css                (viewsource/viewsource.css)
--- a/toolkit/themes/winstripe/mozapps/plugins/missingPlugin.css
+++ b/toolkit/themes/winstripe/mozapps/plugins/missingPlugin.css
@@ -19,31 +19,50 @@ html|applet:not([height]), html|applet[h
 
 html|object > *|*,
 html|embed > *|*,
 html|applet > *|* {
   width: inherit;
   height: inherit;
 }
 
-html|a {
-  text-align: -moz-center;
+html|a, html|div {
   display: inline-block;
   /* overflow:hidden makes baseline vertical-alignment act like plugins */
   overflow: hidden;
   vertical-align: inherit;
   border: 1px outset;
   padding: 5px;
   font-size: 12px;
   font-family: sans-serif;
   background: white;
   -moz-user-select: none;
   text-decoration: none;
   color: black;
 }
 
+vbox {
+  width: inherit;
+  height: inherit;
+  -moz-box-align: center;
+  -moz-box-pack: center;
+}
+
 #missingPluginPlaceholder {
   list-style-image: url(chrome://mozapps/skin/plugins/pluginGeneric.png);
+}
+
+#disabledPluginPlaceholder {
+  list-style-image: url(chrome://mozapps/skin/plugins/pluginDisabled.png);
+}
+
+#blockedPluginPlaceholder {
+  list-style-image: url(chrome://mozapps/skin/plugins/pluginBlocked.png);
+}
+
+#missingPluginPlaceholder,
+#disabledPluginPlaceholder,
+#blockedPluginPlaceholder {
   display: block;
   border: 0px;
   width: 32px;
   height: 32px;
 }
copy from toolkit/themes/winstripe/mozapps/plugins/pluginGeneric-16-aero.png
copy to toolkit/themes/winstripe/mozapps/plugins/pluginBlocked-16-aero.png
copy from toolkit/themes/winstripe/mozapps/plugins/pluginGeneric-16.png
copy to toolkit/themes/winstripe/mozapps/plugins/pluginBlocked-16.png
new file mode 100755
index 0000000000000000000000000000000000000000..d8b270ae522b700e1b84e642df8d386e4628070f
GIT binary patch
literal 971
zc$@*t12p`JP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000A$Nkl<ZScUDD
z&ud*p6vsbje%vH4c`tb}wT%r@q!rvqNugG)ih@)qxKUhYqaYQE|A5=>g)V}iE{aRH
zg18mhZCu!07nRr)8}qxb$-8&vxVZPd+$1;V#wK**Y-Zk_!+byUJu_#Xs4CC0nP;m0
zKLFtB1YP@XVP?4#u7;p*0p1w7J=QQkfAiT3vjCre`{3G2Cw>s4z5%4x%CGH){b}~o
z$y-MPU^RR_K5W`s8Gw*D{m`mj1!e)f=*{sFW4oCE%7Eh&6T|z!e+QVk`S2s)M}WDz
zi;RtU+N}f;SXob5UhCSKj#Yr)?mnX3N*HT;RAG6o%gRRDo_XSWSM0{E>!-dt6o9jG
z1pyJ|x$y?W!yZ3m*?bZRL{tUm1OQbbV9AVQaLCfK4&zh22aN*4JBN0_IeAwR#u|a)
zmz%70BAsqzqMh*4=|KkUD9ev?fGd|zvK6!<29`SpfeZWT?0XBGGiSXw+?iYA{`>|u
zMox`dY>eEW-{8*N5{Wk?2gNwSJ2Ujf_kXu)JMiTXE9ZUU5R?ZGAM?k2tODf1c?Wtx
z%&Qj3jk*N<Qp*8vdCyzHSwrG&r9+9gcq=6CfSAPKoWXgyToqI4fVJ{A<k+uGPcpx-
z&R>fi);GGeMiNd;G&nuk#MwON;`AhcF0AutvBTO%m*z;q^AioGCYx9*pn&jtZ2)J@
zB_+4#%v6)JXPP(xX9Z`#S+K<zg%?kZ5?*PM1;`>~L5m(jR3d=NbZvm&@7+5|zBT~8
z2UAsvn*UZ+w3v&k#kYzv{rGV{zE}?+#-8GKrwU57kdlL;+mJiP1$=D>Lf8)O?;Zsu
zcc55Mi*bylvG(G$04+9k7=W0Sg3CKEInjqHr6b0Qv;bOsukS#%eW%OkV9!}7CVC*-
zyWg3vaw=*9RG)!-ti*yZsuE&x(xVbJpX-6`KE(9_x}`HvS|mgz3y~}+Au1v4zq7in
z4<I4}3<6VcUccQB$U-CyN|xo~Pa`NI=YV-&Q;Tb{+W`Y4A&YcVCCwt;EdHy7hinPE
z%KvTv0R~oAQ_^hj<8lOTfL@K?2fzTy)@C>kaX7#M=>hDh1IGi9|9PZ31^yTTJO`v8
zFI?f+0E$<l8bE;ntm^RrtQH!50qMO`MIG?KI51W8{)mKAV2Qj2ECFe+4oLZ#EI|xV
tk*}v{T0m@-#rFV|AUHztG6cFy@E_@*CnQ@dzlHz+002ovPDHLkV1jz%#Bu-t
new file mode 100644
index 0000000000000000000000000000000000000000..3e6d43c9ac1f12558eeb14aaab7a653655eab907
GIT binary patch
literal 895
zc$@)$1AzRAP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80009<Nkl<ZScUDE
z&x@Ny7{@=)JI^F(%)Ziep;_3{gO)<G1*4Y=Rk0qt^dRb8y!0>FqfmPAwpjWXNbeqd
z@~GYyid*&~9vWz%i_mOblWb-l5AT~a&5t(GS9)<^m@xD3e7^I{JkL83Gvjr(<h9cO
z7XaugMtgftzV3EMH)FKxfH@~WZ*1s;-QBJG`TAGK$D^Ae*av_liTskL`e1i=>-$0k
zK>u!<`Zq@-MFgA+Uz+uA0QUjR`rmDA_<9J68K{QOq5lc+N&&Jg3+~)`@&)h%z`?<<
z)M{nYw2B#YyC<BS47qZp3BaRA2UM#i(zJ?5w%+RvXf}7o?!LW!d+VFEBA}|D0*FM;
zo!g{ZeS=D+Ous+Cdr*z2>ev?VtEi?_DrKA-P%i(8_X%bRz(-3t%NCq-9|KgYk;|9Q
z)9XbBgUH#lRW4kpF&YI<PqRDRYQ2T3o3rsga(wIo-do05ngy!*w)dWg4}YWGeu~JD
zdR-A2(r!QH@bEF-d%X7?9zI@Zv%mj4s*0+f+1u-;D@Wkoy}#b^-XkJ(I!CnIokaq<
zdesBG)MjT#5fOlEz>h0MKvi$3D$Y5)_X{KBy&v!Hr8ZM`*B7!DO*-d39RF^$T68)c
zj*gD#^?KB5H8wXlX*3!*=T^1>-d|aOYH}?`ND|oIZgBBp1Lv6Qst_YI8V#Dw1|cxl
zW6V16?#cr8_kTKHDwW7egkc6|MhFHNF=lfyMnW*mvN1*@gg}f&j4_8tLWsl|>$h%w
zwwi!asYInxVO*nf2dG-^+$N4ij1VGb0keomf=C1s%%;UGE_e$sVYcHJ;b!yjY{!uh
zLO#YxRG!a;Nn}<Q09H7B?FbYN4<W82zzT<(tsx-0*~P+N83D=K84<ZOPPHQ8W`>Ad
z${DgO0trz1FW~vRqcqE$6(B(Qd66j&9<y>-&KXMu<Pj(yzAOUMl~Be4La<4ND+)d%
zK*)>Dq9gEQCk4X+{Ol3TehUn+EDZ~XPy8<vU_bz#4Tq<Q$g;26KZOH4%Ndh}$+JAq
zO%K$8?R;GP)LFls0)GJQd_1)r{KEf&DG_BBoY%i-mWvon!{-D{iJ(CEv<Pel_%}q&
Vd(oPJa2x;t002ovPDHLkV1jJFp_Tvu
copy from toolkit/themes/winstripe/mozapps/plugins/pluginGeneric-aero.png
copy to toolkit/themes/winstripe/mozapps/plugins/pluginDisabled-aero.png
copy from toolkit/themes/winstripe/mozapps/plugins/pluginGeneric.png
copy to toolkit/themes/winstripe/mozapps/plugins/pluginDisabled.png