Bug 1597062 - Port |Bug 581932 - Keyboard shortcuts are disabled after deleting a message and next is a thread when message pane has focus|. r=frg
authorIan Neal <iann_cvs@blueyonder.co.uk>
Sun, 24 Nov 2019 13:34:08 +0100
changeset 37593 e3ca458febd1b36274e531f0f9264e0a7cdfb735
parent 37592 fa4e46e2039322a6c22b6494fc5c66d747ce1b3f
child 37594 6d66ffc08e3f13d4b5edd9d522440e0d2023efb6
push id396
push userclokep@gmail.com
push dateMon, 06 Jan 2020 23:11:57 +0000
reviewersfrg
bugs1597062, 581932
Bug 1597062 - Port |Bug 581932 - Keyboard shortcuts are disabled after deleting a message and next is a thread when message pane has focus|. r=frg
suite/mailnews/content/folderDisplay.js
suite/mailnews/content/mail3PaneWindowCommands.js
--- a/suite/mailnews/content/folderDisplay.js
+++ b/suite/mailnews/content/folderDisplay.js
@@ -79,17 +79,42 @@ var gFolderDisplay =
       let identity = GetIdentityForHeader(aMsg);
       return identity && identity.archiveEnabled;
     });
   },
 
   get displayedFolder()
   {
     return gMsgFolderSelected;
-  }
+  },
+
+   /**
+   * Determine which pane currently has focus (one of the folder pane, thread
+   * pane, or message pane). When changing focus to the message pane, be sure
+   * to focus the appropriate content window in addition to the messagepanebox
+   * (doing both is required in order to blur the previously-focused chrome
+   * element).
+   *
+   * @return the focused pane
+   */
+  get focusedPane() {
+    let panes = ["threadTree", "folderTree", "messagepanebox"].map(id =>
+        document.getElementById(id));
+
+    let currentNode = top.document.activeElement;
+
+    while (currentNode) {
+      if (panes.includes(currentNode)) {
+        return currentNode;
+      }
+
+      currentNode = currentNode.parentNode;
+    }
+    return null;
+  },
 
 }
 
 var gMessageDisplay =
 {
   get displayedMessage()
   {
     if (!gDBView)
--- a/suite/mailnews/content/mail3PaneWindowCommands.js
+++ b/suite/mailnews/content/mail3PaneWindowCommands.js
@@ -764,24 +764,22 @@ function GetNumSelectedMessages()
     return 0;
   }
 }
 
 var gLastFocusedElement=null;
 
 function FocusRingUpdate_Mail()
 {
-  // WhichPaneHasFocus() uses on top.document.commandDispatcher.focusedElement
-  // to determine which pane has focus
-  // if the focusedElement is null, we're here on a blur.
+  // If the focusedElement is null, we're here on a blur.
   // nsFocusController::Blur() calls nsFocusController::SetFocusedElement(null),
   // which will update any commands listening for "focus".
   // we really only care about nsFocusController::Focus() happens,
   // which calls nsFocusController::SetFocusedElement(element)
-  var currentFocusedElement = WhichPaneHasFocus();
+  var currentFocusedElement = gFolderDisplay.focusedPane;
 
   if (currentFocusedElement != gLastFocusedElement) {
     if (currentFocusedElement)
       currentFocusedElement.setAttribute("focusring", "true");
 
     if (gLastFocusedElement)
       gLastFocusedElement.removeAttribute("focusring");
 
@@ -790,38 +788,16 @@ function FocusRingUpdate_Mail()
     // since we just changed the pane with focus we need to update the toolbar to reflect this
     // XXX TODO
     // can we optimize
     // and just update cmd_delete and button_delete?
     UpdateMailToolbar("focus");
   }
 }
 
-function WhichPaneHasFocus()
-{
-  var threadTree = GetThreadTree();
-  var folderTree = GetFolderTree();
-  var messagePane = GetMessagePane();
-
-  if (top.document.commandDispatcher.focusedWindow == GetMessagePaneFrame())
-    return messagePane;
-
-  var currentNode = top.document.commandDispatcher.focusedElement;
-  while (currentNode) {
-    if (currentNode === threadTree ||
-        currentNode === folderTree ||
-        currentNode === messagePane)
-      return currentNode;
-
-    currentNode = currentNode.parentNode;
-  }
-
-  return null;
-}
-
 function SetupCommandUpdateHandlers()
 {
   // folder pane
   var widget = GetFolderTree();
   if (widget)
     widget.controllers.appendController(FolderPaneController);
 }
 
@@ -994,34 +970,34 @@ function MsgDeleteFolder()
         }
       }
     }
   }
 }
 
 function SetFocusThreadPaneIfNotOnMessagePane()
 {
-  var focusedElement = WhichPaneHasFocus();
+  var focusedElement = gFolderDisplay.focusedPane;
 
   if((focusedElement != GetThreadTree()) &&
      (focusedElement != GetMessagePane()))
      SetFocusThreadPane();
 }
 
 function SwitchPaneFocus(event)
 {
   var folderTree = GetFolderTree();
   var threadTree = GetThreadTree();
   var messagePane = GetMessagePane();
 
   // Although internally this is actually a four-pane window, it is presented as
   // a three-pane -- the search pane is more of a toolbar.  So, shift among the
   // three main panes.
 
-  var focusedElement = WhichPaneHasFocus();
+  var focusedElement = gFolderDisplay.focusedPane;
   if (focusedElement == null)       // focus not on one of the main three panes?
     focusedElement = threadTree;    // treat as if on thread tree
 
   if (event && event.shiftKey)
   {
     // Reverse traversal: Message -> Thread -> Folder -> Message
     if (focusedElement == threadTree && !IsFolderPaneCollapsed())
       folderTree.focus();