Bug 566194 - safe mode / security & compatibility check status are not exposed in new addon manager UI. r=dtownsend, a=blocking-beta6
authorBlair McBride <bmcbride@mozilla.com>
Thu, 02 Sep 2010 11:40:20 +1200
changeset 52068 bb55a00afa1d
parent 52067 f5cbf5252653
child 52069 f032fd9b166b
push id15524
push userbmcbride@mozilla.com
push dateMon, 06 Sep 2010 07:12:14 +0000
treeherdermozilla-central@cda6a4cf9839 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdtownsend, blocking-beta6
bugs566194
milestone2.0b6pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 566194 - safe mode / security & compatibility check status are not exposed in new addon manager UI. r=dtownsend, a=blocking-beta6
toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
toolkit/mozapps/extensions/content/extensions.css
toolkit/mozapps/extensions/content/extensions.js
toolkit/mozapps/extensions/content/extensions.xul
toolkit/mozapps/extensions/test/browser/Makefile.in
toolkit/mozapps/extensions/test/browser/browser_globalwarnings.js
toolkit/themes/gnomestripe/mozapps/extensions/extensions.css
toolkit/themes/gnomestripe/mozapps/extensions/warning-stripes.png
toolkit/themes/gnomestripe/mozapps/jar.mn
toolkit/themes/pinstripe/mozapps/extensions/extensions.css
toolkit/themes/pinstripe/mozapps/extensions/warning-stripes.png
toolkit/themes/pinstripe/mozapps/jar.mn
toolkit/themes/winstripe/mozapps/extensions/extensions.css
toolkit/themes/winstripe/mozapps/extensions/warning-stripes.png
toolkit/themes/winstripe/mozapps/jar.mn
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
@@ -8,16 +8,25 @@
 <!ENTITY listEmpty.search.label               "Could not find any matching add-ons">
 <!ENTITY listEmpty.button.label               "Learn more about add-ons">
 <!ENTITY installFromFile.label                "Install From Fileā€¦">
 <!ENTITY installFromFile.accesskey            "I">
 
 <!ENTITY cmd.back.tooltip                     "Go back one page">
 <!ENTITY cmd.forward.tooltip                  "Go forward one page">
 
+<!-- global warnings -->
+<!ENTITY warning.safemode.label                    "All add-ons have been disabled by safe mode.">
+<!ENTITY warning.checkcompatibility.label          "Add-on compatibility checking is disabled. You may have incompatible add-ons.">
+<!ENTITY warning.checkcompatibility.enable.label   "Enable">
+<!ENTITY warning.checkcompatibility.enable.tooltip "Enable add-on compatibility checking">
+<!ENTITY warning.updatesecurity.label              "Add-on update security checking is disabled. You may be compromised by updates.">
+<!ENTITY warning.updatesecurity.enable.label       "Enable">
+<!ENTITY warning.updatesecurity.enable.tooltip     "Enable add-on update security checking">
+
 <!-- categories / views -->
 <!ENTITY view.search.label                    "Search">
 <!ENTITY view.discover.label                  "Get Add-ons">
 <!ENTITY view.locales.label                   "Languages">
 <!ENTITY view.searchengines.label             "Search Engines">
 <!ENTITY view.features.label                  "Extensions">
 <!ENTITY view.appearance2.label               "Appearance">
 <!ENTITY view.plugins.label                   "Plugins">
--- a/toolkit/mozapps/extensions/content/extensions.css
+++ b/toolkit/mozapps/extensions/content/extensions.css
@@ -118,8 +118,15 @@ xhtml|link {
 .detail-row:not([value]),
 #search-list[remote="false"] #search-allresults-link {
   display: none;
 }
 
 .view-pane:not(#updates-view) .addon .relnotes-toggle {
   display: none;
 }
