Bug 562048 - Notification bar needs to look slicker. ui-r=bwinton r=bwinton
authorMagnus Melin <mkmelin+mozilla@iki.fi>
Wed, 26 Dec 2012 01:53:52 +0100
changeset 16866 752e81dfb822ef5f2707d1ccc834bd9476a19db9
parent 16865 76f711a54fd39f802bbac0d68b86fac3d8741067
child 16867 ab678895a5a5d4c8e0f30408815e648e99cf4baa
push id1074
push userbugzilla@standard8.plus.com
push dateMon, 03 Feb 2014 22:47:23 +0000
treeherdercomm-beta@6b791b5369ed [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbwinton, bwinton
bugs562048
Bug 562048 - Notification bar needs to look slicker. ui-r=bwinton r=bwinton
mail/base/content/mailWindowOverlay.js
mail/base/content/mailWindowOverlay.xul
mail/base/content/messageWindow.xul
mail/base/content/messenger.xul
mail/base/content/msgHdrViewOverlay.js
mail/base/content/phishingDetector.js
mail/components/compose/content/MsgComposeCommands.js
mail/locales/en-US/chrome/messenger/messenger.dtd
mail/locales/en-US/chrome/messenger/messenger.properties
mail/steel/steelApplication.js
mail/steel/steelIApplication.idl
mail/steel/test/test_linux_platformChecks.js
mail/steel/test/test_linux_platformIsLinux.js
mail/steel/test/test_mac_platformChecks.js
mail/steel/test/test_mac_platformIsLinux.js
mail/steel/test/test_other_platformIsLinux.js
mail/steel/test/test_windows_platformChecks.js
mail/steel/test/xpcshell.ini
mail/test/mozmill/cloudfile/test-cloudfile-notifications.js
mail/test/mozmill/composition/test-attachment-reminder.js
mail/test/mozmill/composition/test-drafts.js
mail/test/mozmill/content-policy/test-general-content-policy.js
mail/test/mozmill/message-header/test-phishing-bar.js
mail/test/mozmill/message-header/test-return-receipt.js
mail/test/mozmill/shared-modules/test-compose-helpers.js
mail/test/mozmill/shared-modules/test-notificationbox-helpers.js
mail/themes/linux/mail/icons/junk.png
mail/themes/linux/mail/icons/phishing.png
mail/themes/linux/mail/icons/remote-blocked.png
mail/themes/linux/mail/primaryToolbar.css
mail/themes/osx/jar.mn
mail/themes/osx/mail/icons/junk.png
mail/themes/osx/mail/icons/phishing.png
mail/themes/osx/mail/icons/remote-blocked.png
mail/themes/osx/mail/icons/warning.png
mail/themes/osx/mail/primaryToolbar.css
mail/themes/windows/jar.mn
mail/themes/windows/mail/icons/junk-aero.png
mail/themes/windows/mail/icons/junk.png
mail/themes/windows/mail/icons/phishing-aero.png
mail/themes/windows/mail/icons/phishing.png
mail/themes/windows/mail/icons/remote-blocked-aero.png
mail/themes/windows/mail/icons/remote-blocked.png
mail/themes/windows/mail/primaryToolbar-aero.css
mail/themes/windows/mail/primaryToolbar.css
--- a/mail/base/content/mailWindowOverlay.js
+++ b/mail/base/content/mailWindowOverlay.js
@@ -24,21 +24,16 @@ const kMailLayoutCommandMap =
 // Per message header flags to keep track of whether the user is allowing remote
 // content for a particular message.
 // if you change or add more values to these constants, be sure to modify
 // the corresponding definitions in nsMsgContentPolicy.cpp
 const kNoRemoteContentPolicy = 0;
 const kBlockRemoteContent = 1;
 const kAllowRemoteContent = 2;
 
-const kMsgNotificationPhishingBar = 1;
-const kMsgNotificationJunkBar = 2;
-const kMsgNotificationRemoteImages = 3;
-const kMsgNotificationMDN = 4;
-
 Components.utils.import("resource:///modules/MailUtils.js");
 Components.utils.import("resource:///modules/MailConsts.js");
 Components.utils.import("resource://gre/modules/Services.jsm");
 
 // Timer to mark read, if the user has configured the app to mark a message as
 // read if it is viewed for more than n seconds.
 var gMarkViewedMessageAsReadTimer = null;
 
@@ -2765,158 +2760,264 @@ function HandleJunkStatusChanged(folder)
   // and attachment (or on disk), in which case, we want to ignore it.
   if (!gMessageDisplay.displayedMessage ||
       gMessageDisplay.isDummy ||
       gFolderDisplay.displayedFolder != folder)
     return;
 
   // If multiple message are selected and we change the junk status
   // we don't want to show the junk bar (since the message pane is blank).
-  var msgHdr = null;
-  if (GetNumSelectedMessages() == 1)
-    msgHdr = gMessageDisplay.displayedMessage;
-  var junkBarWasDisplayed = gMessageNotificationBar.isFlagSet(kMsgNotificationJunkBar);
+  let msgHdr = (GetNumSelectedMessages() == 1) ?
+    gMessageDisplay.displayedMessage : null;
+  let junkBarWasDisplayed = gMessageNotificationBar.isShowingJunkNotification();
   gMessageNotificationBar.setJunkMsg(msgHdr);
 
   // Only reload message if junk bar display state has changed.
-  if (msgHdr && junkBarWasDisplayed != gMessageNotificationBar.isFlagSet(kMsgNotificationJunkBar))
+  if (msgHdr && junkBarWasDisplayed != gMessageNotificationBar.isShowingJunkNotification())
   {
     // We may be forcing junk mail to be rendered with sanitized html.
     // In that scenario, we want to reload the message if the status has just
     // changed to not junk.
     var sanitizeJunkMail = Services.prefs.getBoolPref("mail.spam.display.sanitize");
 
     // Only bother doing this if we are modifying the html for junk mail....
     if (sanitizeJunkMail)
     {
       let junkScore = msgHdr.getStringProperty("junkscore");
       let isJunk = (junkScore == Components.interfaces.nsIJunkMailPlugin.IS_SPAM_SCORE);
 
-      // If the current row  isn't going to change, reload to show sanitized or
+      // If the current row isn't going to change, reload to show sanitized or
       // unsanitized. Otherwise we wouldn't see the reloaded version anyway.
-
-      // 1) When marking as non-junk, the msg would move back to the inbox.
+      // 1) When marking as non-junk from the Junk folder, the msg would move
+      //    back to the Inbox -> no reload needed
+      //    When marking as non-junk from a folder other than the Junk folder,
+      //    the message isn't moved back to Inbox -> reload needed
+      //    (see nsMsgDBView::DetermineActionsForJunkChange)
       // 2) When marking as junk, the msg will move or delete, if manualMark is set.
       // 3) Marking as junk in the junk folder just changes the junk status.
-      if ((!isJunk && folder.isSpecialFolder(Components.interfaces.nsMsgFolderFlags.Inbox)) ||
+      const nsMsgFolderFlags = Components.interfaces.nsMsgFolderFlags;
+      if ((!isJunk && !folder.isSpecialFolder(nsMsgFolderFlags.Junk)) ||
           (isJunk && !folder.server.spamSettings.manualMark) ||
-          (isJunk && folder.isSpecialFolder(Components.interfaces.nsMsgFolderFlags.Junk)))
+          (isJunk && folder.isSpecialFolder(nsMsgFolderFlags.Junk)))
         ReloadMessage();
     }
   }
 }
 
