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)
33fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch#include "FetchInitiatorTypeNames.h"
34f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "bindings/v8/ScriptController.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/dom/DOMImplementation.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentParser.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Event.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentWriter.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoaderClient.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/ResourceLoader.h"
45591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/loader/SinkDocument.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/TextResourceDecoder.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/UniqueIdentifier.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/appcache/ApplicationCacheHost.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/archive/ArchiveResourceCollection.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/archive/MHTMLArchive.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/cache/MemoryCache.h"
523464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch#include "core/loader/cache/ResourceFetcher.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/DOMWindow.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Settings.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/Logging.h"
597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/plugins/PluginData.h"
607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "public/platform/Platform.h"
617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "public/platform/WebMimeRegistry.h"
62e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "weborigin/SchemeRegistry.h"
63e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "weborigin/SecurityPolicy.h"
64591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Assertions.h"
65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h"
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void cancelAll(const ResourceLoaderSet& loaders)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<ResourceLoader> > loadersCopy;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    copyToVector(loaders, loadersCopy);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t size = loadersCopy.size();
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < size; ++i)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        loadersCopy[i]->cancel();
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void setAllDefersLoading(const ResourceLoaderSet& loaders, bool defers)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<RefPtr<ResourceLoader> > loadersCopy;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    copyToVector(loaders, loadersCopy);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t size = loadersCopy.size();
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < size; ++i)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        loadersCopy[i]->setDefersLoading(defers);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic bool isArchiveMIMEType(const String& mimeType)
88591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
89591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return mimeType == "multipart/related";
90591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
91591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DocumentLoader::DocumentLoader(const ResourceRequest& req, const SubstituteData& substituteData)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_deferMainResourceDataLoad(true)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frame(0)
953464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    , m_fetcher(ResourceFetcher::create(this))
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_originalRequest(req)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_substituteData(substituteData)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_originalRequestCopy(req)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_request(req)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_committed(false)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isStopping(false)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isClientRedirect(false)
1037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    , m_replacesCurrentHistoryItem(false)
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_loadingMainResource(false)
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_timeOfLastDataReceived(0.0)
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_identifierForLoadWithoutResourceLoader(0)
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_dataLoadTimer(this, &DocumentLoader::handleSubstituteDataLoadNow)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_applicationCacheHost(adoptPtr(new ApplicationCacheHost(this)))
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameLoader* DocumentLoader::frameLoader() const
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_frame->loader();
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ResourceLoader* DocumentLoader::mainResourceLoader() const
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_mainResource ? m_mainResource->loader() : 0;
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DocumentLoader::~DocumentLoader()
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_frame || frameLoader()->activeDocumentLoader() != this || !isLoading());
1273464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    m_fetcher->clearDocumentLoader();
128521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    clearMainResourceHandle();
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)PassRefPtr<SharedBuffer> DocumentLoader::mainResourceData() const
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
133591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ASSERT(isArchiveMIMEType(m_response.mimeType()));
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_substituteData.isValid())
13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return m_substituteData.content()->copy();
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_mainResource)
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_mainResource->resourceBuffer();
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)unsigned long DocumentLoader::mainResourceIdentifier() const
1425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
1435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return m_mainResource ? m_mainResource->identifier() : m_identifierForLoadWithoutResourceLoader;
1445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
1455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Document* DocumentLoader::document() const
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_frame && m_frame->loader()->documentLoader() == this)
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_frame->document();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceRequest& DocumentLoader::originalRequest() const
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_originalRequest;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceRequest& DocumentLoader::originalRequestCopy() const
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_originalRequestCopy;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceRequest& DocumentLoader::request() const
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_request;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceRequest& DocumentLoader::request()
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_request;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const KURL& DocumentLoader::url() const
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return request().url();
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::replaceRequestURLForSameDocumentNavigation(const KURL& url)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_originalRequestCopy.setURL(url);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_request.setURL(url);
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::setRequest(const ResourceRequest& req)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Replacing an unreachable URL with alternate content looks like a server-side
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // redirect at this point, but we can replace a committed dataSource.
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool handlingUnreachableURL = false;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    handlingUnreachableURL = m_substituteData.isValid() && !m_substituteData.failingURL().isEmpty();
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (handlingUnreachableURL)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_committed = false;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We should never be getting a redirect callback after the data
19602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // source is committed, except in the unreachable URL case. It
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // would be a WebFoundation bug if it sent a redirect callback after commit.
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_committed);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_request = req;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::setMainDocumentError(const ResourceError& error)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
205591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_mainDocumentError = error;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::mainReceivedError(const ResourceError& error)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!error.isNull());
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading());
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_applicationCacheHost->failedLoadingMainResource();
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frameLoader())
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setMainDocumentError(error);
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearMainResourceLoader();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameLoader()->receivedMainResourceError(error);
220521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    clearMainResourceHandle();
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Cancels the data source's pending loads.  Conceptually, a data source only loads
22402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// one document at a time, but one document may have many related resources.
22502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// stopLoading will stop all loads initiated by the data source,
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// but not loads initiated by child frames' data sources -- that's the WebFrame's job.
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::stopLoading()
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<Frame> protectFrame(m_frame);
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DocumentLoader> protectLoader(this);
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In some rare cases, calling FrameLoader::stopLoading could cause isLoading() to return false.
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // (This can happen when there's a single XMLHttpRequest currently loading and stopLoading causes it
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // to stop loading. Because of this, we need to save it so we don't return early.
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool loading = isLoading();
23602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_committed) {
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Attempt to stop the frame if the document loader is loading, or if it is done loading but
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // still  parsing. Failure to do so can cause a world leak.
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Document* doc = m_frame->document();
24102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (loading || doc->parsing())
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_frame->loader()->stopLoading(UnloadEventPolicyNone);
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Always cancel multipart loaders
24753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    cancelAll(m_multipartResourceLoaders);
24802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearArchiveResources();
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!loading) {
25202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // If something above restarted loading we might run into mysterious crashes like
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // https://bugs.webkit.org/show_bug.cgi?id=62764 and <rdar://problem/9328684>
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!isLoading());
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // We might run in to infinite recursion if we're stopping loading as the result of
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // detaching from the frame, so break out of that recursion here.
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // See <rdar://problem/9673866> for more details.
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isStopping)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isStopping = true;
26502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (isLoadingMainResource()) {
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Stop the main resource loader and let it send the cancelled message.
2687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        cancelMainResourceLoad(ResourceError::cancelledError(m_request.url()));
2697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    } else if (!m_resourceLoaders.isEmpty()) {
27002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        // The main resource loader already finished loading. Set the cancelled error on the
27153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // document and let the resourceLoaders send individual cancelled messages below.
2727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        setMainDocumentError(ResourceError::cancelledError(m_request.url()));
2737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    } else {
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If there are no resource loaders, we need to manufacture a cancelled message.
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // (A back/forward navigation has no resource loaders because its resources are cached.)
2767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        mainReceivedError(ResourceError::cancelledError(m_request.url()));
2777757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
27802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopLoadingSubresources();
28002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isStopping = false;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::commitIfReady()
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_committed) {
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_committed = true;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frameLoader()->commitProvisionalLoad();
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DocumentLoader::isLoading() const
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (document() && document()->hasActiveParser())
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
29653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
29753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return isLoadingMainResource() || !m_resourceLoaders.isEmpty();
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
300fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::notifyFinished(Resource* resource)
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_UNUSED(resource, m_mainResource == resource);
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(m_mainResource);
3047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
3057757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RefPtr<DocumentLoader> protect(this);
3067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) {
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        finishedLoading(m_mainResource->loadFinishTime());
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    mainReceivedError(m_mainResource->resourceError());
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::finishedLoading(double finishTime)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_frame->page()->defersLoading() || InspectorInstrumentation::isDebuggerPaused(m_frame));
318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DocumentLoader> protect(this);
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_identifierForLoadWithoutResourceLoader) {
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        frameLoader()->notifier()->dispatchDidFinishLoading(this, m_identifierForLoadWithoutResourceLoader, finishTime);
323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_identifierForLoadWithoutResourceLoader = 0;
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    double responseEndTime = finishTime;
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!responseEndTime)
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        responseEndTime = m_timeOfLastDataReceived;
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!responseEndTime)
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        responseEndTime = monotonicallyIncreasingTime();
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    timing()->setResponseEnd(responseEndTime);
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    commitIfReady();
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frameLoader())
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
337591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (isArchiveMIMEType(m_response.mimeType())) {
338591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        createArchive();
339591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    } else {
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If this is an empty document, it will not have actually been created yet. Commit dummy data so that
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // DocumentWriter::begin() gets called and creates the Document.
342591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!m_writer)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            commitData(0, 0);
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
346591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    endWriting(m_writer.get());
347591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_mainDocumentError.isNull())
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearMainResourceLoader();
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frameLoader()->stateMachine()->creatingInitialEmptyDocument())
352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        frameLoader()->checkLoadComplete();
353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the document specified an application cache manifest, it violates the author's intent if we store it in the memory cache
355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // and deny the appcache the chance to intercept it in the future, so remove from the memory cache.
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_frame) {
357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (m_mainResource && m_frame->document()->hasManifest())
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            memoryCache()->remove(m_mainResource.get());
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_applicationCacheHost->finishedLoadingMainResource();
361521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    clearMainResourceHandle();
362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
364304f76f9712bb8bf182649e3408252f91dbb8d53Torne (Richard Coles)bool DocumentLoader::isRedirectAfterPost(const ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int status = redirectResponse.httpStatusCode();
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (((status >= 301 && status <= 303) || status == 307)
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        && m_originalRequest.httpMethod() == "POST")
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::handleSubstituteDataLoadNow(DocumentLoaderTimer*)
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
376f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    RefPtr<DocumentLoader> protect(this);
377e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    ResourceResponse response(m_request.url(), m_substituteData.mimeType(), m_substituteData.content()->size(), m_substituteData.textEncoding(), "");
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    responseReceived(0, response);
379f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (isStopping())
380f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return;
381f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (m_substituteData.content()->size())
382f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        dataReceived(0, m_substituteData.content()->data(), m_substituteData.content()->size());
383f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (isLoadingMainResource())
384f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        finishedLoading(0);
385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::startDataLoadTimer()
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_dataLoadTimer.startOneShot(0);
390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::handleSubstituteDataLoadSoon()
393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
39453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_deferMainResourceDataLoad)
395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        startDataLoadTimer();
396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        handleSubstituteDataLoadNow(0);
398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
400e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool DocumentLoader::shouldContinueForNavigationPolicy(const ResourceRequest& request, PolicyCheckLoadType policyCheckLoadType)
40153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Don't ask if we are loading an empty URL.
403e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    if (request.url().isEmpty())
40453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
40553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
406e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    // We are always willing to show alternate content for unreachable URLs.
407e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    if (m_substituteData.isValid() && !m_substituteData.failingURL().isEmpty())
40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
40953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
41053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // If we're loading content into a subframe, check against the parent's Content Security Policy
41153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // and kill the load if that check fails.
41253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_frame->ownerElement() && !m_frame->ownerElement()->document()->contentSecurityPolicy()->allowChildFrameFromSource(request.url()))
41353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
41453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
415e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    NavigationPolicy policy = NavigationPolicyCurrentTab;
416e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    m_triggeringAction.specifiesNavigationPolicy(&policy);
417b9dc6c52d9e8f4c036310a3c680aa51f27a6d6bdTorne (Richard Coles)    if (policyCheckLoadType != PolicyCheckFragment)
418b9dc6c52d9e8f4c036310a3c680aa51f27a6d6bdTorne (Richard Coles)        policy = frameLoader()->client()->decidePolicyForNavigation(request, this, policy);
419e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (policy == NavigationPolicyCurrentTab)
420e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return true;
421e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (policy == NavigationPolicyIgnore)
422e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return false;
423f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (!DOMWindow::allowPopUp(m_frame) && !ScriptController::processingUserGesture())
424f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return false;
4257757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    frameLoader()->client()->loadURLExternally(request, policy);
426e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return false;
42753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
42853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
429fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::redirectReceived(Resource* resource, ResourceRequest& request, const ResourceResponse& redirectResponse)
430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_UNUSED(resource, resource == m_mainResource);
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    willSendRequest(request, redirectResponse);
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::willSendRequest(ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Note that there are no asserts here as there are for the other callbacks. This is due to the
438926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // fact that this "callback" is sent when starting every load, and the state of callback
43902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // deferrals plays less of a part in this function in preventing the bad behavior deferring
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // callbacks is meant to prevent.
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!newRequest.isNull());
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frameLoader()->checkIfFormActionAllowedByCSP(newRequest.url())) {
4447757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url()));
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(timing()->fetchStart());
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!redirectResponse.isNull()) {
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // If the redirecting url is not allowed to display content from the target origin,
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // then block the redirect.
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RefPtr<SecurityOrigin> redirectingOrigin = SecurityOrigin::create(redirectResponse.url());
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!redirectingOrigin->canDisplay(newRequest.url())) {
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            FrameLoader::reportLocalLoadFailed(m_frame, newRequest.url().string());
4557757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url()));
456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        timing()->addRedirect(redirectResponse.url(), newRequest.url());
459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
461926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Update cookie policy base URL as URL changes, except for subframes, which use the
462926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // URL of the main frame which doesn't change when we redirect.
463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (frameLoader()->isLoadingMainFrame())
464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newRequest.setFirstPartyForCookies(newRequest.url());
465926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
466926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If we're fielding a redirect in response to a POST, force a load from origin, since
467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // this is a common site technique to return to a page viewing some data that the POST
468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // just modified.
469304f76f9712bb8bf182649e3408252f91dbb8d53Torne (Richard Coles)    if (newRequest.cachePolicy() == UseProtocolCachePolicy && isRedirectAfterPost(newRequest, redirectResponse))
470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        newRequest.setCachePolicy(ReloadIgnoringCacheData);
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
47283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    Frame* parent = m_frame->tree()->parent();
47383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    if (parent) {
47483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        if (!parent->loader()->mixedContentChecker()->canRunInsecureContent(parent->document()->securityOrigin(), newRequest.url())) {
4757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url()));
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setRequest(newRequest);
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
48253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (redirectResponse.isNull())
48353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
485e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    appendRedirect(newRequest.url());
48693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    frameLoader()->client()->dispatchDidReceiveServerRedirectForProvisionalLoad();
487b9dc6c52d9e8f4c036310a3c680aa51f27a6d6bdTorne (Richard Coles)    if (!shouldContinueForNavigationPolicy(newRequest, PolicyCheckStandard))
48853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        stopLoadingForPolicyChange();
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochstatic bool canShowMIMEType(const String& mimeType, Page* page)
4927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{
4937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (WebKit::Platform::current()->mimeRegistry()->supportsMIMEType(mimeType) == WebKit::WebMimeRegistry::IsSupported)
4947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return true;
4957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    PluginData* pluginData = page->pluginData();
4967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return !mimeType.isEmpty() && pluginData && pluginData->supportsMimeType(mimeType);
4977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch}
4987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
49953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool DocumentLoader::shouldContinueForResponse() const
500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
50153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_substituteData.isValid())
50253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
50453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int statusCode = m_response.httpStatusCode();
50553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (statusCode == 204 || statusCode == 205) {
50653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // The server does not want us to replace the page contents.
50753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
50953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
51053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (contentDispositionType(m_response.httpHeaderField("Content-Disposition")) == ContentDispositionAttachment) {
51153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // The server wants us to download instead of replacing the page contents.
51253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // Downloading is handled by the embedder, but we still get the initial
51353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // response so that we can ignore it and clean up properly.
51453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
51553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
51653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (!canShowMIMEType(m_response.mimeType(), m_frame->page()))
51853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
51953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
52053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Prevent remote web archives from loading because they can claim to be from any domain and thus avoid cross-domain security checks.
52153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (equalIgnoringCase("multipart/related", m_response.mimeType()) && !SchemeRegistry::shouldTreatURLSchemeAsLocal(m_request.url().protocol()))
52253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
52353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
52453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
525926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
526926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
527fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::responseReceived(Resource* resource, const ResourceResponse& response)
528926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
529926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_UNUSED(resource, m_mainResource == resource);
530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DocumentLoader> protect(this);
53153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
53253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_applicationCacheHost->didReceiveResponseForMainResource(response);
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // The memory cache doesn't understand the application cache or its caching rules. So if a main resource is served
53553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // from the application cache, ensure we don't save the result for future use. All responses loaded
536926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // from appcache will have a non-zero appCacheID().
537926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (response.appCacheID())
538926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        memoryCache()->remove(m_mainResource.get());
539926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, xFrameOptionHeader, ("x-frame-options", AtomicString::ConstructFromLiteral));
541926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HTTPHeaderMap::const_iterator it = response.httpHeaderFields().find(xFrameOptionHeader);
542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (it != response.httpHeaderFields().end()) {
543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        String content = it->value;
544926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(m_mainResource);
5455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        unsigned long identifier = mainResourceIdentifier();
546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(identifier);
547926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (frameLoader()->shouldInterruptLoadForXFrameOptions(content, response.url(), identifier)) {
548926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            InspectorInstrumentation::continueAfterXFrameOptionsDenied(m_frame, this, identifier, response);
549926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            String message = "Refused to display '" + response.url().elidedString() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'.";
550926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            frame()->document()->addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, message, identifier);
55153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            frame()->document()->enforceSandboxFlags(SandboxOrigin);
55253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (HTMLFrameOwnerElement* ownerElement = frame()->ownerElement())
55353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                ownerElement->dispatchEvent(Event::create(eventNames().loadEvent, false, false));
55493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
55593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            // The load event might have detached this frame. In that case, the load will already have been cancelled during detach.
55693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            if (frameLoader())
5577757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                cancelMainResourceLoad(ResourceError::cancelledError(m_request.url()));
558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
562926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading());
563926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
56453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_response = response;
565926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
566591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (isArchiveMIMEType(m_response.mimeType()) && m_mainResource->dataBufferingPolicy() != BufferData)
567591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_mainResource->setDataBufferingPolicy(BufferData);
568591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
569926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_identifierForLoadWithoutResourceLoader)
570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        frameLoader()->notifier()->dispatchDidReceiveResponse(this, m_identifierForLoadWithoutResourceLoader, m_response, 0);
571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
57253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!shouldContinueForResponse()) {
5735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        InspectorInstrumentation::continueWithPolicyIgnore(m_frame, this, m_mainResource->identifier(), m_response);
574926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        stopLoadingForPolicyChange();
575926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
576926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
577926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
578926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_response.isHTTP()) {
579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int status = m_response.httpStatusCode();
580926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (status < 200 || status >= 300) {
581926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            bool hostedByObject = frameLoader()->isHostedByObjectElement();
582926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            frameLoader()->handleFallbackContent();
584926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // object elements are no longer rendered after we fallback, so don't
585926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            // keep trying to process data from their load
586926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
587926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (hostedByObject)
5887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                cancelMainResourceLoad(ResourceError::cancelledError(m_request.url()));
589926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
590926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
593926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::stopLoadingForPolicyChange()
594926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
5957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ResourceError error = frameLoader()->client()->interruptedForPolicyChangeError(m_request);
596926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    error.setIsCancellation(true);
597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    cancelMainResourceLoad(error);
598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
600591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::ensureWriter()
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
602591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ensureWriter(m_response.mimeType());
603591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
605591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::ensureWriter(const String& mimeType, const KURL& overridingURL)
606591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
607591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (m_writer)
608591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return;
609591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
610591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    String encoding = overrideEncoding().isNull() ? response().textEncodingName().impl() : overrideEncoding();
611591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    bool userChosen = !overrideEncoding().isNull();
612e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    m_writer = createWriterFor(m_frame, 0, requestURL(), mimeType, encoding, false, false);
613591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_writer->setDocumentWasLoadedAsPartOfNavigation();
614591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // This should be set before receivedFirstData().
615591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!overridingURL.isEmpty())
616591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_frame->document()->setBaseURLOverride(overridingURL);
617591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
618591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // Call receivedFirstData() exactly once per load.
619591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    frameLoader()->receivedFirstData();
620e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    m_frame->document()->maybeHandleHttpRefresh(m_response.httpHeaderField("Refresh"), Document::HttpRefreshFromHeader);
621591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
622591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
623591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::commitData(const char* bytes, size_t length)
624591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
625591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ensureWriter();
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame->document()->parsing());
627591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_writer->addData(bytes, length);
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
630fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid DocumentLoader::dataReceived(Resource* resource, const char* data, int length)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(data);
633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(length);
634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_UNUSED(resource, resource == m_mainResource);
635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_response.isNull());
636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading());
637926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
638591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // Both unloading the old page and parsing the new page may execute JavaScript which destroys the datasource
639591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // by starting a new load, so retain temporarily.
640591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<Frame> protectFrame(m_frame);
641591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<DocumentLoader> protectLoader(this);
642591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
643926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_identifierForLoadWithoutResourceLoader)
644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        frameLoader()->notifier()->dispatchDidReceiveData(this, m_identifierForLoadWithoutResourceLoader, data, length, -1);
645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
64653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_applicationCacheHost->mainResourceDataReceived(data, length);
647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_timeOfLastDataReceived = monotonicallyIncreasingTime();
648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
649591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    commitIfReady();
650591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!frameLoader())
651591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return;
652591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (isArchiveMIMEType(response().mimeType()))
653591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return;
654591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    commitData(data, length);
655591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
656591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // If we are sending data to MediaDocument, we should stop here
657591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // and cancel the request.
658591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (m_frame->document()->isMediaDocument())
6597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        cancelMainResourceLoad(ResourceError::cancelledError(m_request.url()));
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::checkLoadComplete()
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frame || isLoading())
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
66653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // FIXME: This ASSERT is always triggered.
667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // See https://bugs.webkit.org/show_bug.cgi?id=110937
66853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // ASSERT(this == frameLoader()->activeDocumentLoader())
6697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    m_frame->domWindow()->finishedLoading();
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
672e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid DocumentLoader::clearRedirectChain()
673e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
674e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_redirectChain.clear();
675e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
676e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
677e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid DocumentLoader::appendRedirect(const KURL& url)
678e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
679e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_redirectChain.append(url);
680e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
681e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::setFrame(Frame* frame)
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_frame == frame)
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame && !m_frame);
687591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ASSERT(!m_writer);
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame = frame;
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::detachFromFrame()
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_frame);
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<Frame> protectFrame(m_frame);
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<DocumentLoader> protectLoader(this);
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It never makes sense to have a document loader that is detached from its
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // frame have any loads active, so go ahead and kill all the loads.
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopLoading();
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_applicationCacheHost->setDOMApplicationCache(0);
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InspectorInstrumentation::loaderDetachedFromFrame(m_frame, this);
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frame = 0;
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::clearMainResourceLoader()
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
708926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_loadingMainResource = false;
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (this == frameLoader()->activeDocumentLoader())
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        checkLoadComplete();
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
713521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void DocumentLoader::clearMainResourceHandle()
714521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
715521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!m_mainResource)
716521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return;
717521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_mainResource->removeClient(this);
718521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    m_mainResource = 0;
719521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
720521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DocumentLoader::isLoadingInAPISense() const
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Once a frame has loaded, we no longer need to consider subresources,
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // but we still need to consider subframes.
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frameLoader()->state() != FrameStateComplete) {
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Document* doc = m_frame->document();
727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if ((isLoadingMainResource() || !m_frame->document()->loadEventFinished()) && isLoading())
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
7293464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch        if (m_fetcher->requestCount())
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
731926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (doc->processingLoadEvent())
732926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (doc->hasActiveParser())
734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frameLoader()->subframeIsLoading();
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
739591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::createArchive()
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
74153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_archive = MHTMLArchive::create(m_response.url(), mainResourceData().get());
74253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(m_archive);
74302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addAllArchiveResources(m_archive.get());
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ArchiveResource* mainResource = m_archive->mainResource();
746591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
747591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // The origin is the MHTML file, we need to set the base URL to the document encoded in the MHTML so
748591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // relative URLs are resolved properly.
749591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ensureWriter(mainResource->mimeType(), m_archive->mainResource()->url());
750591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    commitData(mainResource->data()->data(), mainResource->data()->size());
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void DocumentLoader::addAllArchiveResources(MHTMLArchive* archive)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
75681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    ASSERT(archive);
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_archiveResourceCollection)
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_archiveResourceCollection = adoptPtr(new ArchiveResourceCollection);
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_archiveResourceCollection->addAllResources(archive);
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void DocumentLoader::prepareSubframeArchiveLoadIfNeeded()
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
76481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_frame->tree()->parent())
76581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return;
76681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
76781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    ArchiveResourceCollection* parentCollection = m_frame->tree()->parent()->loader()->documentLoader()->m_archiveResourceCollection.get();
76881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!parentCollection)
76981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return;
77081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
77181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    m_archive = parentCollection->popSubframeArchive(m_frame->tree()->uniqueName(), m_request.url());
77281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
77381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (!m_archive)
77481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return;
77581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    addAllArchiveResources(m_archive.get());
77681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
77781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    ArchiveResource* mainResource = m_archive->mainResource();
77881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    m_substituteData = SubstituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL());
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::clearArchiveResources()
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_archiveResourceCollection.clear();
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
786fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool DocumentLoader::scheduleArchiveLoad(Resource* cachedResource, const ResourceRequest& request)
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
78893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!m_archive)
78993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return false;
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(m_archiveResourceCollection);
79293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ArchiveResource* archiveResource = m_archiveResourceCollection->archiveResourceForURL(request.url());
793e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!archiveResource) {
794fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        cachedResource->error(Resource::LoadError);
795e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return true;
796e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    cachedResource->setLoading(true);
79993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    cachedResource->responseReceived(archiveResource->response());
800e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    SharedBuffer* data = archiveResource->data();
801e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (data)
802e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        cachedResource->appendData(data->data(), data->size());
80393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    cachedResource->finish();
80493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return true;
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::setTitle(const StringWithDirection& title)
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_pageTitle == title)
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pageTitle = title;
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameLoader()->didChangeTitle(this);
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL DocumentLoader::urlForHistory() const
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return the URL to be used for history and B/F list.
81902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    // Returns nil for WebDataProtocol URLs that aren't alternates
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // for unreachable URLs, because these can't be stored in history.
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_substituteData.isValid())
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return unreachableURL();
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_originalRequestCopy.url();
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const KURL& DocumentLoader::originalURL() const
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_originalRequestCopy.url();
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const KURL& DocumentLoader::requestURL() const
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return request().url();
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const String& DocumentLoader::responseMIMEType() const
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_response.mimeType();
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const KURL& DocumentLoader::unreachableURL() const
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_substituteData.failingURL();
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::setDefersLoading(bool defers)
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
84953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Multiple frames may be loading the same main resource simultaneously. If deferral state changes,
85053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // each frame's DocumentLoader will try to send a setDefersLoading() to the same underlying ResourceLoader. Ensure only
85153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // the "owning" DocumentLoader does so, as setDefersLoading() is not resilient to setting the same value repeatedly.
8523464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    if (mainResourceLoader() && mainResourceLoader()->isLoadedBy(m_fetcher.get()))
853926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        mainResourceLoader()->setDefersLoading(defers);
85453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
85553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    setAllDefersLoading(m_resourceLoaders, defers);
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::stopLoadingSubresources()
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
86053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    cancelAll(m_resourceLoaders);
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void DocumentLoader::addResourceLoader(ResourceLoader* loader)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
865926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // The main resource's underlying ResourceLoader will ask to be added here.
866926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // It is much simpler to handle special casing of main resource loads if we don't
867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // let it be added. In the main resource load case, mainResourceLoader()
868591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // will still be null at this point, but document() should be zero here if and only
869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // if we are just starting the main resource load.
870591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!document())
871926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
87253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(!m_resourceLoaders.contains(loader));
873926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!mainResourceLoader() || mainResourceLoader() != loader);
87453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_resourceLoaders.add(loader);
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void DocumentLoader::removeResourceLoader(ResourceLoader* loader)
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
87953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!m_resourceLoaders.contains(loader))
880926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
88153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_resourceLoaders.remove(loader);
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    checkLoadComplete();
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Frame* frame = m_frame)
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame->loader()->checkLoadComplete();
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool DocumentLoader::maybeLoadEmpty()
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
889926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool shouldLoadEmpty = !m_substituteData.isValid() && (m_request.url().isEmpty() || SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(m_request.url().protocol()));
89053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!shouldLoadEmpty)
891926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
893926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_request.url().isEmpty() && !frameLoader()->stateMachine()->creatingInitialEmptyDocument())
894926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_request.setURL(blankURL());
8957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    m_response = ResourceResponse(m_request.url(), "text/html", 0, String(), String());
896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    finishedLoading(monotonicallyIncreasingTime());
897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::startLoadingMainResource()
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
902e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    RefPtr<DocumentLoader> protect(this);
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mainDocumentError = ResourceError();
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    timing()->markNavigationStart();
905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_mainResource);
906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!m_loadingMainResource);
907926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_loadingMainResource = true;
908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
909926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (maybeLoadEmpty())
910926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(timing()->navigationStart());
913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(!timing()->fetchStart());
914926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    timing()->markFetchStart();
915926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    willSendRequest(m_request, ResourceResponse());
916926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // willSendRequest() may lead to our Frame being detached or cancelling the load via nulling the ResourceRequest.
918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_frame || m_request.isNull())
919926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
92153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_applicationCacheHost->willStartLoadingMainResource(m_request);
92281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    prepareSubframeArchiveLoadIfNeeded();
923926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
924926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_substituteData.isValid()) {
92553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_identifierForLoadWithoutResourceLoader = createUniqueIdentifier();
926926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        frameLoader()->notifier()->dispatchWillSendRequest(this, m_identifierForLoadWithoutResourceLoader, m_request, ResourceResponse());
927926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        handleSubstituteDataLoadSoon();
928926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
929926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
930926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
931926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceRequest request(m_request);
932926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DEFINE_STATIC_LOCAL(ResourceLoaderOptions, mainResourceLoadOptions,
933e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        (SendCallbacks, SniffContent, DoNotBufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientForCrossOriginCredentials, SkipSecurityCheck, CheckContentSecurityPolicy, UseDefaultOriginRestrictionsForType, DocumentContext));
934fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    FetchRequest cachedResourceRequest(request, FetchInitiatorTypeNames::document, mainResourceLoadOptions);
9353464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    m_mainResource = m_fetcher->requestMainResource(cachedResourceRequest);
936926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_mainResource) {
937926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setRequest(ResourceRequest());
938926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // If the load was aborted by clearing m_request, it's possible the ApplicationCacheHost
939926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // is now in a state where starting an empty load will be inconsistent. Replace it with
940926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // a new ApplicationCacheHost.
941926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_applicationCacheHost = adoptPtr(new ApplicationCacheHost(this));
942926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        maybeLoadEmpty();
943926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
944926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
945926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_mainResource->addClient(this);
946926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
947926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // A bunch of headers are set when the underlying ResourceLoader is created, and m_request needs to include those.
948926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (mainResourceLoader())
949926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        request = mainResourceLoader()->originalRequest();
950926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If there was a fragment identifier on m_request, the cache will have stripped it. m_request should include
951926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // the fragment identifier, so add that back in.
952926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (equalIgnoringFragmentIdentifier(m_request.url(), request.url()))
953926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        request.setURL(m_request.url());
954926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setRequest(request);
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
957926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DocumentLoader::cancelMainResourceLoad(const ResourceError& resourceError)
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
959926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DocumentLoader> protect(this);
9607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    ResourceError error = resourceError.isNull() ? ResourceError::cancelledError(m_request.url()) : resourceError;
961926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
962926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_dataLoadTimer.stop();
963926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (mainResourceLoader())
964926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        mainResourceLoader()->cancel(error);
965926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
966926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    mainReceivedError(error);
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DocumentLoader::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* loader)
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
97153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_multipartResourceLoaders.add(loader);
97253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_resourceLoaders.remove(loader);
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    checkLoadComplete();
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (Frame* frame = m_frame)
97502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        frame->loader()->checkLoadComplete();
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
978591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochDocumentWriter* DocumentLoader::beginWriting(const String& mimeType, const String& encoding, const KURL& url)
979591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
980591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_writer = createWriterFor(m_frame, 0, url, mimeType, encoding, false, true);
981591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return m_writer.get();
982591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
983591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
984591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::endWriting(DocumentWriter* writer)
985591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
986591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ASSERT_UNUSED(writer, m_writer == writer);
987591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_writer->end();
988591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_writer.clear();
989591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
990591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
991591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochPassRefPtr<DocumentWriter> DocumentLoader::createWriterFor(Frame* frame, const Document* ownerDocument, const KURL& url, const String& mimeType, const String& encoding, bool userChosen, bool dispatch)
992591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
993591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // Create a new document before clearing the frame, because it may need to
994591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    // inherit an aliased security context.
995591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<Document> document = DOMImplementation::createDocument(mimeType, frame, url, frame->inViewSourceMode());
996591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (document->isPluginDocument() && document->isSandboxed(SandboxPlugins))
997e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        document = SinkDocument::create(DocumentInit(url, frame));
998591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    bool shouldReuseDefaultView = frame->loader()->stateMachine()->isDisplayingInitialEmptyDocument() && frame->document()->isSecureTransitionTo(url);
999f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
10000390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)    ClearOptions options = 0;
10010390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)    if (!shouldReuseDefaultView)
10020390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)        options = ClearWindowProperties | ClearScriptObjects;
10030390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)    frame->loader()->clear(options);
10040390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)
10050390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)    if (frame->document() && frame->document()->attached())
10060390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)        frame->document()->prepareForDestruction();
1007f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
10080390b6f38fb8c48e6cda11a37640b83a6cbca5bdTorne (Richard Coles)    if (!shouldReuseDefaultView)
1009f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        frame->setDOMWindow(DOMWindow::create(frame));
1010591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1011591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    frame->loader()->setOutgoingReferrer(url);
1012591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    frame->domWindow()->setDocument(document);
1013591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1014591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (ownerDocument) {
1015591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        document->setCookieURL(ownerDocument->cookieURL());
1016591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        document->setSecurityOrigin(ownerDocument->securityOrigin());
1017591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
1018591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1019591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    frame->loader()->didBeginDocument(dispatch);
1020591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1021591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return DocumentWriter::create(document.get(), mimeType, encoding, userChosen);
1022591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
1023591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1024591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochString DocumentLoader::mimeType() const
1025591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
1026591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (m_writer)
1027591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return m_writer->mimeType();
1028591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return m_response.mimeType();
1029591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
1030591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1031591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// This is only called by ScriptController::executeScriptIfJavaScriptURL
1032591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// and always contains the result of evaluating a javascript: url.
1033591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// This is the <iframe src="javascript:'html'"> case.
1034591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid DocumentLoader::replaceDocument(const String& source, Document* ownerDocument)
1035591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
1036591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_frame->loader()->stopAllLoaders();
1037591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_writer = createWriterFor(m_frame, ownerDocument, m_frame->document()->url(), mimeType(), m_writer ? m_writer->encoding() : "",  m_writer ? m_writer->encodingWasChosenByUser() : false, true);
1038591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!source.isNull())
1039591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_writer->appendReplacingData(source);
1040591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    endWriting(m_writer.get());
1041591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
1042591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
1044