Title: [125829] trunk/Source/WebCore
Revision
125829
Author
[email protected]
Date
2012-08-16 17:02:23 -0700 (Thu, 16 Aug 2012)

Log Message

ProgressTracker never completes if iframe detached during parsing
https://bugs.webkit.org/show_bug.cgi?id=92272

Reviewed by Adam Barth.

Add a simple helper class to FrameLoader to ensure progressStarted/progressCompleted calls are matched,
and balance the calls when the Frame is detached.

No new tests, as this behavior has only been producing reliably by setting a breakpoint in a specific place.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::init):
(WebCore::FrameLoader::FrameProgressTracker::progressStarted):
(WebCore::FrameLoader::FrameProgressTracker::progressCompleted):
(WebCore::FrameLoader::FrameProgressTracker::~FrameProgressTracker):
(WebCore::FrameLoader::prepareForLoadStart):
(WebCore::FrameLoader::clearProvisionalLoad):
(WebCore::FrameLoader::checkLoadCompleteForThisFrame):
(WebCore::FrameLoader::detachFromParent):
* loader/FrameLoader.h:
(FrameProgressTracker):
(WebCore::FrameLoader::FrameProgressTracker::create):
(WebCore::FrameLoader::FrameProgressTracker::FrameProgressTracker):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (125828 => 125829)


--- trunk/Source/WebCore/ChangeLog	2012-08-16 23:53:24 UTC (rev 125828)
+++ trunk/Source/WebCore/ChangeLog	2012-08-17 00:02:23 UTC (rev 125829)
@@ -1,3 +1,29 @@
+2012-08-16  Nate Chapin  <[email protected]>
+
+        ProgressTracker never completes if iframe detached during parsing 
+        https://bugs.webkit.org/show_bug.cgi?id=92272
+
+        Reviewed by Adam Barth.
+
+        Add a simple helper class to FrameLoader to ensure progressStarted/progressCompleted calls are matched,
+        and balance the calls when the Frame is detached.
+
+        No new tests, as this behavior has only been producing reliably by setting a breakpoint in a specific place.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::init):
+        (WebCore::FrameLoader::FrameProgressTracker::progressStarted):
+        (WebCore::FrameLoader::FrameProgressTracker::progressCompleted):
+        (WebCore::FrameLoader::FrameProgressTracker::~FrameProgressTracker):
+        (WebCore::FrameLoader::prepareForLoadStart):
+        (WebCore::FrameLoader::clearProvisionalLoad):
+        (WebCore::FrameLoader::checkLoadCompleteForThisFrame):
+        (WebCore::FrameLoader::detachFromParent):
+        * loader/FrameLoader.h:
+        (FrameProgressTracker):
+        (WebCore::FrameLoader::FrameProgressTracker::create):
+        (WebCore::FrameLoader::FrameProgressTracker::FrameProgressTracker):
+
 2012-08-16  Arnaud Renevier  <[email protected]>
 
         Update TypedArrays to throw RangeError or similar instead of INDEX_SIZE_ERR

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (125828 => 125829)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2012-08-16 23:53:24 UTC (rev 125828)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2012-08-17 00:02:23 UTC (rev 125829)
@@ -165,6 +165,42 @@
     return frame->document() && frame->document()->isSandboxed(mask);
 }
 
+class FrameLoader::FrameProgressTracker {
+public:
+    static PassOwnPtr<FrameProgressTracker> create(Frame* frame) { return adoptPtr(new FrameProgressTracker(frame)); }
+    ~FrameProgressTracker()
+    {
+        ASSERT(!m_inProgressCount || m_frame->page());
+        for (; m_inProgressCount; m_inProgressCount--)
+            m_frame->page()->progress()->progressCompleted(m_frame);
+    }
+
+    void progressStarted()
+    {
+        ASSERT(m_frame->page());
+        m_inProgressCount++;
+        m_frame->page()->progress()->progressStarted(m_frame);
+    }
+
+    void progressCompleted()
+    {
+        ASSERT(m_inProgressCount > 0);
+        ASSERT(m_frame->page());
+        m_inProgressCount--;
+        m_frame->page()->progress()->progressCompleted(m_frame);
+    }
+
+private:
+    FrameProgressTracker(Frame* frame)
+        : m_frame(frame)
+        , m_inProgressCount(0)
+    {
+    }
+
+    Frame* m_frame;
+    int m_inProgressCount;
+};
+
 FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client)
     : m_frame(frame)
     , m_client(client)
@@ -228,6 +264,7 @@
     m_didCallImplicitClose = true;
 
     m_networkingContext = m_client->createNetworkingContext();
+    m_progressTracker = FrameProgressTracker::create(m_frame);
 }
 
 void FrameLoader::setDefersLoading(bool defers)
@@ -1087,9 +1124,8 @@
 
 void FrameLoader::prepareForLoadStart()
 {
-    if (Page* page = m_frame->page())
-        page->progress()->progressStarted(m_frame);
     m_client->dispatchDidStartProvisionalLoad();
+    m_progressTracker->progressStarted();
 
     // Notify accessibility.
     if (AXObjectCache::accessibilityEnabled()) {
@@ -1646,8 +1682,7 @@
 void FrameLoader::clearProvisionalLoad()
 {
     setProvisionalDocumentLoader(0);
-    if (Page* page = m_frame->page())
-        page->progress()->progressCompleted(m_frame);
+    m_progressTracker->progressCompleted();
     setState(FrameStateComplete);
 }
 
@@ -2123,9 +2158,8 @@
                 return;
 
             if (!settings->needsDidFinishLoadOrderQuirk()) {
+                m_progressTracker->progressCompleted();
                 if (Page* page = m_frame->page()) {
-                    page->progress()->progressCompleted(m_frame);
-
                     if (m_frame == page->mainFrame())
                         page->resetRelevantPaintedObjectCounter();
                 }
@@ -2143,9 +2177,8 @@
             }
 
             if (settings->needsDidFinishLoadOrderQuirk()) {
+                m_progressTracker->progressCompleted();
                 if (Page* page = m_frame->page()) {
-                    page->progress()->progressCompleted(m_frame);
-
                     if (m_frame == page->mainFrame())
                         page->resetRelevantPaintedObjectCounter();
                 }
@@ -2369,6 +2402,8 @@
 
     detachViewsAndDocumentLoader();
 
+    m_progressTracker.clear();
+
     if (Frame* parent = m_frame->tree()->parent()) {
         parent->loader()->closeAndRemoveChild(m_frame);
         parent->loader()->scheduleCheckCompleted();

Modified: trunk/Source/WebCore/loader/FrameLoader.h (125828 => 125829)


--- trunk/Source/WebCore/loader/FrameLoader.h	2012-08-16 23:53:24 UTC (rev 125828)
+++ trunk/Source/WebCore/loader/FrameLoader.h	2012-08-17 00:02:23 UTC (rev 125829)
@@ -385,6 +385,9 @@
     mutable FrameLoaderStateMachine m_stateMachine;
     mutable IconController m_icon;
 
+    class FrameProgressTracker;
+    OwnPtr<FrameProgressTracker> m_progressTracker;
+
     FrameState m_state;
     FrameLoadType m_loadType;
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to