15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 1002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 1302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * documentation and/or other materials provided with the distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 1602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * from this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/FetchInitiatorTypeNames.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentParser.h" 3606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/Event.h" 37e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/MemoryCache.h" 38e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceFetcher.h" 39e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceLoader.h" 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/LocalDOMWindow.h" 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/LocalFrame.h" 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/csp/ContentSecurityPolicy.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h" 4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/parser/TextResourceDecoder.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h" 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoaderClient.h" 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/UniqueIdentifier.h" 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/appcache/ApplicationCacheHost.h" 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h" 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h" 53e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h" 541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Logging.h" 551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h" 56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "platform/mhtml/ArchiveResource.h" 5751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/mhtml/ArchiveResourceCollection.h" 5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/mhtml/MHTMLArchive.h" 597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/network/ContentSecurityPolicyResponseHeaders.h" 6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/plugins/PluginData.h" 6151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SchemeRegistry.h" 6251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityPolicy.h" 637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "public/platform/Platform.h" 647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "public/platform/WebMimeRegistry.h" 65aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch#include "public/platform/WebThreadedDataReceiver.h" 66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Assertions.h" 67591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h" 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 71591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic bool isArchiveMIMEType(const String& mimeType) 72591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 73591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return mimeType == "multipart/related"; 74591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 75591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)DocumentLoader::DocumentLoader(LocalFrame* frame, const ResourceRequest& req, const SubstituteData& substituteData) 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) : m_frame(frame) 783464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch , m_fetcher(ResourceFetcher::create(this)) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_originalRequest(req) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_substituteData(substituteData) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_request(req) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_committed(false) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isClientRedirect(false) 847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch , m_replacesCurrentHistoryItem(false) 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_loadingMainResource(false) 86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_timeOfLastDataReceived(0.0) 877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_applicationCacheHost(ApplicationCacheHost::create(this)) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameLoader* DocumentLoader::frameLoader() const 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_frame) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 95f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return &m_frame->loader(); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ResourceLoader* DocumentLoader::mainResourceLoader() const 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_mainResource ? m_mainResource->loader() : 0; 101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DocumentLoader::~DocumentLoader() 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(!m_frame || !isLoading()); 1063464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch m_fetcher->clearDocumentLoader(); 107521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) clearMainResourceHandle(); 1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_applicationCacheHost->dispose(); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)unsigned long DocumentLoader::mainResourceIdentifier() const 1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_mainResource ? m_mainResource->identifier() : 0; 1145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 1155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Document* DocumentLoader::document() const 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 118f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (m_frame && m_frame->loader().documentLoader() == this) 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_frame->document(); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceRequest& DocumentLoader::originalRequest() const 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_originalRequest; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceRequest& DocumentLoader::request() const 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_request; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const KURL& DocumentLoader::url() const 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_request.url(); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 138f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void DocumentLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocumentNavigationSource sameDocumentNavigationSource) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) KURL oldURL = m_request.url(); 14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_originalRequest.setURL(newURL); 14251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_request.setURL(newURL); 143f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (sameDocumentNavigationSource == SameDocumentNavigationHistoryApi) { 144f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_request.setHTTPMethod("GET"); 145f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_request.setHTTPBody(nullptr); 146f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 14751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) clearRedirectChain(); 14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_isClientRedirect) 14951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) appendRedirect(oldURL); 15051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) appendRedirect(newURL); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 153d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const KURL& DocumentLoader::urlForHistory() const 154bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 155d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return unreachableURL().isEmpty() ? url() : unreachableURL(); 156bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 157bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::setMainDocumentError(const ResourceError& error) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 160591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_mainDocumentError = error; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::mainReceivedError(const ResourceError& error) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!error.isNull()); 16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading() || InspectorInstrumentation::isDebuggerPaused(m_frame)); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_applicationCacheHost->failedLoadingMainResource(); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frameLoader()) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setMainDocumentError(error); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearMainResourceLoader(); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frameLoader()->receivedMainResourceError(error); 173521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) clearMainResourceHandle(); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Cancels the data source's pending loads. Conceptually, a data source only loads 17702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// one document at a time, but one document may have many related resources. 17802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// stopLoading will stop all loads initiated by the data source, 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// but not loads initiated by child frames' data sources -- that's the WebFrame's job. 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::stopLoading() 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame); 183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DocumentLoader> protectLoader(this); 184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In some rare cases, calling FrameLoader::stopLoading could cause isLoading() to return false. 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (This can happen when there's a single XMLHttpRequest currently loading and stopLoading causes it 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to stop loading. Because of this, we need to save it so we don't return early. 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool loading = isLoading(); 18902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_committed) { 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Attempt to stop the frame if the document loader is loading, or if it is done loading but 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // still parsing. Failure to do so can cause a world leak. 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* doc = m_frame->document(); 19402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (loading || doc->parsing()) 196f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->loader().stopLoading(); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!loading) { 20010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_fetcher->stopFetching(); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 20210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch } 20302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_loadingMainResource) { 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Stop the main resource loader and let it send the cancelled message. 2067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); 2078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } else if (m_fetcher->isFetching()) { 20802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // The main resource loader already finished loading. Set the cancelled error on the 20953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // document and let the resourceLoaders send individual cancelled messages below. 2107757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch setMainDocumentError(ResourceError::cancelledError(m_request.url())); 2117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } else { 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If there are no resource loaders, we need to manufacture a cancelled message. 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // (A back/forward navigation has no resource loaders because its resources are cached.) 2147757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch mainReceivedError(ResourceError::cancelledError(m_request.url())); 2157757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 21602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_fetcher->stopFetching(); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::commitIfReady() 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_committed) { 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_committed = true; 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frameLoader()->commitProvisionalLoad(); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DocumentLoader::isLoading() const 229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (document() && document()->hasActiveParser()) 231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 23253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 23309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_loadingMainResource || m_fetcher->isFetching(); 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 236fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::notifyFinished(Resource* resource) 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_UNUSED(resource, m_mainResource == resource); 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_mainResource); 2407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 2417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch RefPtr<DocumentLoader> protect(this); 2427757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) { 244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) finishedLoading(m_mainResource->loadFinishTime()); 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) mainReceivedError(m_mainResource->resourceError()); 249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::finishedLoading(double finishTime) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading() || InspectorInstrumentation::isDebuggerPaused(m_frame)); 254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DocumentLoader> protect(this); 256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) double responseEndTime = finishTime; 258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!responseEndTime) 259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) responseEndTime = m_timeOfLastDataReceived; 260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!responseEndTime) 261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) responseEndTime = monotonicallyIncreasingTime(); 262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) timing()->setResponseEnd(responseEndTime); 263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) commitIfReady(); 265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frameLoader()) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!maybeCreateArchive()) { 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this is an empty document, it will not have actually been created yet. Commit dummy data so that 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // DocumentWriter::begin() gets called and creates the Document. 271591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_writer) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) commitData(0, 0); 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch endWriting(m_writer.get()); 276591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_mainDocumentError.isNull()) 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearMainResourceLoader(); 280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frameLoader()->stateMachine()->creatingInitialEmptyDocument()) 281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) frameLoader()->checkLoadComplete(); 282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If the document specified an application cache manifest, it violates the author's intent if we store it in the memory cache 284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // and deny the appcache the chance to intercept it in the future, so remove from the memory cache. 285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_frame) { 286d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_mainResource && m_frame->document()->hasAppCacheManifest()) 287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) memoryCache()->remove(m_mainResource.get()); 288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_applicationCacheHost->finishedLoadingMainResource(); 290521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) clearMainResourceHandle(); 291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool DocumentLoader::isRedirectAfterPost(const ResourceRequest& newRequest, const ResourceResponse& redirectResponse) 294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int status = redirectResponse.httpStatusCode(); 296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (((status >= 301 && status <= 303) || status == 307) 297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) && m_originalRequest.httpMethod() == "POST") 298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 303197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool DocumentLoader::shouldContinueForNavigationPolicy(const ResourceRequest& request, ContentSecurityPolicyCheck shouldCheckMainWorldContentSecurityPolicy, bool isTransitionNavigation) 30453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 30553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Don't ask if we are loading an empty URL. 30609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (request.url().isEmpty() || m_substituteData.isValid()) 30753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 30853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 30953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // If we're loading content into a subframe, check against the parent's Content Security Policy 310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // and kill the load if that check fails, unless we should bypass the main world's CSP. 311f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME: CSP checks are broken for OOPI. For now, this policy always allows frames with a remote parent... 312197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if ((shouldCheckMainWorldContentSecurityPolicy == CheckContentSecurityPolicy) && (m_frame->deprecatedLocalOwner() && !m_frame->deprecatedLocalOwner()->document().contentSecurityPolicy()->allowChildFrameFromSource(request.url()))) { 31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Fire a load event, as timing attacks would otherwise reveal that the 31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // frame was blocked. This way, it looks like every other cross-origin 31509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // page load. 31609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_frame->document()->enforceSandboxFlags(SandboxOrigin); 317f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_frame->owner()->dispatchLoad(); 31853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 31909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 32053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 32151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) NavigationPolicy policy = m_triggeringAction.policy(); 322197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch policy = frameLoader()->client()->decidePolicyForNavigation(request, this, policy, isTransitionNavigation); 323e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (policy == NavigationPolicyCurrentTab) 324e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return true; 325e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (policy == NavigationPolicyIgnore) 326e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return false; 32776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) if (!LocalDOMWindow::allowPopUp(*m_frame) && !UserGestureIndicator::processingUserGesture()) 328f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return false; 3297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch frameLoader()->client()->loadURLExternally(request, policy); 330e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return false; 33153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 33253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 333fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::redirectReceived(Resource* resource, ResourceRequest& request, const ResourceResponse& redirectResponse) 334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_UNUSED(resource, resource == m_mainResource); 336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) willSendRequest(request, redirectResponse); 337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 33909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void DocumentLoader::updateRequest(Resource* resource, const ResourceRequest& request) 34009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 34109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT_UNUSED(resource, resource == m_mainResource); 34209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_request = request; 34309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 34409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 345c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)static bool isFormSubmission(NavigationType type) 346c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){ 347c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) return type == NavigationTypeFormSubmitted || type == NavigationTypeFormResubmitted; 348c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)} 349c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::willSendRequest(ResourceRequest& newRequest, const ResourceResponse& redirectResponse) 351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Note that there are no asserts here as there are for the other callbacks. This is due to the 353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // fact that this "callback" is sent when starting every load, and the state of callback 35402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // deferrals plays less of a part in this function in preventing the bad behavior deferring 355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // callbacks is meant to prevent. 356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!newRequest.isNull()); 357c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (isFormSubmission(m_triggeringAction.type()) && !m_frame->document()->contentSecurityPolicy()->allowFormAction(newRequest.url())) { 3587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url())); 359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(timing()->fetchStart()); 363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!redirectResponse.isNull()) { 364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If the redirecting url is not allowed to display content from the target origin, 365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // then block the redirect. 366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<SecurityOrigin> redirectingOrigin = SecurityOrigin::create(redirectResponse.url()); 367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!redirectingOrigin->canDisplay(newRequest.url())) { 368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FrameLoader::reportLocalLoadFailed(m_frame, newRequest.url().string()); 3697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url())); 370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) timing()->addRedirect(redirectResponse.url(), newRequest.url()); 373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If we're fielding a redirect in response to a POST, force a load from origin, since 376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // this is a common site technique to return to a page viewing some data that the POST 377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // just modified. 3788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (newRequest.cachePolicy() == UseProtocolCachePolicy && isRedirectAfterPost(newRequest, redirectResponse)) 379f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) newRequest.setCachePolicy(ReloadBypassingCache); 380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_request = newRequest; 382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 38353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (redirectResponse.isNull()) 38453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return; 385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 386e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch appendRedirect(newRequest.url()); 38793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) frameLoader()->client()->dispatchDidReceiveServerRedirectForProvisionalLoad(); 388197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!shouldContinueForNavigationPolicy(newRequest, CheckContentSecurityPolicy)) 389c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); 390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochstatic bool canShowMIMEType(const String& mimeType, Page* page) 3937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 39451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (blink::Platform::current()->mimeRegistry()->supportsMIMEType(mimeType) == blink::WebMimeRegistry::IsSupported) 3957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return true; 3967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch PluginData* pluginData = page->pluginData(); 3977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return !mimeType.isEmpty() && pluginData && pluginData->supportsMimeType(mimeType); 3987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 3997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 40053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool DocumentLoader::shouldContinueForResponse() const 401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_substituteData.isValid()) 40353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 40553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) int statusCode = m_response.httpStatusCode(); 40653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (statusCode == 204 || statusCode == 205) { 40753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // The server does not want us to replace the page contents. 40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 41053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 41153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (contentDispositionType(m_response.httpHeaderField("Content-Disposition")) == ContentDispositionAttachment) { 41253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // The server wants us to download instead of replacing the page contents. 41353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Downloading is handled by the embedder, but we still get the initial 41453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // response so that we can ignore it and clean up properly. 41553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 41653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 41753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4187757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (!canShowMIMEType(m_response.mimeType(), m_frame->page())) 41953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 42053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 42153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Prevent remote web archives from loading because they can claim to be from any domain and thus avoid cross-domain security checks. 42253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (equalIgnoringCase("multipart/related", m_response.mimeType()) && !SchemeRegistry::shouldTreatURLSchemeAsLocal(m_request.url().protocol())) 42353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 42453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 42553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid DocumentLoader::cancelLoadAfterXFrameOptionsOrCSPDenied(const ResourceResponse& response) 4297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 4307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci InspectorInstrumentation::continueAfterXFrameOptionsDenied(m_frame, this, mainResourceIdentifier(), response); 4317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci frame()->document()->enforceSandboxFlags(SandboxOrigin); 4337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (FrameOwner* owner = frame()->owner()) 4347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci owner->dispatchLoad(); 4357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // The load event might have detached this frame. In that case, the load will already have been cancelled during detach. 4377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (frameLoader()) 4387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); 4397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 4407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 4417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 442fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::responseReceived(Resource* resource, const ResourceResponse& response) 443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_UNUSED(resource, m_mainResource == resource); 445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DocumentLoader> protect(this); 44653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 44753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_applicationCacheHost->didReceiveResponseForMainResource(response); 448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // The memory cache doesn't understand the application cache or its caching rules. So if a main resource is served 45053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // from the application cache, ensure we don't save the result for future use. All responses loaded 451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // from appcache will have a non-zero appCacheID(). 452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (response.appCacheID()) 453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) memoryCache()->remove(m_mainResource.get()); 454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DEFINE_STATIC_LOCAL(AtomicString, xFrameOptionHeader, ("x-frame-options", AtomicString::ConstructFromLiteral)); 456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTTPHeaderMap::const_iterator it = response.httpHeaderFields().find(xFrameOptionHeader); 457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (it != response.httpHeaderFields().end()) { 458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) String content = it->value; 4597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (frameLoader()->shouldInterruptLoadForXFrameOptions(content, response.url(), mainResourceIdentifier())) { 460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) String message = "Refused to display '" + response.url().elidedString() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'."; 461e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, message); 4627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci consoleMessage->setRequestIdentifier(mainResourceIdentifier()); 4637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci frame()->document()->addConsoleMessage(consoleMessage.release()); 4647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci cancelLoadAfterXFrameOptionsOrCSPDenied(response); 466926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 469926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_contentSecurityPolicy = ContentSecurityPolicy::create(); 4717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_contentSecurityPolicy->setOverrideURLForSelf(response.url()); 4727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_contentSecurityPolicy->didReceiveHeaders(ContentSecurityPolicyResponseHeaders(response)); 4737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_contentSecurityPolicy->allowAncestors(m_frame, response.url())) { 4747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci cancelLoadAfterXFrameOptionsOrCSPDenied(response); 4757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 4767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 4777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); 479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 48053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_response = response; 481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 482591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (isArchiveMIMEType(m_response.mimeType()) && m_mainResource->dataBufferingPolicy() != BufferData) 483591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_mainResource->setDataBufferingPolicy(BufferData); 484591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 48553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!shouldContinueForResponse()) { 4865267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) InspectorInstrumentation::continueWithPolicyIgnore(m_frame, this, m_mainResource->identifier(), m_response); 487c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); 488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_response.isHTTP()) { 492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) int status = m_response.httpStatusCode(); 493f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME: Fallback content only works if the parent is in the same processs. 494f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if ((status < 200 || status >= 300) && m_frame->owner()) { 495f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!m_frame->deprecatedLocalOwner()) { 496f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ASSERT_NOT_REACHED(); 497f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } else if (m_frame->deprecatedLocalOwner()->isObjectElement()) { 498f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_frame->deprecatedLocalOwner()->renderFallbackContent(); 499f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // object elements are no longer rendered after we fallback, so don't 500f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // keep trying to process data from their load 501f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); 502f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 507a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void DocumentLoader::ensureWriter(const AtomicString& mimeType, const KURL& overridingURL) 508591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 509591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (m_writer) 510591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 511591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 512a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) const AtomicString& encoding = overrideEncoding().isNull() ? response().textEncodingName() : overrideEncoding(); 5137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 5147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Prepare a DocumentInit before clearing the frame, because it may need to 5157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // inherit an aliased security context. 5167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DocumentInit init(url(), m_frame); 5177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci init.withNewRegistrationContext(); 5187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_frame->loader().clear(); 5197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(m_frame->page()); 5207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 5217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_writer = createWriterFor(0, init, mimeType, encoding, false); 522591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_writer->setDocumentWasLoadedAsPartOfNavigation(); 523591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // This should be set before receivedFirstData(). 524591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!overridingURL.isEmpty()) 525591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_frame->document()->setBaseURLOverride(overridingURL); 526591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 527591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // Call receivedFirstData() exactly once per load. 528591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch frameLoader()->receivedFirstData(); 5293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField("Refresh"), Document::HttpRefreshFromHeader); 530591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 531591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 532591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::commitData(const char* bytes, size_t length) 533591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 53409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ensureWriter(m_response.mimeType()); 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_frame->document()->parsing()); 536591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_writer->addData(bytes, length); 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 539fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::dataReceived(Resource* resource, const char* data, int length) 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 541926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(data); 542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(length); 543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_UNUSED(resource, resource == m_mainResource); 544926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_response.isNull()); 545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); 546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 547591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // Both unloading the old page and parsing the new page may execute JavaScript which destroys the datasource 548591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // by starting a new load, so retain temporarily. 5497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame); 550591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<DocumentLoader> protectLoader(this); 551591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 55253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_applicationCacheHost->mainResourceDataReceived(data, length); 553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_timeOfLastDataReceived = monotonicallyIncreasingTime(); 554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 555591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch commitIfReady(); 556591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!frameLoader()) 557591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 558591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (isArchiveMIMEType(response().mimeType())) 559591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 560591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch commitData(data, length); 561591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 562591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // If we are sending data to MediaDocument, we should stop here 563591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // and cancel the request. 5649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (m_frame && m_frame->document()->isMediaDocument()) 5657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch cancelMainResourceLoad(ResourceError::cancelledError(m_request.url())); 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 568e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid DocumentLoader::clearRedirectChain() 569e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 570e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_redirectChain.clear(); 571e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 572e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 573e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid DocumentLoader::appendRedirect(const KURL& url) 574e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 575e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_redirectChain.append(url); 576e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch} 577e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::detachFromFrame() 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_frame); 5817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protectFrame(m_frame); 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<DocumentLoader> protectLoader(this); 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // It never makes sense to have a document loader that is detached from its 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // frame have any loads active, so go ahead and kill all the loads. 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stopLoading(); 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 588e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_applicationCacheHost->setApplicationCache(0); 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorInstrumentation::loaderDetachedFromFrame(m_frame, this); 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame = 0; 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::clearMainResourceLoader() 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_loadingMainResource = false; 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 598521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void DocumentLoader::clearMainResourceHandle() 599521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 600521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!m_mainResource) 601521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 602521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) m_mainResource->removeClient(this); 603521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) m_mainResource = 0; 604521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 605521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 60609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool DocumentLoader::maybeCreateArchive() 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 60843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) // Only the top-frame can load MHTML. 60943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (m_frame->tree().parent()) 61043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) return false; 61143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 61209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Give the archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. 61309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!isArchiveMIMEType(m_response.mimeType())) 61409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return false; 61509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 61609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(m_mainResource); 61709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_archive = MHTMLArchive::create(m_response.url(), m_mainResource->resourceBuffer()); 61809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Invalid MHTML. 61909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!m_archive || !m_archive->mainResource()) { 62009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_archive.clear(); 62109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return false; 62209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 62302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) addAllArchiveResources(m_archive.get()); 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ArchiveResource* mainResource = m_archive->mainResource(); 626591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 627591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // The origin is the MHTML file, we need to set the base URL to the document encoded in the MHTML so 628591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // relative URLs are resolved properly. 629591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ensureWriter(mainResource->mimeType(), m_archive->mainResource()->url()); 630591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 63143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) // The Document has now been created. 63243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) document()->enforceSandboxFlags(SandboxAll); 63343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) commitData(mainResource->data()->data(), mainResource->data()->size()); 63509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return true; 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void DocumentLoader::addAllArchiveResources(MHTMLArchive* archive) 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 64081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) ASSERT(archive); 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_archiveResourceCollection) 642197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_archiveResourceCollection = ArchiveResourceCollection::create(); 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_archiveResourceCollection->addAllResources(archive); 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 64681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void DocumentLoader::prepareSubframeArchiveLoadIfNeeded() 6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 648f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!m_frame->tree().parent() || !m_frame->tree().parent()->isLocalFrame()) 64981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return; 65081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 6515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ArchiveResourceCollection* parentCollection = toLocalFrame(m_frame->tree().parent())->loader().documentLoader()->m_archiveResourceCollection.get(); 65281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!parentCollection) 65381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return; 65481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 655f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_archive = parentCollection->popSubframeArchive(m_frame->tree().uniqueName(), m_request.url()); 65681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 65781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!m_archive) 65881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return; 65981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) addAllArchiveResources(m_archive.get()); 66081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 66181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) ArchiveResource* mainResource = m_archive->mainResource(); 66281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) m_substituteData = SubstituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL()); 6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool DocumentLoader::scheduleArchiveLoad(Resource* cachedResource, const ResourceRequest& request) 6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 66793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!m_archive) 66893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 67093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ASSERT(m_archiveResourceCollection); 67193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ArchiveResource* archiveResource = m_archiveResourceCollection->archiveResourceForURL(request.url()); 672e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (!archiveResource) { 673fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch cachedResource->error(Resource::LoadError); 674e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return true; 675e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 67793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) cachedResource->setLoading(true); 67893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) cachedResource->responseReceived(archiveResource->response()); 679e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch SharedBuffer* data = archiveResource->data(); 680e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (data) 681e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch cachedResource->appendData(data->data(), data->size()); 68293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) cachedResource->finish(); 68393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return true; 6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 686a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& DocumentLoader::responseMIMEType() const 6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_response.mimeType(); 6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const KURL& DocumentLoader::unreachableURL() const 6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_substituteData.failingURL(); 6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::setDefersLoading(bool defers) 6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 69853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Multiple frames may be loading the same main resource simultaneously. If deferral state changes, 69953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // each frame's DocumentLoader will try to send a setDefersLoading() to the same underlying ResourceLoader. Ensure only 70053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // the "owning" DocumentLoader does so, as setDefersLoading() is not resilient to setting the same value repeatedly. 7013464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch if (mainResourceLoader() && mainResourceLoader()->isLoadedBy(m_fetcher.get())) 702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) mainResourceLoader()->setDefersLoading(defers); 70353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 7048abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_fetcher->setDefersLoading(defers); 7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DocumentLoader::maybeLoadEmpty() 7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool shouldLoadEmpty = !m_substituteData.isValid() && (m_request.url().isEmpty() || SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(m_request.url().protocol())); 71053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!shouldLoadEmpty) 711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_request.url().isEmpty() && !frameLoader()->stateMachine()->creatingInitialEmptyDocument()) 714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_request.setURL(blankURL()); 715a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) m_response = ResourceResponse(m_request.url(), "text/html", 0, nullAtom, String()); 716926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) finishedLoading(monotonicallyIncreasingTime()); 717926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::startLoadingMainResource() 7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7223c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch RefPtr<DocumentLoader> protect(this); 7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_mainDocumentError = ResourceError(); 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) timing()->markNavigationStart(); 725926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_mainResource); 726926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!m_loadingMainResource); 727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_loadingMainResource = true; 728926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (maybeLoadEmpty()) 730926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 732926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(timing()->navigationStart()); 733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(!timing()->fetchStart()); 734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) timing()->markFetchStart(); 735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) willSendRequest(m_request, ResourceResponse()); 736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 737d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // willSendRequest() may lead to our LocalFrame being detached or cancelling the load via nulling the ResourceRequest. 738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_frame || m_request.isNull()) 739926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 74153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_applicationCacheHost->willStartLoadingMainResource(m_request); 74281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) prepareSubframeArchiveLoadIfNeeded(); 743926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 744926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ResourceRequest request(m_request); 745926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DEFINE_STATIC_LOCAL(ResourceLoaderOptions, mainResourceLoadOptions, 7467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci (DoNotBufferData, AllowStoredCredentials, ClientRequestedCredentials, CheckContentSecurityPolicy, DocumentContext)); 747fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch FetchRequest cachedResourceRequest(request, FetchInitiatorTypeNames::document, mainResourceLoadOptions); 74809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_mainResource = m_fetcher->fetchMainResource(cachedResourceRequest, m_substituteData); 749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_mainResource) { 75009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_request = ResourceRequest(); 751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If the load was aborted by clearing m_request, it's possible the ApplicationCacheHost 752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // is now in a state where starting an empty load will be inconsistent. Replace it with 753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // a new ApplicationCacheHost. 7547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_applicationCacheHost = ApplicationCacheHost::create(this); 755926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) maybeLoadEmpty(); 756926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 757926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 758926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_mainResource->addClient(this); 759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // A bunch of headers are set when the underlying ResourceLoader is created, and m_request needs to include those. 761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (mainResourceLoader()) 762926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) request = mainResourceLoader()->originalRequest(); 763926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If there was a fragment identifier on m_request, the cache will have stripped it. m_request should include 764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // the fragment identifier, so add that back in. 765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (equalIgnoringFragmentIdentifier(m_request.url(), request.url())) 766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) request.setURL(m_request.url()); 76709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_request = request; 7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 770926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::cancelMainResourceLoad(const ResourceError& resourceError) 7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 772926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RefPtr<DocumentLoader> protect(this); 7737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ResourceError error = resourceError.isNull() ? ResourceError::cancelledError(m_request.url()) : resourceError; 774926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 775926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (mainResourceLoader()) 776926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) mainResourceLoader()->cancel(error); 777926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 778926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) mainReceivedError(error); 7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 781aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochvoid DocumentLoader::attachThreadedDataReceiver(PassOwnPtr<blink::WebThreadedDataReceiver> threadedDataReceiver) 782aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{ 783aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (mainResourceLoader()) 784aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch mainResourceLoader()->attachThreadedDataReceiver(threadedDataReceiver); 785aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch} 786aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 787591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::endWriting(DocumentWriter* writer) 788591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 789591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ASSERT_UNUSED(writer, m_writer == writer); 790591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_writer->end(); 791591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_writer.clear(); 792591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 793591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 7947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<DocumentWriter> DocumentLoader::createWriterFor(const Document* ownerDocument, const DocumentInit& init, const AtomicString& mimeType, const AtomicString& encoding, bool dispatch) 795591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 7967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci LocalFrame* frame = init.frame(); 797f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 7981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (frame->document()) 799e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) frame->document()->prepareForDestruction(); 800e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 8017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!init.shouldReuseDefaultView()) 80276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) frame->setDOMWindow(LocalDOMWindow::create(*frame)); 803591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 804f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) RefPtrWillBeRawPtr<Document> document = frame->domWindow()->installNewDocument(mimeType, init); 805591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (ownerDocument) { 806591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch document->setCookieURL(ownerDocument->cookieURL()); 807591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch document->setSecurityOrigin(ownerDocument->securityOrigin()); 808c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (ownerDocument->isTransitionDocument()) 809c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) document->setIsTransitionDocument(); 810591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 811591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 812f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame->loader().didBeginDocument(dispatch); 813591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 814e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return DocumentWriter::create(document.get(), mimeType, encoding); 815591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 816591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 817a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& DocumentLoader::mimeType() const 818591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 819591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (m_writer) 820591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return m_writer->mimeType(); 821591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return m_response.mimeType(); 822591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 823591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 82451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void DocumentLoader::setUserChosenEncoding(const String& charset) 82551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 82651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_writer) 82751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_writer->setUserChosenEncoding(charset); 82851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 82951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 8307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// This is only called by FrameLoader::replaceDocumentWhileExecutingJavaScriptURL() 8317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid DocumentLoader::replaceDocumentWhileExecutingJavaScriptURL(const DocumentInit& init, const String& source, Document* ownerDocument) 832591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 8337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_writer = createWriterFor(ownerDocument, init, mimeType(), m_writer ? m_writer->encoding() : emptyAtom, true); 834591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!source.isNull()) 835591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_writer->appendReplacingData(source); 836591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch endWriting(m_writer.get()); 837591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 838591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 839c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 840