Add assertions to help debug crash under DOMWindowExtension::suspendForPageCache()
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 10 Mar 2019 03:26:10 +0000 (03:26 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 10 Mar 2019 03:26:10 +0000 (03:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=195488

Reviewed by Ryosuke Niwa.

Try and figure out how the document can be detached from its frame while we're suspending
DOMWindowExtensions.

* page/DOMWindow.cpp:
(WebCore::DOMWindow::willDetachDocumentFromFrame):
(WebCore::DOMWindow::suspendForPageCache):
* page/DOMWindow.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242677 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/page/DOMWindow.cpp
Source/WebCore/page/DOMWindow.h

index a07f96e..7627438 100644 (file)
@@ -1,5 +1,20 @@
 2019-03-09  Chris Dumez  <cdumez@apple.com>
 
+        Add assertions to help debug crash under DOMWindowExtension::suspendForPageCache()
+        https://bugs.webkit.org/show_bug.cgi?id=195488
+
+        Reviewed by Ryosuke Niwa.
+
+        Try and figure out how the document can be detached from its frame while we're suspending
+        DOMWindowExtensions.
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::willDetachDocumentFromFrame):
+        (WebCore::DOMWindow::suspendForPageCache):
+        * page/DOMWindow.h:
+
+2019-03-09  Chris Dumez  <cdumez@apple.com>
+
         Simplify DOMWindowProperty code / handling
         https://bugs.webkit.org/show_bug.cgi?id=195495
 
index ed47c2f..efa0e5e 100644 (file)
 #include <wtf/MathExtras.h>
 #include <wtf/NeverDestroyed.h>
 #include <wtf/Ref.h>
+#include <wtf/SetForScope.h>
 #include <wtf/Variant.h>
 #include <wtf/text/WTFString.h>
 
@@ -473,6 +474,8 @@ void DOMWindow::willDetachDocumentFromFrame()
     if (!frame())
         return;
 
+    RELEASE_ASSERT(!m_isSuspendingObservers);
+
     // It is necessary to copy m_observers to a separate vector because the Observer may
     // unregister themselves from the DOMWindow as a result of the call to willDetachGlobalObjectFromFrame.
     for (auto& observer : copyToVector(m_observers)) {
@@ -521,10 +524,14 @@ void DOMWindow::resetUnlessSuspendedForDocumentSuspension()
 
 void DOMWindow::suspendForPageCache()
 {
+    SetForScope<bool> isSuspendingObservers(m_isSuspendingObservers, true);
+    RELEASE_ASSERT(frame());
+
     for (auto* observer : copyToVector(m_observers)) {
         if (m_observers.contains(observer))
             observer->suspendForPageCache();
     }
+    RELEASE_ASSERT(frame());
 
     m_suspendedForDocumentSuspension = true;
 }
index 5e788c4..e7f476e 100644 (file)
@@ -393,6 +393,7 @@ private:
 
     bool m_shouldPrintWhenFinishedLoading { false };
     bool m_suspendedForDocumentSuspension { false };
+    bool m_isSuspendingObservers { false };
     Optional<bool> m_canShowModalDialogOverride;
 
     HashSet<Observer*> m_observers;