1. diff --git a/accessible/ipc/DocAccessibleParent.cpp b/accessible/ipc/DocAccessibleParent.cpp
  2. index a847c36..61e3db8 100644
  3. --- a/accessible/ipc/DocAccessibleParent.cpp
  4. +++ b/accessible/ipc/DocAccessibleParent.cpp
  5. @@ -266,14 +266,14 @@ DocAccessibleParent::Destroy()
  6. }
  7. bool
  8. -DocAccessibleParent::CheckDocTree() const
  9. +DocAccessibleParent::CheckDocTreeInternal() const
  10. {
  11. size_t childDocs = mChildDocs.Length();
  12. for (size_t i = 0; i < childDocs; i++) {
  13. if (!mChildDocs[i] || mChildDocs[i]->mParentDoc != this)
  14. return false;
  15. - if (!mChildDocs[i]->CheckDocTree()) {
  16. + if (!mChildDocs[i]->CheckDocTreeInternal()) {
  17. return false;
  18. }
  19. }
  20. @@ -281,5 +281,19 @@ DocAccessibleParent::CheckDocTree() const
  21. return true;
  22. }
  23. +bool
  24. +DocAccessibleParent::CheckDocTree() const
  25. +{
  26. + const DocAccessibleParent* doc = this;
  27. + while (doc->ParentDoc()) {
  28. + doc = doc->ParentDoc();
  29. + }
  30. +
  31. + if (!doc->mTopLevel) {
  32. + return false;
  33. + }
  34. +
  35. + return doc->CheckDocTreeInternal();
  36. +}
  37. } // a11y
  38. } // mozilla
  39. diff --git a/accessible/ipc/DocAccessibleParent.h b/accessible/ipc/DocAccessibleParent.h
  40. index f9e6cc5..0b80d4d 100644
  41. --- a/accessible/ipc/DocAccessibleParent.h
  42. +++ b/accessible/ipc/DocAccessibleParent.h
  43. @@ -72,8 +72,10 @@ public:
  44. void Destroy();
  45. virtual void ActorDestroy(ActorDestroyReason aWhy) override
  46. {
  47. + if (mShutdown)
  48. + return;
  49. +
  50. MOZ_DIAGNOSTIC_ASSERT(CheckDocTree());
  51. - if (!mShutdown)
  52. Destroy();
  53. }
  54. @@ -152,6 +154,7 @@ private:
  55. const nsTArray<AccessibleData>& aNewTree, uint32_t aIdx,
  56. uint32_t aIdxInParent);
  57. MOZ_WARN_UNUSED_RESULT bool CheckDocTree() const;
  58. + MOZ_WARN_UNUSED_RESULT bool CheckDocTreeInternal() const;
  59. nsTArray<DocAccessibleParent*> mChildDocs;
  60. DocAccessibleParent* mParentDoc;