Bug 490464 Update the download pref pane for use with toolkit download manager r=mcsmurf a=KaiRo
authorNeil Rashbrook <neil@parkwaycc.co.uk>
Wed, 08 Jul 2009 10:40:56 +0100
changeset 3036 8b921b3250e6d112e2f087bdaec50cb2bc81b7c0
parent 3035 4f6ab99f4b723b2c7c16ac4a02bd5d75af72fc2e
child 3037 7e75dc09719fb80211dca61c18aa32ed2afb48e7
push idunknown
push userunknown
push dateunknown
reviewersmcsmurf, KaiRo
bugs490464
Bug 490464 Update the download pref pane for use with toolkit download manager r=mcsmurf a=KaiRo
config/config.mk
suite/browser/browser-prefs.js
suite/browser/mailNavigatorOverlay.xul
suite/browser/navigator.xul
suite/browser/test/browser/browser_bug462289.js
suite/common/contentAreaContextOverlay.xul
suite/common/contentAreaUtils.js
suite/common/downloads/downloadmanager.js
suite/common/downloads/downloadmanager.xul
suite/common/downloads/tests/Makefile.in
suite/common/downloads/tests/chrome/test_delete_key_removes.xul
suite/common/downloads/tests/chrome/test_space_key_pauses_resumes.xul
suite/common/downloads/treeView.js
suite/common/pref/pref-download.js
suite/common/pref/pref-download.xul
suite/locales/en-US/chrome/common/contentAreaCommands.dtd
suite/locales/en-US/chrome/common/contentAreaCommands.properties
suite/locales/en-US/chrome/common/downloads/downloadmanager.dtd
suite/locales/en-US/chrome/common/pref/pref-download.dtd
suite/locales/en-US/chrome/common/pref/prefutilities.properties
suite/themes/modern/jar.mn
--- a/config/config.mk
+++ b/config/config.mk
@@ -451,24 +451,24 @@ MAKE_JARS_FLAGS = \
 ifdef USE_EXTENSION_MANIFEST
 MAKE_JARS_FLAGS += -e
 endif
 
 ifdef BOTH_MANIFESTS
 MAKE_JARS_FLAGS += --both-manifests
 endif
 
-TAR_CREATE_FLAGS = -cvhf
+TAR_CREATE_FLAGS = -chf
 
 ifeq ($(OS_ARCH),BSD_OS)
-TAR_CREATE_FLAGS = -cvLf
+TAR_CREATE_FLAGS = -cLf
 endif
 
 ifeq ($(OS_ARCH),OS2)
-TAR_CREATE_FLAGS = -cvf
+TAR_CREATE_FLAGS = -cf
 endif
 
 #
 # Personal makefile customizations go in these optional make include files.
 #
 MY_CONFIG	:= $(DEPTH)/config/myconfig.mk
 MY_RULES	:= $(DEPTH)/config/myrules.mk
 