+/**
+ * Object to handle message related notifications that are showing in a
+ * notificationbox above the message content.
+ */
 var gMessageNotificationBar =
 {
-  mBarStatus: 0,
-  // flag bit values for mBarStatus, indexed by kMsgNotificationXXX
-  mBarFlagValues: [
-                    0, // for no msgNotificationBar
-                    1, // 1 << (kMsgNotificationPhishingBar - 1)
-                    2, // 1 << (kMsgNotificationJunkBar - 1)
-                    4, // 1 << (kMsgNotificationRemoteImages - 1)
-                    8  // 1 << (kMsgNotificationMDN - 1)
-                  ],
-
-  get mMsgNotificationBar() {
-    delete this.mMsgNotificationBar;
-    return this.mMsgNotificationBar = document.getElementById('msgNotificationBar');
+  get stringBundle() {
+    delete this.stringBundle;
+    return this.stringBundle = document.getElementById("bundle_messenger");
+  },
+
+  get brandBundle() {
+    delete this.brandBundle;
+    return this.brandBundle = document.getElementById("brand_bundle");
+  },
+
+  get msgNotificationBar() {
+    delete this.msgNotificationBar;
+    return this.msgNotificationBar = document.getElementById("msgNotificationBar");
   },
 
   setJunkMsg: function(aMsgHdr)
   {
-    var isJunk = false;
-
-    if (aMsgHdr)
+    goUpdateCommand("button_junk");
+
+    let brandName = this.brandBundle.getString("brandShortName");
+    let junkBarMsg = this.stringBundle.getFormattedString("junkBarMessage",
+                                                          [brandName]);
+
+    let junkScore = aMsgHdr.getStringProperty("junkscore");
+    if (!((junkScore != "") &&
+          (junkScore != Components.interfaces.nsIJunkMailPlugin.IS_HAM_SCORE))) {
+      // not junk -> just close the notificaion then, if one was showing
+      let item = this.msgNotificationBar.getNotificationWithValue("junkContent");
+      if (item)
+        this.msgNotificationBar.removeNotification(item, true);
+      return;
+    }
+
+    let buttons = [{
+      label: this.stringBundle.getString("junkBarInfoButton"),
+      accessKey: this.stringBundle.getString("junkBarInfoButtonKey"),
+      popup: null,
+      callback: function(aNotification, aButton) {
+        MsgJunkMailInfo(false);
+        return true; // keep notification open
+      }
+    },
     {
-      var junkScore = aMsgHdr.getStringProperty("junkscore");
-      isJunk = ((junkScore != "") && (junkScore != "0"));
+      label: this.stringBundle.getString("junkBarButton"),
+      accessKey: this.stringBundle.getString("junkBarButtonKey"),
+      popup: null,
+      callback: function(aNotification, aButton) {
+        JunkSelectedMessages(false);
+        // Return true (=don't close) since changing junk status will fire a
+        // JunkStatusChanged notification which will make the junk bar go away
+        // for this message -> no notifcation to close anymore -> trying to
+        // close would just fail.
+        return true;
+      }
+    }];
+
+    if (!this.isShowingJunkNotification()) {
+      this.msgNotificationBar.appendNotification(junkBarMsg, "junkContent",
+        "chrome://messenger/skin/icons/junk.png",
+        this.msgNotificationBar.PRIORITY_WARNING_HIGH,
+        buttons);
     }
-
-    this.updateMsgNotificationBar(kMsgNotificationJunkBar, isJunk);
-
-    goUpdateCommand('button_junk');
+  },
+
+  isShowingJunkNotification: function() {
+    return !!this.msgNotificationBar.getNotificationWithValue("junkContent");
   },
 
   setRemoteContentMsg: function(aMsgHdr)
   {
     // update the allow remote content for sender string
     let emailAddress = MailServices.headerParser.extractHeaderAddressMailboxes(aMsgHdr.author);
     var desc = document.getElementById("bundle_messenger")
                        .getFormattedString("alwaysLoadRemoteContentForSender2",
                                            [emailAddress ? emailAddress : aMsgHdr.author]);
-    var authorDesc = document.getElementById("allowRemoteContentForAuthorDesc");
-    authorDesc.value = desc;
-    authorDesc.setAttribute("tooltiptext", desc);
-    this.updateMsgNotificationBar(kMsgNotificationRemoteImages, true);
+    let displayName = MailServices.headerParser.extractHeaderAddressName(aMsgHdr.author);
+    let brandName = this.brandBundle.getString("brandShortName");
+    let remoteContentMsg = this.stringBundle.getFormattedString("remoteContentBarMessage",
+                                                                [brandName]);
+
+    let buttonLabel = this.stringBundle.getString(Application.platformIsWindows ?
+      "remoteContentPrefLabel" : "remoteContentPrefLabelUnix");
+    let buttonAccesskey = this.stringBundle.getString(Application.platformIsWindows ?
+      "remoteContentPrefAccesskey" : "remoteContentPrefAccesskeyUnix");
+
+    let buttons = [{
+      label: buttonLabel,
+      accessKey: buttonAccesskey,
+      popup: "remoteContentOptions",
+      callback: function() { }
+    }];
+
+    if (!this.isShowingRemoteContentNotification()) {
+      this.msgNotificationBar.appendNotification(remoteContentMsg, "remoteContent",
+        "chrome://messenger/skin/icons/remote-blocked.png",
+        this.msgNotificationBar.PRIORITY_WARNING_MEDIUM,
+        buttons);
+    }
+  },
+
+  isShowingRemoteContentNotification: function() {
+    return !!this.msgNotificationBar.getNotificationWithValue("remoteContent");
   },
 
   setPhishingMsg: function()
   {
-    this.updateMsgNotificationBar(kMsgNotificationPhishingBar, true);
+    let phishingMsgNote = this.stringBundle.getString("phishingBarMessage");
+
+    let buttonLabel = this.stringBundle.getString(Application.platformIsWindows ?
+      "phishingBarPrefLabel" : "phishingBarPrefLabelUnix");
+    let buttonAccesskey = this.stringBundle.getString(Application.platformIsWindows ?
+      "phishingBarPrefAccesskey" : "phishingBarPrefAccesskeyUnix");
+
+    let buttons = [
+    {
+      label: buttonLabel,
+      accessKey: buttonAccesskey,
+      popup: "phishingOptions",
+      callback: function(aNotification, aButton) { }
+    }];
+
+    if (!this.isShowingPhishingNotification()) {
+       this.msgNotificationBar.appendNotification(phishingMsgNote, "maybeScam",
+         "chrome://messenger/skin/icons/phishing.png",
+         this.msgNotificationBar.PRIORITY_CRITICAL_MEDIUM,
+         buttons);
+    }
+  },
+
+  isShowingPhishingNotification: function() {
+    return !!this.msgNotificationBar.getNotificationWithValue("maybeScam");
   },
 
   setMDNMsg: function(aMdnGenerator, aMsgHeader, aMimeHdr)
   {
     this.mdnGenerator = aMdnGenerator;
     // Return receipts can be RFC 3798 or not.
     let mdnHdr = aMimeHdr.extractHeader("Disposition-Notification-To", false) ||
                  aMimeHdr.extractHeader("Return-Receipt-To", false); // not
     let fromHdr = aMimeHdr.extractHeader("From", false);
 
     let mdnAddr = MailServices.headerParser.extractHeaderAddressMailboxes(mdnHdr);
     let fromAddr = MailServices.headerParser.extractHeaderAddressMailboxes(fromHdr);
 
     let authorName = MailServices.headerParser.extractHeaderAddressName(
                        aMsgHeader.mime2DecodedAuthor) || aMsgHeader.author;
 
-    let mdnBarMsg = document.getElementById("mdnBarMessage");
-    if (mdnBarMsg.firstChild) // might have to remove old text first
-     mdnBarMsg.removeChild(mdnBarMsg.firstChild);
-
-    var bundle = document.getElementById("bundle_messenger");
-    var barMsg;
     // If the return receipt doesn't go to the sender address, note that in the
     // notification.
-    if (mdnAddr != fromAddr)
-      barMsg = bundle.getFormattedString("mdnBarMessageAddressDiffers",
-                                         [authorName, mdnAddr]);
-    else
-      barMsg = bundle.getFormattedString("mdnBarMessageNormal", [authorName]);
-    mdnBarMsg.appendChild(document.createTextNode(barMsg));
-    this.updateMsgNotificationBar(kMsgNotificationMDN, true);
+    let mdnBarMsg = (mdnAddr != fromAddr) ?
+      this.stringBundle.getFormattedString("mdnBarMessageAddressDiffers",
+                                            [authorName, mdnAddr]) :
+      this.stringBundle.getFormattedString("mdnBarMessageNormal", [authorName]);
+
+    let buttons = [{
+      label: this.stringBundle.getString("mdnBarSendReqButton"),
+      accessKey: this.stringBundle.getString("mdnBarSendReqButtonKey"),
+      popup: null,
+      callback: function(aNotification, aButton) {
+        SendMDNResponse();
+        return false; // close notification
+      }
+    },
+    {
+      label: this.stringBundle.getString("mdnBarIgnoreButton"),
+      accessKey: this.stringBundle.getString("mdnBarIgnoreButtonKey"),
+      popup: null,
+      callback: function(aNotification, aButton) {
+        IgnoreMDNResponse();
+        return false; // close notification
+      }
+    }];
+
+    this.msgNotificationBar.appendNotification(mdnBarMsg, "mdnRequested",
+      null, this.msgNotificationBar.PRIORITY_INFO_MEDIUM, buttons);
+  },
+
+  setDraftEditMessage: function() {
+   let msgHdr = gFolderDisplay.selectedMessage;
+   if (!msgHdr || !msgHdr.folder)
+     return;
+
+   const nsMsgFolderFlags = Components.interfaces.nsMsgFolderFlags;
+   if (msgHdr.folder.isSpecialFolder(nsMsgFolderFlags.Drafts, true))
+   {
+    let draftMsgNote = this.stringBundle.getString("draftMessageMsg");
+
+    let buttons = [{
+      label: this.stringBundle.getString("draftMessageButton"),
+      accessKey: this.stringBundle.getString("draftMessageButtonKey"),
+      popup: null,
+      callback: function(aNotification, aButton) {
+        MsgComposeDraftMessage();
+        return true; // keep notification open
+      }
+    }];
+
+    this.msgNotificationBar.appendNotification(draftMsgNote, "draftMsgContent",
+      null, this.msgNotificationBar.PRIORITY_INFO_HIGH, buttons);
+   }
   },
 
   clearMsgNotifications: function()
   {
-    this.mBarStatus = 0;
-    this.mMsgNotificationBar.selectedIndex = 0;
-    this.mMsgNotificationBar.collapsed = true;
-  },
-
-  updateMsgNotificationBar: function(aIndex, aSet)
-  {
-    var chunk = this.mBarFlagValues[aIndex];
-    var status = aSet ? this.mBarStatus | chunk : this.mBarStatus & ~chunk;
-    this.mBarStatus = status;
-
-    // the phishing message takes precedence over the junk message
-    // which takes precedence over the remote content message
-    this.mMsgNotificationBar.selectedIndex = this.mBarFlagValues.indexOf(status & -status);
-    this.mMsgNotificationBar.collapsed = !status;
-  },
-
-  /**
-   * @param aFlag one of the |mBarFlagValues| values
-   * @return true if aFlag is currently set for the loaded message
-   */
-  isFlagSet: function(aFlag)
-  {
-    var chunk = this.mBarFlagValues[aFlag];
-    return this.mBarStatus & chunk;
+    this.msgNotificationBar.removeAllNotifications(true);
   }
 };
 
 /**
  * LoadMsgWithRemoteContent
  *   Reload the current message, allowing remote content
  */
 function LoadMsgWithRemoteContent()
@@ -2933,29 +3034,26 @@ function LoadMsgWithRemoteContent()
  *  Reloads the message after adjusting the remote content policy for the sender.
  *  Iterate through the local address books looking for a card with the same e-mail address as the
  *  sender of the current loaded message. If we find a card, update the allow remote content field.
  *  If we can't find a card, prompt the user with a new AB card dialog, pre-selecting the remote content field.
  */
 function allowRemoteContentForSender()
 {
   // get the sender of the msg hdr
-  var msgHdr = gMessageDisplay.displayedMessage;
+  let msgHdr = gMessageDisplay.displayedMessage;
   if (!msgHdr)
     return;
 
-  var names = {};
-  var addresses = {};
-  var fullNames = {};
-  var numAddresses;
-
-  numAddresses = MailServices.headerParser.parseHeadersWithArray(msgHdr.author, addresses, names, fullNames);
-  var authorEmailAddress = addresses.value[0];
-  if (!authorEmailAddress)
-    return;
+  let names = {};
+  let addresses = {};
+
+  MailServices.headerParser.parseHeadersWithArray(msgHdr.author, addresses, names, {});
+  let authorEmailAddress = addresses.value[0];
+  let authorDisplayName = names.value[0];
 
   // search through all of our local address books looking for a match.
   let enumerator = MailServices.ab.directories;
   var cardForEmailAddress;
   var addrbook;
   while (!cardForEmailAddress && enumerator.hasMoreElements())
   {
     addrbook = enumerator.getNext()
@@ -2975,17 +3073,17 @@ function allowRemoteContentForSender()
   {
     // set the property for remote content
     cardForEmailAddress.setProperty("AllowRemoteContent", true);
     addrbook.modifyCard(cardForEmailAddress);
     allowRemoteContent = true;
   }
   else
   {
-    var args = {primaryEmail:authorEmailAddress, displayName:names.value[0],
+    let args = {primaryEmail:authorEmailAddress, displayName:authorDisplayName,
                 allowRemoteContent:true};
     // create a new card and set the property
     window.openDialog("chrome://messenger/content/addressbook/abNewCardDialog.xul",
                       "", "chrome,resizable=no,titlebar,modal,centerscreen", args);
     allowRemoteContent = args.allowRemoteContent;
   }
 
   // Reload the message if we've updated the remote content policy for the sender.
@@ -3189,23 +3287,21 @@ function HandleMDNResponse(aUrl)
                                      msgHdr.messageKey, mimeHdr, false);
   if (askUser)
     gMessageNotificationBar.setMDNMsg(mdnGenerator, msgHdr, mimeHdr);
 }
 
 function SendMDNResponse()
 {
   gMessageNotificationBar.mdnGenerator.userAgreed();
-  gMessageNotificationBar.updateMsgNotificationBar(kMsgNotificationMDN, false);
 }
 
 function IgnoreMDNResponse()
 {
   gMessageNotificationBar.mdnGenerator.userDeclined();
-  gMessageNotificationBar.updateMsgNotificationBar(kMsgNotificationMDN, false);
 }
 
 function QuickSearchFocus()
 {
   let tabmail = document.getElementById('tabmail');
 
   // If we're currently viewing a Gloda tab, drill down to find the
   // built-in search input, and select that.
--- a/mail/base/content/mailWindowOverlay.xul
+++ b/mail/base/content/mailWindowOverlay.xul
@@ -57,16 +57,17 @@
 <script type="application/javascript" src="chrome://global/content/printUtils.js"/>
 <script type="application/javascript" src="chrome://messenger/content/msgViewPickerOverlay.js"/>
 <script type="application/javascript" src="chrome://messenger/content/plugins.js"/>
 <script type="application/javascript" src="chrome://global/content/viewZoomOverlay.js"/>
 <script type="application/javascript" src="chrome://messenger/content/newmailaccount/uriListener.js"/>
 <script type="application/javascript" src="chrome://messenger-newsblog/content/utils.js"/>
 
 <stringbundleset id="stringbundleset">
+  <stringbundle id="brand_bundle" src="chrome://branding/locale/brand.properties"/>
   <stringbundle id="bundle_messenger" src="chrome://messenger/locale/messenger.properties"/>
   <stringbundle id="bundle_offlinePrompts" src="chrome://messenger/locale/offline.properties"/>
 </stringbundleset>
 
 <!-- Performance optimization...we include utilityOverlay.xul which defines some command sets
      which are updated based on events like focus and select. We have our own custom events
      which we use to optmize when we do command updating. To avoid unnecessary command updating,
      we are going to override the events the global edit menu items and select edit menu items
@@ -966,16 +967,38 @@
              onpopupshowing="onViewToolbarsPopupShowing(event, 'mail-toolbox');">
     <menuseparator id="customizeMailToolbarMenuSeparator"/>
     <menuitem id="CustomizeMailToolbar"
               command="cmd_CustomizeMailToolbar"
               label="&customizeToolbar.label;"
               accesskey="&customizeToolbar.accesskey;"/>
   </menupopup>
 
+  <menupopup id="remoteContentOptions">
+    <menuitem id="remoteContentOptionAllowForMsg"
+              label="&remoteContentOptionsAllowForMsg.label;"
+              accesskey="&remoteContentOptionsAllowForMsg.accesskey;"
+              oncommand="LoadMsgWithRemoteContent();"/>
+    <menuitem id="remoteContentOptionAllowForAddress"
+              label="&remoteContentOptionAllowForAddress.label;"
+              accesskey="&remoteContentOptionAllowForAddress.accesskey;"
+              oncommand="allowRemoteContentForSender();"/>
+  </menupopup>
+
+  <menupopup id="phishingOptions">
+    <menuitem id="phishingOptionIgnore"
+              label="&phishingOptionIgnore.label;"
+              accesskey="&phishingOptionIgnore.accesskey;"
+              oncommand="IgnorePhishingWarning();"/>
+    <menuitem id="phishingOptionDisableDetection"
+              label="&phishingOptionDisableDetection.label;"
+              accesskey="&phishingOptionDisableDetection.accesskey;"
+              oncommand="DisablePhishingWarning();"/>
+  </menupopup>
+
 <popupset id="mainPopupSet">
   <menupopup id="appmenu-popup"
              onpopupshowing="initAppMenuPopup(this, event);">
     <hbox>
       <vbox id="appmenuPrimaryPane">
         <splitmenu id="appmenu_newMessage"
                    label="&appmenuNewMsgCmd.label;"
                    oncommand="MsgNewMessage(null);">
@@ -3294,65 +3317,16 @@
 #else
            defaultset="button-getmsg,button-newmsg,button-chat,button-address,separator,button-tag,qfb-show-filter-bar,spring,gloda-search,button-appmenu">
 #endif
   </toolbar>
 
   <toolbarset id="customToolbars" context="toolbar-context-menu"/>
 </toolbox>
 
-<!-- The msgNotificationBar appears on top of the message and displays
-     information like: junk, contains remote images, or is a suspected phishing
-     URL.
--->
-<deck id="msgNotificationBar" selectedIndex="0" collapsed="true">
-  <hbox id="msgNotificationNoStatus"/>
-
-  <hbox id="phishingBar" class="msgNotificationBar" align="center">
-    <image id="phishingBarImage"/>
-    <vbox flex="1">
-      <description flex="1" class="msgNotificationBarText">&phishingBarMessage2.label;</description>
-      <label id="disablePhishingWarning" class="msgNotificaton-smallText text-link"
-             value="&disablePhishingWarning1.label;" onclick="DisablePhishingWarning();"/>
-      <label id="reportPhishingError" value="&reportPhishingError1.label;" class="msgNotificaton-smallText text-link" collapsed="true"/>
-    </vbox>
-    <button label="&removePhishingBarButton1.label;" oncommand="IgnorePhishingWarning();"/>
-  </hbox>
-
-  <hbox id="junkBar" class="msgNotificationBar" align="center">
-    <image id="junkBarImage"/>
-    <description flex="1" class="msgNotificationBarText">&junkBarMessage2.label;</description>
-    <button label="&junkBarButton1.label;" oncommand="JunkSelectedMessages(false);"/>
-  </hbox>
-
-  <hbox id="remoteContentBar" class="msgNotificationBar" align="center">
-    <image id="remoteContentImage"/>
-    <vbox flex="1">
-      <description class="msgNotificationBarText">&remoteContentMessage2.label;</description>
-      <label id="allowRemoteContentForAuthorDesc" class="msgNotificaton-smallText text-link"
-             crop="end"
-             onclick="allowRemoteContentForSender();"/>
-    </vbox>
-    <button id="remoteContentBarButton" label="&loadRemoteContentButton3.label;"
-            oncommand="LoadMsgWithRemoteContent();"/>
-  </hbox>
-
-  <hbox id="mdnBar" class="msgNotificationBar" align="center">
-    <image id="mdnBarImage"/>
-    <description id="mdnBarMessage" class="msgNotificationBarText" flex="1"/>
-    <button label="&mdnBarIgnoreButton2.label;"
-            accesskey="&mdnBarIgnoreButton2.accesskey;"
-            oncommand="IgnoreMDNResponse();"/>
-    <button label="&mdnBarSendButton2.label;"
-            accesskey="&mdnBarSendButton2.accesskey;"
-            oncommand="SendMDNResponse();"/>
-  </hbox>
-
-</deck>
-
 <statusbar class="chromeclass-status" id="status-bar">
   <hbox insertbefore="unreadMessageCount"  id="statusTextBox" flex="1">
     <statusbarpanel id="offline-status" class="statusbarpanel-iconic" oncommand="MailOfflineMgr.toggleOfflineStatus();"/>
     <statusbarpanel id="statusText" label="&statusText.label;" flex="1"/>
     <statusbarpanel class="statusbarpanel-progress" collapsed="true" id="statusbar-progresspanel">
       <progressmeter class="progressmeter-statusbar" id="statusbar-icon" mode="normal" value="0"/>
     </statusbarpanel>
     <statusbarpanel class="statusbarpanel-progress"
--- a/mail/base/content/messageWindow.xul
+++ b/mail/base/content/messageWindow.xul
@@ -125,16 +125,18 @@
   </popupset>
 
   <menupopup id="attachmentListContext"/>
   <menupopup id="attachmentItemContext"/>
   <menupopup id="header-toolbar-context-menu"/>
   <menupopup id="attachment-toolbar-context-menu"/>
   <menupopup id="copyUrlPopup"/>
   <menupopup id="toolbar-context-menu"/>
+  <menupopup id="remoteContentOptions"/>
+  <menupopup id="phishingOptions"/>
 
   <!-- navigation-toolbox is provided by mailWindowOverlay.xul -->
   <toolbox id="navigation-toolbox" class="toolbox-top" />
 
   <!-- mail-toolbox is provided by mailWindowOverlay.xul -->
   <toolbox id="mail-toolbox" />
 
   <tooltip id="aHTMLTooltip" onpopupshowing="return FillInHTMLTooltip(document.tooltipNode);"/>
@@ -143,18 +145,19 @@
   <!-- a convenience box for ease of extension overlaying -->
   <hbox id="messagepaneboxwrapper" flex="1">
     <vbox id="messagepanebox" flex="3"
           ondragover="nsDragAndDrop.dragOver(event, messagepaneObserver);"
           ondragdrop="nsDragAndDrop.drop(event, messagepaneObserver);"
           ondragexit="nsDragAndDrop.dragExit(event, messagepaneObserver);">
 
       <hbox id="msgHeaderView"/>
-      <hbox id="editMessageBox"/>
-      <deck id="msgNotificationBar"/>
+      <!-- The msgNotificationBar appears on top of the message and displays
+           information like: junk, mdn, remote content and phishing warnings -->
+      <notificationbox id="msgNotificationBar"/>
 
       <!-- message view -->
       <browser id="messagepane" context="mailContext" tooltip="aHTMLTooltip"
                style="height: 0px; min-height: 1px" flex="1" name="messagepane"
                disablesecurity="true" disablehistory="true" type="content-primary"
                onresize="return messagePaneOnResize(event);" autofind="false"
                src="about:blank" onclick="return contentAreaClick(event);" />
       <splitter id="attachment-splitter" collapse="after" resizebefore="closest" resizeafter="closest" collapsed="true"/>
--- a/mail/base/content/messenger.xul
+++ b/mail/base/content/messenger.xul
@@ -126,16 +126,18 @@
 <menupopup id="mailContext"/>
 <menupopup id="folderPaneContext"/>
 <menupopup id="attachmentListContext"/>
 <menupopup id="attachmentItemContext"/>
 <menupopup id="header-toolbar-context-menu"/>
 <menupopup id="attachment-toolbar-context-menu"/>
 <menupopup id="copyUrlPopup"/>
 <menupopup id="toolbar-context-menu"/>
+<menupopup id="remoteContentOptions"/>
+<menupopup id="phishingOptions"/>
 
 <tooltip id="attachmentListTooltip"/>
 
 <menupopup id="emailAddressPopup" position="after_start" class="emailAddressPopup"
            onpopupshowing="setupEmailAddressPopup(findEmailNodeFromPopupNode(document.popupNode, 'emailAddressPopup')); goUpdateCommand('cmd_createFilterFromPopup')"
            onpopuphiding="hideEmailNewsPopup(findEmailNodeFromPopupNode(document.popupNode, 'emailAddressPopup'));">
     <menuitem id="emailAddressPlaceHolder"
               disabled="true"/>
@@ -507,18 +509,20 @@
                              flex="1" name="multimessage"
                              hidden="true"
                              disablesecurity="true" disablehistory="true"
                              tooltip="aHTMLTooltip"
                              src="chrome://messenger/content/multimessageview.xhtml"
                              autofind="false"/>
                     <vbox id="singlemessage" flex="1">
                       <hbox id="msgHeaderView"/>
-                      <hbox id="editMessageBox"/>
-                      <deck id="msgNotificationBar"/>
+                      <!-- The msgNotificationBar appears on top of the message
+                           and displays information like: junk, contains remote
+                           images, or is a suspected phishing URL. -->
+                      <notificationbox id="msgNotificationBar"/>
                       <!-- The messagepanewrapper hbox exists to allow
                            extensions to add sidebars to the message. -->
                       <hbox id="messagepanewrapper" flex="1">
                         <browser id="messagepane" context="mailContext"
                                  autofind="false" minheight="1" flex="1"
                                  name="messagepane" tooltip="aHTMLTooltip"
                                  disablehistory="true" type="content-primary"
                                  src="about:blank"
--- a/mail/base/content/msgHdrViewOverlay.js
+++ b/mail/base/content/msgHdrViewOverlay.js
@@ -428,17 +428,16 @@ var messageHeaderSink = {
 
         gViewAllHeaders = false;
       }
 
       ClearCurrentHeaders();
       gBuiltExpandedView = false;
       gBuildAttachmentsForCurrentMsg = false;
       ClearAttachmentList();
-      ClearEditMessageBox();
       gMessageNotificationBar.clearMsgNotifications();
 
       for (let index in gMessageListeners)
         gMessageListeners[index].onStartHeaders();
     },
 
     onEndHeaders: function()
     {
@@ -459,17 +458,17 @@ var messageHeaderSink = {
 
       // Only update the expanded view if it's actually selected (an
       // extension-provided panel could be visible instead) and needs updating.
       if (document.getElementById("msgHeaderViewDeck").selectedIndex == 0 &&
           !gBuiltExpandedView) {
         UpdateExpandedMessageHeaders();
       }
 
-      ShowEditMessageBox();
+      gMessageNotificationBar.setDraftEditMessage();
       UpdateJunkButton();
 
       for (let index in gMessageListeners)
         gMessageListeners[index].onEndHeaders();
     },
 
     processHeaders: function(headerNameEnumerator, headerValueEnumerator,
                              dontCollectAddress)
@@ -1149,17 +1148,17 @@ function HideMessageHeaderPane()
   let appMenuNode = document.getElementById("appmenu_msgAttachmentMenu");
   if (appMenuNode)
     appMenuNode.setAttribute("disabled", "true");
 
   // disable the attachment box
   document.getElementById("attachmentView").collapsed = true;
   document.getElementById("attachment-splitter").collapsed = true;
 
-  ClearEditMessageBox();
+  gMessageNotificationBar.clearMsgNotifications();
 }
 
 /**
  * Take string of newsgroups separated by commas, split it
  * into newsgroups and send them to the corresponding
  * mail-newsgroups-headerfield element.
  *
  * @param headerEntry  the entry data structure for this header
--- a/mail/base/content/phishingDetector.js
+++ b/mail/base/content/phishingDetector.js
@@ -174,18 +174,19 @@ var gPhishingDetector = {
   localListCallback: function (aMsgHdr, aFailsStaticTests, aUrl, aLocalListStatus)
   {  
     // for urls in the blacklist, notify the phishing bar.
     // for urls in the whitelist, do nothing
     // for all other urls, fall back to the static tests
     if (aMsgHdr == gFolderDisplay.selectedMessage)
     {
       if (aLocalListStatus == 0 /* PROT_ListWarden.IN_BLACKLIST */ ||
-          (aLocalListStatus == 2 /* PROT_ListWarden.PROT_ListWarden.NOT_FOUND */ && aFailsStaticTests))
+          (aLocalListStatus == 2 /* PROT_ListWarden.PROT_ListWarden.NOT_FOUND */ && aFailsStaticTests)) {
         gMessageNotificationBar.setPhishingMsg();
+      }
     }
   },
 
   /**
    * Looks up the report phishing url for the current phishing provider, appends aPhishingURL to the url,
    * and loads it in the default browser where the user can submit the url as a phish.
    * @param aPhishingURL the url we want to report back as a phishing attack
    */
