Bug 756973 - make RootAccessible::NativeState faster, r=tbsaunde, enn
authorAlexander Surkov <surkov.alexander@gmail.com>
Wed, 23 May 2012 08:48:35 +0900
changeset 94996 fb5b2c7e1b9b8ba8d1e28e2a1381842ec0dde475
parent 94995 d3c66ed8fea9c8eabe7a55db954cd80f1fa667b6
child 94997 f713ee5937ab3e395f91a94c410de26d67652e28
push id270
push userpvanderbeken@mozilla.com
push dateThu, 06 Mar 2014 09:24:21 +0000
reviewerstbsaunde, enn
bugs756973
milestone15.0a1
Bug 756973 - make RootAccessible::NativeState faster, r=tbsaunde, enn
accessible/src/generic/RootAccessible.cpp
dom/base/nsFocusManager.h
--- a/accessible/src/generic/RootAccessible.cpp
+++ b/accessible/src/generic/RootAccessible.cpp
@@ -132,43 +132,38 @@ RootAccessible::GetChromeFlags()
   xulWin->GetChromeFlags(&chromeFlags);
   return chromeFlags;
 }
 #endif
 
 PRUint64
 RootAccessible::NativeState()
 {
-  PRUint64 states = nsDocAccessibleWrap::NativeState();
+  PRUint64 state = nsDocAccessibleWrap::NativeState();
+  if (state & states::DEFUNCT)
+    return state;
 
 #ifdef MOZ_XUL
   PRUint32 chromeFlags = GetChromeFlags();
   if (chromeFlags & nsIWebBrowserChrome::CHROME_WINDOW_RESIZE)
-    states |= states::SIZEABLE;
+    state |= states::SIZEABLE;
     // If it has a titlebar it's movable
     // XXX unless it's minimized or maximized, but not sure
     //     how to detect that
   if (chromeFlags & nsIWebBrowserChrome::CHROME_TITLEBAR)
-    states |= states::MOVEABLE;
+    state |= states::MOVEABLE;
   if (chromeFlags & nsIWebBrowserChrome::CHROME_MODAL)
-    states |= states::MODAL;
+    state |= states::MODAL;
 #endif
 
   nsFocusManager* fm = nsFocusManager::GetFocusManager();
-  if (fm) {
-    nsCOMPtr<nsIDOMWindow> rootWindow;
-    GetWindow(getter_AddRefs(rootWindow));
+  if (fm && fm->GetActiveWindow() == mDocument->GetWindow())
+    state |= states::ACTIVE;
 
-    nsCOMPtr<nsIDOMWindow> activeWindow;
-    fm->GetActiveWindow(getter_AddRefs(activeWindow));
-    if (activeWindow == rootWindow)
-      states |= states::ACTIVE;
-  }
-
-  return states;
+  return state;
 }
 
 const char* const docEvents[] = {
 #ifdef DEBUG_DRAGDROPSTART
   // Capture mouse over events and fire fake DRAGDROPSTART event to simplify
   // debugging a11y objects with event viewers
   "mouseover",
 #endif
--- a/dom/base/nsFocusManager.h
+++ b/dom/base/nsFocusManager.h
@@ -63,16 +63,21 @@ public:
   nsIContent* GetFocusedContent() { return mFocusedContent; }
 
   /**
    * Return a focused window. Version of nsIFocusManager::GetFocusedWindow.
    */
   nsPIDOMWindow* GetFocusedWindow() const { return mFocusedWindow; }
 
   /**
+   * Return an active window. Version of nsIFocusManager::GetActiveWindow.
+   */
+  nsPIDOMWindow* GetActiveWindow() const { return mActiveWindow; }
+
+  /**
    * Called when content has been removed.
    */
   nsresult ContentRemoved(nsIDocument* aDocument, nsIContent* aContent);
 
   /**
    * Called when mouse button down event handling is started and finished.
    */
   void SetMouseButtonDownHandlingDocument(nsIDocument* aDocument)