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