@@ -241,17 +242,17 @@ var gPhishingDetector = {
    * of the http(s) url the user clicked on.
    *
    * @param aUrl the url 
    * @return true if the link should be allowed to load
    */
   warnOnSuspiciousLinkClick: function(aUrl)
   {
     // if the loaded message has been flagged as a phishing scam, 
-    if (!gMessageNotificationBar.isFlagSet(kMsgNotificationPhishingBar))
+    if (!gMessageNotificationBar.isShowingJunkNotification())
       return true;
 
     var hrefURL;
     // make sure relative link urls don't make us bail out
     try {
       hrefURL = Services.io.newURI(aUrl, null, null);
     } catch(ex) { return false; }
 
--- a/mail/components/compose/content/MsgComposeCommands.js
+++ b/mail/components/compose/content/MsgComposeCommands.js
@@ -1778,17 +1778,17 @@ attachmentWorker.onerror = function(erro
 };
 
 
 attachmentWorker.onmessage = function(event)
 {
   let keywordsFound = event.data;
   let msg = null;
   let nBox = document.getElementById("attachmentNotificationBox");
-  let notification = nBox.getNotificationWithValue("1");
+  let notification = nBox.getNotificationWithValue("attachmentReminder");
   let removeNotification = false;
 
   if (keywordsFound.length > 0) {
     msg = document.createElement("hbox");
     msg.setAttribute("flex", "100");
 
     msg.onclick = function(event)
     {
@@ -1847,17 +1847,17 @@ attachmentWorker.onmessage = function(ev
       accessKey : getComposeBundle().getString("remindLaterButton.accessskey"),
       label: getComposeBundle().getString("remindLaterButton"),
       callback: function (aNotificationBar, aButton)
       {
         gRemindLater = true;
       }
     };
 
-    notification = nBox.appendNotification("", "1",
+    notification = nBox.appendNotification("", "attachmentReminder",
                                  /* fake out the image so we can do it in CSS */
                                  "null",
                                  nBox.PRIORITY_WARNING_MEDIUM,
                                  [addButton, remindButton]);
     let buttons = notification.childNodes[0];
     notification.insertBefore(msg, buttons);
   }
   CheckForAttachmentNotification.shouldFire = true;
--- a/mail/locales/en-US/chrome/messenger/messenger.dtd
+++ b/mail/locales/en-US/chrome/messenger/messenger.dtd
@@ -561,16 +561,28 @@
 <!ENTITY tagButton.tooltip "Tag messages">
 <!ENTITY compactButton.tooltip "Remove deleted messages from selected folder">
 <!ENTITY appmenuButton1.tooltip "Display the &brandShortName; Menu">
 
 <!-- Toolbar Button Popup -->
 <!ENTITY buttonMenuForwardAsInline.label "Forward Inline">
 <!ENTITY buttonMenuForwardAsAttachment.label "Forward As Attachment">
 
+<!-- Remote Content Button Popup -->
+<!ENTITY remoteContentOptionsAllowForMsg.label "Show remote content in this message">
+<!ENTITY remoteContentOptionsAllowForMsg.accesskey "S">
+<!ENTITY remoteContentOptionAllowForAddress.label "Show remote content from this sender">
+<!ENTITY remoteContentOptionAllowForAddress.accesskey "f">
+
+<!-- Phishing Button Popup -->
+<!ENTITY phishingOptionIgnore.label "Ignore warning for this message">
+<!ENTITY phishingOptionIgnore.accesskey "n">
+<!ENTITY phishingOptionDisableDetection.label "Disable scam detection for all messages">
+<!ENTITY phishingOptionDisableDetection.accesskey "D">
+
 <!-- AppMenu Popup -->
 <!ENTITY appmenuNewMsgCmd.label "New Message">
 <!ENTITY appmenuNewContactCmd.label "Address Book Contact…">
 <!ENTITY appmenuEditMenu.label "Edit">
 <!ENTITY appmenuToolbarLayout.label "Toolbar Layout…">
 <!ENTITY appmenuSelectThread.label "Select Thread">
 <!ENTITY appmenuSelectFlagged.label "Select Starred Messages">
 
@@ -783,37 +795,16 @@
 <!ENTITY contextPlay.accesskey "P">
 <!ENTITY contextPause.label "Pause">
 <!ENTITY contextPause.accesskey "P">
 <!ENTITY contextMute.label "Mute">
 <!ENTITY contextMute.accesskey "M">
 <!ENTITY contextUnmute.label "Unmute">
 <!ENTITY contextUnmute.accesskey "m">
 
-<!-- Junk Bar -->
-<!ENTITY junkBarMessage2.label "&brandShortName; thinks this message is junk mail.">
-<!ENTITY junkBarButton1.label "Not Junk">
-<!ENTITY junkInfoButton.label "?">
-
-<!-- Remote Content Bar -->
-<!ENTITY remoteContentMessage2.label "To protect your privacy, &brandShortName; has blocked remote content in this message.">
-<!ENTITY loadRemoteContentButton3.label "Show Remote Content">
-
-<!-- Phishing Bar -->
-<!ENTITY phishingBarMessage2.label "This message may be a scam.">
-<!ENTITY removePhishingBarButton1.label "Ignore Warning">
-<!ENTITY disablePhishingWarning1.label "Disable scam detection for all messages">
-<!ENTITY reportPhishingError1.label "This message doesn't appear to be a scam.">
-
-<!-- MDN Bar -->
-<!ENTITY mdnBarIgnoreButton2.label "Ignore">
-<!ENTITY mdnBarIgnoreButton2.accesskey "I">
-<!ENTITY mdnBarSendButton2.label "Send Return Receipt">
-<!ENTITY mdnBarSendButton2.accesskey "S">
-
 <!-- Quick Search Bar -->
 <!-- LOCALIZATION NOTE (quickSearchCmd.key):
      This is actually the key used for the global message search box; we have
      not changed 
      -->
 <!ENTITY quickSearchCmd.key "k">
 <!-- LOCALIZATION NOTE (search.label.base):
      This is the base of the empty text for the global search box.  We replace
--- a/mail/locales/en-US/chrome/messenger/messenger.properties
+++ b/mail/locales/en-US/chrome/messenger/messenger.properties
@@ -297,16 +297,44 @@ feedsAcctType=Feeds
 # LOCALIZATION NOTE(nocachedbodytitle): Do not translate "<TITLE>" or "</TITLE>" in the line below
 nocachedbodytitle=<TITLE>Go Online to View This Message</TITLE>\n
 
 # mailWindowOverlay.js
 confirmUnsubscribeTitle=Confirm Unsubscribe
 confirmUnsubscribeText=Are you sure you want to unsubscribe from %S?
 confirmUnsubscribeManyText=Are you sure you want to unsubscribe from these newsgroups?
 restoreAllTabs=Restore All Tabs
+# LOCALIZATION NOTE(junkBarMessage): %S is brand
+junkBarMessage=%S thinks this message is Junk mail.
+junkBarButton=Not Junk
+junkBarButtonKey=N
+junkBarInfoButton=Learn More
+junkBarInfoButtonKey=L
+
+# LOCALIZATION NOTE(remoteContentBarMessage): %S is brand
+remoteContentBarMessage=To protect your privacy, %S has blocked remote content in this message.
+remoteContentPrefLabel=Options
+remoteContentPrefAccesskey=O
+remoteContentPrefLabelUnix=Preferences
+remoteContentPrefAccesskeyUnix=P
+
+phishingBarMessage=This message may be a scam.
+phishingBarPrefLabel=Options
+phishingBarPrefAccesskey=O
+phishingBarPrefLabelUnix=Preferences
+phishingBarPrefAccesskeyUnix=P
+
+mdnBarIgnoreButton=Ignore Request
+mdnBarIgnoreButtonKey=n
+mdnBarSendReqButton=Send Receipt
+mdnBarSendReqButtonKey=S
+
+draftMessageMsg=This is a draft message.
+draftMessageButton=Edit
+draftMessageButtonKey=E
 
 # msgHdrViewOverlay.js
 openLabel=Open
 openLabelAccesskey=O
 saveLabel=Save As…
 saveLabelAccesskey=A
 detachLabel=Detach…
 detachLabelAccesskey=D
--- a/mail/steel/steelApplication.js
+++ b/mail/steel/steelApplication.js
@@ -50,17 +50,18 @@ Application.prototype = {
 				    contractID: APPLICATION_CONTRACTID,
 				    interfaces: [Ci.steelIApplication,
 						 Ci.extIApplication,
 						 Ci.nsIObserver],
 				    flags: Ci.nsIClassInfo.SINGLETON}),
 
   // for steelIApplication
   platformIsMac: "nsILocalFileMac" in Components.interfaces,
-  platformIsLinux: "@mozilla.org/gnome-gconf-service;1" in Components.classes
+  platformIsLinux: "@mozilla.org/gnome-gconf-service;1" in Components.classes,
+  platformIsWindows: "@mozilla.org/windows-registry-key;1" in Components.classes
 };
 
 #include ../../mozilla/toolkit/components/exthelper/extApplication.js
 
 Application.prototype.__proto__ = extApplication.prototype;
 
 const NSGetFactory = XPCOMUtils.generateNSGetFactory([Application]);
 
--- a/mail/steel/steelIApplication.idl
+++ b/mail/steel/steelIApplication.idl
@@ -2,23 +2,28 @@
  * 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/. */
 
 #include "extIApplication.idl"
 
 /**
  * The core STEEL object, available in the global scope
  */
-[scriptable, uuid(d8e187c3-6303-474e-a690-c2eef3331f20)]
+[scriptable, uuid(e33b45c3-9b44-45f2-8aa3-c89805695f2b)]
 interface steelIApplication : extIApplication {
   /**
    * Returns true if the application is running on a Mac OS X. This is intended
    * for situations where Mac does things differently, e.g. The application
    * doesn't support print preview on Mac because Mac provides a preview option
    * in the print dialog.
    */
   readonly attribute boolean platformIsMac;
 
   /**
    * Returns true if the application is running on GNU/Linux or on UNIX.
    */
   readonly attribute boolean platformIsLinux;
+
+  /**
+   * Returns true if the application is running on Windows.
+   */
+  readonly attribute boolean platformIsWindows;
 };
rename from mail/steel/test/test_linux_platformIsLinux.js
rename to mail/steel/test/test_linux_platformChecks.js
--- a/mail/steel/test/test_linux_platformIsLinux.js
+++ b/mail/steel/test/test_linux_platformChecks.js
@@ -1,13 +1,14 @@
 /* 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/. */
 
 /**
  * Linux specific version of testing the platformIsLinux part of
  * steelIApplication.
  */
-
 function run_test() {
-  do_check_true(Cc["@mozilla.org/steel/application;1"]
-                   .getService(Ci.steelIApplication).platformIsLinux);
+  let steel = Cc["@mozilla.org/steel/application;1"].getService(Ci.steelIApplication);
+  do_check_true(steel.platformIsLinux);
+  do_check_false(steel.platformIsMac);
+  do_check_false(steel.platformIsWindows);
 }
rename from mail/steel/test/test_mac_platformIsLinux.js
rename to mail/steel/test/test_mac_platformChecks.js
--- a/mail/steel/test/test_mac_platformIsLinux.js
+++ b/mail/steel/test/test_mac_platformChecks.js
@@ -1,13 +1,14 @@
 /* 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/. */
 
 /**
  * Mac specific version of testing the platformIsLinux part of
  * steelIApplication.
  */
-
 function run_test() {
-  do_check_false(Cc["@mozilla.org/steel/application;1"]
-                   .getService(Ci.steelIApplication).platformIsLinux);
+  let steel = Cc["@mozilla.org/steel/application;1"].getService(Ci.steelIApplication);
+  do_check_false(steel.platformIsLinux);
+  do_check_true(steel.platformIsMac);
+  do_check_false(steel.platformIsWindows);
 }
rename from mail/steel/test/test_other_platformIsLinux.js
rename to mail/steel/test/test_windows_platformChecks.js
--- a/mail/steel/test/test_other_platformIsLinux.js
+++ b/mail/steel/test/test_windows_platformChecks.js
@@ -1,13 +1,14 @@
 /* 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/. */
 
 /**
  * Non-Mac and non-Linux specific version of testing the platformIsLinux
  * part of steelIApplication.
  */
-
 function run_test() {
-  do_check_false(Cc["@mozilla.org/steel/application;1"]
-                   .getService(Ci.steelIApplication).platformIsLinux);
+  let steel = Cc["@mozilla.org/steel/application;1"].getService(Ci.steelIApplication);
+  do_check_false(steel.platformIsLinux);
+  do_check_false(steel.platformIsMac);
+  do_check_true(steel.platformIsWindows);
 }
--- a/mail/steel/test/xpcshell.ini
+++ b/mail/steel/test/xpcshell.ini
@@ -1,22 +1,17 @@
 ; 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/.
 
 [DEFAULT]
 head = head_steel.js
 tail =
 
-[test_mac_platformIsMac.js]
-run-if = os == 'mac'
-[test_mac_platformIsLinux.js]
+[test_mac_platformChecks.js]
 run-if = os == 'mac'
 
-[test_linux_platformIsMac.js]
-run-if = os == 'linux'
-[test_linux_platformIsLinux.js]
+[test_linux_platformChecks.js]
 run-if = os == 'linux'
 
-[test_other_platformIsMac.js]
-skip-if = os == 'linux' || os == 'mac'
-[test_other_platformIsLinux.js]
-skip-if = os == 'linux' || os == 'mac'
+[test_windows_platformChecks.js]
+run-if = os == 'win'
+
--- a/mail/test/mozmill/cloudfile/test-cloudfile-notifications.js
+++ b/mail/test/mozmill/cloudfile/test-cloudfile-notifications.js
@@ -1,54 +1,55 @@
 /* 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/. */
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /**
- * Tests the get an account workflow.
+ * Tests that the cloudfile notifications work as they should.
  */
 
 let MODULE_NAME = 'test-cloudfile-notifications';
 
 let RELATIVE_ROOT = '../shared-modules';
 let MODULE_REQUIRES = ['folder-display-helpers',
                        'compose-helpers',
                        'cloudfile-helpers',
                        'attachment-helpers',
-                       'prompt-helpers'];
+                       'prompt-helpers', 
+                       'notificationbox-helpers'];
 
 let controller = {};
 let mozmill = {};
 let elib = {};
 Cu.import('resource://mozmill/modules/controller.js', controller);
 Cu.import('resource://mozmill/modules/mozmill.js', mozmill);
 Cu.import('resource://mozmill/modules/elementslib.js', elib);
 Cu.import('resource://gre/modules/Services.jsm');
 
 let maxSize, cfh, ah, oldInsertNotificationPref;
 
 const kOfferThreshold = "mail.compose.big_attachments.threshold_kb";
 const kInsertNotificationPref = "mail.compose.big_attachments.insert_notification";
 
+const kBoxId = "attachmentNotificationBox";
+
 function setupModule(module) {
-  let fdh = collector.getModule('folder-display-helpers');
-  fdh.installInto(module);
-
-  let ch = collector.getModule('compose-helpers');
-  ch.installInto(module);
+  collector.getModule('folder-display-helpers').installInto(module);
+  collector.getModule('compose-helpers').installInto(module);
 
   cfh = collector.getModule('cloudfile-helpers');
   cfh.installInto(module);
   cfh.gMockCloudfileManager.register();
 
   ah = collector.getModule('attachment-helpers');
   ah.installInto(module);
   ah.gMockFilePickReg.register();
 
   collector.getModule('prompt-helpers').installInto(module);
+  collector.getModule('notificationbox-helpers').installInto(module);
 
   maxSize = Services.prefs.getIntPref(kOfferThreshold, 0) * 1024;
   oldInsertNotificationPref = Services.prefs
                                       .getBoolPref(kInsertNotificationPref);
   Services.prefs.setBoolPref(kInsertNotificationPref, true);
 };
 
 function teardownModule(module) {
@@ -62,57 +63,57 @@ function teardownModule(module) {
  * A helper function to assert that the Filelink offer notification is
  * either displayed or not displayed.
  *
  * @param aController the controller of the compose window to check.
  * @param aDisplayed true if the notification should be displayed, false
  *                   otherwise.
  */
 function assert_cloudfile_notification_displayed(aController, aDisplayed) {
-  assert_notification_displayed(aController, "bigAttachment", aDisplayed);
+  assert_notification_displayed(aController, kBoxId, "bigAttachment", aDisplayed);
 }
 
 /**
  * A helper function to assert that the Filelink upload notification is
  * either displayed or not displayed.
  *
  * @param aController the controller of the compose window to check.
  * @param aDisplayed true if the notification should be displayed, false
  *                   otherwise.
  */
 function assert_upload_notification_displayed(aController, aDisplayed) {
-  assert_notification_displayed(aController, "bigAttachmentUploading",
+  assert_notification_displayed(aController, kBoxId, "bigAttachmentUploading",
                                 aDisplayed);
 }
 
 /**
  * A helper function to assert that the Filelink privacy warning notification
  * is either displayed or not displayed.
  *
  * @param aController the controller of the compose window to check.
  * @param aDisplayed true if the notification should be displayed, false
  *                   otherwise.
  */
 function assert_privacy_warning_notification_displayed(aController, aDisplayed) {
-  assert_notification_displayed(aController, "bigAttachmentPrivacyWarning",
+  assert_notification_displayed(aController, kBoxId, "bigAttachmentPrivacyWarning",
                                 aDisplayed);
 }
 
 /**
  * A helper function to close the Filelink upload notification.
  */
 function close_upload_notification(aController) {
-  close_notification(aController, "bigAttachmentUploading");
+  close_notification(aController, kBoxId, "bigAttachmentUploading");
 }
 
 /**
  * A helper function to close the Filelink privacy warning notification.
  */
 function close_privacy_warning_notification(aController) {
-  close_notification(aController, "bigAttachmentPrivacyWarning");
+  close_notification(aController, kBoxId, "bigAttachmentPrivacyWarning");
 }
 
 function test_no_notification_for_small_file() {
   let cwc = open_compose_new_mail(mc);
   add_attachments(cwc, "http://www.example.com/1", 0);
   assert_cloudfile_notification_displayed(cwc, false);
 
   add_attachments(cwc, "http://www.example.com/2", 1);
@@ -235,17 +236,17 @@ function test_link_insertion_goes_away_o
       aListener.onStopRequest(null, null,
                               Ci.nsIMsgCloudFileProvider.uploadErr);
     }, 500);
   }
   let cwc = open_compose_new_mail(mc);
   cwc.window.attachToCloud(provider);
 
   assert_upload_notification_displayed(cwc, true);
-  wait_for_notification_to_stop(cwc, "bigAttachmentUploading");
+  wait_for_notification_to_stop(cwc, kBoxId, "bigAttachmentUploading");
   gMockPromptService.unregister();
 }
 
 /**
  * Test that we do not show the Filelink offer notification if we convert
  * a Filelink back into a normal attachment.
  */
 function test_no_offer_on_conversion() {
@@ -346,17 +347,17 @@ function test_privacy_warning_notificati
       aListener.onStopRequest(null, null,
                               Components.results.NS_OK);
     }, 500);
   }
   let cwc = open_compose_new_mail(mc);
   cwc.window.attachToCloud(provider);
 
   assert_upload_notification_displayed(cwc, true);
-  wait_for_notification_to_stop(cwc, "bigAttachmentUploading");
+  wait_for_notification_to_stop(cwc, kBoxId, "bigAttachmentUploading");
 
   // Assert that the warning is displayed.
   assert_privacy_warning_notification_displayed(cwc, true);
 
   // Close the privacy warning notification...
   close_privacy_warning_notification(cwc);
 
   // And now upload some more files. We shouldn't get the warning again.
@@ -385,17 +386,17 @@ function test_privacy_warning_notificati
       aListener.onStopRequest(null, null,
                               Components.results.NS_OK);
     }, 500);
   }
   let cwc = open_compose_new_mail(mc);
   cwc.window.attachToCloud(provider);
 
   assert_upload_notification_displayed(cwc, true);
