Title: [126483] trunk/Source/WebCore
- Revision
- 126483
- Author
- jap...@chromium.org
- Date
- 2012-08-23 14:26:07 -0700 (Thu, 23 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 (126482 => 126483)
--- trunk/Source/WebCore/ChangeLog 2012-08-23 21:01:27 UTC (rev 126482)
+++ trunk/Source/WebCore/ChangeLog 2012-08-23 21:26:07 UTC (rev 126483)
@@ -1,3 +1,29 @@
+2012-08-23 Nate Chapin <jap...@chromium.org>
+
+ 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-23 Dana Jansens <dan...@chromium.org>
[chromium] Create sharedQuadState at same time as creating quads and give them to the quadSink
Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (126482 => 126483)
--- trunk/Source/WebCore/loader/FrameLoader.cpp 2012-08-23 21:01:27 UTC (rev 126482)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp 2012-08-23 21:26:07 UTC (rev 126483)
@@ -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,8 +1124,7 @@
void FrameLoader::prepareForLoadStart()
{
- if (Page* page = m_frame->page())
- page->progress()->progressStarted(m_frame);
+ m_progressTracker->progressStarted();
m_client->dispatchDidStartProvisionalLoad();
// Notify accessibility.
@@ -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 (126482 => 126483)
--- trunk/Source/WebCore/loader/FrameLoader.h 2012-08-23 21:01:27 UTC (rev 126482)
+++ trunk/Source/WebCore/loader/FrameLoader.h 2012-08-23 21:26:07 UTC (rev 126483)
@@ -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
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes