Chromium Code Reviews| Index: Source/core/loader/FrameLoader.cpp |
| diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp |
| index aeb892669a02f2dce79ca35dbfdf5fe38d5850f0..7a3256f67aba76252c60967a4d70c7ed7ef8e4b0 100644 |
| --- a/Source/core/loader/FrameLoader.cpp |
| +++ b/Source/core/loader/FrameLoader.cpp |
| @@ -149,6 +149,7 @@ FrameLoader::FrameLoader(LocalFrame* frame, FrameLoaderClient* client) |
| , m_fetchContext(FrameFetchContext::create(frame)) |
| , m_inStopAllLoaders(false) |
| , m_isComplete(false) |
| + , m_currentLoaderNeedsStop(false) |
| , m_checkTimer(this, &FrameLoader::checkTimerFired) |
| , m_shouldCallCheckCompleted(false) |
| , m_didAccessInitialDocument(false) |
| @@ -615,6 +616,27 @@ void FrameLoader::started() |
| frame->loader().m_isComplete = false; |
| } |
| +void FrameLoader::onResponseReceived() |
| +{ |
| + checkCurrentDocumentLoaderNeedsStop(); |
| +} |
| + |
| +void FrameLoader::checkCurrentDocumentLoaderNeedsStop() |
|
Nate Chapin
2014/03/10 16:12:44
If this function is only called once, let's merge
mkosiba (inactive)
2014/03/11 23:24:08
sure, I was keeping it separate because I was expe
|
| +{ |
| + if (!m_currentLoaderNeedsStop) |
| + return; |
| + |
| + for (RefPtr<LocalFrame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) |
| + child->loader().stopAllLoaders(); |
| + if (m_documentLoader) |
| + m_documentLoader->stopLoading(); |
| + |
| + m_currentLoaderNeedsStop = false; |
| + |
| + if (m_state == FrameStateProvisional) |
| + m_progressTracker->progressStarted(); |
|
Nate Chapin
2014/03/10 16:12:44
It doesn't seem right to wait to send a progress t
mkosiba (inactive)
2014/03/11 23:24:08
this is the meat of the change. The problem is tha
Nate Chapin
2014/03/12 19:55:45
I talked with darin, and our thoughts were:
1. Le
|
| +} |
| + |
| void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSendReferrer shouldSendReferrer, Document* originDocument) |
| { |
| if (shouldSendReferrer == NeverSendReferrer) { |
| @@ -937,6 +959,9 @@ void FrameLoader::checkLoadCompleteForThisFrame() |
| { |
| ASSERT(m_client->hasWebView()); |
| + if (m_currentLoaderNeedsStop) |
|
Nate Chapin
2014/03/10 16:12:44
Why is this needed?
mkosiba (inactive)
2014/03/11 23:24:08
because otherwise we'll call
m_progressTracker
|
| + return; |
| + |
| if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) { |
| const ResourceError& error = m_provisionalDocumentLoader->mainDocumentError(); |
| if (error.isNull()) |
| @@ -1288,7 +1313,7 @@ void FrameLoader::loadWithNavigationAction(const NavigationAction& action, Frame |
| else if (m_documentLoader) |
| m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEncoding()); |
| - // stopAllLoaders can detach the LocalFrame, so protect it. |
| + // Stopping the provisional loader can detach the Frame, so protect it. |
| RefPtr<LocalFrame> protect(m_frame); |
| if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request) || !shouldClose()) && m_policyDocumentLoader) { |
| m_policyDocumentLoader->detachFromFrame(); |
| @@ -1296,26 +1321,24 @@ void FrameLoader::loadWithNavigationAction(const NavigationAction& action, Frame |
| return; |
| } |
| - // A new navigation is in progress, so don't clear the history's provisional item. |
| - stopAllLoaders(); |
| - |
| - // <rdar://problem/6250856> - In certain circumstances on pages with multiple frames, stopAllLoaders() |
| - // might detach the current FrameLoader, in which case we should bail on this newly defunct load. |
| - if (!m_frame->page() || !m_policyDocumentLoader) |
| - return; |
| - |
| if (isLoadingMainFrame()) |
| m_frame->page()->inspectorController().resume(); |
| m_frame->navigationScheduler().cancel(); |
| + if (m_provisionalDocumentLoader) |
| + m_provisionalDocumentLoader->stopLoading(); |
| + if (m_provisionalDocumentLoader) |
|
Nate Chapin
2014/03/10 16:12:44
Merge these 2 ifs? Or can stopLoading() null out t
mkosiba (inactive)
2014/03/11 23:24:08
merge - sure. call stopLoading() - no, since that
|
| + m_provisionalDocumentLoader->detachFromFrame(); |
| + m_checkTimer.stop(); |
| + |
| m_provisionalDocumentLoader = m_policyDocumentLoader.release(); |
| m_loadType = type; |
| m_state = FrameStateProvisional; |
| + m_currentLoaderNeedsStop = true; |
| if (formState) |
| m_client->dispatchWillSubmitForm(formState); |
| - m_progressTracker->progressStarted(); |
| if (m_provisionalDocumentLoader->isClientRedirect()) |
| m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url()); |
| m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->request().url()); |