-  wait_for_notification_to_stop(cwc, "bigAttachmentUploading");
+  wait_for_notification_to_stop(cwc, kBoxId, "bigAttachmentUploading");
 
   // Assert that the warning is displayed.
   assert_privacy_warning_notification_displayed(cwc, true);
 
   // Close the compose window
   close_compose_window(cwc);
 
   // Open a new compose window
@@ -424,31 +425,31 @@ function test_privacy_warning_notificati
       aListener.onStopRequest(null, null,
                               Components.results.NS_OK);
     }, 500);
   }
   let cwc = open_compose_new_mail(mc);
   cwc.window.attachToCloud(provider);
 
   assert_upload_notification_displayed(cwc, true);
-  wait_for_notification_to_stop(cwc, "bigAttachmentUploading");
+  wait_for_notification_to_stop(cwc, kBoxId, "bigAttachmentUploading");
 
   // Assert that the warning is displayed.
   assert_privacy_warning_notification_displayed(cwc, true);
 
   // Close the privacy warning notification...
   close_privacy_warning_notification(cwc);
 
   // Open a new compose window
   cwc = open_compose_new_mail(mc);
 
   gMockFilePicker.returnFiles = collectFiles(['./data/testFile3',
                                               './data/testFile4'], __file__);
   cwc.window.attachToCloud(provider);
 
   assert_upload_notification_displayed(cwc, true);
-  wait_for_notification_to_stop(cwc, "bigAttachmentUploading");
+  wait_for_notification_to_stop(cwc, kBoxId, "bigAttachmentUploading");
 
   // Assert that the privacy warning notification is displayed again.
   assert_privacy_warning_notification_displayed(cwc, true);
 
   gMockPromptService.unregister();
 }
--- a/mail/test/mozmill/composition/test-attachment-reminder.js
+++ b/mail/test/mozmill/composition/test-attachment-reminder.js
@@ -6,61 +6,62 @@
  * Tests that the attachment reminder works properly.
  */
 
 const MODULE_NAME = "test-attachment-reminder";
 
 const RELATIVE_ROOT = "../shared-modules";
 const MODULE_REQUIRES = ["folder-display-helpers",
                          "compose-helpers",
-                         "window-helpers"];
+                         "window-helpers",
+                         "notificationbox-helpers"];
 
 Cu.import("resource://gre/modules/Services.jsm");
 
-// I'm not sure why this is the ID. But it is. :/
-const kNotificationID = "1";
+const kBoxId = "attachmentNotificationBox";
+const kNotificationId = "attachmentReminder";
 
 function setupModule(module) {
   collector.getModule("folder-display-helpers").installInto(module);
   collector.getModule("compose-helpers").installInto(module);
   collector.getModule("window-helpers").installInto(module);
+  collector.getModule("notificationbox-helpers").installInto(module);
 };
 
 function setupComposeWin(aCwc, toAddr, subj, body) {
   aCwc.type(null, toAddr);
   aCwc.type(aCwc.eid("msgSubject"), subj)
   aCwc.type(aCwc.eid("content-frame"), body);
 }
 
 /**
  * Test that the attachment works, in general.
  */
 function test_attachment_reminder_appears_properly() {
   let cwc = open_compose_new_mail();
-  let notificationBox = cwc.e("attachmentNotificationBox");
+  let notificationBox = cwc.e(kBoxId);
 
   // There should be no notification yet.
-  assert_notification_displayed(cwc, kNotificationID, false);
+  assert_notification_displayed(cwc, kBoxId, kNotificationId, false);
 
   setupComposeWin(cwc, "test@example.org", "testing attachment reminder!",
                   "Hjello! ");
 
   // Give the notification time to appear. It shouldn't.
   cwc.sleep(1100);
-  if (notificationBox.getNotificationWithValue(kNotificationID))
+  if (notificationBox.getNotificationWithValue(kNotificationId))
     throw new Error("Attachment notification shown when it shouldn't.");
 
   cwc.type(cwc.eid("content-frame"), "Seen this cool attachment?");
 
     // Give the notification time to appear. It should now.
-  wait_for_notification_to_show(cwc, kNotificationID);
+  wait_for_notification_to_show(cwc, kBoxId, kNotificationId);
 
   // Click ok to be notified on send if no attachments are attached.
-  cwc.click(cwc.eid("attachmentNotificationBox",
-            {tagName: "button", label: "Remind Me Later"}));
+  cwc.click(cwc.eid(kBoxId, {tagName: "button", label: "Remind Me Later"}));
 
   // Now try to send, make sure we get the alert.
   plan_for_modal_dialog("commonDialog", click_oh_i_did);
   cwc.click(cwc.eid("button-send"));
   wait_for_modal_dialog("commonDialog");
 
   close_compose_window(cwc);
 }
