From 0f5d250d99b7f4b909165b6db3bf073f2fc58513 Mon Sep 17 00:00:00 2001 From: Alexander Surkov Date: Wed, 2 Mar 2011 13:16:28 +0800 Subject: [PATCH] Bug 636945 - add downcasting for nsRootAccessible, r=davidb, a=davidb --- accessible/src/atk/nsAccessibleWrap.cpp | 2 +- accessible/src/base/nsAccessNode.cpp | 12 ++++++------ accessible/src/base/nsAccessNode.h | 2 +- accessible/src/base/nsAccessible.h | 6 +++++- accessible/src/base/nsDocAccessible.cpp | 6 +++--- accessible/src/base/nsRootAccessible.cpp | 1 + accessible/src/base/nsRootAccessible.h | 7 +++++++ accessible/src/mac/mozAccessible.mm | 2 +- accessible/src/msaa/nsAccessibleWrap.cpp | 2 +- accessible/src/msaa/nsDocAccessibleWrap.cpp | 2 +- 10 files changed, 27 insertions(+), 15 deletions(-) diff --git a/accessible/src/atk/nsAccessibleWrap.cpp b/accessible/src/atk/nsAccessibleWrap.cpp index 5049d5e276f..3de6b08e697 100644 --- a/accessible/src/atk/nsAccessibleWrap.cpp +++ b/accessible/src/atk/nsAccessibleWrap.cpp @@ -1081,7 +1081,7 @@ nsAccessibleWrap::FirePlatformEvent(AccEvent* aEvent) case nsIAccessibleEvent::EVENT_FOCUS: { MAI_LOG_DEBUG(("\n\nReceived: EVENT_FOCUS\n")); - nsRefPtr rootAccWrap = accWrap->GetRootAccessible(); + nsRootAccessible* rootAccWrap = accWrap->RootAccessible(); if (rootAccWrap && rootAccWrap->mActivated) { atk_focus_tracker_notify(atkObj); // Fire state change event for focus diff --git a/accessible/src/base/nsAccessNode.cpp b/accessible/src/base/nsAccessNode.cpp index cfa92e17390..9b2d07d9f3e 100644 --- a/accessible/src/base/nsAccessNode.cpp +++ b/accessible/src/base/nsAccessNode.cpp @@ -285,7 +285,8 @@ nsAccessNode::GetDocAccessible() const GetAccService()->GetDocAccessible(mContent->GetOwnerDoc()) : nsnull; } -already_AddRefed nsAccessNode::GetRootAccessible() +nsRootAccessible* +nsAccessNode::RootAccessible() const { nsCOMPtr docShellTreeItem = nsCoreUtils::GetDocShellTreeItemFor(mContent); @@ -300,9 +301,8 @@ already_AddRefed nsAccessNode::GetRootAccessible() return nsnull; } - nsDocAccessible *docAcc = nsAccUtils::GetDocAccessibleFor(root); - nsRefPtr rootAcc = do_QueryObject(docAcc); - return rootAcc.forget(); + nsDocAccessible* docAcc = nsAccUtils::GetDocAccessibleFor(root); + return docAcc ? docAcc->AsRoot() : nsnull; } nsIFrame* @@ -347,8 +347,8 @@ nsAccessNode::GetRootDocument(nsIAccessibleDocument **aRootDocument) { NS_ENSURE_ARG_POINTER(aRootDocument); - nsRefPtr rootDocument = GetRootAccessible(); - NS_IF_ADDREF(*aRootDocument = rootDocument.get()); + nsRootAccessible* rootDocument = RootAccessible(); + NS_IF_ADDREF(*aRootDocument = rootDocument); return NS_OK; } diff --git a/accessible/src/base/nsAccessNode.h b/accessible/src/base/nsAccessNode.h index 6f53e6b7f31..f7ba055282d 100644 --- a/accessible/src/base/nsAccessNode.h +++ b/accessible/src/base/nsAccessNode.h @@ -105,7 +105,7 @@ public: /** * Return the root document accessible for this accessnode. */ - already_AddRefed GetRootAccessible(); + nsRootAccessible* RootAccessible() const; /** * Reference to a node of focused accessible. diff --git a/accessible/src/base/nsAccessible.h b/accessible/src/base/nsAccessible.h index 2a4e5b99e6c..73c603f5084 100644 --- a/accessible/src/base/nsAccessible.h +++ b/accessible/src/base/nsAccessible.h @@ -364,6 +364,9 @@ public: inline bool IsHyperText() const { return mFlags & eHyperTextAccessible; } nsHyperTextAccessible* AsHyperText(); + inline bool IsRoot() const { return mFlags & eRootAccessible; } + nsRootAccessible* AsRoot(); + inline bool IsTextLeaf() const { return mFlags & eTextLeafAccessible; } nsTextAccessible* AsTextLeaf(); @@ -509,7 +512,8 @@ protected: enum AccessibleTypes { eApplicationAccessible = 1 << 2, eHyperTextAccessible = 1 << 3, - eTextLeafAccessible = 1 << 4 + eRootAccessible = 1 << 4, + eTextLeafAccessible = 1 << 5 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/accessible/src/base/nsDocAccessible.cpp b/accessible/src/base/nsDocAccessible.cpp index ccf09171035..78df5f55df6 100644 --- a/accessible/src/base/nsDocAccessible.cpp +++ b/accessible/src/base/nsDocAccessible.cpp @@ -770,7 +770,7 @@ nsresult nsDocAccessible::AddEventListeners() nsCOMPtr rootTreeItem; docShellTreeItem->GetRootTreeItem(getter_AddRefs(rootTreeItem)); if (rootTreeItem) { - nsRefPtr rootAccessible = GetRootAccessible(); + nsRootAccessible* rootAccessible = RootAccessible(); NS_ENSURE_TRUE(rootAccessible, NS_ERROR_FAILURE); nsRefPtr caretAccessible = rootAccessible->GetCaretAccessible(); if (caretAccessible) { @@ -817,7 +817,7 @@ nsresult nsDocAccessible::RemoveEventListeners() NS_RELEASE_THIS(); // Kung fu death grip } - nsRefPtr rootAccessible(GetRootAccessible()); + nsRootAccessible* rootAccessible = RootAccessible(); if (rootAccessible) { nsRefPtr caretAccessible = rootAccessible->GetCaretAccessible(); if (caretAccessible) { @@ -1135,7 +1135,7 @@ nsDocAccessible::ARIAAttributeChanged(nsIContent* aContent, nsIAtom* aAttribute) nsCOMPtr focusedNode = GetCurrentFocus(); if (nsCoreUtils::GetRoleContent(focusedNode) == aContent) { nsAccessible* focusedAcc = GetAccService()->GetAccessible(focusedNode); - nsRefPtr rootAcc = GetRootAccessible(); + nsRootAccessible* rootAcc = RootAccessible(); if (rootAcc && focusedAcc) { rootAcc->FireAccessibleFocusEvent(focusedAcc, nsnull, PR_TRUE); } diff --git a/accessible/src/base/nsRootAccessible.cpp b/accessible/src/base/nsRootAccessible.cpp index f74fcb007af..7759aca3573 100644 --- a/accessible/src/base/nsRootAccessible.cpp +++ b/accessible/src/base/nsRootAccessible.cpp @@ -112,6 +112,7 @@ nsRootAccessible:: nsIWeakReference *aShell) : nsDocAccessibleWrap(aDocument, aRootContent, aShell) { + mFlags |= eRootAccessible; } nsRootAccessible::~nsRootAccessible() diff --git a/accessible/src/base/nsRootAccessible.h b/accessible/src/base/nsRootAccessible.h index d00cee6ad6f..c308da8b0d4 100644 --- a/accessible/src/base/nsRootAccessible.h +++ b/accessible/src/base/nsRootAccessible.h @@ -164,4 +164,11 @@ protected: NS_DEFINE_STATIC_IID_ACCESSOR(nsRootAccessible, NS_ROOTACCESSIBLE_IMPL_CID) +inline nsRootAccessible* +nsAccessible::AsRoot() +{ + return mFlags & eRootAccessible ? + static_cast(this) : nsnull; +} + #endif diff --git a/accessible/src/mac/mozAccessible.mm b/accessible/src/mac/mozAccessible.mm index c84b58336b8..789b43a9f02 100644 --- a/accessible/src/mac/mozAccessible.mm +++ b/accessible/src/mac/mozAccessible.mm @@ -365,7 +365,7 @@ GetNativeFromGeckoAccessible(nsIAccessible *anAccessible) // (which might be the owning NSWindow in the application, for example). // // get the native root accessible, and tell it to return its first parent unignored accessible. - nsRefPtr root(mGeckoAccessible->GetRootAccessible()); + nsRootAccessible* root = mGeckoAccessible->RootAccessible(); id nativeParent = GetNativeFromGeckoAccessible(static_cast(root)); NSAssert1 (nativeParent, @"!!! we can't find a parent for %@", self); diff --git a/accessible/src/msaa/nsAccessibleWrap.cpp b/accessible/src/msaa/nsAccessibleWrap.cpp index 83583c2e747..e56aa5a7423 100644 --- a/accessible/src/msaa/nsAccessibleWrap.cpp +++ b/accessible/src/msaa/nsAccessibleWrap.cpp @@ -1772,7 +1772,7 @@ void nsAccessibleWrap::UpdateSystemCaret() // off-screen model can follow the caret ::DestroyCaret(); - nsRefPtr rootAccessible = GetRootAccessible(); + nsRootAccessible* rootAccessible = RootAccessible(); if (!rootAccessible) { return; } diff --git a/accessible/src/msaa/nsDocAccessibleWrap.cpp b/accessible/src/msaa/nsDocAccessibleWrap.cpp index ceefd973c29..b4654bd4ec9 100644 --- a/accessible/src/msaa/nsDocAccessibleWrap.cpp +++ b/accessible/src/msaa/nsDocAccessibleWrap.cpp @@ -258,7 +258,7 @@ nsDocAccessibleWrap::Init() if (nsWinUtils::IsWindowEmulationEnabled()) { // Create window for tab document. if (nsWinUtils::IsTabDocument(mDocument)) { - nsRefPtr root = GetRootAccessible(); + nsRootAccessible* root = RootAccessible(); mHWND = nsWinUtils::CreateNativeWindow(kClassNameTabContent, static_cast(root->GetNativeWindow()));