Bug 629912 - 4.0b11pre crash [@ NotificationController::TextEnumerator(nsPtrHashKey<nsIContent>*, void*) ][@ nsINode::GetFlags()], r=davidb, a=betaN+

This commit is contained in:
Alexander Surkov 2011-01-31 12:04:32 +08:00
parent 06f1c2af92
commit fb0f6d54cf
5 changed files with 30 additions and 3 deletions

View File

@ -161,6 +161,14 @@ public:
} }
} }
/**
* Cancel pending text update.
*/
inline void CancelTextUpdate(nsIContent* aTextNode)
{
mTextHash.RemoveEntry(aTextNode);
}
/** /**
* Pend accessible tree update for content insertion. * Pend accessible tree update for content insertion.
*/ */

View File

@ -53,12 +53,13 @@
#include "nsTArray.h" #include "nsTArray.h"
#include "nsRefPtrHashtable.h" #include "nsRefPtrHashtable.h"
class AccEvent;
class AccGroupInfo; class AccGroupInfo;
class EmbeddedObjCollector; class EmbeddedObjCollector;
class nsHyperTextAccessible;
class nsAccessible; class nsAccessible;
class AccEvent; class nsHyperTextAccessible;
struct nsRoleMapEntry; struct nsRoleMapEntry;
class nsTextAccessible;
struct nsRect; struct nsRect;
class nsIContent; class nsIContent;
@ -359,6 +360,9 @@ public:
inline bool IsHyperText() const { return mFlags & eHyperTextAccessible; } inline bool IsHyperText() const { return mFlags & eHyperTextAccessible; }
nsHyperTextAccessible* AsHyperText(); nsHyperTextAccessible* AsHyperText();
inline bool IsTextLeaf() const { return mFlags & eTextLeafAccessible; }
nsTextAccessible* AsTextLeaf();
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// HyperLinkAccessible // HyperLinkAccessible
@ -499,7 +503,8 @@ protected:
* @note keep these flags in sync with ChildrenFlags * @note keep these flags in sync with ChildrenFlags
*/ */
enum AccessibleTypes { enum AccessibleTypes {
eHyperTextAccessible = 1 << 2 eHyperTextAccessible = 1 << 2,
eTextLeafAccessible = 1 << 3
}; };
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////

View File

@ -2057,6 +2057,9 @@ nsDocAccessible::UncacheChildrenInSubtree(nsAccessible* aRoot)
for (PRUint32 idx = 0; idx < count; idx++) for (PRUint32 idx = 0; idx < count; idx++)
UncacheChildrenInSubtree(aRoot->GetCachedChildAt(idx)); UncacheChildrenInSubtree(aRoot->GetCachedChildAt(idx));
if (aRoot->IsTextLeaf())
mNotificationController->CancelTextUpdate(aRoot->GetContent());
if (aRoot->IsPrimaryForNode() && if (aRoot->IsPrimaryForNode() &&
mNodeToAccessibleMap.Get(aRoot->GetNode()) == aRoot) mNodeToAccessibleMap.Get(aRoot->GetNode()) == aRoot)
mNodeToAccessibleMap.Remove(aRoot->GetNode()); mNodeToAccessibleMap.Remove(aRoot->GetNode());

View File

@ -48,6 +48,7 @@ nsTextAccessible::
nsTextAccessible(nsIContent *aContent, nsIWeakReference *aShell) : nsTextAccessible(nsIContent *aContent, nsIWeakReference *aShell) :
nsLinkableAccessible(aContent, aShell) nsLinkableAccessible(aContent, aShell)
{ {
mFlags |= eTextLeafAccessible;
} }
PRUint32 PRUint32

View File

@ -61,5 +61,15 @@ protected:
}; };
////////////////////////////////////////////////////////////////////////////////
// nsAccessible downcast method
inline nsTextAccessible*
nsAccessible::AsTextLeaf()
{
return mFlags & eTextLeafAccessible ?
static_cast<nsTextAccessible*>(this) : nsnull;
}
#endif #endif