@@ -68,31 +69,31 @@ function test_attachment_reminder_appear
 /**
  * Test that the alert appears normally, but not after closing the
  * notification.
  */
 function test_attachment_reminder_dismissal() {
   let cwc = open_compose_new_mail();
 
   // There should be no notification yet.
-  assert_notification_displayed(cwc, kNotificationID, false);
+  assert_notification_displayed(cwc, kBoxId, kNotificationId, false);
 
   setupComposeWin(cwc, "test@example.org", "popping up, eh?",
                   "Hi there, remember the attachment!");
 
   // Give the notification time to appear.
-  wait_for_notification_to_show(cwc, kNotificationID);
+  wait_for_notification_to_show(cwc, kBoxId, kNotificationId);
 
   // We didn't click the "Remind Me Later" - the alert should pop up
   // on send anyway.
   plan_for_modal_dialog("commonDialog", click_oh_i_did);
   cwc.click(cwc.eid("button-send"));
   wait_for_modal_dialog("commonDialog");
 
-  let notification = assert_notification_displayed(cwc, kNotificationID,
+  let notification = assert_notification_displayed(cwc, kBoxId, kNotificationId,
                                                    true);
   notification.close();
   click_send_and_handle_send_error(cwc);
 }
 // Disabling this test on Windows due to random timeouts on our Mozmill
 // testers.
 test_attachment_reminder_dismissal.EXCLUDED_PLATFORMS = ['winnt'];
 
@@ -101,22 +102,22 @@ test_attachment_reminder_dismissal.EXCLU
  */
 function test_attachment_reminder_aggressive_pref() {
   const kPref = "mail.compose.attachment_reminder_aggressive";
   Services.prefs.setBoolPref(kPref, false);
 
   let cwc = open_compose_new_mail();
 
   // There should be no notification yet.
-  assert_notification_displayed(cwc, kNotificationID, false);
+  assert_notification_displayed(cwc, kBoxId, kNotificationId, false);
 
   setupComposeWin(cwc, "test@example.org", "aggressive?",
                   "Check this attachment!");
 
-  wait_for_notification_to_show(cwc, kNotificationID);
+  wait_for_notification_to_show(cwc, kBoxId, kNotificationId);
   click_send_and_handle_send_error(cwc);
 
   // Now reset the pref back to original value.
   if (Services.prefs.prefHasUserValue(kPref))
     Services.prefs.clearUserPref(kPref);
 }
 // Disabling this test on Windows due to random timeouts on our Mozmill
 // testers.
@@ -128,17 +129,17 @@ test_attachment_reminder_aggressive_pref
  */
 function test_no_send_now_sends() {
   let cwc = open_compose_new_mail();
 
   setupComposeWin(cwc, "test@example.org",
                   "will the 'No, Send Now' button work?",
                   "Hello, i got your attachment!");
 
-  wait_for_notification_to_show(cwc, kNotificationID);
+  wait_for_notification_to_show(cwc, kBoxId, kNotificationId);
 
   // Click the send button again, this time choose "No, Send Now".
   plan_for_modal_dialog("commonDialog", click_no_send_now);
   cwc.click(cwc.eid("button-send"));
   wait_for_modal_dialog("commonDialog");
 
   click_send_and_handle_send_error(cwc);
 }
--- a/mail/test/mozmill/composition/test-drafts.js
+++ b/mail/test/mozmill/composition/test-drafts.js
@@ -12,16 +12,17 @@
 const MODULE_NAME = "test-drafts";
 
 const RELATIVE_ROOT = "../shared-modules";
 const MODULE_REQUIRES = ["folder-display-helpers", "compose-helpers", "window-helpers"];
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource:///modules/mailServices.js");
 
+const kBoxId = "msgNotificationBar";
 var draftsFolder;
 
 function setupModule(module) {
   collector.getModule("folder-display-helpers").installInto(module);
   collector.getModule("compose-helpers").installInto(module);
   collector.getModule("window-helpers").installInto(module);
 
   if (!MailServices.accounts
@@ -40,27 +41,28 @@ function setupModule(module) {
  * Tests that we only open one compose window for one instance of a draft.
  */
 function test_open_draft_again() {
   make_new_sets_in_folder(draftsFolder, [{count: 1}]);
   be_in_folder(draftsFolder);
   let draftMsg = select_click_row(0);
 
   plan_for_new_window("msgcompose");
-  mc.click(mc.eid("editMessageButton"));
+  mc.click(mc.eid(kBoxId, {tagName: "button", label: "Edit"}));
   let cwc = wait_for_compose_window();
 
   let cwins = 0;
   let e = Services.wm.getEnumerator("msgcompose");
   while (e.hasMoreElements()) {
     e.getNext();
     cwins++;
   }
 
-  mc.click(mc.eid("editMessageButton")); // click edit in main win again
+  // click edit in main win again
+  mc.click(mc.eid(kBoxId, {tagName: "button", label: "Edit"}));
 
   mc.sleep(1000); // wait a sec to see if it caused a new window
 
   assert_true(Services.ww.activeWindow == cwc.window,
     "the original draft composition window should have got focus (again)");
 
   let cwins2 = 0;
   let e2 = Services.wm.getEnumerator("msgcompose");
--- a/mail/test/mozmill/content-policy/test-general-content-policy.js
+++ b/mail/test/mozmill/content-policy/test-general-content-policy.js
@@ -1,39 +1,40 @@
+/* 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/. */
+
 /**
  * Checks various remote content policy workings, including:
  *
  * - Images
  * - Video
  *
  * In:
  *
  * - Messages
  * - Reply email compose window
  * - Forward email compose window
  * - Content tab
  */
 
-//
-/* 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/. */
+// make SOLO_TEST=content-policy/test-general-content-policy.js mozmill-one
+
+const MODULE_NAME = 'test-general-content-policy';
 
-var MODULE_NAME = 'test-general-content-policy';
-
-var RELATIVE_ROOT = '../shared-modules';
-var MODULE_REQUIRES = ['folder-display-helpers', 'window-helpers',
-                       'compose-helpers', 'content-tab-helpers'];
+const RELATIVE_ROOT = '../shared-modules';
+const MODULE_REQUIRES = ['folder-display-helpers', 'window-helpers',
+                         'compose-helpers', 'content-tab-helpers',
+                         'notificationbox-helpers'];
 var jumlib = {};
 Components.utils.import("resource://mozmill/modules/jum.js", jumlib);
 var elib = {};
 Components.utils.import('resource://mozmill/modules/elementslib.js', elib);
 
 var folder = null;
-var composeHelper = null;
 var gMsgNo = 0;
 
 // RELATIVE_ROOT messes with the collector, so we have to bring the path back
 // so we get the right path for the resources.
 var url = collector.addHttpResource('../content-policy/html', 'content');
 
 /**
  * The TESTS array is constructed from objects containing the following:
@@ -88,24 +89,19 @@ const msgBodyStart = '<!DOCTYPE HTML PUB
 '\n' +
 '<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">\n' +
 '</head>\n' +
 '<body bgcolor="#ffffff" text="#000000">\n';
 
 const msgBodyEnd = '</body>\n</html>\n';
 
 var setupModule = function (module) {
-  let fdh = collector.getModule('folder-display-helpers');
-  fdh.installInto(module);
-  let wh = collector.getModule('window-helpers');
-  wh.installInto(module);
-  composeHelper = collector.getModule('compose-helpers');
-  composeHelper.installInto(module);
-  let cth = collector.getModule('content-tab-helpers');
-  cth.installInto(module);
+  for (let dep of MODULE_REQUIRES) {
+    collector.getModule(dep).installInto(module);
+  }
 
   folder = create_folder("generalContentPolicy");
 };
 
 function addToFolder(aSubject, aBody, aFolder) {
 
   let msgId = Components.classes["@mozilla.org/uuid-generator;1"]
                           .getService(Components.interfaces.nsIUUIDGenerator)
@@ -165,27 +161,27 @@ function addMsgToFolderAndCheckContent(f
  * Check remote content in a compose window.
  *
  * @param test        The test from TESTS that is being performed.
  * @param replyType   The type of the compose window, set to true for "reply",
  *                    false for "forward".
  * @param loadAllowed Whether or not the load is expected to be allowed.
  */
 function checkComposeWindow(test, replyType, loadAllowed) {
-  let replyWindow = replyType ? composeHelper.open_compose_with_reply() :
-                                composeHelper.open_compose_with_forward();
+  let replyWindow = replyType ? open_compose_with_reply() :
+                                open_compose_with_forward();
 
   if (test.checkForAllowed(
         replyWindow.window.document.getElementById("content-frame")
           .contentDocument.getElementById("testelement")) != loadAllowed)
     throw new Error(test.type + " has not been " +
                     (loadAllowed ? "allowed" : "blocked") +
                     " in reply window as expected.");
 
-  composeHelper.close_compose_window(replyWindow);
+  close_compose_window(replyWindow);
 }
 
 /**
  * Check remote content in stand-alone message window, and reload
  */
  function checkStandaloneMessageWindow(test, loadAllowed) {
   plan_for_new_window("mail:messageWindow");
   // Open it
@@ -196,24 +192,28 @@ function checkComposeWindow(test, replyT
   if (test.checkForAllowed(
           msgc.window.content.document.getElementById("testelement")) != loadAllowed)
     throw new Error(test.type + " has not been blocked in message content as expected.");
 
   // Clean up, close the window
   close_message_window(msgc);
 }
 
-
 function allowRemoteContentAndCheck(test) {
   addMsgToFolderAndCheckContent(folder, test);
 
   plan_for_message_display(mc);
 
   // Click on the allow remote content button
-  mc.click(new elib.ID(mc.window.document, "remoteContentBarButton"));
+  const kBoxId = "msgNotificationBar";
+  const kNotificationValue = "remoteContent";
+  wait_for_notification_to_show(mc, kBoxId, kNotificationValue);
+  mc.click_menus_in_sequence(mc.e("remoteContentOptions"),
+                             [{id: "remoteContentOptionAllowForMsg"}]);
+  wait_for_notification_to_stop(mc, kBoxId, kNotificationValue);
 
   wait_for_message_display_completion(mc, true);
 
   if (!test.checkForAllowed(mc.window.content.document
                               .getElementById("testelement")))
     throw new Error(test.type + " has been unexpectedly blocked in message content");
 }
 
--- a/mail/test/mozmill/message-header/test-phishing-bar.js
+++ b/mail/test/mozmill/message-header/test-phishing-bar.js
@@ -1,102 +1,105 @@
 /* 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/. */
 
-/*
- *  Test that the phishing bar behaves properly
+/**
+ * Test that the phishing notification behaves properly.
  */
 
-var MODULE_NAME = "test-phishing-bar";
+// make SOLO_TEST=message-header/test-phishing-bar.js mozmill-one
+
+const MODULE_NAME = "test-phishing-bar";
 
-var RELATIVE_ROOT = "../shared-modules";
-var MODULE_REQUIRES = ["folder-display-helpers",
-                       "window-helpers"];
+const RELATIVE_ROOT = "../shared-modules";
+const MODULE_REQUIRES = ["folder-display-helpers",
+                         "window-helpers", "notificationbox-helpers"];
 
-var elib = {};
-Components.utils.import("resource://mozmill/modules/elementslib.js", elib);
 var os = {};
 Components.utils.import('resource://mozmill/stdlib/os.js', os);
 
 var folder;
 
+const kBoxId = "msgNotificationBar";
+const kNotificationValue = "maybeScam";
+
 function setupModule(module) {
-  let fdh = collector.getModule("folder-display-helpers");
-  fdh.installInto(module);
-  let wh = collector.getModule("window-helpers");
-  wh.installInto(module);
+  for (let dep of MODULE_REQUIRES) {
+    collector.getModule(dep).installInto(module);
+  }
 
   folder = create_folder("PhishingBarA");
   add_message_to_folder(folder, create_message({body: {
     body: '<a href="http://www.evil.com/google/">http://www.google.com</a>',
     contentType: "text/html"
   }}));
+  add_message_to_folder(folder, create_message());
 }
 
 /**
- * Make sure that the phishing bar is currently visible.
- *
- * @param msgc the Mozmill controller for the message window
+ * Make sure the notification shows, and goes away once the Ignore menuitem
+ * is clicked.
  */
-function assert_phishing_bar_visible(msgc) {
-  assert_true(!msgc.e("msgNotificationBar").collapsed,
-              "Notification bar is collapsed!");
-  assert_equals(msgc.e("msgNotificationBar").selectedPanel,
-                msgc.e("phishingBar"),
-                "Notification bar not showing phishing bar!");
+function assert_ignore_works(aController) {
+  wait_for_notification_to_show(aController, kBoxId, kNotificationValue);
+  aController.click_menus_in_sequence(aController.e("phishingOptions"),
+                                      [{id: "phishingOptionIgnore"}]);
+  wait_for_notification_to_stop(aController, kBoxId, kNotificationValue);
 }
 
 /**
- * Make sure that the phishing bar gets hidden when the ignore button is
- * clicked.
- *
- * @param msgc the Mozmill controller for the message window
+ * Test that when viewing a message, choosing ignore hides the the phishing
+ * notification.
  */
-function help_test_hide_phishing_bar(msgc) {
-  let phishingButton = msgc.e("phishingBar").querySelector("button");
-  assert_phishing_bar_visible(msgc);
+function test_ignore_phishing_warning_from_message() {
+  be_in_folder(folder);
+  select_click_row(0);
+  assert_ignore_works(mc);
 
-  msgc.click(new elib.Elem(phishingButton));
-  wait_for_message_display_completion(msgc, true);
-  assert_true(msgc.e("msgNotificationBar").collapsed);
+  select_click_row(1);
+  // msg 1 is normal -> no phishing warning
+  assert_notification_displayed(mc, kBoxId, kNotificationValue, false);
+  select_click_row(0);
+  // msg 0 is a potential phishing attempt, but we ignored it so that should
+  // be remembered
+  assert_notification_displayed(mc, kBoxId, kNotificationValue, false);
 }
 
-function test_hide_phishing_bar_from_message() {
-  be_in_folder(folder);
-  select_click_row(0);
-
-  // XXX Disabled due very frequent random failures.
-  // help_test_hide_phishing_bar(mc);
-}
-
-function test_hide_phishing_bar_from_eml() {
-  // XXX Disabled due very frequent random failures.
-  /*
+/**
+ * Test that when viewing en eml file, choosing ignore hides the phishing
+ * notification.
+ */
+function test_ignore_phishing_warning_from_eml() {
   let thisFilePath = os.getFileForPath(__file__);
   let file = os.getFileForPath(os.abspath("./evil.eml", thisFilePath));
 
   let msgc = open_message_from_file(file);
-  help_test_hide_phishing_bar(msgc);
-  */
+  assert_ignore_works(msgc);
+  close_window(msgc);
 }
 
-function test_phishing_bar_for_eml_attachment() {
+/**
+ * Test that when viewing an attached eml file, the phishing notification works.
+ */
+function test_ignore_phishing_warning_from_eml_attachment() {
   let thisFilePath = os.getFileForPath(__file__);
   let file = os.getFileForPath(os.abspath("./evil-attached.eml", thisFilePath));
 
   let msgc = open_message_from_file(file);
 
   // Make sure the root message shows the phishing bar.
-  assert_phishing_bar_visible(msgc);
+  wait_for_notification_to_show(msgc, kBoxId, kNotificationValue);
+  //function assert_notification_displayed(aController, aValue, aDisplayed) 
 
   // Open the attached message.
   plan_for_new_window("mail:messageWindow");
   msgc.e("attachmentList").getItemAtIndex(0).attachment.open();
-  let msg2c = wait_for_new_window("mail:messageWindow");
-  wait_for_message_display_completion(msg2c, true);
+  let msgc2 = wait_for_new_window("mail:messageWindow");
+  wait_for_message_display_completion(msgc2, true);
 
   // Now make sure the attached message shows the phishing bar.
-  assert_phishing_bar_visible(msg2c);
+  wait_for_notification_to_show(msgc2, kBoxId, kNotificationValue);
 
-  close_window(msg2c);
+  close_window(msgc2);
   close_window(msgc);
 }
+
--- a/mail/test/mozmill/message-header/test-return-receipt.js
+++ b/mail/test/mozmill/message-header/test-return-receipt.js
@@ -6,25 +6,28 @@
  * Test return receipt (MDN) stuff.
  */
 
 // make SOLO_TEST=message-header/test-return-receipt.js mozmill-one
 
 const MODULE_NAME = "test-return-receipt";
 
 const RELATIVE_ROOT = "../shared-modules";
-const MODULE_REQUIRES = ["folder-display-helpers", "window-helpers"];
+const MODULE_REQUIRES = ["folder-display-helpers", "window-helpers",
+                        "notificationbox-helpers"];
 
 var folder;
 
+const kBoxId = "msgNotificationBar";
+const kNotificationValue = "mdnRequested";
+
 function setupModule(module) {
-  let fdh = collector.getModule("folder-display-helpers");
-  fdh.installInto(module);
-  let wh = collector.getModule("window-helpers");
-  wh.installInto(module);
+  collector.getModule("folder-display-helpers").installInto(module);
+  collector.getModule("window-helpers").installInto(module);
+  collector.getModule("notificationbox-helpers").installInto(module);
 
   folder = create_folder("ReturnReceiptTest");
 
   // Create a message that requests a return receipt.
   let msg0 = create_message(
     {from: ["Ake", "ake@example.com"],
       clobberHeaders: { "Disposition-Notification-To": "ake@example.com" }
     });
@@ -79,35 +82,25 @@ function gotoMsg(row) {
   assert_selected_and_displayed(mc, curMessage);
 }
 
 /**
  * Utility to make sure the MDN bar is shown / not shown.
  */
 function assert_mdn_shown(shouldShow) {
   let msgNotBar = mc.e("msgNotificationBar");
-  if (shouldShow) {
-    if (msgNotBar.collapsed)
-      throw new Error("msgNotificationBar should show");
-    if (msgNotBar.selectedIndex != 4) // it's not the mdnBar showing
-      throw new Error("msgNotificationBar should show the mdnBar; " +
-                      "msgNotBar.selectedIndex=" + msgNotBar.selectedIndex);
-  }
-  else {
-    if (!msgNotBar.collapsed)
-      throw new Error("mdnBar shouldn't show");
-  }
+  assert_notification_displayed(mc, kBoxId, kNotificationValue, shouldShow);
 }
 
 /**
  * Utility function to make sure the notification contains a certain text.
  */
 function assert_mdn_text_contains(text, shouldContain) {
-  let mdnBar = mc.e("mdnBar");
-  let notificationText = mdnBar.textContent;
+  let nb = mc.window.document.getElementById(kBoxId);
+  let notificationText = nb.currentNotification.label;
   if (shouldContain && !notificationText.contains(text))
     throw new Error("mdnBar should contain text=" + text +
                     "; notificationText=" + notificationText);
   if (!shouldContain && notificationText.contains(text))
     throw new Error("mdnBar shouldn't contain text=" + text +
                     "; notificationText=" + notificationText);
 }
 
--- a/mail/test/mozmill/shared-modules/test-compose-helpers.js
+++ b/mail/test/mozmill/shared-modules/test-compose-helpers.js
@@ -45,20 +45,16 @@ function installInto(module) {
   module.wait_for_compose_window = wait_for_compose_window;
   module.create_msg_attachment = create_msg_attachment;
   module.add_attachments = add_attachments;
   module.add_attachment = add_attachments;
   module.delete_attachment = delete_attachment;
   module.get_compose_body = get_compose_body;
   module.type_in_composer = type_in_composer;
   module.assert_previous_text = assert_previous_text;
-  module.assert_notification_displayed = assert_notification_displayed;
-  module.close_notification = close_notification;
-  module.wait_for_notification_to_stop = wait_for_notification_to_stop;
-  module.wait_for_notification_to_show = wait_for_notification_to_show;
 }
 
 /**
  * Opens the compose window by starting a new message
  *
  * @param aController the controller for the mail:3pane from which to spawn
  *                    the compose window.  If left blank, defaults to mc.
  *
@@ -307,96 +303,16 @@ function delete_attachment(aComposeWindo
   let bucket = aComposeWindow.e('attachmentBucket');
   let node = bucket.getElementsByTagName('attachmentitem')[aIndex];
 
   aComposeWindow.click(new elib.Elem(node));
   aComposeWindow.window.RemoveSelectedAttachment();
 }
 
 /**
- * A helper function for determining whether or not a notification with
- * a particular value is being displayed in the composer window.
- *
- * @param aController the controller of the compose window to check
- * @param aValue the value of the notification to look for.
- * @param aDisplayed true if the notification should be displayed, false
- *                   otherwise.
- * @returns the notification if we're asserting that the notification is
- *          displayed, and it actually shows up. Returns null otherwise.
- */
-function assert_notification_displayed(aController, aValue, aDisplayed) {
-  let nb = aController.window
-                      .document
-                      .getElementById("attachmentNotificationBox");
-  let hasNotification = false;
-  let notification = nb.getNotificationWithValue(aValue);
-  let hasNotification = (notification != null)
-
-  if (hasNotification != aDisplayed)
-    throw new Error("Expected the notification with value " + aValue +
-                    " to be " + (aDisplayed ? "shown" : "not shown"));
-
-  return notification;
-}
-
-/**
- * A helper function for closing a notification in the compose window if
- * one is currently displayed.
- *
- * @param aController the controller for the compose window with
- *                    the notification.
- * @param aValue the value of the notification to close.
- */
-function close_notification(aController, aValue) {
-  let nb = aController.window
-                      .document
-                      .getElementById("attachmentNotificationBox");
-  let notification = nb.getNotificationWithValue(aValue);
-
-  if (notification)
-    notification.close();
-}
-
-/**
- * A helper function that waits for a notification with value aValue
- * to stop displaying in the compose window.
- *
- * @param aController the controller for the compose window with the
- *                    notification.
- * @param aValue the value of the notification to wait to stop.
- */
-function wait_for_notification_to_stop(aController, aValue) {
-  let nb = aController.window
-                      .document
-                      .getElementById("attachmentNotificationBox");
-
-  aController.waitFor(function() !nb.getNotificationWithValue(aValue),
-                      "Timed out waiting for notification with value " +
-                      aValue + " to stop.");
-}
-
-/**
- * A helper function that waits for a notification with value aValue
- * to show in the compose window.
- *
- * @param aController the controller for the compose window that we want
- *                    the notification to appear in.
- * @param aValue the value of the notification to wait for.
- */
-function wait_for_notification_to_show(aController, aValue) {
-  let nb = aController.window
-                      .document
-                      .getElementById("attachmentNotificationBox");
-
-  aController.waitFor(function() nb.getNotificationWithValue(aValue) != null,
-                      "Timed out waiting for notification with value " +
-                      aValue + " to show.");
-}
-
-/**
  * Helper function returns the message body element of a composer window.
  *
  * @param aController the controller for a compose window.
  */
 function get_compose_body(aController) {
   let mailDoc = aController.e("content-frame").contentDocument;
   return mailDoc.querySelector("body");
 }
new file mode 100644
--- /dev/null
+++ b/mail/test/mozmill/shared-modules/test-notificationbox-helpers.js
@@ -0,0 +1,114 @@
+/* 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 Ci = Components.interfaces;
+var Cc = Components.classes;
+var Cu = Components.utils;
+
+var elib = {};
+Cu.import("resource://mozmill/modules/elementslib.js", elib);
+var mozmill = {};
+Cu.import("resource://mozmill/modules/mozmill.js", mozmill);
+var utils = {};
+Cu.import("resource://mozmill/modules/utils.js", utils);
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const MODULE_NAME = "notificationbox-helpers";
+
+const RELATIVE_ROOT = "../shared-modules";
+
+// we need this for the main controller
+const MODULE_REQUIRES = ["folder-display-helpers",
+                         "window-helpers",
+                         "mock-object-helpers"];
+
+function installInto(module) {
+  module.assert_notification_displayed = assert_notification_displayed;
+  module.close_notification = close_notification;
+  module.wait_for_notification_to_stop = wait_for_notification_to_stop;
+  module.wait_for_notification_to_show = wait_for_notification_to_show;
+}
+
+/**
+ * A helper function for determining whether or not a notification with
+ * a particular value is being displayed.
+ *
+ * @param aController the controller of the window to check
+ * @param aBoxId the id of the notificaiton box
+ * @param aValue the value of the notification to look for
+ * @param aDisplayed true if the notification should be displayed, false
+ *                   otherwise
+ * @returns the notification if we're asserting that the notification is
+ *          displayed, and it actually shows up. Returns null otherwise
+ */
+function assert_notification_displayed(aController, aBoxId, aValue, aDisplayed) {
+  let nb = aController.window.document.getElementById(aBoxId);
+  if (!nb)
+     throw new Error("Couldn't find a notification box for id=" + aBoxId);
+
+  let hasNotification = false;
+  let notification = nb.getNotificationWithValue(aValue);
+  let hasNotification = (notification != null)
+
+  if (hasNotification != aDisplayed)
+    throw new Error("Expected the notification with value " + aValue +
+                    " to be " + (aDisplayed ? "shown" : "not shown"));
+
+  return notification;
+}
+
+/**
+ * A helper function for closing a notification if one is currently displayed
+ * in the window.
+ *
+ * @param aController the controller for the window with the notification
+ * @param aBoxId the id of the notificaiton box
+ * @param aValue the value of the notification to close
+ */
+function close_notification(aController, aBoxId, aValue) {
+  let nb = aController.window.document.getElementById(aBoxId);
+  if (!nb)
+    throw new Error("Couldn't find a notification box for id=" + aBoxId);
+
+  let notification = nb.getNotificationWithValue(aValue);
+  if (notification)
+    notification.close();
+}
+
+/**
+ * A helper function that waits for a notification with value aValue
+ * to stop displaying in the window.
+ *
+ * @param aController the controller for the window with the notification
+ * @param aBoxId the id of the notificaiton box 
+ * @param aValue the value of the notification to wait to stop
+ */
+function wait_for_notification_to_stop(aController, aBoxId, aValue) {
+  let nb = aController.window.document.getElementById(aBoxId);
+  if (!nb)
+    throw new Error("Couldn't find a notification box for id=" + aBoxId);
+  aController.waitFor(function() !nb.getNotificationWithValue(aValue),
+                      "Timed out waiting for notification with value " +
+                      aValue + " to stop.");
+}
+
+/**
+ * A helper function that waits for a notification with value aValue
+ * to show in the window.
+ *
+ * @param aController the controller for the compose window that we want
+ *                    the notification to appear in
+ * @param aBoxId the id of the notificaiton box
+ * @param aValue the value of the notification to wait for
+ */
+function wait_for_notification_to_show(aController, aBoxId, aValue) {
+  let nb = aController.window.document.getElementById(aBoxId);
+  if (!nb)
+    throw new Error("Couldn't find a notification box for id=" + aBoxId);
+  aController.waitFor(function() nb.getNotificationWithValue(aValue) != null,
+                      "Timed out waiting for notification with value " +
+                      aValue + " to show.");
+}
+
index 0ae15cd390a97b27e53f94d3f6bde9818966d115..6ae803d3513383b85139e70457d238d391b11b87
GIT binary patch
literal 718
zc$@*w0x|uGP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10!v9mK~y-6h0{xHOmP&)@$WhJ*_oQ^Od~BB)GL~ZnrMifq$_J-
z!(G^0iWLi6K_anY#l*(Ot~(MTc5+2RJkk~w!qB3o*L3FokBvu@8T_~B{60DPpBynW
zdc8D}K!wxJI1X&6)orm?pZ}NexEDq@&AE-5x37#}>m3HrUSU<ayXDx0QN=Q6oKF)e
zr-@Ab7f2J?qQafc2T$~eBV)L{^SxHL=fG!RDote9KLJ%PSN9((^^Hx+^1G*q@DQL@
zH>XN2!o4(+ojrjxkv&nRx~DXLK-#y?K=uhlf?suk*8@e0D%?pE8R`O5I9}Pbt>9*E
zV~ej)UohDC6ZZ|NmR3iU`XyH3R2Lw^?zpm6Z2lS8GM+Vw21m+iB9p+;F!om!$^(?w
zS7U_3U4TPIgH?mL=368Ru@4Uznb=oUm8<IMx#7{Fekl}*sylFwHEAOLZy-&?#|vX^
zFCgNOFox_cg-U_awq3)hmL-Z16(nB*Q3c$}33BpwE6=_lVT6Ps78{+`eTMf2UUhO@
zI-Vg>OuqC95&KrF+aI7-H&d}E-y3rf7Qqj2aYkNTq#eE>9DYZ!>VfZ*%{NeyN8Nwm
z?0RE*x``iv2Nra2af^K5D=uncK?l@my!rgiId`KAFymtOb#eCN^qj*4oItKfD}-FZ
z2_I(~uC=s0YsRJD+go{!X(FTQ=~Q2-Z+&I^U?EtSV}6_E_ptCdYi9G=oa?v)wYt6R
z3H;iKs+<&0kGPK83ZTBeu-vXY=g!vZ)>+yA0}yQUE(zZFasU7T07*qoM6N<$f(`6M
AivR!s
index 53cd7a5d41db59e0732b9e45280c50980c108c14..d99a9ea6d4600a872b724a33d61665e8a8310168
GIT binary patch
literal 766
zc$@+L0s;MrP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10((hBK~y-6ZIexF97hm_pPCtIwKBUh*fIJ*z62vMCI>?>A>^E#
zO>zs4bID0Y<S&HWgD$=rg8zUI0Us;^fe@2JAOTAX0tH*xjCNOEX=i(<dwQlS2MJ+G
zevd`<({H_9EoR1fJr<c4_#U_itQ-9FwOP2(2#A^Sv&a<i5%6&eUl@G8xU!ObaP#K$
z>lZJ|{?5+W%pL=O0)GKJ_fBq>N6-R_*>-z!WqG-Eb$NN_+O1op?KVEoX<98tqY=IB
zZ7cfyiR<-fsw%l}HVcp$h(Pk$>grr(Mj9hF9#ik_f%io3Nkq6ZKQEV-mM$ezQ*1wZ
zaymkyfC3UDy0wMu?vmy?nRCqj_ydUuIvnC(zQk>AqA{ZHWRNK!fO(IM$D|@;s`#cs
z78Vfip)4T;)O)n5&I0VjfR!ay6eyr(Skqvt=wyOUCe$I&gn)*C!RgZ_-<efFf7I(y
zR~4ZsD2sxsDA1}R<T;_&qZ$l|&JmnLRo|RC;5dWd2CrUyHQhASMS*xvbdD^~@p(>V
zMh!@}OF0~3@ch&PKn+iO{eBrjzzqht!$Zm#+56;EDl_7756Sd2t|&qS8)pCtzwQr*
zHf|b9U;>oD^?$dhyWL|zl90699F0be!tZAQ56u3nV_e@nIB;=pjuP;|?l<33I!6G~
zPKSe{2+{jr9+>@eW|aZfMY06`UhH&ME~}=sbJRctXtmIGo7YE2Z`JI>HM7GDfD_0K
zfj_R!%yc_2RaX^~WyCaPKLppPez|7$^ulL)SL-5+0voeQa=j}u8_aB|IyShwX7-G8
wO3oM7%-$H>o~S;|o5mfgZW!Eo-(i6N0o{6pxJ(|H+yDRo07*qoM6N<$f><_B%m4rY
index ce1f83c1bb56fc98a3ef050cd6ae1be3fc08a1c2..8636a5c363ff9299041e571e645e63c7b8000c45
GIT binary patch
literal 865
zc$@)Y1D^beP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10^UhPK~y-6jgn1hTxAr7pYOZ(CexWIlXjGhNi#`?LVqNJG5+AH
z#VYk@ql==3(jeWq5vA0C2pX!G#6TOwg-D4YnWCf?$-<hJSkX?R7}BP-jdmh7&6r7t
zwB{z6ICJm)j*D7@v`8N~%k!T1eL3o2Z_hiP=d~MSZ0-Q9weL7i*Q>AWdlP`}p3ai%
zx?+sEqj6nVx_dfHo!#%+B7zNKMIsUQcYMhAqvQX3{fX_5(DC|SKrFxpd>g>?d@?_t
zWkb_8l+w3dHi6IZcc=dmSmoc`N-5&8D0K;&m!7TR{l00|jEzt;{tat$S+ws_h{TvY
zbO?;ORRADf6=v^q3F1xzPo8`YFPo?7nWu=>zlaWnDCTlZ4-S&J@Us;_iv4d~Sakrz
zV-Zed7O3fap4g(Hq4fo(PJPSVXP@IOFR`vM#nv5<vA(vJv2=Q{U#TstffdAKVa(V$
z7Dp!7(0o60{ry}W9bxgo?JRuo1!*hJ$l=4-T9a&UuGLDt{h!7{6*iTb6C{&${Fcd(
zo1Nv}mKGXwlSIBAAX~GMM~@s~VrYo!`ua+x)GiI+2LXl(z8X5k@=v2wSQhhh1*Yz<
z<7#n*rnWZfvg15(=`8o`+{yB_Ysk_PD3#PV+^ZWFL{K7l*RK<l%S^TG;D^5~&VBST
z4O=#|ZRR}Z4;%myy!m-V1Pu@hRnVABa4GvMm!s=(3kBAifU41x98EpM@Si0njvXTv
zjqrO{7mnjl%;!-eGd2*o?t=A6Z#$mnlRti(Gi`fltgNKT{e#D=S4e%C=3++&SB8hF
z4Ttf9fPA5_A~2v1_V&Ex`+mEKI5*3@tM5~*`tr0&ghI@gO1R}R5(GGwMKT<wY>dpf
z?iC}lNr}iUZ`-d_m8H~xt@Xpz(P(syZKIW9#rK&n7K_WCmp39$w~9>OR^TRSrFLtr
rUp6B5A>wGQe-V+RM&!L#kut#Fba7^be`q@t00000NkvXXu0mjfrDU7a
--- a/mail/themes/linux/mail/primaryToolbar.css
+++ b/mail/themes/linux/mail/primaryToolbar.css
@@ -540,32 +540,16 @@ toolbar[iconsize="small"] .button-appmen
   font-weight: bold;
 }
 
 .msgNotificaton-smallText {
   -moz-padding-start: 10px;
   font-size: 90%;
 }
 
-#junkBarImage {
-  list-style-image: url("chrome://messenger/skin/icons/junk.png");
-}
-
-#junkIcon {
-  list-style-image: url("chrome://messenger/skin/icons/folder-junk.png");
-}
-
-#remoteContentImage {
-  list-style-image: url("chrome://messenger/skin/icons/remote-blocked.png"); 
-}
-
-#phishingBarImage {
-  list-style-image: url("chrome://messenger/skin/icons/phishing.png");
-}
-
 #mdnBarImage {
   list-style-image: url("moz-icon://stock/gtk-dialog-question?size=toolbar");
 }
 
 /* AppMenu styling */
 
 .splitmenu-menuitem {
   -moz-margin-end: 1px;
--- a/mail/themes/osx/jar.mn
+++ b/mail/themes/osx/jar.mn
@@ -217,17 +217,16 @@ classic.jar:
   skin/classic/messenger/icons/vertical-threadpane-splitter-bg-rtl.gif (mail/icons/vertical-threadpane-splitter-bg-rtl.gif)
   skin/classic/messenger/icons/unreadmail-selected.png           (mail/icons/unreadmail-selected.png)
   skin/classic/messenger/icons/unreadmail.png                    (mail/icons/unreadmail.png)
   skin/classic/messenger/icons/unthreadcol.png                   (mail/icons/unthreadcol.png)
   skin/classic/messenger/icons/online.png                        (mail/icons/online.png)
   skin/classic/messenger/icons/online@2x.png                     (mail/icons/online@2x.png)
   skin/classic/messenger/icons/offline.png                       (mail/icons/offline.png)
   skin/classic/messenger/icons/offline@2x.png                    (mail/icons/offline@2x.png)
-  skin/classic/messenger/icons/warning.png                       (mail/icons/warning.png)
   skin/classic/messenger/icons/arrow-dn-7.png                    (mail/icons/arrow-dn-7.png)
   skin/classic/messenger/icons/zoomout.png                       (mail/icons/zoomout.png)
   skin/classic/messenger/icons/zoomout-hover.png                 (mail/icons/zoomout-hover.png)
   skin/classic/messenger/icons/timeline.png                      (mail/icons/timeline.png)
   skin/classic/messenger/icons/timeline-inverted.png             (mail/icons/timeline-inverted.png)
   skin/classic/messenger/icons/empty-search-results.png          (mail/icons/empty-search-results.png)
   skin/classic/messenger/icons/QFB-toolbar.png                   (mail/icons/QFB-toolbar.png)
   skin/classic/messenger/icons/QFB-toolbar@2x.png                (mail/icons/QFB-toolbar@2x.png)
@@ -237,16 +236,19 @@ classic.jar:
   skin/classic/messenger/icons/chat-toolbar@2x.png               (mail/icons/chat-toolbar@2x.png)
   skin/classic/messenger/icons/status.png                        (mail/icons/status.png)
   skin/classic/messenger/icons/status@2x.png                     (mail/icons/status@2x.png)
   skin/classic/messenger/icons/status-small.png                  (mail/icons/status-small.png)
   skin/classic/messenger/icons/status-small@2x.png               (mail/icons/status-small@2x.png)
   skin/classic/messenger/icons/connecting.png                    (mail/icons/connecting.png)
   skin/classic/messenger/icons/loading.png                       (mail/icons/loading.png)
   skin/classic/messenger/icons/loading@2x.png                    (mail/icons/loading@2x.png)
+  skin/classic/messenger/icons/junk.png                          (mail/icons/junk.png)
+  skin/classic/messenger/icons/phishing.png                      (mail/icons/phishing.png)
+  skin/classic/messenger/icons/remote-blocked.png                (mail/icons/remote-blocked.png)
   skin/classic/messenger/tabs/alltabs-box-bkgnd-icon.png              (mail/tabs/alltabs-box-bkgnd-icon.png)
   skin/classic/messenger/tabs/alltabs-box-bkgnd-icon@2x.png           (mail/tabs/alltabs-box-bkgnd-icon@2x.png)
   skin/classic/messenger/tabs/alltabs-box-overflow-bkgnd-animate.png  (mail/tabs/alltabs-box-overflow-bkgnd-animate.png)
   skin/classic/messenger/tabs/newtab.png                              (mail/tabs/newtab.png)
   skin/classic/messenger/tabs/dragIndicator.png                  (mail/tabs/dragIndicator.png)
   skin/classic/messenger/tabs/arrow.png                          (mail/tabs/arrow.png)
   skin/classic/messenger/tabs/arrow@2x.png                       (mail/tabs/arrow@2x.png)
   skin/classic/messenger/tabs/activeEnd.png                      (mail/tabs/activeEnd.png)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d76f96cd9530150204feb8b0a60310cc77e57eff
GIT binary patch
literal 450
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>2?p
zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4<ivthz5Jr|+3#$m7#JAsJzX3_
zEP9ttvh`+m6mdNtTP84BwUtp-VTMAJK#Pgkw(Rtm(>4lh74n|lkSdV#iMyrY9}D+Z
zA9Y6$<xJ%pGn`shMD+P`OfC#}l=m?#zHeLn-1%D6zhK8{3Yngl{>^8YRMt@Z;H$aA
zj3hfIp#w~^>9J-{_XKmQTs@xFz@GiKTlu|Lkeb6KnSk;w=Igif%=sZ;e$dR|^_l0k
z2b2YvXGb=Op5LI8Svtq>z_E&2ZSH_?3`~5gXBm#4V-wwevbL4!em3t8rZX+C?mkv&
zG)$YpbikDPNzu;dAr31;s!lQZgl>$GS;7>xHcXwP>HPdN$7TfXzPrzxRmJmCu8EX+
z<OBnr`?JqJ%au9)J-BJ>HQA|g>&pYyhMoWP^G~V(%k@B!*eh9EFW2qgpT0Ks%dfyw
p-}M+?A7Bz-R8HV1Y2@GklY3=blxNH16`)9A@O1TaS?83{1OTn+u4n)N
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..16e93fcd046cf3454a28eeb84a060dfcc1231df2
GIT binary patch
literal 455
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>2?p
zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4<ivthz5Jr|+3#$m7#J8`JY5_^
zEPB@l8G0Xfkf=?M&J<ed(Way;+nQ5a$UCK@+2W`2C+<7V7FHbR9z9r4DjXx?G|lPF
zluMIzPd|J%!Lfr+*G619a~9i{x(^5M?*4wS_Is_mN7B?4%eWO=zI(qlJXw*u^fluY
zsg}eW(}V7DDyG#NN${|3pX>L$O|@6cbVKfM;REiH&*Q5<gcZaIJFO9az}fKKk~#Le
zJL?g527iXE$bjo#1yA0b<GB7h_ouA;-`}fG_O!QWJ-sQe&P?U<9TT3%JPp&AJ+_cm
z(Po$ze8!+BcvAFAzZ7*5*Nb`EZ`*oKO0oVN#&CgQ!NrU{ZHX24^0ps$6>U(7xo#U2
z`qe6$lfnP;memgnDkePFmzc1|OY?j5+H0;_d1kYx2YGd;sGb);ZFjT8>aMZxXM?`S
vRRS#hU5kD&h@J4}-IvVnAbX%f@*(%t;_Vxa{(CF}20DYMtDnm{r-UW|eRZ>Z
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..918fefb29c2d00232c68609140bc87d8b2efbdeb
GIT binary patch
literal 709
zc$@*n0y_PPP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10zyedK~y-6jgmn~Q*j)}Kfm{e@mOH4z_rFGCr+V42s+rQpj(jc
z*v9Y_>>>o}Ar?I6L1FCN$%C0eFeQm%MJ5I@FrMO85mu*gI~bH<=<@CTJNO1AI{d=#
z^5y&c{=UB-KT%2{A{{^y=;mm!fcr|RubN9Ffo?e>fJ?w_0FP_X4d6J=)aK@<XaBf5
zbX`}rZSS_Uv?S_1|A|Fp3V6{V`Yvz-NB{z$H4p=+NF?$$l}hD`#o~iXrSi};O{cZB
z^?hA%Xk3rS^J9E`{8ca*tff+^P$rY<P)cptw(Xyto&B`Dyu8-PKxMPpg{7q>1_uYD
zK$FX#0?zjJ_0<xI#QdQvbai#T3x~tMrl+TG0!<=fo2EHun&w;}5cr^!(k3S-uZc+e
zfd=t-yqruX!}VsRlqa1|U-bEWPuJJi9|wcMlAAtupg}Ym-6@yLX8=Y<M&`U;Z`pC2
za{~hdcSWSs+uQrbl}7d(D4^Qe+4)=7bqyew%dHj)g=dCgRDd=hYgyJe08P_0lu`f-
zZXI(ECZSNsbh)%r%Db|%a?3D`M=tjqSn&CL84aMhx%s1;AkW?--5VMjDu{>;ToI8w
z@p$~p*x1;ji2MNzpw{2tzo?t0iD4LqWm(6!x3^D-h$AAQYPCAw)6-Kel}c?u`^Lt`
z^?W{m9?*eWG#Y(5F){H(+!am&mw~`P_gDqCW@cut4i68vS1Og$fcX9X^62R3=U6QE
r8d$3vG=dMfz}^!n;5$$ReggajK5p3#^wT1x00000NkvXXu0mjf@q<GO
deleted file mode 100644
index 0815759685e0cd54b363626b34ff8ff08403cd10..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/mail/themes/osx/mail/primaryToolbar.css
+++ b/mail/themes/osx/mail/primaryToolbar.css
@@ -749,93 +749,16 @@ toolbar[mode="text"] .button-appmenu .to
   padding: 0;
 }
 
 .msgNotification-smallText {
   -moz-padding-start: 10px;
   font-size: 90%;
 }
 
-#junkBarImage {
-  list-style-image: url("chrome://messenger/skin/icons/mail-toolbar.png");
-  -moz-image-region: rect(0px 162px 18px 144px);
-}
-
-@media (min-resolution: 2dppx) {
-  #junkBarImage {
-    list-style-image: url("chrome://messenger/skin/icons/mail-toolbar@2x.png");
-    -moz-image-region: rect(0px 324px 36px 288px);
-  }
-}
-
-#junkBar {
-  background-color: #CAE2C5;
-  padding: 6px 8px;
-  color: black;
-}
-
-#junkIcon {
-  list-style-image: url("chrome://messenger/skin/icons/folder-pane.png");
-  -moz-image-region: rect(0 128px 16px 112px);
-}
-
-/* ::::: remote content bar status rules ::::: */
-
-#remoteContentImage {
-  list-style-image: url("chrome://messenger/skin/icons/warning.png");
-}
-
-#remoteContentBar {
-  background-color: #FBFBC8;
-  border: 1px solid #DDDDE1;
-  color: black;
-  padding: 0.3em 0.2em;
-  border-bottom-left-radius: 0.2em;
-  border-bottom-right-radius: 0.2em;
-  border-top-left-radius: 0.2em;
-  border-top-right-radius: 0.2em;
-}
-
-#remoteContentDescription {
-  -moz-margin-start: 1.1em;
-}
-
-#remoteContentButton {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-#phishingBarImage {
-/* for now, temporarily copy the remote image icon until we can get a new one */
-  list-style-image: url("chrome://messenger/skin/icons/warning.png");
-}
-
-#phishingBar {
-  background-color: #EFF3D4;
-  padding: 6px 8px;
-  color: black;
-}
-
-
-#mdnBarImage {
-  list-style-image: url("chrome://global/skin/icons/question-24.png");
-}
-
-#mdnBar {
-  background-color: #FBFBC8;
-  border: 1px solid #DDDDE1;
-  color: black;
-  padding: 0.3em 0.2em;
-  border-bottom-left-radius: 0.2em;
-  border-bottom-right-radius: 0.2em;
-  border-top-left-radius: 0.2em;
-  border-top-right-radius: 0.2em;
-}
-
-
 #CustomizeToolbarSheet > #main-box {
   border-top: none !important;
   border-left: 2px solid;
   border-right: 2px solid;
   border-bottom: 3px solid;
   -moz-border-right-colors: -moz-mac-menushadow ThreeDLightShadow !important;
   -moz-border-bottom-colors: -moz-mac-menushadow -moz-mac-menushadow ThreeDShadow !important;
   -moz-border-left-colors: ThreeDLightShadow ThreeDHighlight !important;
