Chromium Code Reviews| Index: third_party/WebKit/Source/core/loader/FrameLoader.cpp |
| diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
| index aa26da1c588e5c2beb1e1a155008c065c3ff3948..57c9ade117b094ac79ff005cc4d939c0b3f1ab5e 100644 |
| --- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
| +++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp |
| @@ -720,12 +720,9 @@ void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip |
| ASSERT(!stateObject || frameLoadType == FrameLoadTypeBackForward); |
| // If we have a provisional request for a different document, a fragment scroll should cancel it. |
| - if (m_provisionalDocumentLoader) { |
| - m_provisionalDocumentLoader->stopLoading(); |
| - detachDocumentLoader(m_provisionalDocumentLoader); |
| - if (!m_frame->host()) |
| - return; |
| - } |
| + detachDocumentLoader(m_provisionalDocumentLoader); |
| + if (!m_frame->host()) |
| + return; |
| TemporaryChange<FrameLoadType> loadTypeChange(m_loadType, frameLoadType); |
| saveScrollState(); |
| @@ -1005,8 +1002,7 @@ void FrameLoader::stopAllLoaders() |
| if (m_inStopAllLoaders) |
| return; |
| - // Calling stopLoading() on the provisional document loader can blow away |
| - // the frame from underneath. |
| + // Stopping a document loader can blow away the frame from underneath. |
| RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); |
| m_inStopAllLoaders = true; |
| @@ -1017,20 +1013,21 @@ void FrameLoader::stopAllLoaders() |
| } |
| m_frame->document()->suppressLoadEvent(); |
| - // Don't stop loading the provisional loader if it is being protected (i.e. |
| - // it is about to be committed) See prepareForCommit() for more details. |
| - if (m_provisionalDocumentLoader && !m_protectProvisionalLoader) |
| - m_provisionalDocumentLoader->stopLoading(); |
| if (m_documentLoader) |
| - m_documentLoader->stopLoading(); |
| + m_documentLoader->fetcher()->stopFetching(); |
| m_frame->document()->cancelParsing(); |
| - |
| if (!m_protectProvisionalLoader) |
| detachDocumentLoader(m_provisionalDocumentLoader); |
| m_checkTimer.stop(); |
| m_frame->navigationScheduler().cancel(); |
| + // It's possible that the above actions won't have stopped loading if load |
| + // completion had been blocked on parsing or if we were in the middle of |
| + // committing an empty document. In that case, emulate a failed navigation. |
| + if (!m_provisionalDocumentLoader && m_documentLoader && m_frame->isLoading()) |
| + loadFailed(!m_documentLoader->sentDidFinishLoad() ? m_documentLoader.get() : nullptr, ResourceError::cancelledError(m_documentLoader->url())); |
|
Nate Chapin
2016/03/22 16:42:43
Unconditionally use m_documentLoader. It's probabl
|
| + |
| m_inStopAllLoaders = false; |
| } |
| @@ -1242,16 +1239,13 @@ void FrameLoader::detach() |
| } |
| } |
| -void FrameLoader::receivedMainResourceError(DocumentLoader* loader, const ResourceError& error) |
| +void FrameLoader::loadFailed(DocumentLoader* loader, const ResourceError& error) |
| { |
| // Retain because the stop may release the last reference to it. |
| RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); |
| RefPtrWillBeRawPtr<DocumentLoader> protectDocumentLoader(loader); |
| - // FIXME: We really ought to be able to just check for isCancellation() here, but there are some |
| - // ResourceErrors that setIsCancellation() but aren't created by ResourceError::cancelledError(). |
| - ResourceError c(ResourceError::cancelledError(KURL())); |
| - if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->owner()) { |
| + if (!error.isCancellation() && m_frame->owner()) { |
| // FIXME: For now, fallback content doesn't work cross process. |
| if (m_frame->owner()->isLocal()) |
| m_frame->deprecatedLocalOwner()->renderFallbackContent(); |
| @@ -1410,11 +1404,7 @@ void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, FrameLoadType ty |
| return; |
| m_frame->document()->cancelParsing(); |
| - |
| - if (m_provisionalDocumentLoader) { |
| - m_provisionalDocumentLoader->stopLoading(); |
| - detachDocumentLoader(m_provisionalDocumentLoader); |
| - } |
| + detachDocumentLoader(m_provisionalDocumentLoader); |
| // beforeunload fired above, and detaching a DocumentLoader can fire |
| // events, which can detach this frame. |