Index: Source/core/loader/FrameLoader.cpp |
diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp |
index e01198cdeb4ee1616956d3a34c0929078e904a76..03b94885b301a99c993018541c79dd8b9e7160d3 100644 |
--- a/Source/core/loader/FrameLoader.cpp |
+++ b/Source/core/loader/FrameLoader.cpp |
@@ -243,8 +243,10 @@ bool FrameLoader::closeURL() |
void FrameLoader::didExplicitOpen() |
{ |
// Calling document.open counts as committing the first real document load. |
- if (!m_stateMachine.committedFirstRealDocumentLoad()) |
+ if (!m_stateMachine.committedFirstRealDocumentLoad()) { |
m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); |
+ m_progressTracker->progressStarted(); |
+ } |
// Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results |
// from a subsequent window.document.open / window.document.write call. |
@@ -961,6 +963,7 @@ FrameLoadType FrameLoader::loadType() const |
return m_loadType; |
} |
+#if defined(ENABLE_LOAD_COMPLETION_HACKS) |
// This function is an incomprehensible mess and is only used in checkLoadCompleteForThisFrame. |
// If you're thinking of using it elsewhere, stop right now and reconsider your life. |
static bool isDocumentDoneLoading(Document* document) |
@@ -969,18 +972,15 @@ static bool isDocumentDoneLoading(Document* document) |
return true; |
if (document->loader()->isLoadingMainResource()) |
return false; |
- if (!document->loadEventFinished()) { |
- if (document->loader()->isLoading() || document->isDelayingLoadEvent()) |
- return false; |
- } |
+ if (!document->loadEventFinished()) |
+ return false; |
if (document->fetcher()->requestCount()) |
return false; |
if (document->processingLoadEvent()) |
return false; |
- if (document->hasActiveParser()) |
- return false; |
return true; |
} |
+#endif |
bool FrameLoader::checkLoadCompleteForThisFrame() |
{ |
@@ -1016,8 +1016,16 @@ bool FrameLoader::checkLoadCompleteForThisFrame() |
return true; |
if (m_provisionalDocumentLoader || !m_documentLoader) |
return false; |
+ |
+#if defined(ENABLE_LOAD_COMPLETION_HACKS) |
if (!isDocumentDoneLoading(m_frame->document()) && !m_inStopAllLoaders) |
return false; |
+#else |
+ if (m_inStopAllLoaders) |
+ m_frame->document()->suppressLoadEvent(); |
+ if (!m_frame->document()->loadEventFinished()) |
+ return false; |
+#endif |
m_state = FrameStateComplete; |
@@ -1276,6 +1284,8 @@ void FrameLoader::loadWithNavigationAction(const NavigationAction& action, Frame |
if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, shouldCheckMainWorldContentSecurityPolicy, isTransitionNavigation) || !shouldClose()) && m_policyDocumentLoader) { |
m_policyDocumentLoader->detachFromFrame(); |
m_policyDocumentLoader = nullptr; |
+ if (!m_stateMachine.committedFirstRealDocumentLoad()) |
+ m_state = FrameStateComplete; |
checkCompleted(); |
return; |
} |