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