diff --git a/accessible/src/atk/nsAppRootAccessible.cpp b/accessible/src/atk/nsAppRootAccessible.cpp index 9d94f9bb402b..bf60b1ac99a8 100644 --- a/accessible/src/atk/nsAppRootAccessible.cpp +++ b/accessible/src/atk/nsAppRootAccessible.cpp @@ -678,32 +678,41 @@ NS_IMETHODIMP nsAppRootAccessible::GetChildAt(PRInt32 aChildNum, return rv; } -NS_IMETHODIMP nsAppRootAccessible::GetChildCount(PRInt32 *aAccChildCount) +void nsAppRootAccessible::CacheChildren() { - PRUint32 count = 0; - nsresult rv = NS_OK; - if (mChildren) - rv = mChildren->GetLength(&count); - if (NS_SUCCEEDED(rv)) { - MAI_LOG_DEBUG(("\nGet Acc Child OK, count=%d\n", count)); + if (!mChildren) { + mAccChildCount = eChildCountUninitialized; + return; } - else - MAI_LOG_DEBUG(("\nGet Acc Child Failed, count=%d\n", count)); - *aAccChildCount = NS_STATIC_CAST(PRInt32, count); - return rv; -} + if (mAccChildCount == eChildCountUninitialized) { + nsCOMPtr enumerator; + mChildren->Enumerate(getter_AddRefs(enumerator)); -NS_IMETHODIMP nsAppRootAccessible::GetFirstChild(nsIAccessible * *aFirstChild) -{ - nsCOMPtr firstChild; - *aFirstChild = nsnull; - nsresult rv = NS_OK; - rv = mChildren->QueryElementAt(0, NS_GET_IID(nsIAccessible), - getter_AddRefs(firstChild)); - if (firstChild) - NS_IF_ADDREF(*aFirstChild = firstChild); - return rv; + nsCOMPtr childWeakRef; + nsCOMPtr accessible; + nsCOMPtr previousAccessible; + PRBool hasMoreElements; + while(NS_SUCCEEDED(enumerator->HasMoreElements(&hasMoreElements)) + && hasMoreElements) { + enumerator->GetNext(getter_AddRefs(childWeakRef)); + accessible = do_QueryReferent(childWeakRef); + if (accessible) { + if (previousAccessible) { + previousAccessible->SetNextSibling(accessible); + } + else { + SetFirstChild(accessible); + } + previousAccessible = do_QueryInterface(accessible); + previousAccessible->SetParent(this); + } + } + + PRUint32 count = 0; + mChildren->GetLength(&count); + mAccChildCount = NS_STATIC_CAST(PRInt32, count); + } } NS_IMETHODIMP nsAppRootAccessible::GetNextSibling(nsIAccessible * *aNextSibling) @@ -746,6 +755,7 @@ nsAppRootAccessible::AddRootAccessible(nsIAccessible *aRootAccWrap) // add by weak reference rv = mChildren->AppendElement(aRootAccWrap, PR_TRUE); + InvalidateChildren(); void* atkAccessible; aRootAccWrap->GetNativeInterface(&atkAccessible); @@ -803,6 +813,7 @@ nsAppRootAccessible::RemoveRootAccessible(nsIAccessible *aRootAccWrap) rv = mChildren->RemoveElementAt(index); #endif + InvalidateChildren(); return rv; } diff --git a/accessible/src/atk/nsAppRootAccessible.h b/accessible/src/atk/nsAppRootAccessible.h index fd593873a5b9..1034c224efe8 100644 --- a/accessible/src/atk/nsAppRootAccessible.h +++ b/accessible/src/atk/nsAppRootAccessible.h @@ -86,14 +86,15 @@ public: NS_IMETHOD GetPreviousSibling(nsIAccessible **aPreviousSibling); NS_IMETHOD GetChildAt(PRInt32 aChildNum, nsIAccessible **aChild); - NS_IMETHOD GetFirstChild(nsIAccessible * *aFirstChild); - NS_IMETHOD GetChildCount(PRInt32 *aAccChildCount); - // return the atk object for app root accessible NS_IMETHOD GetNativeInterface(void **aOutAccessible); nsresult AddRootAccessible(nsIAccessible *aRootAccWrap); nsresult RemoveRootAccessible(nsIAccessible *aRootAccWrap); + +protected: + virtual void CacheChildren(); + private: nsCOMPtr mChildren; }; diff --git a/accessible/src/base/nsAccessible.cpp b/accessible/src/base/nsAccessible.cpp index f17dac55fc06..b27876d75e0b 100644 --- a/accessible/src/base/nsAccessible.cpp +++ b/accessible/src/base/nsAccessible.cpp @@ -489,7 +489,7 @@ NS_IMETHODIMP nsAccessible::Shutdown() NS_IMETHODIMP nsAccessible::InvalidateChildren() { // Document has transformed, reset our invalid children and child count - mAccChildCount = -1; + mAccChildCount = eChildCountUninitialized; mFirstChild = nsnull; return NS_OK; } @@ -667,7 +667,7 @@ void nsAccessible::CacheChildren() { if (!mWeakShell) { // This node has been shut down - mAccChildCount = -1; + mAccChildCount = eChildCountUninitialized; return; } @@ -1968,7 +1968,7 @@ NS_IMETHODIMP nsAccessible::GetFinalState(PRUint32 *aState) if (!content) { return NS_ERROR_FAILURE; // Node already shut down } - for (PRInt32 index = 0; index < NS_ARRAY_LENGTH(gUnivStateMap); index ++) { + for (PRUint32 index = 0; index < NS_ARRAY_LENGTH(gUnivStateMap); index ++) { MappedAttrState(content, aState, &gUnivStateMap[index]); } if (!mRoleMapEntry) { diff --git a/accessible/src/html/nsHTMLFormControlAccessible.cpp b/accessible/src/html/nsHTMLFormControlAccessible.cpp index 66292ded728a..47bb8bda5a8b 100644 --- a/accessible/src/html/nsHTMLFormControlAccessible.cpp +++ b/accessible/src/html/nsHTMLFormControlAccessible.cpp @@ -495,7 +495,7 @@ void nsHTMLGroupboxAccessible::CacheChildren() { if (!mWeakShell) { // This node has been shut down - mAccChildCount = -1; + mAccChildCount = eChildCountUninitialized; return; } diff --git a/accessible/src/html/nsHTMLImageAccessible.cpp b/accessible/src/html/nsHTMLImageAccessible.cpp index f357139314d4..71b54fdba9ff 100644 --- a/accessible/src/html/nsHTMLImageAccessible.cpp +++ b/accessible/src/html/nsHTMLImageAccessible.cpp @@ -174,7 +174,7 @@ void nsHTMLImageAccessible::CacheChildren() { if (!mWeakShell) { // This node has been shut down - mAccChildCount = -1; + mAccChildCount = eChildCountUninitialized; return; } diff --git a/accessible/src/xul/nsXULSelectAccessible.cpp b/accessible/src/xul/nsXULSelectAccessible.cpp index 8bd038ff3533..e1302b0613cf 100644 --- a/accessible/src/xul/nsXULSelectAccessible.cpp +++ b/accessible/src/xul/nsXULSelectAccessible.cpp @@ -606,7 +606,7 @@ void nsXULComboboxAccessible::CacheChildren() { if (!mWeakShell) { // This node has been shut down - mAccChildCount = -1; + mAccChildCount = eChildCountUninitialized; return; }