+
+#addons-page:not([warning]) .global-warning,
+#addons-page:not([warning="safemode"]) .global-warning-safemode,
+#addons-page:not([warning="checkcompatibility"]) .global-warning-checkcompatibility,
+#addons-page:not([warning="updatesecurity"]) .global-warning-updatesecurity {
+  display: none;
+}
--- a/toolkit/mozapps/extensions/content/extensions.js
+++ b/toolkit/mozapps/extensions/content/extensions.js
@@ -46,16 +46,20 @@ Cu.import("resource://gre/modules/Plural
 Cu.import("resource://gre/modules/DownloadUtils.jsm");
 Cu.import("resource://gre/modules/AddonManager.jsm");
 Cu.import("resource://gre/modules/AddonRepository.jsm");
 
 
 const PREF_DISCOVERURL = "extensions.webservice.discoverURL";
 const PREF_MAXRESULTS = "extensions.getAddons.maxResults";
 const PREF_BACKGROUND_UPDATE = "extensions.update.enabled";
+const PREF_CHECK_COMPATIBILITY = "extensions.checkCompatibility";
+const PREF_CHECK_UPDATE_SECURITY = "extensions.checkUpdateSecurity";
+
+const BRANCH_REGEXP = /^([^\.]+\.[0-9]+[a-z]*).*/gi;
 
 const LOADING_MSG_DELAY = 100;
 
 const SEARCH_SCORE_MULTIPLIER_NAME = 2;
 const SEARCH_SCORE_MULTIPLIER_DESCRIPTION = 2;
 
 // Use integers so search scores are sortable by nsIXULSortService
 const SEARCH_SCORE_MATCH_WHOLEWORD = 10;
@@ -137,16 +141,17 @@ function loadView(aViewId) {
   } else {
     gViewController.loadView(aViewId);
   }
 }
 
 var gEventManager = {
   _listeners: {},
   _installListeners: [],
+  checkCompatibilityPref: "",
 
   initialize: function() {
     var self = this;
     ["onEnabling", "onEnabled", "onDisabling", "onDisabled", "onUninstalling",
      "onUninstalled", "onInstalled", "onOperationCancelled",
      "onUpdateAvailable", "onUpdateFinished", "onCompatibilityUpdateAvailable",
      "onPropertyChanged"].forEach(function(aEvent) {
       self[aEvent] = function() {
@@ -159,19 +164,30 @@ var gEventManager = {
      "onInstallEnded", "onInstallFailed", "onInstallCancelled",
      "onExternalInstall"].forEach(function(aEvent) {
       self[aEvent] = function() {
         self.delegateInstallEvent(aEvent, Array.splice(arguments, 0));
       };
     });
     AddonManager.addInstallListener(this);
     AddonManager.addAddonListener(this);
+    
+    var version = Services.appinfo.version.replace(BRANCH_REGEXP, "$1");
+    this.checkCompatibilityPref = PREF_CHECK_COMPATIBILITY + "." + version;
+
+    Services.prefs.addObserver(this.checkCompatibilityPref, this, false);
+    Services.prefs.addObserver(PREF_CHECK_UPDATE_SECURITY, this, false);
+
+    this.refreshGlobalWarning();
   },
 
   shutdown: function() {
+    Services.prefs.removeObserver(this.checkCompatibilityPref, this);
+    Services.prefs.removeObserver(PREF_CHECK_UPDATE_SECURITY, this);
+
     AddonManager.removeInstallListener(this);
     AddonManager.removeAddonListener(this);
   },
 
   registerAddonListener: function(aListener, aAddonId) {
     if (!(aAddonId in this._listeners))
       this._listeners[aAddonId] = [];
     else if (this._listeners[aAddonId].indexOf(aListener) != -1)
@@ -239,16 +255,59 @@ var gEventManager = {
         continue;
       try {
         listener[aEvent].apply(listener, aParams);
       } catch(e) {
         // this shouldn't be fatal
         Cu.reportError(e);
       }
     }
+  },
+  
+  refreshGlobalWarning: function() {
+    var page = document.getElementById("addons-page");
+
+    if (Services.appinfo.inSafeMode) {
+      page.setAttribute("warning", "safemode");
+      return;
+    } 
+
+    var checkUpdateSecurity = true;
+    var checkUpdateSecurityDefault = true;
+    try {
+      checkUpdateSecurity = Services.prefs.getBoolPref(PREF_CHECK_UPDATE_SECURITY);
+    } catch(e) { }
+    try {
+      var defaultBranch = Services.prefs.getDefaultBranch("");
+      checkUpdateSecurityDefault = defaultBranch.getBoolPref(PREF_CHECK_UPDATE_SECURITY);
+    } catch(e) { }
+    if (checkUpdateSecurityDefault && !checkUpdateSecurity) {
+      page.setAttribute("warning", "updatesecurity");
+      return;
+    }
+
+    var checkCompatibility = true;
+    try {
+      checkCompatibility = Services.prefs.getBoolPref(this.checkCompatibilityPref);
+    } catch(e) { }
+    if (!checkCompatibility) {
+      page.setAttribute("warning", "checkcompatibility");
+      return;
+    }
+    
+    page.removeAttribute("warning");
+  },
+  
+  observe: function(aSubject, aTopic, aData) {
+    switch (aData) {
+    case this.checkCompatibilityPref:
+    case PREF_CHECK_UPDATE_SECURITY:
+      this.refreshGlobalWarning();
+      break;
+    }
   }
 };
 
 
 var gViewController = {
   viewPort: null,
   currentViewId: "",
   currentViewObj: null,
@@ -435,16 +494,30 @@ var gViewController = {
 
     cmd_restartApp: {
       isEnabled: function() true,
       doCommand: function() {
         Application.restart();
       }
     },
 
+    cmd_enableCheckCompatibility: {
+      isEnabled: function() true,
+      doCommand: function() {
+        Services.prefs.clearUserPref(gEventManager.checkCompatibilityPref);
+      }
+    },
+
+    cmd_enableUpdateSecurity: {
+      isEnabled: function() true,
+      doCommand: function() {
+        Services.prefs.clearUserPref(PREF_CHECK_UPDATE_SECURITY);
+      }
+    },
+
     cmd_goToDiscoverPane: {
       isEnabled: function() {
         return gDiscoverView.enabled;
       },
       doCommand: function() {
         gViewController.loadView("addons://discover/");
       }
     },
--- a/toolkit/mozapps/extensions/content/extensions.xul
+++ b/toolkit/mozapps/extensions/content/extensions.xul
@@ -93,16 +93,18 @@
     <command id="cmd_restartApp"/>
     <command id="cmd_goToDiscoverPane"/>
     <command id="cmd_goToRecentUpdates"/>
     <command id="cmd_goToAvailableUpdates"/>
     <command id="cmd_toggleBackgroundUpdateCheck"/>
     <command id="cmd_installFromFile"/>
     <command id="cmd_back"/>
     <command id="cmd_forward"/>
+    <command id="cmd_enableCheckCompatibility"/>
+    <command id="cmd_enableUpdateSecurity"/>
   </commandset>
 
   <!-- view commands - these act on the selected addon -->
   <commandset id="viewCommandSet"
               events="richlistbox-select" commandupdater="true"
               oncommandupdate="gViewController.updateCommands();"
               oncommand="gViewController.doCommand(event.target.id);">
     <command id="cmd_showItemDetails"/>
@@ -229,17 +231,36 @@
               <radio id="search-filter-local" class="search-filter-radio"
                      label="&search.filter2.installed.label;" value="local"
                      tooltiptext="&search.filter2.installed.tooltip;"/>
               <radio id="search-filter-remote" class="search-filter-radio"
                      label="&search.filter2.available.label;" value="remote"
                      tooltiptext="&search.filter2.available.tooltip;"/>
             </radiogroup>
           </hbox>
-          <hbox class="view-header" pack="end">
+          <hbox class="view-header global-warning-container">
+            <!-- global warnings -->
+            <hbox class="global-warning">
+              <image class="warning-icon"/>
+              <label class="global-warning-safemode"
+                     value="&warning.safemode.label;"/>
+              <label class="global-warning-checkcompatibility"
+                     value="&warning.checkcompatibility.label;"/>
+              <button class="button-link global-warning-checkcompatibility"
+                      label="&warning.checkcompatibility.enable.label;"
+                      tooltiptext="&warning.checkcompatibility.enable.tooltip;"
+                      command="cmd_enableCheckCompatibility"/>
+              <label class="global-warning-updatesecurity"
+                     value="&warning.updatesecurity.label;"/>
+              <button class="button-link global-warning-updatesecurity"
+                      label="&warning.updatesecurity.enable.label;"
+                      tooltiptext="&warning.updatesecurity.enable.tooltip;"
+                      command="cmd_enableUpdateSecurity"/>
+            </hbox>
+            <spacer flex="1"/>
             <hbox id="search-sorters" class="sort-controls"
                   showrelevance="true" sortby="relevancescore" ascending="false"/>
           </hbox>
           <vbox id="search-list-empty" class="empty-list-notice"
                 flex="1" hidden="true">
             <spacer flex="1"/>
             <label value="&listEmpty.search.label;"/>
             <button label="&listEmpty.button.label;" class="addon-control"
@@ -250,34 +271,72 @@
             <hbox pack="center">
               <label id="search-allresults-link" class="text-link"/>
             </hbox>
           </richlistbox>
         </vbox>
 
         <!-- list view -->
         <vbox id="list-view" flex="1" class="view-pane">
-          <hbox class="view-header" pack="end">
+          <hbox class="view-header global-warning-container">
+            <!-- global warnings -->
+            <hbox class="global-warning">
+              <image class="warning-icon"/>
+              <label class="global-warning-safemode"
+                     value="&warning.safemode.label;"/>
+              <label class="global-warning-checkcompatibility"
+                     value="&warning.checkcompatibility.label;"/>
+              <button class="button-link global-warning-checkcompatibility"
+                      label="&warning.checkcompatibility.enable.label;"
+                      tooltiptext="&warning.checkcompatibility.enable.tooltip;"
+                      command="cmd_enableCheckCompatibility"/>
+              <label class="global-warning-updatesecurity"
+                     value="&warning.updatesecurity.label;"/>
+              <button class="button-link global-warning-updatesecurity"
+                      label="&warning.updatesecurity.enable.label;"
+                      tooltiptext="&warning.updatesecurity.enable.tooltip;"
+                      command="cmd_enableUpdateSecurity"/>
+            </hbox>
+            <spacer flex="1"/>
             <hbox id="list-sorters" class="sort-controls" sortby="name"
                   ascending="true"/>
           </hbox>
           <vbox id="addon-list-empty" class="empty-list-notice"
                 flex="1" hidden="true">
             <spacer flex="1"/>
             <label value="&listEmpty.installed.label;"/>
             <button label="&listEmpty.button.label;" class="addon-control"
                     command="cmd_goToDiscoverPane"/>
             <spacer flex="3"/>
           </vbox>
           <richlistbox id="addon-list" class="list" flex="1"/>
         </vbox>
 
         <!-- updates view -->
         <vbox id="updates-view" flex="1" class="view-pane">
-          <hbox class="view-header" pack="end">
+          <hbox class="view-header global-warning-container">
+            <!-- global warnings -->
+            <hbox class="global-warning">
+              <image class="warning-icon"/>
+              <label class="global-warning-safemode"
+                     value="&warning.safemode.label;"/>
+              <label class="global-warning-checkcompatibility"
+                     value="&warning.checkcompatibility.label;"/>
+              <button class="button-link global-warning-checkcompatibility"
+                      label="&warning.checkcompatibility.enable.label;"
+                      tooltiptext="&warning.checkcompatibility.enable.tooltip;"
+                      command="cmd_enableCheckCompatibility"/>
+              <label class="global-warning-updatesecurity"
+                     value="&warning.updatesecurity.label;"/>
+              <button class="button-link global-warning-updatesecurity"
+                      label="&warning.updatesecurity.enable.label;"
+                      tooltiptext="&warning.updatesecurity.enable.tooltip;"
+                      command="cmd_enableUpdateSecurity"/>
+            </hbox>
+            <spacer flex="1"/>
             <hbox id="updates-sorters" class="sort-controls" sortby="dateUpdated"
                   ascending="false"/>
           </hbox>
           <vbox id="updates-list-empty" class="empty-list-notice"
                 flex="1" hidden="true">
             <spacer flex="1"/>
             <label id="empty-availableUpdates-msg" value="&listEmpty.availableUpdates.label;"/>
             <label id="empty-recentUpdates-msg" value="&listEmpty.recentUpdates.label;"/>
@@ -287,159 +346,179 @@
           </vbox>
           <hbox id="update-all-container" hidden="true">
             <button label="Update these add-ons" class="addon-control"/>
           </hbox>
           <richlistbox id="updates-list" class="list" flex="1"/>
         </vbox>
 
         <!-- detail view -->
-        <scrollbox id="detail-view" flex="1" class="view-pane addon-view" orient="horizontal" pack="stretch" align="start">
-          <spacer flex="1"/>
-          <!-- "loading" splash screen -->
-          <hbox class="loading" flex="1">
-            <image/>
-            <label value="&loading.label;"/>
+        <vbox id="detail-view" flex="1" class="view-pane">
+          <!-- global warnings -->
+          <hbox class="global-warning-container global-warning" pack="start">
+            <image class="warning-icon"/>
+            <label class="global-warning-safemode"
+                   value="&warning.safemode.label;"/>
+            <label class="global-warning-checkcompatibility"
+                   value="&warning.checkcompatibility.label;"/>
+            <button class="button-link global-warning-checkcompatibility"
+                    label="&warning.checkcompatibility.enable.label;"
+                    tooltiptext="&warning.checkcompatibility.enable.tooltip;"
+                    command="cmd_enableCheckCompatibility"/>
+            <label class="global-warning-updatesecurity"
+                   value="&warning.updatesecurity.label;"/>
+            <button class="button-link global-warning-updatesecurity"
+                    label="&warning.updatesecurity.enable.label;"
+                    tooltiptext="&warning.updatesecurity.enable.tooltip;"
+                    command="cmd_enableUpdateSecurity"/>
           </hbox>
-          <!-- actual detail view -->
-          <vbox class="detail-view-container" flex="3">
-            <vbox id="detail-notifications">
-              <hbox id="warning-container" align="center" class="warning">
-                <image class="warning-icon"/>
-                <label id="detail-warning" flex="1"/>
-                <label id="detail-warning-link" class="text-link"/>
-                <spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
-              </hbox>
-              <hbox id="error-container" align="center" class="error">
-                <image class="error-icon"/>
-                <label id="detail-error" flex="1"/>
-                <label id="detail-error-link" class="text-link"/>
-                <spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
-              </hbox>
-              <hbox id="pending-container" align="center" class="pending">
-                <image class="pending-icon"/>
-                <label id="detail-pending" flex="1"/>
-                <button class="button-link"
-                            label="&addon.restartNow.label;"
-                            command="cmd_restartApp"/>
-                <button id="detail-undo" class="button-link"
-                            label="&addon.undoAction.label;"
-                            tooltipText="&addon.undoAction.tooltip;"
-                            command="cmd_cancelOperation"/>
-                <spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
-              </hbox>
-            </vbox>
-            <hbox align="start">
-              <image id="detail-icon" class="icon"/>
-              <vbox flex="1">
-                <vbox id="detail-summary">
-                  <hbox id="detail-name-container">
-                    <label id="detail-name"/>
-                    <label id="detail-version"/>
-                    <label class="disabled-postfix" value="&addon.disabled.postfix;"/>
-                    <label class="update-postfix" value="&addon.update.postfix;"/>
+          <scrollbox  flex="1" class="addon-view" orient="horizontal" pack="stretch" align="start">
+            <spacer flex="1"/>
+            <!-- "loading" splash screen -->
+            <hbox class="loading" flex="1">
+              <image/>
+              <label value="&loading.label;"/>
+            </hbox>
+            <!-- actual detail view -->
+            <vbox class="detail-view-container" flex="3">
+              <vbox id="detail-notifications">
+                <hbox id="warning-container" align="center" class="warning">
+                  <image class="warning-icon"/>
+                  <label id="detail-warning" flex="1"/>
+                  <label id="detail-warning-link" class="text-link"/>
+                  <spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
+                </hbox>
+                <hbox id="error-container" align="center" class="error">
+                  <image class="error-icon"/>
+                  <label id="detail-error" flex="1"/>
+                  <label id="detail-error-link" class="text-link"/>
+                  <spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
+                </hbox>
+                <hbox id="pending-container" align="center" class="pending">
+                  <image class="pending-icon"/>
+                  <label id="detail-pending" flex="1"/>
+                  <button class="button-link"
+                              label="&addon.restartNow.label;"
+                              command="cmd_restartApp"/>
+                  <button id="detail-undo" class="button-link"
+                              label="&addon.undoAction.label;"
+                              tooltipText="&addon.undoAction.tooltip;"
+                              command="cmd_cancelOperation"/>
+                  <spacer flex="5000"/> <!-- Necessary to allow the message to wrap -->
+                </hbox>
+              </vbox>
+              <hbox align="start">
+                <image id="detail-icon" class="icon"/>
+                <vbox flex="1">
+                  <vbox id="detail-summary">
+                    <hbox id="detail-name-container">
+                      <label id="detail-name"/>
+                      <label id="detail-version"/>
+                      <label class="disabled-postfix" value="&addon.disabled.postfix;"/>
+                      <label class="update-postfix" value="&addon.update.postfix;"/>
+                    </hbox>
+                    <label id="detail-creator" class="creator"/>
+                  </vbox>
+                  <hbox id="detail-desc-container" align="end">
+                    <image id="detail-screenshot" hidden="true"/>
+                    <description id="detail-desc" flex="1"/>
                   </hbox>
-                  <label id="detail-creator" class="creator"/>
-                </vbox>
-                <hbox id="detail-desc-container" align="end">
-                  <image id="detail-screenshot" hidden="true"/>
-                  <description id="detail-desc" flex="1"/>
-                </hbox>
-                <vbox id="detail-contributions">
-                  <description id="detail-contrib-description">
-                    &detail.contributions.description;
-                  </description>
-                  <hbox align="center">
-                    <label id="detail-contrib-suggested"/>
+                  <vbox id="detail-contributions">
+                    <description id="detail-contrib-description">
+                      &detail.contributions.description;
+                    </description>
+                    <hbox align="center">
+                      <label id="detail-contrib-suggested"/>
+                      <spacer flex="1"/>
+                      <button id="detail-contrib-button" class="addon-control"
+                              label="&cmd.contribute.label;"
+                              accesskey="&cmd.contribute.accesskey;"
+                              tooltiptext="&cmd.contribute.tooltip;"
+                              command="cmd_contribute"/>
+                    </hbox>
+                  </vbox>
+                  <grid id="detail-grid">
+                    <columns>
+                       <column flex="1"/>
+                       <column flex="2"/>
+                    </columns>
+                    <rows>
+                      <row class="detail-row" id="detail-dateUpdated" label="&detail.lastupdated.label;"/>
+                      <row class="detail-row-complex" id="detail-updates-row">
+                        <label class="detail-row-label" value="&detail.updateType;"/>
+                        <hbox align="center">
+                          <radiogroup id="detail-autoUpdate" orient="horizontal">
+                            <radio label="&detail.updateAutomatic.label;"
+                                   tooltiptext="&detail.updateAutomatic.tooltip;"
+                                   value="true"/>
+                            <radio label="&detail.updateManual.label;"
+                                   tooltiptext="&detail.updateAutomatic.tooltip;"
+                                   value="false"/>
+                          </radiogroup>
+                          <button id="detail-findUpdates" class="button-link"
+                                  label="&detail.checkForUpdates.label;"
+                                  accesskey="&detail.checkForUpdates.accesskey;"
+                                  tooltiptext="&detail.checkForUpdates.tooltip;"
+                                  command="cmd_findItemUpdates"/>
+                        </hbox>
+                      </row>
+                      <row class="detail-row-complex" id="detail-homepage-row" label="&detail.home;">
+                        <label class="detail-row-label" value="&detail.home;"/>
+                        <label id="detail-homepage" class="detail-row-value text-link"/>
+                      </row>
+                      <row class="detail-row-complex" id="detail-repository-row" label="&detail.repository;">
+                        <label class="detail-row-label" value="&detail.repository;"/>
+                        <label id="detail-repository" class="detail-row-value text-link"/>
+                      </row>
+                      <row class="detail-row" id="detail-size" label="&detail.size;"/>
+                      <row class="detail-row-complex" id="detail-rating-row">
+                        <label class="detail-row-label" value="&rating.label;"/>
+                        <hbox>
+                          <label id="detail-rating" class="meta-value meta-rating"
+                                 showrating="average"/>
+                          <label id="detail-reviews" class="text-link"/>
+                        </hbox>
+                      </row>
+                      <row class="detail-row" id="detail-downloads" label="&detail.numberOfDownloads.label;"/>
+                    </rows>
+                  </grid>
+                  <hbox id="detail-controls">
+                    <button id="detail-prefs" class="addon-control"
+#ifdef XP_WIN
+                            label="&detail.showPreferencesWin.label;"
+                            accesskey="&detail.showPreferencesWin.accesskey;"
+                            tooltiptext="&detail.showPreferencesWin.tooltip;"
+#else
+                            label="&detail.showPreferencesUnix.label;"
+                            accesskey="&detail.showPreferencesUnix.accesskey;"
+                            tooltiptext="&detail.showPreferencesUnix.tooltip;"
+#endif
+                            command="cmd_showItemPreferences"/>
                     <spacer flex="1"/>
-                    <button id="detail-contrib-button" class="addon-control"
-                            label="&cmd.contribute.label;"
-                            accesskey="&cmd.contribute.accesskey;"
-                            tooltiptext="&cmd.contribute.tooltip;"
-                            command="cmd_contribute"/>
+                    <button id="detail-uninstall" class="addon-control remove"
+                            label="&cmd.uninstallAddon.label;"
+                            accesskey="&cmd.uninstallAddon.accesskey;"
+                            command="cmd_uninstallItem"/>
+                    <button id="detail-enable" class="addon-control enable"
+                            label="&cmd.enableAddon.label;"
+                            accesskey="&cmd.enableAddon.accesskey;"
+                            command="cmd_enableItem"/>
+                    <button id="detail-disable" class="addon-control disable"
+                            label="&cmd.disableAddon.label;"
+                            accesskey="&cmd.disableAddon.accesskey;"
+                            command="cmd_disableItem"/>
+                    <button id="detail-install" class="addon-control install"
+                            label="&cmd.installAddon.label;"
+                            accesskey="&cmd.installAddon.accesskey;"
+                            command="cmd_installItem"/>
                   </hbox>
                 </vbox>
-                <grid id="detail-grid">
-                  <columns>
-                     <column flex="1"/>
-                     <column flex="2"/>
-                  </columns>
-                  <rows>
-                    <row class="detail-row" id="detail-dateUpdated" label="&detail.lastupdated.label;"/>
-                    <row class="detail-row-complex" id="detail-updates-row">
-                      <label class="detail-row-label" value="&detail.updateType;"/>
-                      <hbox align="center">
-                        <radiogroup id="detail-autoUpdate" orient="horizontal">
-                          <radio label="&detail.updateAutomatic.label;"
-                                 tooltiptext="&detail.updateAutomatic.tooltip;"
-                                 value="true"/>
-                          <radio label="&detail.updateManual.label;"
-                                 tooltiptext="&detail.updateAutomatic.tooltip;"
-                                 value="false"/>
-                        </radiogroup>
-                        <button id="detail-findUpdates" class="button-link"
-                                label="&detail.checkForUpdates.label;"
-                                accesskey="&detail.checkForUpdates.accesskey;"
-                                tooltiptext="&detail.checkForUpdates.tooltip;"
-                                command="cmd_findItemUpdates"/>
-                      </hbox>
-                    </row>
-                    <row class="detail-row-complex" id="detail-homepage-row" label="&detail.home;">
-                      <label class="detail-row-label" value="&detail.home;"/>
-                      <label id="detail-homepage" class="detail-row-value text-link"/>
-                    </row>
-                    <row class="detail-row-complex" id="detail-repository-row" label="&detail.repository;">
-                      <label class="detail-row-label" value="&detail.repository;"/>
-                      <label id="detail-repository" class="detail-row-value text-link"/>
-                    </row>
-                    <row class="detail-row" id="detail-size" label="&detail.size;"/>
-                    <row class="detail-row-complex" id="detail-rating-row">
-                      <label class="detail-row-label" value="&rating.label;"/>
-                      <hbox>
-                        <label id="detail-rating" class="meta-value meta-rating"
-                               showrating="average"/>
-                        <label id="detail-reviews" class="text-link"/>
-                      </hbox>
-                    </row>
-                    <row class="detail-row" id="detail-downloads" label="&detail.numberOfDownloads.label;"/>
-                  </rows>
-                </grid>
-                <hbox id="detail-controls">
-                  <button id="detail-prefs" class="addon-control"
-#ifdef XP_WIN
-                          label="&detail.showPreferencesWin.label;"
-                          accesskey="&detail.showPreferencesWin.accesskey;"
-                          tooltiptext="&detail.showPreferencesWin.tooltip;"
-#else
-                          label="&detail.showPreferencesUnix.label;"
-                          accesskey="&detail.showPreferencesUnix.accesskey;"
-                          tooltiptext="&detail.showPreferencesUnix.tooltip;"
-#endif
-                          command="cmd_showItemPreferences"/>
-                  <spacer flex="1"/>
-                  <button id="detail-uninstall" class="addon-control remove"
-                          label="&cmd.uninstallAddon.label;"
-                          accesskey="&cmd.uninstallAddon.accesskey;"
-                          command="cmd_uninstallItem"/>
-                  <button id="detail-enable" class="addon-control enable"
-                          label="&cmd.enableAddon.label;"
-                          accesskey="&cmd.enableAddon.accesskey;"
-                          command="cmd_enableItem"/>
-                  <button id="detail-disable" class="addon-control disable"
-                          label="&cmd.disableAddon.label;"
-                          accesskey="&cmd.disableAddon.accesskey;"
-                          command="cmd_disableItem"/>
-                  <button id="detail-install" class="addon-control install"
-                          label="&cmd.installAddon.label;"
-                          accesskey="&cmd.installAddon.accesskey;"
-                          command="cmd_installItem"/>
-                </hbox>
-              </vbox>
-            </hbox>
-          </vbox>
-          <spacer flex="1"/>
-        </scrollbox>
+              </hbox>
+            </vbox>
+            <spacer flex="1"/>
+          </scrollbox>
+        </vbox>
 
       </deck>
 
   </hbox>
 
 </page>
--- a/toolkit/mozapps/extensions/test/browser/Makefile.in
+++ b/toolkit/mozapps/extensions/test/browser/Makefile.in
@@ -70,16 +70,17 @@ include $(DEPTH)/config/autoconf.mk
   browser_sorting.js \
   browser_uninstalling.js \
   browser_updatessl.js \
   browser_updatessl.rdf \
   browser_installssl.js \
   browser_backgroundupdate_menuitem.js \
   browser_recentupdates.js \
   browser_manualupdates.js \
+  browser_globalwarnings.js \
   redirect.sjs \
   releaseNotes.xhtml \
   $(NULL)
 
 include $(topsrcdir)/config/rules.mk
 
 libs:: $(_TEST_FILES)
 	$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/browser/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/test/browser/browser_globalwarnings.js
@@ -0,0 +1,65 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+// Bug 566194 - safe mode / security & compatibility check status are not exposed in new addon manager UI
+
+function test() {
+  waitForExplicitFinish();
+  run_next_test();
+}
+
+function end_test() {
+  finish();
+}
+
+add_test(function() {
+  info("Testing compatibility checking warning");
+
+  var version = Services.appinfo.version.replace(/^([^\.]+\.[0-9]+[a-z]*).*/gi, "$1");
+  var pref = "extensions.checkCompatibility." + version;
+  info("Setting " + pref + " pref to false")
+  Services.prefs.setBoolPref(pref, false);
+
+  open_manager(null, function(aWindow) {
+    var label = aWindow.document.querySelector("#list-view label.global-warning-checkcompatibility");
+    is_element_visible(label, "Check Compatibility warning label should be visible");
+    var button = aWindow.document.querySelector("#list-view button.global-warning-checkcompatibility");
+    is_element_visible(button, "Check Compatibility warning button should be visible");
+
+    info("Clicking 'Enable' button");
+    EventUtils.synthesizeMouse(button, 2, 2, { }, aWindow);
+    is(Services.prefs.prefHasUserValue(pref), false, "Check Compatability pref should be cleared");
+    is_element_hidden(label, "Check Compatibility warning label should be hidden");
+    is_element_hidden(button, "Check Compatibility warning button should be hidden");
+
+    close_manager(aWindow, function() {
+      run_next_test();
+    });
+  });
+});
+
+add_test(function() {
+  info("Testing update security checking warning");
+
+  var pref = "extensions.checkUpdateSecurity";
+  info("Setting " + pref + " pref to false")
+  Services.prefs.setBoolPref(pref, false);
+
+  open_manager(null, function(aWindow) {
+    var label = aWindow.document.querySelector("#list-view label.global-warning-updatesecurity");
+    is_element_visible(label, "Check Update Security warning label should be visible");
+    var button = aWindow.document.querySelector("#list-view button.global-warning-updatesecurity");
+    is_element_visible(button, "Check Update Security warning button should be visible");
+
+    info("Clicking 'Enable' button");
+    EventUtils.synthesizeMouse(button, 2, 2, { }, aWindow);
+    is(Services.prefs.prefHasUserValue(pref), false, "Check Update Security pref should be cleared");
+    is_element_hidden(label, "Check Update Security warning label should be hidden");
+    is_element_hidden(button, "Check Update Security warning button should be hidden");
+
+    close_manager(aWindow, function() {
+      run_next_test();
+    });
+  });
+});
--- a/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css
@@ -78,16 +78,56 @@
 #back-btn[disabled="true"]:-moz-locale-dir(rtl) {
   list-style-image: url("moz-icon://stock/gtk-go-back-rtl?size=toolbar&state=disabled");
 }
 
 #forward-btn[disabled="true"]:-moz-locale-dir(rtl) {
   list-style-image: url("moz-icon://stock/gtk-go-forward-rtl?size=toolbar&state=disabled");
 }
 
+/*** global warnings ***/
+
+.global-warning {
+  -moz-box-align: center;
+  margin: 0 8px;
+  color: #916D15;
+  text-shadow: #FFFFFF 1px 1px 1px;
+  font-weight: bold;
+}
+
+#addons-page[warning] .global-warning-container {
+  background-color: rgba(255, 255, 0, 0.1);
+  background-image: url("chrome://mozapps/skin/extensions/warning-stripes.png");
+  background-repeat: repeat-x;
+}
+
+/*** notification icons ***/
+
+.warning-icon {
+  list-style-image: url("chrome://global/skin/icons/warning-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
+.error-icon {
+  list-style-image: url("chrome://global/skin/icons/error-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
+.pending-icon,
+.info-icon {
+  list-style-image: url("chrome://global/skin/icons/information-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
 /*** category selector ***/
 
 #categories {
   -moz-appearance: none;
   border: none;
   -moz-margin-end: -1px;
   background-color: transparent;
   position: relative;
@@ -374,38 +414,16 @@
 .addon-view:not([selected]) .error {
   color: #7C322B;
 }
 
 .addon-view:not([selected]) .pending {
   color: #4F7939;
 }
 
-.warning-icon {
-  list-style-image: url("chrome://global/skin/icons/warning-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
-.error-icon {
-  list-style-image: url("chrome://global/skin/icons/error-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
-.pending-icon,
-.info-icon {
-  list-style-image: url("chrome://global/skin/icons/information-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
 .addon-view[notification="warning"] {
   background-image: -moz-linear-gradient(rgba(255, 255, 0, 0.2), rgba(255, 255, 0, 0.1));
 }
 
 .addon-view[notification="error"] {
   background-image: -moz-linear-gradient(rgba(255, 0, 0, 0.2), rgba(255, 0, 0, 0.1));
 }
 
@@ -513,33 +531,33 @@
 }
 
 /*** detail view ***/
 
 #detail-view[active="false"] .fade {
   opacity: 0.6;
 }
 
-#detail-view > .loading {
+#detail-view .loading {
   opacity: 0;
 }
 
-#detail-view:not([loading]) > .loading {
+#detail-view:not([loading]) .loading {
   visibility: collapse;
 }
 
-#detail-view[loading-extended] > .loading {
+#detail-view[loading-extended] .loading {
   -moz-box-align: center;
   -moz-box-pack: center;
   opacity: 1;
   -moz-transition-property: opacity;
   -moz-transition-duration: 1s;
 }
 
-#detail-view > .loading > image {
+#detail-view .loading > image {
   list-style-image: url("chrome://global/skin/icons/loading_16.png");
 }
 
 .detail-view-container {
   overflow: auto;
   padding: 2em;
   font-size: 110%;
 }
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..69463fb1af3de8f2cb8c9acc2fcbd61b226cb114
GIT binary patch
literal 2177
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
--- a/toolkit/themes/gnomestripe/mozapps/jar.mn
+++ b/toolkit/themes/gnomestripe/mozapps/jar.mn
@@ -20,16 +20,17 @@ toolkit.jar:
 + skin/classic/mozapps/extensions/go-back.png              (extensions/go-back.png)
 + skin/classic/mozapps/extensions/rating-won.png           (extensions/rating-won.png)
 + skin/classic/mozapps/extensions/rating-not-won.png       (extensions/rating-not-won.png)
 + skin/classic/mozapps/extensions/rating-unrated.png       (extensions/rating-unrated.png)
 + skin/classic/mozapps/extensions/cancel.png               (extensions/cancel.png)
 + skin/classic/mozapps/extensions/pause.png                (extensions/pause.png)
 + skin/classic/mozapps/extensions/utilities.png            (extensions/utilities.png)
 + skin/classic/mozapps/extensions/heart.png                (extensions/heart.png)
++ skin/classic/mozapps/extensions/warning-stripes.png      (extensions/warning-stripes.png)
 + skin/classic/mozapps/passwordmgr/key.png                 (passwordmgr/key.png)
 + skin/classic/mozapps/plugins/notifyPluginBlocked.png     (plugins/pluginBlocked-16.png)
 + skin/classic/mozapps/plugins/notifyPluginCrashed.png     (plugins/pluginGeneric-16.png)
 + skin/classic/mozapps/plugins/notifyPluginGeneric.png     (plugins/pluginGeneric-16.png)
 + skin/classic/mozapps/plugins/notifyPluginOutdated.png    (plugins/pluginOutdated-16.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)
--- a/toolkit/themes/pinstripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/pinstripe/mozapps/extensions/extensions.css
@@ -91,16 +91,56 @@
   -moz-box-shadow: @toolbarbuttonPressedInnerShadow@, @loweredShadow@;
 }
 
 .nav-button:-moz-window-inactive {
   border-color: @toolbarbuttonInactiveBorderColor@;
   background-image: @toolbarbuttonInactiveBackgroundImage@;
 }
 
+/*** global warnings ***/
+
+.global-warning {
+  -moz-box-align: center;
+  margin: 0 8px;
+  color: #916D15;
+  text-shadow: #FFFFFF 1px 1px 1px;
+  font-weight: bold;
+}
+
+#addons-page[warning] .global-warning-container {
+  background-color: rgba(255, 255, 0, 0.1);
+  background-image: url("chrome://mozapps/skin/extensions/warning-stripes.png");
+  background-repeat: repeat-x;
+}
+
+/*** notification icons ***/
+
+.warning-icon {
+  list-style-image: url("chrome://global/skin/icons/warning-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
+.error-icon {
+  list-style-image: url("chrome://global/skin/icons/error-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
+.pending-icon,
+.info-icon {
+  list-style-image: url("chrome://global/skin/icons/information-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
 /*** category selector ***/
 
 #categories {
   -moz-appearance: none;
   border: none;
   -moz-margin-end: -1px;
   background-color: transparent;
   position: relative;
@@ -387,38 +427,16 @@
 .addon-view:not([selected]) .error {
   color: #7C322B;
 }
 
 .addon-view:not([selected]) .pending {
   color: #4F7939;
 }
 
-.warning-icon {
-  list-style-image: url("chrome://global/skin/icons/warning-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
-.error-icon {
-  list-style-image: url("chrome://global/skin/icons/error-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
-.pending-icon,
-.info-icon {
-  list-style-image: url("chrome://global/skin/icons/information-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
 .addon-view[notification="warning"] {
   background-image: -moz-linear-gradient(rgba(255, 255, 0, 0.2), rgba(255, 255, 0, 0.1));
 }
 
 .addon-view[notification="error"] {
   background-image: -moz-linear-gradient(rgba(255, 0, 0, 0.2), rgba(255, 0, 0, 0.1));
 }
 
@@ -537,33 +555,33 @@
 }
 
 /*** detail view ***/
 
 #detail-view[active="false"] .fade {
   opacity: 0.6;
 }
 
-#detail-view > .loading {
+#detail-view .loading {
   opacity: 0;
 }
 
-#detail-view:not([loading]) > .loading {
+#detail-view:not([loading]) .loading {
   visibility: collapse;
 }
 
-#detail-view[loading-extended] > .loading {
+#detail-view[loading-extended] .loading {
   -moz-box-align: center;
   -moz-box-pack: center;
   opacity: 1;
   -moz-transition-property: opacity;
   -moz-transition-duration: 1s;
 }
 
-#detail-view > .loading > image {
+#detail-view .loading > image {
   list-style-image: url("chrome://global/skin/icons/loading_16.png");
 }
 
 .detail-view-container {
   padding: 2em;
   font-size: 110%;
 }
 
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..69463fb1af3de8f2cb8c9acc2fcbd61b226cb114
GIT binary patch
literal 2177
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
--- a/toolkit/themes/pinstripe/mozapps/jar.mn
+++ b/toolkit/themes/pinstripe/mozapps/jar.mn
@@ -23,16 +23,17 @@ toolkit.jar:
   skin/classic/mozapps/extensions/rating-won.png                  (extensions/rating-won.png)
   skin/classic/mozapps/extensions/rating-not-won.png              (extensions/rating-not-won.png)
   skin/classic/mozapps/extensions/rating-unrated.png              (extensions/rating-unrated.png)
   skin/classic/mozapps/extensions/cancel.png                      (extensions/cancel.png)
   skin/classic/mozapps/extensions/pause.png                       (extensions/pause.png)
   skin/classic/mozapps/extensions/utilities.png                   (extensions/utilities.png)
   skin/classic/mozapps/extensions/heart.png                       (extensions/heart.png)
   skin/classic/mozapps/extensions/navigation.png                  (extensions/navigation.png)
+  skin/classic/mozapps/extensions/warning-stripes.png             (extensions/warning-stripes.png)
   skin/classic/mozapps/extensions/about.css                       (extensions/about.css)
 * skin/classic/mozapps/extensions/extensions.css                  (extensions/extensions.css)
   skin/classic/mozapps/extensions/update.css                      (extensions/update.css)
   skin/classic/mozapps/extensions/eula.css                        (extensions/eula.css)
   skin/classic/mozapps/extensions/blocklist.css                   (extensions/blocklist.css)
   skin/classic/mozapps/passwordmgr/key.png                        (passwordmgr/key.png)
   skin/classic/mozapps/plugins/contentPluginBlocked.png           (plugins/contentPluginBlocked.png)
   skin/classic/mozapps/plugins/contentPluginCrashed.png           (plugins/contentPluginCrashed.png)
--- a/toolkit/themes/winstripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/winstripe/mozapps/extensions/extensions.css
@@ -58,16 +58,65 @@
   -moz-image-region: rect(0, 18px, 18px, 0);
 }
 
 #back-btn:-moz-locale-dir(rtl),
 #forward-btn:-moz-locale-dir(ltr) {
   -moz-image-region: rect(0, 36px, 18px, 18px);
 }
 
+/*** global warnings ***/
+
+.global-warning {
+  -moz-box-align: center;
+  padding: 0 8px;
+  color: #916D15;
+  font-weight: bold;
+}
+
+.global-warning,
+.global-warning .button-link {
+  text-shadow: #FFFFFF 1px 1px 1px;
+}
+
+#addons-page[warning] .global-warning-container {
+  background-color: rgba(255, 255, 0, 0.1);
+  background-image: url("chrome://mozapps/skin/extensions/warning-stripes.png");
+  background-repeat: repeat-x;
+}
+
+#detail-view .global-warning {
+  padding: 4px 12px;
+  border-bottom: 1px solid #A8A8A8;  
+}
+
+/*** notification icons ***/
+
+.warning-icon {
+  list-style-image: url("chrome://global/skin/icons/warning-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
+.error-icon {
+  list-style-image: url("chrome://global/skin/icons/error-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
+.pending-icon,
+.info-icon {
+  list-style-image: url("chrome://global/skin/icons/information-16.png");
+  width: 16px;
+  height: 16px;
+  margin: 3px 0;
+}
+
 /*** category selector ***/
 
 #categories {
   -moz-appearance: none;
   border: none;
   -moz-margin-end: -1px;
   background-color: transparent;
   position: relative;
@@ -354,38 +403,16 @@
 .addon-view:not([selected]) .error {
   color: #7C322B;
 }
 
 .addon-view:not([selected]) .pending {
   color: #4F7939;
 }
 
-.warning-icon {
-  list-style-image: url("chrome://global/skin/icons/warning-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
-.error-icon {
-  list-style-image: url("chrome://global/skin/icons/error-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
-.pending-icon,
-.info-icon {
-  list-style-image: url("chrome://global/skin/icons/information-16.png");
-  width: 16px;
-  height: 16px;
-  margin: 3px 0;
-}
-
 .addon-view[notification="warning"] {
   background-image: -moz-linear-gradient(rgba(255, 255, 0, 0.2), rgba(255, 255, 0, 0.1));
 }
 
 .addon-view[notification="error"] {
   background-image: -moz-linear-gradient(rgba(255, 0, 0, 0.2), rgba(255, 0, 0, 0.1));
 }
 
@@ -504,33 +531,33 @@
 }
 
 /*** detail view ***/
 
 #detail-view[active="false"] .fade {
   opacity: 0.6;
 }
 
-#detail-view > .loading {
+#detail-view .loading {
   opacity: 0;
 }
 
-#detail-view:not([loading]) > .loading {
+#detail-view:not([loading]) .loading {
   visibility: collapse;
 }
 
-#detail-view[loading-extended] > .loading {
+#detail-view[loading-extended] .loading {
   -moz-box-align: center;
   -moz-box-pack: center;
   opacity: 1;
   -moz-transition-property: opacity;
   -moz-transition-duration: 1s;
 }
 
-#detail-view > .loading > image {
+#detail-view .loading > image {
   list-style-image: url("chrome://global/skin/icons/loading_16.png");
 }
 
 .detail-view-container {
   overflow: auto;
   padding: 2em;
   font-size: 110%;
 }
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..69463fb1af3de8f2cb8c9acc2fcbd61b226cb114
GIT binary patch
literal 2177
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
--- a/toolkit/themes/winstripe/mozapps/jar.mn
+++ b/toolkit/themes/winstripe/mozapps/jar.mn
@@ -29,16 +29,17 @@ toolkit.jar:
         skin/classic/mozapps/extensions/rating-won.png             (extensions/rating-won.png)
         skin/classic/mozapps/extensions/rating-not-won.png         (extensions/rating-not-won.png)
         skin/classic/mozapps/extensions/rating-unrated.png         (extensions/rating-unrated.png)
         skin/classic/mozapps/extensions/cancel.png                 (extensions/cancel.png)
         skin/classic/mozapps/extensions/pause.png                  (extensions/pause.png)
         skin/classic/mozapps/extensions/utilities.png              (extensions/utilities.png)
         skin/classic/mozapps/extensions/heart.png                  (extensions/heart.png)
         skin/classic/mozapps/extensions/navigation.png             (extensions/navigation.png)
+        skin/classic/mozapps/extensions/warning-stripes.png        (extensions/warning-stripes.png)
         skin/classic/mozapps/extensions/eula.css                   (extensions/eula.css)
         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/contentPluginBlocked.png      (plugins/contentPluginBlocked.png)
@@ -94,16 +95,17 @@ toolkit.jar:
         skin/classic/aero/mozapps/extensions/rating-won.png                (extensions/rating-won.png)
         skin/classic/aero/mozapps/extensions/rating-not-won.png            (extensions/rating-not-won.png)
         skin/classic/aero/mozapps/extensions/rating-unrated.png            (extensions/rating-unrated.png)
         skin/classic/aero/mozapps/extensions/cancel.png                    (extensions/cancel.png)
         skin/classic/aero/mozapps/extensions/pause.png                     (extensions/pause.png)
         skin/classic/aero/mozapps/extensions/utilities.png                 (extensions/utilities.png)
         skin/classic/aero/mozapps/extensions/heart.png                     (extensions/heart.png)
         skin/classic/aero/mozapps/extensions/navigation.png                (extensions/navigation.png)
+        skin/classic/aero/mozapps/extensions/warning-stripes.png           (extensions/warning-stripes.png)
         skin/classic/aero/mozapps/extensions/eula.css                      (extensions/eula.css)
         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/contentPluginBlocked.png         (plugins/contentPluginBlocked.png)