--- a/mail/themes/windows/jar.mn
+++ b/mail/themes/windows/jar.mn
@@ -1,17 +1,15 @@
 classic.jar:
 % skin editor classic/1.0 %skin/classic/editor/
   skin/classic/editor/editor.css                              (editor/editor.css)
   skin/classic/editor/EditorDialog.css                        (editor/EditorDialog.css)
   skin/classic/editor/icons/img-align-bottom.gif              (editor/img-align-bottom.gif)
   skin/classic/editor/icons/img-align-left.gif                (editor/img-align-left.gif)
   skin/classic/editor/icons/img-align-middle.gif              (editor/img-align-middle.gif)
-  skin/classic/editor/icons/img-align-right.gif               (editor/img-align-right.gif)
-  skin/classic/editor/icons/img-align-top.gif                 (editor/img-align-top.gif)
 
 # ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION!
 # ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION!
 #
 # If you add a new file here, you'll need to add it to the aero section at the
 # bottom of this file, too. If you do not, people using Windows prior to Vista
 # will be able to enjoy your additions, but people using Vista and above will
 # not.
@@ -455,18 +453,18 @@ classic.jar:
   skin/classic/aero/messenger/icons/server.png                     (mail/icons/server-aero.png)
   skin/classic/aero/messenger/icons/readcol.svg                    (mail/icons/readcol.svg)
   skin/classic/aero/messenger/icons/unreadmail.png                 (mail/icons/unreadmail.png)
   skin/classic/aero/messenger/icons/search-arrow.gif               (mail/icons/search-arrow.gif)
   skin/classic/aero/messenger/icons/quick-search-icons.png         (mail/icons/quick-search-icons-aero.png)
   skin/classic/aero/messenger/icons/quick-search-clear.png         (mail/icons/quick-search-clear.png)
   skin/classic/aero/messenger/icons/close-button.png               (mail/icons/close-button.png)
   skin/classic/aero/messenger/icons/closeTab.png                   (mail/icons/closeTab.png)
