void DocumentLoader::setupForReplaceByMIMEType(const String& newMIMEType) { if (!m_gotFirstByte) return; String oldMIMEType = m_response.mimeType(); if (!doesProgressiveLoad(oldMIMEType)) { frameLoader()->revertToProvisional(this); setupForReplace(); RefPtr<SharedBuffer> resourceData = mainResourceData(); commitLoad(resourceData->data(), resourceData->size()); } frameLoader()->finishedLoadingDocument(this); m_frame->loader()->end(); frameLoader()->setReplacing(); m_gotFirstByte = false; if (doesProgressiveLoad(newMIMEType)) { frameLoader()->revertToProvisional(this); setupForReplace(); } stopLoadingSubresources(); stopLoadingPlugIns(); #if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size clearArchiveResources(); #endif }
void DocumentLoader::setupForReplaceByMIMEType(const String& newMIMEType) { if (!m_gotFirstByte) return; String oldMIMEType = m_response.mimeType(); if (!doesProgressiveLoad(oldMIMEType)) { frameLoader()->client()->revertToProvisionalState(this); setupForReplace(); RefPtr<SharedBuffer> resourceData = mainResourceData(); commitLoad(resourceData->data(), resourceData->size()); } frameLoader()->finishedLoadingDocument(this); m_writer.end(); frameLoader()->setReplacing(); m_gotFirstByte = false; if (doesProgressiveLoad(newMIMEType)) { frameLoader()->client()->revertToProvisionalState(this); setupForReplace(); } stopLoadingSubresources(); stopLoadingPlugIns(); #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML) clearArchiveResources(); #endif }
// Cancels the data source's pending loads. Conceptually, a data source only loads // one document at a time, but one document may have many related resources. // stopLoading will stop all loads initiated by the data source, // but not loads initiated by child frames' data sources -- that's the WebFrame's job. void DocumentLoader::stopLoading() { RefPtr<Frame> protectFrame(m_frame); RefPtr<DocumentLoader> protectLoader(this); // In some rare cases, calling FrameLoader::stopLoading could cause isLoading() to return false. // (This can happen when there's a single XMLHttpRequest currently loading and stopLoading causes it // to stop loading. Because of this, we need to save it so we don't return early. bool loading = isLoading(); if (m_committed) { // Attempt to stop the frame if the document loader is loading, or if it is done loading but // still parsing. Failure to do so can cause a world leak. Document* doc = m_frame->document(); if (loading || doc->parsing()) m_frame->loader()->stopLoading(UnloadEventPolicyNone); } // Always cancel multipart loaders cancelAll(m_multipartResourceLoaders); clearArchiveResources(); if (!loading) { // If something above restarted loading we might run into mysterious crashes like // https://bugs.webkit.org/show_bug.cgi?id=62764 and <rdar://problem/9328684> ASSERT(!isLoading()); return; } // We might run in to infinite recursion if we're stopping loading as the result of // detaching from the frame, so break out of that recursion here. // See <rdar://problem/9673866> for more details. if (m_isStopping) return; m_isStopping = true; FrameLoader* frameLoader = DocumentLoader::frameLoader(); if (isLoadingMainResource()) // Stop the main resource loader and let it send the cancelled message. cancelMainResourceLoad(frameLoader->cancelledError(m_request)); else if (!m_resourceLoaders.isEmpty()) // The main resource loader already finished loading. Set the cancelled error on the // document and let the resourceLoaders send individual cancelled messages below. setMainDocumentError(frameLoader->cancelledError(m_request)); else // If there are no resource loaders, we need to manufacture a cancelled message. // (A back/forward navigation has no resource loaders because its resources are cached.) mainReceivedError(frameLoader->cancelledError(m_request)); stopLoadingSubresources(); m_isStopping = false; }
void DocumentLoader::setupForReplace() { if (!mainResourceData()) return; maybeFinishLoadingMultipartContent(); maybeCreateArchive(); m_writer.end(); frameLoader()->setReplacing(); m_gotFirstByte = false; stopLoadingSubresources(); stopLoadingPlugIns(); #if ENABLE(WEB_ARCHIVE) || ENABLE(MHTML) clearArchiveResources(); #endif }