--- a/suite/browser/browser-prefs.js
+++ b/suite/browser/browser-prefs.js
@@ -79,17 +79,17 @@ pref("browser.chrome.load_toolbar_icons"
 
 pref("browser.toolbars.showbutton.go",      false);
 pref("browser.toolbars.showbutton.search",  true);
 
 //XXXCallek sound is not implemented in new DLMGR yet
 pref("browser.download.finished_download_sound", false);
 pref("browser.download.finished_sound_url", "");
 pref("browser.download.useDownloadDir", false);
-pref("browser.download.folderList", 2);
+pref("browser.download.folderList", 1);
 
 pref("browser.download.manager.showAlertOnComplete", true);
 pref("browser.download.manager.showAlertInterval", 2000);
 pref("browser.download.manager.retention", 2);
 pref("browser.download.manager.quitBehavior", 0);
 pref("browser.download.manager.addToRecentDocs", true);
 pref("browser.download.manager.scanWhenDone", true);
 pref("browser.download.manager.resumeOnWakeDelay", 10000);
--- a/suite/browser/mailNavigatorOverlay.xul
+++ b/suite/browser/mailNavigatorOverlay.xul
@@ -230,17 +230,18 @@
               insertafter="context-saveaudio"/>
     <menuitem id="context-sendlink"
               label="&contextSendThisLink.label;"
               accesskey="&contextSendThisLink.accesskey;"
               oncommand="sendLink(gContextMenu.linkURL());"
               insertafter="context-savelink"/>
     <menu id="frame">
     <menupopup id="frame_popup">
-      <menuitem insertafter="saveframeas"
+      <menuitem id="context-sendframe"
+                insertafter="context-saveframe"
                 label="&contextSendFrame.label;"
                 accesskey="&contextSendFrame.accesskey;"
                 oncommand="sendPage(gContextMenu.target.ownerDocument);"/>
     </menupopup>
     </menu>
   </popup>
   
 </overlay>
--- a/suite/browser/navigator.xul
+++ b/suite/browser/navigator.xul
@@ -247,16 +247,17 @@
                      ondragexit="nsDragAndDrop.dragExit(event, homeButtonObserver); event.stopPropagation()"
                      ondragover="nsDragAndDrop.dragOver(event, homeButtonObserver); event.stopPropagation()"/>
 
       <toolbaritem id="nav-bar-inner" align="center" flex="1" persist="width"
                  class="chromeclass-location"
                  title="&locationBar.title;">
         <textbox id="urlbar" class="chromeclass-location uri-element" flex="1"
                  type="autocomplete" autocompletesearch="history file"
+                 completedefaultindex="true" forcecomplete="false"
                  timeout="50" maxrows="6"
                  disablehistory="false" accesskey="&locationBar.accesskey;"
                  defaultSearchEngine="true" tabscrolling="true"
                  showcommentcolumn="true"
                  inputtooltiptext="&locationBar.tooltip;"
                  newlines="stripsurroundingwhitespace"
                  aria-label="&locationBar.title;"
                  oninput="gBrowser.userTypedValue = this.value;"
--- a/suite/browser/test/browser/browser_bug462289.js
+++ b/suite/browser/test/browser/browser_bug462289.js
@@ -30,16 +30,17 @@ function step3()
 
   EventUtils.synthesizeKey("VK_TAB", { });
   // give tab key a chance to settle
   setTimeout(step3_5, 0);
 }
 
 function step3_5()
 {
+  is(document.activeElement.localName, "tab", "tab key to tab activeElement");
   is(document.activeElement, tab1, "tab key to tab activeElement");
 
   EventUtils.synthesizeMouse(tab1, 9, 9, {});
   setTimeout(step4, 0);
 }
 
 function step4()
 {
--- a/suite/common/contentAreaContextOverlay.xul
+++ b/suite/common/contentAreaContextOverlay.xul
@@ -244,44 +244,50 @@
                 accesskey="&selectAllCmd.accesskey;"
                 command="cmd_selectAll"/>      
       <menuseparator id="context-sep-selectall"/>
       <menuitem id="context-searchselect"
                 oncommand="OpenSearch('internet', gContextMenu.searchSelected(), true, event.shiftKey);"/>
       <menuseparator id="frame-sep"/>
       <menu id="frame" label="&thisFrameMenu.label;" accesskey="&thisFrameMenu.accesskey;">
         <menupopup id="frame_popup">
-          <menuitem label="&showOnlyThisFrameCmd.label;"
+          <menuitem id="context-showonlythisframe"
+                    label="&showOnlyThisFrameCmd.label;"
                     accesskey="&showOnlyThisFrameCmd.accesskey;"
                     oncommand="gContextMenu.showOnlyThisFrame();"/>
-          <menuitem label="&openFrameCmd.label;"
+          <menuitem id="context-openframe"
+                    label="&openFrameCmd.label;"
                     accesskey="&openFrameCmd.accesskey;"
                     oncommand="gContextMenu.openFrame();"/>
-          <menuitem label="&openFrameCmdInTab.label;"
+          <menuitem id="context-openframeintab"
+                    label="&openFrameCmdInTab.label;"
                     accesskey="&openFrameCmdInTab.accesskey;"
                     oncommand="gContextMenu.openFrameInTab(event.shiftKey);"/>
           <menuseparator/>
-          <menuitem id="context-reload-frame"
+          <menuitem id="context-reloadframe"
                     label="&reloadFrameCmd.label;"
                     accesskey="&reloadFrameCmd.accesskey;"
                     oncommand="gContextMenu.reloadFrame();"/>
           <menuseparator/>
-          <menuitem label="&bookmarkFrameCmd.label;"
+          <menuitem id="context-bookmarkframe"
+                    label="&bookmarkFrameCmd.label;"
                     accesskey="&bookmarkFrameCmd.accesskey;"
                     oncommand="gContextMenu.addBookmarkForFrame();"/>
-          <menuitem id="saveframeas"
+          <menuitem id="context-saveframe"
                     valueSaveAs="&saveFrameAsCmd.label;"
                     valueSave="&saveFrameCmd.label;"
                     accesskey="&saveFrameCmd.accesskey;"
                     oncommand="saveDocument(gContextMenu.target.ownerDocument);"/>
           <menuseparator/>
-          <menuitem label="&viewFrameSourceCmd.label;"
+          <menuitem id="context-viewframesource"
+                    label="&viewFrameSourceCmd.label;"
                     accesskey="&viewFrameSourceCmd.accesskey;"
                     oncommand="gContextMenu.viewFrameSource();"/>
-          <menuitem label="&viewFrameInfoCmd.label;"
+          <menuitem id="context-viewframeinfo"
+                    label="&viewFrameInfoCmd.label;"
                     accesskey="&viewFrameInfoCmd.accesskey;"
                     oncommand="gContextMenu.viewFrameInfo();"/>        
         </menupopup>
       </menu>
       <menuseparator id="context-sep-properties"/>
       <menuitem id="context-viewpartialsource-selection"
                 label="&viewPartialSourceForSelectionCmd.label;"
                 accesskey="&viewPartialSourceCmd.accesskey;"
--- a/suite/common/contentAreaUtils.js
+++ b/suite/common/contentAreaUtils.js
@@ -527,16 +527,18 @@ function initFileInfo(aFI, aURL, aURLCha
   }
 }
 
 /** 
  * Given the Filepicker Parameters (aFpP), show the file picker dialog,
  * prompting the user to confirm (or change) the fileName.
  * @param aFpP a structure (see definition in internalSave(...) method)
  *        containing all the data used within this method.
+ * @param aSkipPrompt If true, we will attempt not to prompt the user for a
+          download location
  * @return true if the user confirmed a filename in the picker; false if they
  *         dismissed the picker.
  */
 function getTargetFile(aFpP)
 {
   var prefs = getPrefsBrowserDownload("browser.download.");
   var useDownloadDir = prefs.getBoolPref("useDownloadDir");
   const nsILocalFile = Components.interfaces.nsILocalFile;
--- a/suite/common/downloads/downloadmanager.js
+++ b/suite/common/downloads/downloadmanager.js
@@ -70,16 +70,24 @@ function dmStartup()
                       .getService(Components.interfaces.nsIObserverService);
   obs.addObserver(gDownloadObserver, "download-manager-remove-download", false);
 
   // The DownloadProgressListener (DownloadProgressListener.js) handles
   // progress notifications.
   gDownloadListener = new DownloadProgressListener();
   gDownloadManager.addListener(gDownloadListener);
 
+  // correct keybinding command attributes which don't do our business yet
+  var key = document.getElementById("key_delete");
+  if (key.hasAttribute("command"))
+    key.setAttribute("command", "cmd_stop");
+  key = document.getElementById("key_delete2");
+  if (key.hasAttribute("command"))
+    key.setAttribute("command", "cmd_stop");
+
   gDownloadTree.focus();
 
   if (gDownloadTree.view.rowCount > 0)
     gDownloadTree.view.selection.select(0);
 }
 
 function dmShutdown()
 {
@@ -428,21 +436,23 @@ var gDownloadObserver = {
     }
   }
 };
 
 var dlTreeController = {
   supportsCommand: function(aCommand)
   {
     switch (aCommand) {
+      case "cmd_play":
       case "cmd_pause":
       case "cmd_resume":
       case "cmd_retry":
       case "cmd_cancel":
       case "cmd_remove":
+      case "cmd_stop":
       case "cmd_open":
       case "cmd_show":
       case "cmd_openReferrer":
       case "cmd_copyLocation":
       case "cmd_selectAll":
       case "cmd_clearList":
         return true;
     }
@@ -455,16 +465,23 @@ var dlTreeController = {
     if (gDownloadTreeView && gDownloadTreeView.selection)
       selectionCount = gDownloadTreeView.selection.count;
 
     var selItemData = selectionCount ?
                       gDownloadTreeView.getRowData(gDownloadTree.currentIndex) :
                       null;
 
     switch (aCommand) {
+      case "cmd_play":
+         return selectionCount == 1 &&
+                ((selItemData.resumable &&
+                 (selItemData.isActive ||
+                  selItemData.state == nsIDownloadManager.DOWNLOAD_PAUSED)) ||
+                (selItemData.state == nsIDownloadManager.DOWNLOAD_CANCELED ||
+                 selItemData.state == nsIDownloadManager.DOWNLOAD_FAILED));
       case "cmd_pause":
         return selectionCount == 1 &&
                selItemData.isActive &&
                selItemData.state != nsIDownloadManager.DOWNLOAD_PAUSED &&
                selItemData.resumable;
       case "cmd_resume":
         return selectionCount == 1 &&
                selItemData.state == nsIDownloadManager.DOWNLOAD_PAUSED &&
@@ -479,16 +496,18 @@ var dlTreeController = {
       case "cmd_cancel":
         return selectionCount == 1 && selItemData.isActive;
       case "cmd_retry":
         return selectionCount == 1 &&
                (selItemData.state == nsIDownloadManager.DOWNLOAD_CANCELED ||
                 selItemData.state == nsIDownloadManager.DOWNLOAD_FAILED);
       case "cmd_remove":
         return selectionCount == 1 && !selItemData.isActive;
+      case "cmd_stop":
+        return selectionCount == 1;
       case "cmd_openReferrer":
         return selectionCount == 1 && !!selItemData.referrer;
       case "cmd_copyLocation":
         return selectionCount > 0;
       case "cmd_selectAll":
         return gDownloadTreeView.rowCount != selectionCount;
       case "cmd_clearList":
         return gDownloadTreeView.rowCount && gDownloadManager.canCleanUp;
@@ -515,16 +534,30 @@ var dlTreeController = {
         gDownloadTreeView.selection.getRangeAt(rg, start, end);
         for (let row = start.value; row <= end.value; row++){
           m_selIdx.push(row);
         }
       }
     }
 
     switch (aCommand) {
+      case "cmd_play":
+        switch (selItemData.state) {
+          case nsIDownloadManager.DOWNLOAD_DOWNLOADING:
+            pauseDownload(selItemData.dlid);
+            break;
+          case nsIDownloadManager.DOWNLOAD_PAUSED:
+            resumeDownload(selItemData.dlid);
+            break;
+          case nsIDownloadManager.DOWNLOAD_FAILED:
+          case nsIDownloadManager.DOWNLOAD_CANCELED:
+            retryDownload(selItemData.dlid);
+            break;
+         }
+         break;
       case "cmd_pause":
         pauseDownload(selItemData.dlid);
         break;
       case "cmd_resume":
         resumeDownload(selItemData.dlid);
         break;
       case "cmd_retry":
         retryDownload(selItemData.dlid);
@@ -532,16 +565,24 @@ var dlTreeController = {
       case "cmd_cancel":
         // fake an nsIDownload with the properties needed by that function
         cancelDownload({id: selItemData.dlid,
                         targetFile: getLocalFileFromNativePathOrUrl(selItemData.file)});
         break;
       case "cmd_remove":
         removeDownload(selItemData.dlid);
         break;
+      case "cmd_stop":
+        if (selItemData.isActive)
+          // fake an nsIDownload with the properties needed by that function
+          cancelDownload({id: selItemData.dlid,
+                          targetFile: getLocalFileFromNativePathOrUrl(selItemData.file)});
+        else
+          removeDownload(selItemData.dlid);
+        break;
       case "cmd_open":
         // fake an nsIDownload with the properties needed by that function
         openDownload({displayName: selItemData.target,
                       targetFile: getLocalFileFromNativePathOrUrl(selItemData.file)});
         break;
       case "cmd_show":
         // fake an nsIDownload with the properties needed by that function
         showDownload({targetFile: getLocalFileFromNativePathOrUrl(selItemData.file)});
@@ -589,15 +630,16 @@ var dlTreeController = {
   onEvent: function(aEvent){
     switch (aEvent) {
     case "tree-select":
       this.onCommandUpdate();
     }
   },
 
   onCommandUpdate: function() {
-    var cmds = ["cmd_pause", "cmd_resume", "cmd_retry", "cmd_cancel",
-                "cmd_remove", "cmd_open", "cmd_show", "cmd_openReferrer",
-                "cmd_copyLocation", "cmd_selectAll", "cmd_clearList"];
+    var cmds = ["cmd_play", "cmd_pause", "cmd_resume", "cmd_retry",
+                "cmd_cancel", "cmd_remove", "cmd_stop", "cmd_open", "cmd_show",
+                "cmd_openReferrer", "cmd_copyLocation", "cmd_selectAll",
+                "cmd_clearList"];
     for (let command in cmds)
       goUpdateCommand(cmds[command]);
   }
 };
--- a/suite/common/downloads/downloadmanager.xul
+++ b/suite/common/downloads/downloadmanager.xul
@@ -86,46 +86,59 @@
     </commandset>
     <commandset id="editMenuCommands"/>
     <commandset id="commandUpdate_Downloads"
                 commandupdater="true"
                 events="focus,tree-select"
                 oncommandupdate="dlTreeController.onCommandUpdate()"/>
 
     <commandset id="downloadCommands">
+      <command id="cmd_play"
+               oncommand="goDoCommand('cmd_play');"/>
       <command id="cmd_pause"
                oncommand="goDoCommand('cmd_pause');"/>
       <command id="cmd_resume"
                oncommand="goDoCommand('cmd_resume');"/>
       <command id="cmd_retry"
                oncommand="goDoCommand('cmd_retry');"/>
       <command id="cmd_cancel"
                oncommand="goDoCommand('cmd_cancel');"/>
       <command id="cmd_remove"
                oncommand="goDoCommand('cmd_remove');"/>
+      <command id="cmd_stop"
+               oncommand="goDoCommand('cmd_stop');"/>
       <command id="cmd_open"
                oncommand="goDoCommand('cmd_open');"/>
       <command id="cmd_show"
                oncommand="goDoCommand('cmd_show');"/>
       <command id="cmd_openReferrer"
                oncommand="goDoCommand('cmd_openReferrer');"/>
       <command id="cmd_copyLocation"
                oncommand="goDoCommand('cmd_copyLocation');"/>
       <command id="cmd_clearList"
                oncommand="goDoCommand('cmd_clearList');"/>
     </commandset>
   </commandset>
 
   <keyset id="tasksKeys">
     <!-- File Menu -->
+    <key id="key_open"
+         keycode="VK_ENTER"
+         command="cmd_open"/>
+    <key id="key_open2"
+         keycode="VK_RETURN"
+         command="cmd_open"/>
     <key id="key_close"/>
     <key id="key_quit"/>
     <!-- Edit Menu -->
     <key id="key_cut"/>
     <key id="key_copy"/>
+    <key id="key_play"
+         key=" "
+         command="cmd_play"/>
     <key id="key_delete"/>
     <key id="key_delete2"/>
     <key id="key_selectAll"/>
     <!-- Search Box -->
     <key id="key_search_focus"
          command="cmd_search_focus"
          key="&search.key;"
          modifiers="accel"/>
@@ -178,16 +191,17 @@
     <menubar id="download-menubar"
              grippytooltiptext="&menuBar.tooltip;"
              chromedir="&locale.dir;">
       <menu id="menu_File">
         <menupopup id="menu_FilePopup">
           <menuitem id="dlMenu_open"
                     label="&cmd.open.label;"
                     accesskey="&cmd.open.accesskey;"
+                    key="key_open"
                     command="cmd_open"/>
           <menuitem id="dlMenu_show"
                     label="&cmd.show.label;"
                     accesskey="&cmd.show.accesskey;"
                     command="cmd_show"/>
           <menuitem id="dlMenu_openReferrer"
                     label="&cmd.goToDownloadPage.label;"
                     accesskey="&cmd.goToDownloadPage.accesskey;"
@@ -350,16 +364,17 @@
     </toolbar>
   </toolbox>
 
   <tree id="downloadTree"
         flex="1" type="downloads"
         class="plain"
         context="downloadContext"
         enableColumnDrag="true"
+        ondblclick="goDoCommand('cmd_open');"
         onselect="onTreeSelect(event);">
     <treecols context="" onclick="sortDownloads(event.target)">
       <treecol id="Name"
                label="&col.name.label;"
                tooltiptext="&col.name.tooltip;"
                class="sortDirectionIndicator" flex="3"
                persist="width hidden ordinal sortActive sortDirection"/>
       <splitter class="tree-splitter"/>
--- a/suite/common/downloads/tests/Makefile.in
+++ b/suite/common/downloads/tests/Makefile.in
@@ -39,28 +39,32 @@ topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 relativesrcdir = suite/common/downloads/tests
 
 include $(DEPTH)/config/autoconf.mk
 include $(topsrcdir)/config/rules.mk
 
 _CHROME_FILES = \
+    test_action_keys_respect_focus.xul \
     test_basic_functionality.xul \
     test_cleanup_search.xul \
     test_clear_button_disabled.xul \
     test_close_download_manager.xul \
+    test_delete_key_cancels.xul \
     test_delete_key_removes.xul \
+    test_enter_dblclick_opens.xul \
     test_multi_select.xul \
     test_multiword_search.xul \
     test_removeDownload_updates_ui.xul \
     test_search_clearlist.xul \
     test_search_keys.xul \
     test_select_all.xul \
     test_space_key_pauses_resumes.xul \
+    test_space_key_retries.xul \
     test_ui_stays_open_on_alert_clickback.xul \
     $(NULL)
 
 _BROWSER_FILES = browser_nsISuiteDownloadManagerUI.js \
     $(NULL)
 
 libs:: $(addprefix chrome/, $(_CHROME_FILES))
 	$(INSTALL) $(foreach f,$^,"$f") $(MOZDEPTH)/_tests/testing/mochitest/chrome/$(relativesrcdir)
--- a/suite/common/downloads/tests/chrome/test_delete_key_removes.xul
+++ b/suite/common/downloads/tests/chrome/test_delete_key_removes.xul
@@ -165,17 +165,17 @@ function test()
            "The database and the number of downloads display matches");
         stmt.reset();
 
         let len = DownloadData.length;
         for (let i = 0; i < len; i++) {
           synthesizeKey("VK_DELETE", {}, win);
 
           stmt.executeStep();
-          todo_is(stmt.getInt32(0), len - (i + 1),
+          is(stmt.getInt32(0), len - (i + 1),
              "The download was properly removed");
           stmt.reset();
         }
       }
       finally {
         stmt.reset();
         stmt.finalize();
       }
--- a/suite/common/downloads/tests/chrome/test_space_key_pauses_resumes.xul
+++ b/suite/common/downloads/tests/chrome/test_space_key_pauses_resumes.xul
@@ -62,42 +62,45 @@ function bug413985obs(aWin)
   this.mWin = aWin;
   this.wasPaused = false;
   this.wasResumed = false;
 }
 bug413985obs.prototype = {
   observe: function(aSubject, aTopic, aData)
   {
     if ("timer-callback" == aTopic) {
-      // dispatch a space keypress to resume the download
+      // dispatch a space keypress to pause/resume the download
       synthesizeKey(" ", {}, this.mWin);
     }
   },
 
   onDownloadStateChange: function(aState, aDownload)
   {
     if (aDownload.state == Components.interfaces.nsIDownloadManager.DOWNLOAD_DOWNLOADING &&
         !this.wasPaused) {
       this.wasPaused = true;
-      // dispatch a space keypress to pause the download
-      synthesizeKey(" ", {}, this.mWin);
+      // We have to do this on a timer so other JS stuff that handles the UI
+      // can actually catch up to us...
+      var timer = Components.classes["@mozilla.org/timer;1"]
+                            .createInstance(Components.interfaces.nsITimer);
+      timer.init(this, 0, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
     }
 
     if (aDownload.state == Components.interfaces.nsIDownloadManager.DOWNLOAD_PAUSED &&
         !this.wasResumed) {
       this.wasResumed = true;
       // We have to do this on a timer so other JS stuff that handles the UI
       // can actually catch up to us...
       var timer = Components.classes["@mozilla.org/timer;1"]
                             .createInstance(Components.interfaces.nsITimer);
       timer.init(this, 0, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
     }
 
     if (aDownload.state == Components.interfaces.nsIDownloadManager.DOWNLOAD_FINISHED) {
-      todo(this.wasPaused && this.wasResumed,
+      ok(this.wasPaused && this.wasResumed,
          "The download was paused, and then resumed to completion");
       aDownload.targetFile.remove(false);
 
       var dm = Components.classes["@mozilla.org/download-manager;1"]
                          .getService(Components.interfaces.nsIDownloadManager);
       dm.removeListener(this);
 
       SimpleTest.finish();
@@ -164,19 +167,19 @@ function test()
     {
       if (aTopic != DLMGR_UI_DONE)
         return;
 
       var win = aSubject;
       var doc = win.document;
       dm.addListener(new bug413985obs(win));
 
-      var dl = addDownload();
+      addDownload();
       // we need to focus the download as well
-      doc.getElementById("downloadTree").view.selecttion.select(0);
+      doc.getElementById("downloadTree").view.selection.select(0);
       os.removeObserver(testObs, DLMGR_UI_DONE);
     }
   };
 
   // Register with the observer service
   os.addObserver(testObs, DLMGR_UI_DONE, false);
 
   // Show the Download Manager UI
--- a/suite/common/downloads/treeView.js
+++ b/suite/common/downloads/treeView.js
@@ -314,20 +314,20 @@ DownloadTreeView.prototype = {
       this.addDownload(aDownload);
       return;
     }
     if (this._dlList[row].currBytes != aDownload.amountTransferred) {
       this._dlList[row].endTime = Date.now();
       this._dlList[row].currBytes = aDownload.amountTransferred;
       this._dlList[row].maxBytes = aDownload.size;
       this._dlList[row].progress = aDownload.percentComplete;
-      this._dlList[row].resumable = aDownload.resumable;
     }
     if (this._dlList[row].state != aDownload.state) {
       this._dlList[row].state = aDownload.state;
+      this._dlList[row].resumable = aDownload.resumable;
       switch (this._dlList[row].state) {
         case nsIDownloadManager.DOWNLOAD_NOTSTARTED:
         case nsIDownloadManager.DOWNLOAD_DOWNLOADING:
         case nsIDownloadManager.DOWNLOAD_PAUSED:
         case nsIDownloadManager.DOWNLOAD_QUEUED:
         case nsIDownloadManager.DOWNLOAD_SCANNING:
           this._dlList[row].isActive = 1;
           break;
@@ -350,22 +350,32 @@ DownloadTreeView.prototype = {
     window.updateCommands("tree-select");
   },
 
   removeDownload: function(aDownloadID) {
     var row = this._getIdxForID(aDownloadID);
     // Make sure we have an item to remove
     if (row < 0) return;
 
+    var index = this.selection.currentIndex;
+    var wasSingleSelection = this.selection.count == 1;
+
     // Remove data from the download list
     this._dlList.splice(row, 1);
 
     // Tell the tree we removed 1 row at the given row index
     this._tree.rowCountChanged(row, -1);
 
+    // Update selection if only removed download was selected
+    if (wasSingleSelection && this.selection.count == 0) {
+      index = Math.min(index, this.rowCount - 1);
+      if (index >= 0)
+        this.selection.select(index);
+    }
+
     window.updateCommands("tree-select");
   },
 
   initTree: function() {
     if (!this._tree)
       return
     // We're resetting the whole list, either because we're creating the tree
     // or because we need to recreate it
--- a/suite/common/pref/pref-download.js
+++ b/suite/common/pref/pref-download.js
@@ -33,78 +33,187 @@
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
+const kDesktop = 0;
+const kDownloads = 1;
+const kUserDir = 2;
 var gFPHandler;
 
 function Startup()
 {
-  var pAutoDL = document.getElementById("browser.download.autoDownload");
-  SetAutoDLEnabled(pAutoDL.value);
-  var pDLSound = document.getElementById("browser.download.finished_download_sound");
-  SetSoundEnabled(pDLSound.value);
- 
   // Define globals
-  gFPHandler = Components.classes["@mozilla.org/network/protocol;1?name=file"]
-                         .getService(Components.interfaces.nsIFileProtocolHandler);
+  gFPHandler = Components.classes["@mozilla.org/network/io-service;1"]
+                         .getService(Components.interfaces.nsIIOService)
+                         .getProtocolHandler("file")
+                         .QueryInterface(Components.interfaces.nsIFileProtocolHandler);
 
   // if we don't have the alert service, hide the pref UI for using alerts to
   // notify on download completion
   // see bug #158711
+  /* XXX: sound is to be reintroduced with bug 490467
   var downloadDoneNotificationAlertUI = document.getElementById("finishedNotificationAlert");
   downloadDoneNotificationAlertUI.hidden = !("@mozilla.org/alerts-service;1" in Components.classes);
+  */
+}
+
+/**
+  * Enables/disables the folder field and Browse button based on whether a
+  * default download directory is being used.
+  */
+function ReadUseDownloadDir()
+{
+  var downloadFolder = document.getElementById("downloadFolder");
+  var chooseFolder = document.getElementById("chooseFolder");
+  var preference = document.getElementById("browser.download.useDownloadDir");
+  downloadFolder.disabled = !preference.value;
+  chooseFolder.disabled = !preference.value;
+}
+
+/**
+  * Displays a file picker in which the user can choose the location where
+  * downloads are automatically saved, updating preferences and UI in
+  * response to the choice, if one is made.
+  */
+function ChooseFolder()
+{
+  const nsIFilePicker = Components.interfaces.nsIFilePicker;
+
+  var fp = Components.classes["@mozilla.org/filepicker;1"]
+                     .createInstance(nsIFilePicker);
+  var prefutilitiesBundle = document.getElementById("bundle_prefutilities");
+  var title = prefutilitiesBundle.getString("downloadfolder");
+  fp.init(window, title, nsIFilePicker.modeGetFolder);
+  fp.appendFilters(nsIFilePicker.filterAll);
+
+  var folderListPref = document.getElementById("browser.download.folderList");
+  fp.displayDirectory = IndexToFolder(folderListPref.value); // file
+
+  if (fp.show() == nsIFilePicker.returnOK) {
+    var currentDirPref = document.getElementById("browser.download.dir");
+    currentDirPref.value = fp.file;
+    folderListPref.value = FolderToIndex(fp.file);
+    // Note, the real prefs will not be updated yet, so dnld manager's
+    // userDownloadsDirectory may not return the right folder after
+    // this code executes. displayDownloadDirPref will be called on
+    // the assignment above to update the UI.
+  }
 }
 
-function SetAutoDLEnabled(aEnable)
+/**
+  * Initializes the download folder display settings based on the user's
+  * preferences.
+  */
+function DisplayDownloadDirPref()
 {
-  EnableElementById("downloadLocation", !aEnable, false);
+  var folderListPref = document.getElementById("browser.download.folderList");
+  var currentDirPref = IndexToFolder(folderListPref.value); // file
+  var prefutilitiesBundle = document.getElementById("bundle_prefutilities");
+  var iconUrlSpec = gFPHandler.getURLSpecFromFile(currentDirPref);
+  var downloadFolder = document.getElementById("downloadFolder");
+  downloadFolder.image = "moz-icon://" + iconUrlSpec + "?size=16";
+
+  // Display a 'pretty' label or the path in the UI.
+  switch (FolderToIndex(currentDirPref)) {
+    case kDesktop:
+      downloadFolder.label = prefutilitiesBundle.getString("desktopFolderName");
+      break;
+    case kDownloads:
+      downloadFolder.label = prefutilitiesBundle.getString("downloadsFolderName");
+      break;
+    default:
+      downloadFolder.label = currentDirPref ? currentDirPref.path : "";
+      break;
+  }
+}
+
+/**
+  * Returns the Desktop folder.
+  */
+function GetDesktopFolder()
+{
+  return Components.classes["@mozilla.org/file/directory_service;1"]
+                   .getService(Components.interfaces.nsIProperties)
+                   .get("Desk", Components.interfaces.nsILocalFile);
 }
 
+/**
+  * Returns the Downloads folder as determined by the XPCOM directory service
+  * via the download manager's attribute defaultDownloadsDirectory.
+  */
+function GetDownloadsFolder()
+{
+  return Components.classes["@mozilla.org/download-manager;1"]
+                   .getService(Components.interfaces.nsIDownloadManager)
+                   .defaultDownloadsDirectory;
+}
+
+/**
+  * Determines the type of the given folder.
+  *
+  * @param   aFolder
+  *          the folder whose type is to be determined
+  * @returns integer
+  *          kDesktop if aFolder is the Desktop or is unspecified,
+  *          kDownloads if aFolder is the Downloads folder,
+  *          kUserDir otherwise
+  */
+function FolderToIndex(aFolder)
+{
+  if (!aFolder || aFolder.equals(GetDesktopFolder()))
+    return kDesktop;
+  if (aFolder.equals(GetDownloadsFolder()))
+    return kDownloads;
+  return kUserDir;
+}
+
+/**
+  * Converts an integer into the corresponding folder.
+  *
+  * @param   aIndex
+  *          an integer
+  * @returns the Desktop folder if aIndex == kDesktop,
+  *          the Downloads folder if aIndex == kDownloads,
+  *          the folder stored in browser.download.dir
+  */
+function IndexToFolder(aIndex)
+{
+  var folder;
+  switch (aIndex) {
+    default:
+      folder = document.getElementById("browser.download.dir").value;
+      if (folder && folder.exists())
+        return folder;
+    case kDownloads:
+      folder = GetDownloadsFolder();
+      if (folder && folder.exists())
+        return folder;
+    case kDesktop:
+      return GetDesktopFolder();
+  }
+}
+
+/* XXX: sound is to be reintroduced with bug 490467
 function SetSoundEnabled(aEnable)
 {
   EnableElementById("downloadSndURL", aEnable, false);
   document.getElementById("downloadSndPreview").disabled = !aEnable;
 }
 
-function ReadDLFolder(aField)
-{
-  var file = document.getElementById("browser.download.dir").value;
-  if (file)
-  {
-    aField.file = file;
-    aField.label = (/Mac/.test(navigator.platform)) ? file.leafName : file.path;
-  }
-}
-
-function DownloadSelectFolder()
-{
-  var pref = document.getElementById("browser.download.dir");
-  const nsIFilePicker = Components.interfaces.nsIFilePicker;
-  var fp = Components.classes["@mozilla.org/filepicker;1"]
-                     .createInstance(nsIFilePicker);
-  var prefutilitiesBundle = document.getElementById("bundle_prefutilities");
-  var title = prefutilitiesBundle.getString("downloadfolder");
-  fp.init(window, title, nsIFilePicker.modeGetFolder);
-  fp.displayDirectory = pref.value;
-  fp.appendFilters(nsIFilePicker.filterAll);
-  if (fp.show() == nsIFilePicker.returnOK)
-    pref.value = fp.file;
-}
-
-
 function BrowseSound()
 {
   var pref = document.getElementById("browser.download.finished_sound_url");
 
   const nsIFilePicker = Components.interfaces.nsIFilePicker;
+  const nsILocalFile = Components.interfaces.nsILocalFile;
   var fp = Components.classes["@mozilla.org/filepicker;1"]
                      .createInstance(nsIFilePicker);
   var prefutilitiesBundle = document.getElementById("bundle_prefutilities");
   var title = prefutilitiesBundle.getString("choosesound");
   fp.init(window, title, nsIFilePicker.modeOpen);
 
   if (pref.value)
     fp.displayDirectory = gFPHandler.getFileFromURLSpec(pref.value)
@@ -139,8 +248,9 @@ function ReadSndFile(aField)
   var pref = document.getElementById("browser.download.finished_sound_url");
   if (pref.value)
   {
     var file = gFPHandler.getFileFromURLSpec(pref.value);
     aField.file = file;
     aField.label = (/Mac/.test(navigator.platform)) ? file.leafName : file.path;
   }
 }
+*/
--- a/suite/common/pref/pref-download.xul
+++ b/suite/common/pref/pref-download.xul
@@ -43,110 +43,103 @@
 <!DOCTYPE overlay SYSTEM "chrome://communicator/locale/pref/pref-download.dtd">
 
 <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
   <prefpane id="download_pane"
             label="&pref.download.title;"
             script="chrome://communicator/content/pref/pref-download.js">
 
     <preferences>
-      <preference id="browser.downloadmanager.behavior"
-                  name="browser.downloadmanager.behavior"
+      <preference id="browser.download.manager.focusWhenStarting"
+                  name="browser.download.manager.focusWhenStarting"
+                  type="bool" inverted="true"/>
+      <preference id="browser.download.manager.behavior"
+                  name="browser.download.manager.behavior"
                   type="int"/>
-      <preference id="browser.download.autoDownload"
-                  name="browser.download.autoDownload"
-                  type="bool"
-                  onchange="SetAutoDLEnabled(this.value);"/>
-      <preference id="browser.download.lastLocation"
-                  name="browser.download.lastLocation"
+      <preference id="browser.download.useDownloadDir"
+                  name="browser.download.useDownloadDir"
                   type="bool"/>
-      <preference id="browser.download.finished_download_sound"
+      <preference id="browser.download.dir"
+                  name="browser.download.dir"
+                  type="file"/>
+      <preference id="browser.download.folderList"
+                  name="browser.download.folderList"
+                  type="int"
+                  onchange="DisplayDownloadDirPref();"/>
+      <!-- XXX: to be reintroduced with bug 490467
+       preference id="browser.download.finished_download_sound"
                   name="browser.download.finished_download_sound"
                   type="bool"
                   onchange="SetSoundEnabled(this.value);"/>
       <preference id="browser.download.finished_download_alert"
                   name="browser.download.finished_download_alert"
                   type="bool"/>
       <preference id="browser.download.finished_sound_url"
                   name="browser.download.finished_sound_url"
-                  type="string"/>
-      <preference id="browser.download.dir"
-                  name="browser.download.dir"
-                  type="file"/>
+                  type="string"/ -->
     </preferences>
 
     <groupbox>
       <caption label="&downloadBehavior.label;"/>
+      <checkbox id="focusWhenStarting"
+                label="&focusWhenStarting.label;"
+                preference="browser.download.manager.focusWhenStarting"
+                accesskey="&focusWhenStarting.accesskey;"/>
       <radiogroup id="downloadBehavior"
-                  preference="browser.downloadmanager.behavior">
+                  class="indent"
+                  preference="browser.download.manager.behavior">
         <radio value="0"
                label="&openDM.label;"
                accesskey="&openDM.accesskey;"/>
         <radio value="1"
                label="&openProgressDialog.label;"
                accesskey="&openProgressDialog.accesskey;"/>
         <radio value="2"
                label="&doNothing.label;"
                accesskey="&doNothing.accesskey;"/>
       </radiogroup>
     </groupbox>
 
     <groupbox>
       <caption label="&downloadLocation.label;"/>
-      <radiogroup id="autoDownload"
-                  preference="browser.download.autoDownload">
-        <radio value="false"
-               label="&promptDownload.label;"
-               accesskey="&promptDownload.accesskey;"/>
-        <radiogroup id="downloadLocation"
-                    class="indent"
-                    preference="browser.download.lastLocation">
-          <radio value="true"
-                 label="&lastLocation.label;"
-                 accesskey="&lastLocation.accesskey;"/>
-          <radio value="false"
-                 label="&specifiedLocation.label;"
-                 accesskey="&specifiedLocation.accesskey;"/>
-        </radiogroup>
-        <radio value="true"
-               label="&autoDownload.label;"
-               accesskey="&autoDownload.accesskey;"/>
-      </radiogroup>
-
-      <separator class="thin"/>
-
-      <vbox>
-        <label value="&downloadFolder.label;"/>
-        <hbox align="center">
-          <filefield id="downloadFolder"
-                     flex="1"
+      <radiogroup id="saveWhere"
+                  preference="browser.download.useDownloadDir"
+                  onsyncfrompreference="return document.getElementById('download_pane').ReadUseDownloadDir();">
+        <hbox id="saveToRow">
+          <radio id="saveTo" value="true"
+                 label="&saveTo.label;"
+                 accesskey="&saveTo.accesskey;"
+                 aria-labelledby="saveTo downloadFolder"/>
+          <filefield id="downloadFolder" flex="1"
                      preference="browser.download.dir"
                      preference-editable="true"
-                     onsyncfrompreference="return document.getElementById('download_pane').ReadDLFolder(this);"/>
-          <button id="chooseDownloadFolder"
+                     aria-labelledby="saveTo"
+                     onsyncfrompreference="document.getElementById('download_pane').DisplayDownloadDirPref();"/>
+          <button id="chooseFolder" oncommand="ChooseFolder();"
                   label="&chooseDownloadFolder.label;"
-                  accesskey="&chooseDownloadFolder.accesskey;"
-                  oncommand="DownloadSelectFolder();">
-            <observes element="downloadFolder" attribute="disabled"/>
-          </button>
+                  accesskey="&chooseDownloadFolder.accesskey;"/>
         </hbox>
-      </vbox>
+        <radio id="alwaysAsk" value="false"
+               label="&alwaysAsk.label;"
+               accesskey="&alwaysAsk.accesskey;"/>
+      </radiogroup>
     </groupbox>
 
-    <groupbox>
+    <!-- XXX: to be reintroduced with bug 490467
+     groupbox>
       <caption label="&finishedBehavior.label;"/>
       <hbox align="center">
-	<checkbox id="finishedNotificationSound"
+        <checkbox id="finishedNotificationSound"
                   label="&playSound.label;"
-		  preference="browser.download.finished_download_sound"
-		  accesskey="&playSound.accesskey;"/>
-	<checkbox id="finishedNotificationAlert"
+                  preference="browser.download.finished_download_sound"
+                  accesskey="&playSound.accesskey;"/>
+        <checkbox id="finishedNotificationAlert"
                   label="&showAlert.label;"
-		  preference="browser.download.finished_download_alert"
-		  accesskey="&showAlert.accesskey;"/>
+                  preference="browser.download.finished_download_alert"
+                  accesskey="&showAlert.accesskey;"/>
       </hbox>
 
       <hbox align="center" class="indent">
         <filefield id="downloadSndURL"
                    flex="1"
                    preference="browser.download.finished_sound_url"
                    preference-editable="true"
                    onsyncfrompreference="return document.getElementById('download_pane').ReadSndFile(this);"/>
@@ -158,11 +151,11 @@
             <observes element="downloadSndURL" attribute="disabled"/>
           </button>
           <button id="downloadSndPreview"
                   label="&preview.label;"
                   accesskey="&preview.accesskey;"
                   oncommand="PreviewSound();"/>
         </hbox>
       </hbox>
-    </groupbox>
+    </groupbox -->
   </prefpane>
 </overlay>
--- a/suite/locales/en-US/chrome/common/contentAreaCommands.dtd
+++ b/suite/locales/en-US/chrome/common/contentAreaCommands.dtd
@@ -1,13 +1,13 @@
 <!-- Context Menu -->
 <!ENTITY popupWindowRejectCmd.label     "Reject popup windows from this site">
-<!ENTITY popupWindowRejectCmd.accesskey "">
+<!ENTITY popupWindowRejectCmd.accesskey "o">
 <!ENTITY popupWindowAllowCmd.label      "Allow popup windows from this site">
-<!ENTITY popupWindowAllowCmd.accesskey  "">
+<!ENTITY popupWindowAllowCmd.accesskey  "o">
 <!ENTITY openLinkCmd.label            "Open Link in New Window">
 <!ENTITY openLinkCmd.accesskey        "W">
 <!ENTITY openLinkCmdInTab.label       "Open Link in New Tab">
 <!ENTITY openLinkCmdInTab.accesskey   "T">
 <!ENTITY openLinkInWindowCmd.label    "Open">
 <!ENTITY openLinkInWindowCmd.accesskey "p">
 <!ENTITY openFrameCmd.label           "Open Frame in New Window">
 <!ENTITY openFrameCmd.accesskey       "W">
@@ -25,74 +25,74 @@
 <!ENTITY reloadCmd.accesskey          "R">
 <!ENTITY reloadCmd.commandkey         "r">
 <!ENTITY stopCmd.label                "Stop">
 <!ENTITY stopCmd.accesskey            "S">
 <!ENTITY reloadFrameCmd.label         "Reload Frame">
 <!ENTITY reloadFrameCmd.accesskey     "R">
 <!ENTITY viewPartialSourceForSelectionCmd.label "View Selection Source">
 <!ENTITY viewPartialSourceForMathMLCmd.label    "View MathML Source">
-<!ENTITY viewPartialSourceCmd.accesskey "e">
+<!ENTITY viewPartialSourceCmd.accesskey "u">
 <!ENTITY viewPageSourceCmd.label      "View Page Source">
 <!ENTITY viewPageSourceCmd.accesskey  "V">
 <!ENTITY viewFrameSourceCmd.label     "View Frame Source">
 <!ENTITY viewFrameSourceCmd.accesskey "V">
 <!ENTITY viewPageInfoCmd.label        "View Page Info">
 <!ENTITY viewPageInfoCmd.accesskey    "I">
 <!ENTITY viewFrameInfoCmd.label       "View Frame Info">
 <!ENTITY viewFrameInfoCmd.accesskey   "I">
 <!ENTITY fitImageCmd.label            "Fit Image to Window">
 <!ENTITY fitImageCmd.accesskey        "F">
 <!ENTITY reloadImageCmd.label         "Reload Image">
-<!ENTITY reloadImageCmd.accesskey     "e">
+<!ENTITY reloadImageCmd.accesskey     "R">
 <!ENTITY viewImageCmd.label           "View Image">
-<!ENTITY viewImageCmd.accesskey       "I">
+<!ENTITY viewImageCmd.accesskey       "w">
 <!ENTITY viewBGImageCmd.label         "View Background Image">
 <!ENTITY viewBGImageCmd.accesskey     "w">
 <!ENTITY setWallpaperCmd.label        "Set As Wallpaper">
-<!ENTITY setWallpaperCmd.accesskey    "S">
+<!ENTITY setWallpaperCmd.accesskey    "e">
 <!ENTITY bookmarkPageCmd.label        "Bookmark This Page">
 <!ENTITY bookmarkPageCmd.accesskey    "m">
 <!ENTITY bookmarkLinkCmd.label        "Bookmark This Link">
-<!ENTITY bookmarkLinkCmd.accesskey    "L">
+<!ENTITY bookmarkLinkCmd.accesskey    "B">
 <!ENTITY bookmarkFrameCmd.label       "Bookmark This Frame">
-<!ENTITY bookmarkFrameCmd.accesskey   "m">
+<!ENTITY bookmarkFrameCmd.accesskey   "B">
 <!ENTITY savePageAsCmd.label          "Save Page As…">
 <!ENTITY savePageCmd.label            "Save Page">
-<!ENTITY savePageCmd.accesskey        "a">
+<!ENTITY savePageCmd.accesskey        "e">
 <!ENTITY savePageCmd.commandkey       "s">
 <!ENTITY saveFrameAsCmd.label         "Save Frame As…">
 <!ENTITY saveFrameCmd.label           "Save Frame">
 <!ENTITY saveFrameCmd.accesskey       "m">
 <!ENTITY saveLinkAsCmd.label          "Save Link Target As…">
 <!ENTITY saveLinkCmd.label            "Save Link Target">
-<!ENTITY saveLinkCmd.accesskey        "r">
+<!ENTITY saveLinkCmd.accesskey        "S">
 <!ENTITY saveImageAsCmd.label         "Save Image As…">
 <!ENTITY saveImageCmd.label           "Save Image">
 <!ENTITY saveImageCmd.accesskey       "v">
 <!ENTITY saveVideoCmd.label           "Save Video As…">
 <!ENTITY saveVideoCmd.accesskey       "v">
 <!ENTITY saveAudioCmd.label           "Save Audio As…">
 <!ENTITY saveAudioCmd.accesskey       "v">
 <!ENTITY copyCmd.label                "Copy">
 <!ENTITY copyCmd.accesskey            "C">
 <!ENTITY selectAllCmd.label           "Select All">
 <!ENTITY selectAllCmd.accesskey       "A">
 <!ENTITY copyLinkCmd.label            "Copy Link Location">
-<!ENTITY copyLinkCmd.accesskey        "C">
+<!ENTITY copyLinkCmd.accesskey        "L">
 <!ENTITY copyImageCmd.label           "Copy Image">
-<!ENTITY copyImageCmd.accesskey       "o">
+<!ENTITY copyImageCmd.accesskey       "I">
 <!ENTITY copyVideoURLCmd.label        "Copy Video Location">
-<!ENTITY copyVideoURLCmd.accesskey    "o">
+<!ENTITY copyVideoURLCmd.accesskey    "L">
 <!ENTITY copyAudioURLCmd.label        "Copy Audio Location">
-<!ENTITY copyAudioURLCmd.accesskey    "o">
+<!ENTITY copyAudioURLCmd.accesskey    "L">
 <!ENTITY metadataCmd.label            "Properties">
 <!ENTITY metadataCmd.accesskey        "P">
 <!ENTITY copyEmailCmd.label           "Copy Email Address">
-<!ENTITY copyEmailCmd.accesskey       "E">
+<!ENTITY copyEmailCmd.accesskey       "A">
 <!ENTITY pasteCmd.label               "Paste">
 <!ENTITY pasteCmd.accesskey           "P">
 <!ENTITY cutCmd.label                 "Cut">
 <!ENTITY cutCmd.accesskey             "t">
 <!ENTITY deleteCmd.label              "Delete">
 <!ENTITY deleteCmd.accesskey          "D">
 <!ENTITY undoCmd.label                "Undo">
 <!ENTITY undoCmd.accesskey            "U">
@@ -111,17 +111,17 @@
 <!ENTITY mediaShowControls.label      "Show Media Controls">
 <!ENTITY mediaShowControls.accesskey  "a">
 <!ENTITY mediaHideControls.label      "Hide Media Controls">
 <!ENTITY mediaHideControls.accesskey  "a">
 <!ENTITY search.accesskey             "W">
 <!ENTITY bidiSwitchPageDirectionItem.label        "Switch Page Direction">
 <!ENTITY bidiSwitchPageDirectionItem.accesskey    "g">
 <!ENTITY bidiSwitchTextDirectionItem.label        "Switch Text Direction">
-<!ENTITY bidiSwitchTextDirectionItem.accesskey    "w">
+<!ENTITY bidiSwitchTextDirectionItem.accesskey    "x">
 <!ENTITY spellAddToDictionary.label     "Add to Dictionary">
 <!ENTITY spellAddToDictionary.accesskey "o">
 <!ENTITY spellIgnoreWord.label          "Ignore Word">
 <!ENTITY spellIgnoreWord.accesskey      "W">
 <!ENTITY spellCheckEnable.label         "Check Spelling">
 <!ENTITY spellCheckEnable.accesskey     "S">
 <!ENTITY spellNoSuggestions.label       "(No Spelling Suggestions)">
 <!ENTITY spellDictionaries.label        "Languages">
--- a/suite/locales/en-US/chrome/common/contentAreaCommands.properties
+++ b/suite/locales/en-US/chrome/common/contentAreaCommands.properties
@@ -1,17 +1,17 @@
 # context menu strings
 
 searchText=Search Web for "%S"
-searchText.accesskey=W
+searchText.accesskey=S
 
 blockImage=Block Images from %S
-blockImage.accesskey=B
+blockImage.accesskey=k
 unblockImage=Unblock Images from %S
-unblockImage.accesskey=b
+unblockImage.accesskey=k
 
 SaveImageTitle=Save Image
 SaveVideoTitle=Save Video
 SaveAudioTitle=Save Audio
 SaveLinkTitle=Save As
 SaveAttachmentTitle=Save Attachment
 DefaultSaveFileName=index
 WebPageCompleteFilter=Web Page, complete
--- a/suite/locales/en-US/chrome/common/downloads/downloadmanager.dtd
+++ b/suite/locales/en-US/chrome/common/downloads/downloadmanager.dtd
@@ -58,17 +58,17 @@
 <!ENTITY view.sortDescending.label       "Z > A Sort Order">
 <!ENTITY view.sortDescending.accesskey   "Z">
 
 <!ENTITY cmd.pause.label                 "Pause">
 <!ENTITY cmd.pause.accesskey             "P">
 <!ENTITY cmd.resume.label                "Resume">
 <!ENTITY cmd.resume.accesskey            "R">
 <!ENTITY cmd.retry.label                 "Retry">
-<!ENTITY cmd.retry.accesskey             "R">
+<!ENTITY cmd.retry.accesskey             "t">
 <!ENTITY cmd.cancel.label                "Cancel">
 <!ENTITY cmd.cancel.accesskey            "C">
 <!ENTITY cmd.remove.label                "Remove From List">
 <!ENTITY cmd.remove.accesskey            "e">
 <!ENTITY cmd.open.label                  "Open">
 <!ENTITY cmd.open.accesskey              "O">
 <!ENTITY cmd.show.label                  "Open Containing Folder">
 <!ENTITY cmd.show.accesskey              "F">
--- a/suite/locales/en-US/chrome/common/pref/pref-download.dtd
+++ b/suite/locales/en-US/chrome/common/pref/pref-download.dtd
@@ -1,29 +1,29 @@
 <!ENTITY pref.download.title            "Downloads">
+
 <!ENTITY downloadBehavior.label         "When starting a download">
-<!ENTITY downloadLocation.label         "When saving a file">
-<!ENTITY finishedBehavior.label         "When a download completes">
+<!ENTITY focusWhenStarting.label        "Flash the download manager if it is already open, otherwise:">
+<!ENTITY focusWhenStarting.accesskey    "F">
 <!ENTITY openDM.label                   "Open the download manager">
 <!ENTITY openDM.accesskey               "m">
 <!ENTITY openProgressDialog.label       "Open a progress dialog">
 <!ENTITY openProgressDialog.accesskey   "O">
 <!ENTITY doNothing.label                "Don't open anything">
 <!ENTITY doNothing.accesskey            "D">
-<!ENTITY promptDownload.label           "Prompt for download location and default to">
-<!ENTITY promptDownload.accesskey       "P">
-<!ENTITY lastLocation.label             "Last download folder">
-<!ENTITY lastLocation.accesskey         "L">
-<!ENTITY specifiedLocation.label        "Specified download folder">
-<!ENTITY specifiedLocation.accesskey    "e">
-<!ENTITY autoDownload.label             "Automatically download files to specified download folder">
-<!ENTITY autoDownload.accesskey         "A">
-<!ENTITY downloadFolder.label           "Current Download Folder:">
+
+<!ENTITY downloadLocation.label         "When saving a file">
+<!ENTITY saveTo.label                   "Save files to">
+<!ENTITY saveTo.accesskey               "v">
 <!ENTITY chooseDownloadFolder.label     "Choose Folder…">
 <!ENTITY chooseDownloadFolder.accesskey "C">
+<!ENTITY alwaysAsk.label                "Always ask me where to save files">
+<!ENTITY alwaysAsk.accesskey            "A">
+
+<!ENTITY finishedBehavior.label         "When a download completes">
 <!ENTITY playSound.label                "Play a sound">
 <!ENTITY playSound.accesskey            "s">
 <!ENTITY showAlert.label                "Show an alert">
-<!ENTITY showAlert.accesskey            "n">
+<!ENTITY showAlert.accesskey            "a">
 <!ENTITY browse.label                   "Browse…">
 <!ENTITY browse.accesskey               "B">
 <!ENTITY preview.label                  "Preview">
-<!ENTITY preview.accesskey              "v">
+<!ENTITY preview.accesskey              "e">
--- a/suite/locales/en-US/chrome/common/pref/prefutilities.properties
+++ b/suite/locales/en-US/chrome/common/pref/prefutilities.properties
@@ -1,8 +1,10 @@
 cachefolder=Choose Cache Folder
 choosehomepage=Choose Home Page
 downloadfolder=Choose a Download Folder
+desktopFolderName=Desktop
+downloadsFolderName=Downloads
 choosesound=Choose a sound
 
 SoundFiles=Sounds
 
 labelDefaultFont=Default (%font_family%)
--- a/suite/themes/modern/jar.mn
+++ b/suite/themes/modern/jar.mn
@@ -17,17 +17,19 @@ modern.jar:
   skin/modern/communicator/toolbar.css                             (communicator/toolbar.css)
   skin/modern/communicator/dialogs.css                             (communicator/dialogs.css)
   skin/modern/communicator/helpOverlay.css                         (communicator/helpOverlay.css)
   skin/modern/communicator/smileys.css                             (communicator/smileys.css)
   skin/modern/communicator/communicator.css                        (communicator/communicator.css)
   skin/modern/communicator/aboutSessionRestore.css                 (communicator/aboutSessionRestore.css)
   skin/modern/communicator/bookmarks/bookmark-folder-closed.gif    (communicator/bookmarks/bookmark-folder-closed.gif)
   skin/modern/communicator/bookmarks/bookmark-folder-dis.gif       (communicator/bookmarks/bookmark-folder-dis.gif)
-  skin/modern/communicator/bookmarks/bookmark-folder-open.gif      (communicator/bookmarks/bookmark-folder-open.gif)
+  skin/modern/communicator/downloads/dl-remove.png                 (communicator/downloads/dl-remove.png)
+  skin/modern/communicator/downloads/downloadmanager.css           (communicator/downloads/downloadmanager.css)
+ skin/modern/communicator/bookmarks/bookmark-folder-open.gif      (communicator/bookmarks/bookmark-folder-open.gif)
   skin/modern/communicator/bookmarks/bookmark-group.gif            (communicator/bookmarks/bookmark-group.gif)
   skin/modern/communicator/bookmarks/bookmark-item-dis.gif         (communicator/bookmarks/bookmark-item-dis.gif)
   skin/modern/communicator/bookmarks/bookmark-item-updated.gif     (communicator/bookmarks/bookmark-item-updated.gif)
   skin/modern/communicator/bookmarks/bookmark-item.gif             (communicator/bookmarks/bookmark-item.gif)
   skin/modern/communicator/bookmarks/bookmarks.css                 (communicator/bookmarks/bookmarks.css)
   skin/modern/communicator/bookmarks/bookmarksToolbar.css          (communicator/bookmarks/bookmarksToolbar.css)
   skin/modern/communicator/bookmarks/bookmarksWindow.css           (communicator/bookmarks/bookmarksWindow.css)
   skin/modern/communicator/brand/throbber-anim.png                 (communicator/brand/throbber-anim.png)