-  skin/classic/aero/messenger/icons/remote-blocked.png             (mail/icons/remote-blocked.png)
-  skin/classic/aero/messenger/icons/phishing.png                   (mail/icons/phishing.png)
+  skin/classic/aero/messenger/icons/remote-blocked.png             (mail/icons/remote-blocked-aero.png)
+  skin/classic/aero/messenger/icons/phishing.png                   (mail/icons/phishing-aero.png)
   skin/classic/aero/messenger/icons/junk.png                       (mail/icons/junk-aero.png)
   skin/classic/aero/messenger/icons/check.gif                      (mail/icons/check.gif)
   skin/classic/aero/messenger/icons/notchecked.gif                 (mail/icons/notchecked.gif)
   skin/classic/aero/messenger/icons/online.png                     (mail/icons/online-aero.png)
   skin/classic/aero/messenger/icons/offline.png                    (mail/icons/offline-aero.png)
   skin/classic/aero/messenger/icons/row.png                        (mail/icons/row.png)
   skin/classic/aero/messenger/icons/update.png                     (mail/icons/update.png)
   skin/classic/aero/messenger/icons/secure.png                     (mail/icons/secure.png)
index 45278b6c41ebe1c55bb5f5274693ac46062c932c..4fbd66128ca5889ce9e5940a85e26ee8b5505c76
GIT binary patch
literal 384
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>2?p
zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4<ivthz5Jr|+3#$mfQtTlx;Tbd
z^e&xb?{(NwpmqOqc@Ha2#ZV59AQzv^*~}433{$&0N;&QwICLzSgDdWUa0Qzodw`%L
z_r#93H*z+f%RlZgC-2_upJ~%%XG;F>>^(8z%CwSAVh)#BcChRVW8B7d);NJjqG0;V
zO^2%Mb0?_v2k$c2y#0*bv@McMDy9vd&uVww;ww<|yvXM6V0${6?*j)<<6({q<-E3@
zf49tSXkOB<bYLAb#|-aPjLQ$yUD{n4_>bE<B$<B)>o)GV)aL06j+xuLHn^G`J?hM|
zgKb~9iGJg3r2}W;8oTWkydT^-bFVn?pOva<qox7Ftpmmd{4q0cwl5E3;0xRH-=>b?
YxTAHd$F4_$z<^-zboFyt=akR{0DLcxqyPW_
index 0ae15cd390a97b27e53f94d3f6bde9818966d115..6ae803d3513383b85139e70457d238d391b11b87
GIT binary patch
literal 718
zc$@*w0x|uGP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10!v9mK~y-6h0{xHOmP&)@$WhJ*_oQ^Od~BB)GL~ZnrMifq$_J-
z!(G^0iWLi6K_anY#l*(Ot~(MTc5+2RJkk~w!qB3o*L3FokBvu@8T_~B{60DPpBynW
zdc8D}K!wxJI1X&6)orm?pZ}NexEDq@&AE-5x37#}>m3HrUSU<ayXDx0QN=Q6oKF)e
zr-@Ab7f2J?qQafc2T$~eBV)L{^SxHL=fG!RDote9KLJ%PSN9((^^Hx+^1G*q@DQL@
zH>XN2!o4(+ojrjxkv&nRx~DXLK-#y?K=uhlf?suk*8@e0D%?pE8R`O5I9}Pbt>9*E
zV~ej)UohDC6ZZ|NmR3iU`XyH3R2Lw^?zpm6Z2lS8GM+Vw21m+iB9p+;F!om!$^(?w
zS7U_3U4TPIgH?mL=368Ru@4Uznb=oUm8<IMx#7{Fekl}*sylFwHEAOLZy-&?#|vX^
zFCgNOFox_cg-U_awq3)hmL-Z16(nB*Q3c$}33BpwE6=_lVT6Ps78{+`eTMf2UUhO@
zI-Vg>OuqC95&KrF+aI7-H&d}E-y3rf7Qqj2aYkNTq#eE>9DYZ!>VfZ*%{NeyN8Nwm
z?0RE*x``iv2Nra2af^K5D=uncK?l@my!rgiId`KAFymtOb#eCN^qj*4oItKfD}-FZ
z2_I(~uC=s0YsRJD+go{!X(FTQ=~Q2-Z+&I^U?EtSV}6_E_ptCdYi9G=oa?v)wYt6R
z3H;iKs+<&0kGPK83ZTBeu-vXY=g!vZ)>+yA0}yQUE(zZFasU7T07*qoM6N<$f(`6M
AivR!s
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..19c72d8ad7bb32cf06e6df181edad8b81b255c34
GIT binary patch
literal 343
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>2?p
zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4<ivthz5Jr|+3#$mfQqhox;Tbd
z^sb$3%jXy<(7ONO!VRpmH!|?{>S}}t1xB_8B?(IfX0)_9>1LhO&gjUHIa_<OIJUlW
z+05$mXDp3Ro|&PtDPoGvnVfIjfkC1Q(^vixXEI&zPfxK*d`gMY=A>zScDLeLlk8vI
z(r2moJ>h`S1PjJvj5TsX9B&<&GpcUz&amV3xb@?zifqGTb%RM;eC?*ir5bB9Ixl#%
zVDsnH=iv_FnwJiXsKhq%ZSWQp{v`F{wDr8@hF)EbW*a;X8ZS_P`RMuW)!8P-%ux<<
g5<jNebJb**Kiue@EFsyk0O&skPgg&ebxsLQ03knnCIA2c
index 9911af9d515e737a2716fe2568ae22adf6a3f34e..d99a9ea6d4600a872b724a33d61665e8a8310168
GIT binary patch
literal 766
zc$@+L0s;MrP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10((hBK~y-6ZIexF97hm_pPCtIwKBUh*fIJ*z62vMCI>?>A>^E#
zO>zs4bID0Y<S&HWgD$=rg8zUI0Us;^fe@2JAOTAX0tH*xjCNOEX=i(<dwQlS2MJ+G
zevd`<({H_9EoR1fJr<c4_#U_itQ-9FwOP2(2#A^Sv&a<i5%6&eUl@G8xU!ObaP#K$
z>lZJ|{?5+W%pL=O0)GKJ_fBq>N6-R_*>-z!WqG-Eb$NN_+O1op?KVEoX<98tqY=IB
zZ7cfyiR<-fsw%l}HVcp$h(Pk$>grr(Mj9hF9#ik_f%io3Nkq6ZKQEV-mM$ezQ*1wZ
zaymkyfC3UDy0wMu?vmy?nRCqj_ydUuIvnC(zQk>AqA{ZHWRNK!fO(IM$D|@;s`#cs
z78Vfip)4T;)O)n5&I0VjfR!ay6eyr(Skqvt=wyOUCe$I&gn)*C!RgZ_-<efFf7I(y
zR~4ZsD2sxsDA1}R<T;_&qZ$l|&JmnLRo|RC;5dWd2CrUyHQhASMS*xvbdD^~@p(>V
zMh!@}OF0~3@ch&PKn+iO{eBrjzzqht!$Zm#+56;EDl_7756Sd2t|&qS8)pCtzwQr*
zHf|b9U;>oD^?$dhyWL|zl90699F0be!tZAQ56u3nV_e@nIB;=pjuP;|?l<33I!6G~
zPKSe{2+{jr9+>@eW|aZfMY06`UhH&ME~}=sbJRctXtmIGo7YE2Z`JI>HM7GDfD_0K
zfj_R!%yc_2RaX^~WyCaPKLppPez|7$^ulL)SL-5+0voeQa=j}u8_aB|IyShwX7-G8
wO3oM7%-$H>o~S;|o5mfgZW!Eo-(i6N0o{6pxJ(|H+yDRo07*qoM6N<$f><_B%m4rY
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3d442ae5160277476e7f089c3a41d7063db7c3e3
GIT binary patch
literal 461
zc$@*v0W$uHP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10ZK_kK~y-6mD9gV)=?D4@z?$8V{3zRgOaX6G`PA6DLECi3l5P*
zn>gv>kA{Yjz@gPi4T72k1)ZABM8rQp&~Wh=r{R0Q@a4(pdGsvz+;i^deSe&LQbb58
z4PX*a+|7PrIU){=9Jr4do?-&JbD$CrqtQkfDDb1wbT=(%;Ab1a6`p55-3GXA$8Xrh
zJ}z*L9X#s<IKdqL;sxH~9DDeZ!7TxSS@dEaJ+<6pjNnr{!1sKDg)F|pjPl;27{XLa
zX}@Rz*v8A6xS=fD?}(VjR^I$|E5IKNW`7z-=)=d9(nGB0++Z^xlrMc&i(TVAjw=W*
zbFOFx6d23?ULMCI;uP;{kfrLRDfhyX@_SaciLY2eSDtU=+#(*}25%}rzw(jl{qO;g
zFy;Sh-QaUXtfh$1&QeN!c!dFF84s`;5eLu_(8>M*FRoq$A%{2B00000NkvXXu0mjf
D#dyX5
index ddefdf15742195458840aec97048ab4470b50467..8636a5c363ff9299041e571e645e63c7b8000c45
GIT binary patch
literal 865
zc$@)Y1D^beP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^
zaAhuUa%Y?FJQ@H10^UhPK~y-6jgn1hTxAr7pYOZ(CexWIlXjGhNi#`?LVqNJG5+AH
z#VYk@ql==3(jeWq5vA0C2pX!G#6TOwg-D4YnWCf?$-<hJSkX?R7}BP-jdmh7&6r7t
zwB{z6ICJm)j*D7@v`8N~%k!T1eL3o2Z_hiP=d~MSZ0-Q9weL7i*Q>AWdlP`}p3ai%
zx?+sEqj6nVx_dfHo!#%+B7zNKMIsUQcYMhAqvQX3{fX_5(DC|SKrFxpd>g>?d@?_t
zWkb_8l+w3dHi6IZcc=dmSmoc`N-5&8D0K;&m!7TR{l00|jEzt;{tat$S+ws_h{TvY
zbO?;ORRADf6=v^q3F1xzPo8`YFPo?7nWu=>zlaWnDCTlZ4-S&J@Us;_iv4d~Sakrz
zV-Zed7O3fap4g(Hq4fo(PJPSVXP@IOFR`vM#nv5<vA(vJv2=Q{U#TstffdAKVa(V$
z7Dp!7(0o60{ry}W9bxgo?JRuo1!*hJ$l=4-T9a&UuGLDt{h!7{6*iTb6C{&${Fcd(
zo1Nv}mKGXwlSIBAAX~GMM~@s~VrYo!`ua+x)GiI+2LXl(z8X5k@=v2wSQhhh1*Yz<
z<7#n*rnWZfvg15(=`8o`+{yB_Ysk_PD3#PV+^ZWFL{K7l*RK<l%S^TG;D^5~&VBST
z4O=#|ZRR}Z4;%myy!m-V1Pu@hRnVABa4GvMm!s=(3kBAifU41x98EpM@Si0njvXTv
zjqrO{7mnjl%;!-eGd2*o?t=A6Z#$mnlRti(Gi`fltgNKT{e#D=S4e%C=3++&SB8hF
z4Ttf9fPA5_A~2v1_V&Ex`+mEKI5*3@tM5~*`tr0&ghI@gO1R}R5(GGwMKT<wY>dpf
z?iC}lNr}iUZ`-d_m8H~xt@Xpz(P(syZKIW9#rK&n7K_WCmp39$w~9>OR^TRSrFLtr
rUp6B5A>wGQe-V+RM&!L#kut#Fba7^be`q@t00000NkvXXu0mjfrDU7a
--- a/mail/themes/windows/mail/primaryToolbar-aero.css
+++ b/mail/themes/windows/mail/primaryToolbar-aero.css
@@ -597,36 +597,16 @@ toolbar[mode="text"] .button-appmenu .to
   font-weight: bold;
 }
 
 .msgNotificaton-smallText {
   -moz-padding-start: 10px;
   font-size: 90%;
 }
 
-#junkBarImage {
-  list-style-image: url("chrome://messenger/skin/icons/junk.png");
-}
-
-#junkIcon {
-  list-style-image: url("chrome://messenger/skin/icons/folder-junk.png");
-}
-
-#remoteContentImage {
-  list-style-image: url("chrome://messenger/skin/icons/remote-blocked.png"); 
-}
-
-#phishingBarImage {
-  list-style-image: url("chrome://messenger/skin/icons/phishing.png");
-}
-
-#mdnBarImage {
-  list-style-image: url("chrome://global/skin/icons/question-24-aero.png");
-}
-
 /* AppMenu styling */
 
 .splitmenu-menuitem {
   -moz-margin-end: 1px;
   -moz-padding-end: 0.5em;
 }
 
 .splitmenu-menu {
--- a/mail/themes/windows/mail/primaryToolbar.css
+++ b/mail/themes/windows/mail/primaryToolbar.css
@@ -779,36 +779,16 @@ toolbar[iconsize="small"] .button-appmen
   font-weight: bold;
 }
 
 .msgNotificaton-smallText {
   -moz-padding-start: 10px;
   font-size: 90%;
 }
 
-#junkBarImage {
-  list-style-image: url("chrome://messenger/skin/icons/junk.png");
-}
-
-#junkIcon {
-  list-style-image: url("chrome://messenger/skin/icons/folder-junk.png");
-}
-
-#remoteContentImage {
-  list-style-image: url("chrome://messenger/skin/icons/remote-blocked.png"); 
-}
-
-#phishingBarImage {
-  list-style-image: url("chrome://messenger/skin/icons/phishing.png");
-}
-
-#mdnBarImage {
-  list-style-image: url("chrome://global/skin/icons/question-24.png");
-}
-
 /* AppMenu styling */
 
 .splitmenu-menuitem {
   -moz-margin-end: 1px;
 }
 
 .splitmenu-menu {
   -moz-box-pack: end;