15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Alp Toker <alp@atoker.com> 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) Research In Motion Limited 2009. All rights reserved. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 1502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * notice, this list of conditions and the following disclaimer. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 1802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * documentation and/or other materials provided with the distribution. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 2102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * from this software without specific prior written permission. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/DOMWrapperWorld.h" 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptController.h" 40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/SerializedScriptValue.h" 415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h" 44323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/dom/ViewportDescription.h" 451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/editing/Editor.h" 46a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/editing/UndoStack.h" 4706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/PageTransitionEvent.h" 488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/fetch/FetchContext.h" 49e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceFetcher.h" 50e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceLoader.h" 5176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h" 52d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/frame/FrameHost.h" 53bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/frame/FrameView.h" 54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 55d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/frame/PinchViewport.h" 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/Settings.h" 57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/csp/ContentSecurityPolicy.h" 5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h" 598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h" 6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h" 61e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h" 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorController.h" 6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h" 6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoadTiming.h" 6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h" 6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FormState.h" 6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FormSubmission.h" 688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/loader/FrameFetchContext.h" 6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoadRequest.h" 7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoaderClient.h" 7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/ProgressTracker.h" 7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/UniqueIdentifier.h" 7353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/appcache/ApplicationCacheHost.h" 7451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/BackForwardClient.h" 7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h" 7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ChromeClient.h" 7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/CreateWindow.h" 7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h" 8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/WindowFeatures.h" 8251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/scrolling/ScrollingCoordinator.h" 8393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/xml/parser/XMLDocumentParser.h" 841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Logging.h" 851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h" 861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h" 871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/network/HTTPParsers.h" 88bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/ResourceRequest.h" 89a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/ScrollAnimator.h" 9051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h" 9151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityPolicy.h" 92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "public/platform/WebURLRequest.h" 93e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/TemporaryChange.h" 94591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/CString.h" 95591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h" 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 97197021e6b966cfb06891637935ef33fff06433d1Ben Murdochusing blink::WebURLRequest; 98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 99c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isBackForwardLoadType(FrameLoadType type) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return type == FrameLoadTypeBackForward; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static bool needsHistoryItemRestore(FrameLoadType type) 109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return type == FrameLoadTypeBackForward || type == FrameLoadTypeReload || type == FrameLoadTypeReloadFromOrigin; 111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)FrameLoader::FrameLoader(LocalFrame* frame) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_frame(frame) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_mixedContentChecker(frame) 11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch , m_progressTracker(ProgressTracker::create(frame)) 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_state(FrameStateProvisional) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_loadType(FrameLoadTypeStandard) 119f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) , m_fetchContext(FrameFetchContext::create(frame)) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_inStopAllLoaders(false) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_checkTimer(this, &FrameLoader::checkTimerFired) 122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_didAccessInitialDocument(false) 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_didAccessInitialDocumentTimer(this, &FrameLoader::didAccessInitialDocumentTimerFired) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_forcedSandboxFlags(SandboxNone) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameLoader::~FrameLoader() 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Verify that this FrameLoader has been detached. 1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!m_progressTracker); 1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FrameLoader::trace(Visitor* visitor) 1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_frame); 1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_mixedContentChecker); 1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_progressTracker); 1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci visitor->trace(m_fetchContext); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::init() 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 144197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ResourceRequest initialRequest(KURL(ParsedURLString, emptyString())); 145197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch initialRequest.setRequestContext(WebURLRequest::RequestContextInternal); 146197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch initialRequest.setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); 147197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_provisionalDocumentLoader = client()->createDocumentLoader(m_frame, initialRequest, SubstituteData()); 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_provisionalDocumentLoader->startLoadingMainResource(); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->document()->cancelParsing(); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocument); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 153d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)FrameLoaderClient* FrameLoader::client() const 154d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 155d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return static_cast<FrameLoaderClient*>(m_frame->client()); 156d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 157d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::setDefersLoading(bool defers) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_documentLoader) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_documentLoader->setDefersLoading(defers); 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_provisionalDocumentLoader) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_provisionalDocumentLoader->setDefersLoading(defers); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_policyDocumentLoader) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_policyDocumentLoader->setDefersLoading(defers); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!defers) { 168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_deferredHistoryLoad.isValid()) { 169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) loadHistoryItem(m_deferredHistoryLoad.m_item.get(), m_deferredHistoryLoad.m_type, m_deferredHistoryLoad.m_cachePolicy); 170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_deferredHistoryLoad = DeferredHistoryLoad(); 171d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 172f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->navigationScheduler().startTimer(); 173e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) scheduleCheckCompleted(); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 177e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void FrameLoader::stopLoading() 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->document() && m_frame->document()->parsing()) { 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) finishedParsing(); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->document()->setParsing(false); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Document* doc = m_frame->document()) { 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: HTML5 doesn't tell us to set the state to complete when aborting, but we do anyway to match legacy behavior. 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10537 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) doc->setReadyState(Document::Complete); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This will cancel redirection timer, which really needs to be restarted when restoring the frame from b/f cache. 191f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->navigationScheduler().cancel(); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 194d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FrameLoader::saveScrollState() 195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 196d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_currentItem || !m_frame->view()) 197d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 198d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Shouldn't clobber anything if we might still restore later. 200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (needsHistoryItemRestore(m_loadType) && !m_frame->view()->wasScrolledByUser()) 20151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 20251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 20351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_currentItem->setScrollPoint(m_frame->view()->scrollPosition()); 204d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 205d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_frame->settings()->pinchVirtualViewportEnabled()) 206d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_currentItem->setPinchViewportScrollPoint(m_frame->host()->pinchViewport().visibleRect().location()); 207d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) else 208d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_currentItem->setPinchViewportScrollPoint(FloatPoint(-1, -1)); 209d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 210197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (m_frame->isMainFrame()) 21151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_currentItem->setPageScaleFactor(m_frame->page()->pageScaleFactor()); 212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 213d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->didUpdateCurrentHistoryItem(); 21451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 21551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 21651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void FrameLoader::clearScrollPositionAndViewState() 21751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 21851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(m_frame->isMainFrame()); 21951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!m_currentItem) 22051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 22151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_currentItem->clearScrollPoint(); 22251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_currentItem->setPageScaleFactor(0); 22351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 22451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::closeURL() 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 227d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) saveScrollState(); 22802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 22953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Should only send the pagehide event here if the current document exists. 230e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (m_frame->document()) 231e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_frame->document()->dispatchUnloadEvents(); 232e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) stopLoading(); 23302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 234a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (Page* page = m_frame->page()) 235a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) page->undoStack().didUnloadFrame(*m_frame); 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::didExplicitOpen() 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calling document.open counts as committing the first real document load. 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_stateMachine.committedFirstRealDocumentLoad()) 243e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 24402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results 24602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // from a subsequent window.document.open / window.document.write call. 24702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // Canceling redirection here works for all cases because document.open 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // implicitly precedes document.write. 249f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->navigationScheduler().cancel(); 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameLoader::clear() 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // clear() is called during (Local)Frame finalization and when creating 2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // a new Document within it (DocumentLoader::createWriterFor().) 256e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (m_stateMachine.creatingInitialEmptyDocument()) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 25802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 259c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_frame->editor().clear(); 26053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_frame->document()->cancelParsing(); 2611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_frame->document()->prepareForDestruction(); 2621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_frame->document()->removeFocusedElementOfSubtree(m_frame->document()); 2638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_frame->selection().prepareForDestruction(); 264f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->eventHandler().clear(); 265e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (m_frame->view()) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->view()->clear(); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 268f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->script().enableEval(); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 270c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_frame->navigationScheduler().cancel(); 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_checkTimer.stop(); 273e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) 274e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (m_stateMachine.isDisplayingInitialEmptyDocument()) 275e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 276a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 277a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// This is only called by ScriptController::executeScriptIfJavaScriptURL 2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// and always contains the result of evaluating a javascript: url. 2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// This is the <iframe src="javascript:'html'"> case. 2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FrameLoader::replaceDocumentWhileExecutingJavaScriptURL(const String& source, Document* ownerDocument) 2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_frame->document()->loader()) 2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // DocumentWriter::replaceDocumentWhileExecutingJavaScriptURL can cause the DocumentLoader to get deref'ed and possible destroyed, 2877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // so protect it with a RefPtr. 2887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtr<DocumentLoader> documentLoader(m_frame->document()->loader()); 2897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(*m_frame->document(), UseCounter::ReplaceDocumentViaJavaScriptURL); 2917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Prepare a DocumentInit before clearing the frame, because it may need to 2937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // inherit an aliased security context. 2947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DocumentInit init(m_frame->document()->url(), m_frame); 2957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci init.withNewRegistrationContext(); 2967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci stopAllLoaders(); 2987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci clear(); 2997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // clear() potentially detaches the frame from the document. The 3017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // loading cannot continue in that case. 3027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_frame->page()) 3037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci documentLoader->replaceDocumentWhileExecutingJavaScriptURL(init, source, ownerDocument); 3067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 3077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameLoader::setHistoryItemStateForCommit(HistoryCommitType historyCommitType, bool isPushOrReplaceState, PassRefPtr<SerializedScriptValue> stateObject) 30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 31009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_provisionalItem) 31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_currentItem = m_provisionalItem.release(); 312323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 313323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!m_currentItem || historyCommitType == StandardCommit) { 31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_currentItem = HistoryItem::create(); 315323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } else if (!isPushOrReplaceState && m_documentLoader->url() != m_currentItem->url()) { 316323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_currentItem->generateNewItemSequenceNumber(); 317323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!equalIgnoringFragmentIdentifier(m_documentLoader->url(), m_currentItem->url())) 318323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_currentItem->generateNewDocumentSequenceNumber(); 319323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 320323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_currentItem->setURL(m_documentLoader->urlForHistory()); 32210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch m_currentItem->setDocumentState(m_frame->document()->formElementsState()); 32309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_currentItem->setTarget(m_frame->tree().uniqueName()); 32409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (isPushOrReplaceState) 32509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_currentItem->setStateObject(stateObject); 32609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_currentItem->setReferrer(Referrer(m_documentLoader->request().httpReferrer(), m_documentLoader->request().referrerPolicy())); 327f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_currentItem->setFormInfoFromRequest(m_documentLoader->request()); 32809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 32909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 330d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)static HistoryCommitType loadTypeToCommitType(FrameLoadType type) 33109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 33209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) switch (type) { 33309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case FrameLoadTypeStandard: 334d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return StandardCommit; 33509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case FrameLoadTypeInitialInChildFrame: 33609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return InitialCommitInChildFrame; 33709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) case FrameLoadTypeBackForward: 33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return BackForwardCommit; 33909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) default: 34009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) break; 341a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 34209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return HistoryInertCommit; 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::receivedFirstData() 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 34702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (m_stateMachine.creatingInitialEmptyDocument()) 34802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return; 34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 350d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) HistoryCommitType historyCommitType = loadTypeToCommitType(m_loadType); 351d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (historyCommitType == StandardCommit && (m_documentLoader->urlForHistory().isEmpty() || (opener() && !m_currentItem && m_documentLoader->originalRequest().url().isEmpty()))) 352d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) historyCommitType = HistoryInertCommit; 3535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) else if (historyCommitType == InitialCommitInChildFrame && (!m_frame->tree().top()->isLocalFrame() || MixedContentChecker::isMixedContent(toLocalFrame(m_frame->tree().top())->document()->securityOrigin(), m_documentLoader->url()))) 354d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) historyCommitType = HistoryInertCommit; 35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setHistoryItemStateForCommit(historyCommitType); 35609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 35709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!m_stateMachine.committedMultipleRealLoads() && m_loadType == FrameLoadTypeStandard) 358a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedMultipleRealLoads); 359a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 360d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidCommitLoad(m_frame, m_currentItem.get(), historyCommitType); 361a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 362e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) InspectorInstrumentation::didCommitLoad(m_frame, m_documentLoader.get()); 363e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_frame->page()->didCommitLoad(m_frame); 364323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) dispatchDidClearDocumentOfWindowObject(); 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::didBeginDocument(bool dispatch) 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->document()->setReadyState(Document::Loading); 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_provisionalItem && m_loadType == FrameLoadTypeBackForward) 37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_frame->domWindow()->statePopped(m_provisionalItem->stateObject()); 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (dispatch) 375323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) dispatchDidClearDocumentOfWindowObject(); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_frame->document()->initContentSecurityPolicy(m_documentLoader ? m_documentLoader->releaseContentSecurityPolicy() : ContentSecurityPolicy::create()); 37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Settings* settings = m_frame->document()->settings(); 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (settings) { 38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_frame->document()->fetcher()->setImagesEnabled(settings->imagesEnabled()); 3823464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch m_frame->document()->fetcher()->setAutoLoadImages(settings->loadsImagesAutomatically()); 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_documentLoader) { 386a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) const AtomicString& dnsPrefetchControl = m_documentLoader->response().httpHeaderField("X-DNS-Prefetch-Control"); 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!dnsPrefetchControl.isEmpty()) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->document()->parseDNSPrefetchControlHeader(dnsPrefetchControl); 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String headerContentLanguage = m_documentLoader->response().httpHeaderField("Content-Language"); 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!headerContentLanguage.isEmpty()) { 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t commaIndex = headerContentLanguage.find(','); 39306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) headerContentLanguage.truncate(commaIndex); // kNotFound == -1 == don't truncate 39406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) headerContentLanguage = headerContentLanguage.stripWhiteSpace(isHTMLSpace<UChar>); 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!headerContentLanguage.isEmpty()) 396a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) m_frame->document()->setContentLanguage(AtomicString(headerContentLanguage)); 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_provisionalItem && m_loadType == FrameLoadTypeBackForward) 40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_frame->document()->setStateForNewFormElements(m_provisionalItem->documentState()); 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::finishedParsing() 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_stateMachine.creatingInitialEmptyDocument()) 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // This can be called from the LocalFrame's destructor, in which case we shouldn't protect ourselves 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // because doing so will cause us to re-enter the destructor when protector goes out of scope. 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Null-checking the FrameView indicates whether or not we're in the destructor. 4127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame->view() ? m_frame.get() : nullptr); 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 414d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (client()) 415d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidFinishDocumentLoad(); 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkCompleted(); 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_frame->view()) 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; // We are being destroyed by something checkCompleted called. 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Check if the scrollbars are really needed for the content. 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If not, remove them, relayout, and repaint. 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->view()->restoreScrollbar(); 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollToFragmentWithParentBoundary(m_frame->document()->url()); 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::loadDone() 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkCompleted(); 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::allChildrenAreComplete() const 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 435f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) { 4369e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (!child->isLocalFrame()) 4379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) continue; 4389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) LocalFrame* frame = toLocalFrame(child); 4399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (!frame->document()->isLoadCompleted() || frame->loader().m_provisionalDocumentLoader) 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::allAncestorsAreComplete() const 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 447f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (Frame* ancestor = m_frame; ancestor; ancestor = ancestor->tree().parent()) { 448f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (ancestor->isLocalFrame() && !toLocalFrame(ancestor)->document()->loadEventFinished()) 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::checkCompleted() 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->view()) 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->view()->handleLoadCompleted(); 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4619e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (m_frame->document()->isLoadCompleted() && m_stateMachine.committedFirstRealDocumentLoad()) 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Are we still parsing? 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->document()->parsing()) 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Still waiting imports? 469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_frame->document()->haveImportsLoaded()) 470d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 471d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Still waiting for images/scripts? 4733464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch if (m_frame->document()->fetcher()->requestCount()) 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Still waiting for elements that don't go through a FrameLoader? 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->document()->isDelayingLoadEvent()) 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Any frame that hasn't completed yet? 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!allChildrenAreComplete()) 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // OK, completed. 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->document()->setReadyState(Document::Complete); 4863c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (m_frame->document()->loadEventStillNeeded()) 4873c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_frame->document()->implicitClose(); 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 489f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->navigationScheduler().startTimer(); 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) completed(); 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->page()) 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkLoadComplete(); 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->view()) 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->view()->handleLoadCompleted(); 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::checkTimerFired(Timer<FrameLoader>*) 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Page* page = m_frame->page()) { 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (page->defersLoading()) 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 505e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) checkCompleted(); 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::scheduleCheckCompleted() 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 510e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (!m_checkTimer.isActive()) 511e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_checkTimer.startOneShot(0, FROM_HERE); 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5149e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)Frame* FrameLoader::opener() 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) return client() ? client()->opener() : 0; 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 519d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FrameLoader::setOpener(LocalFrame* opener) 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 52143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) // If the frame is already detached, the opener has already been cleared. 522d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (client()) 523d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->setOpener(opener); 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 526fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool FrameLoader::allowPlugins(ReasonForCallingAllowPlugins reason) 527fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch{ 5287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // With Oilpan, a FrameLoader might be accessed after the 5297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FrameHost has been detached. FrameClient will not be 5307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // accessible, so bail early. 5317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!client()) 5327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return false; 533fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch Settings* settings = m_frame->settings(); 534d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool allowed = client()->allowPlugins(settings && settings->pluginsEnabled()); 535fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (!allowed && reason == AboutToInstantiatePlugin) 536d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->didNotAllowPlugins(); 537fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return allowed; 538fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch} 539fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch 540d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void FrameLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocumentNavigationSource sameDocumentNavigationSource, PassRefPtr<SerializedScriptValue> data, FrameLoadType type) 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Update the data source's request with the new URL to fake the URL change 5433c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_frame->document()->setURL(newURL); 544f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) documentLoader()->updateForSameDocumentNavigation(newURL, sameDocumentNavigationSource); 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // Generate start and stop notifications only when loader is completed so that we 5473c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // don't fire them for fragment redirection that happens in window.onload handler. 5483c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // See https://bugs.webkit.org/show_bug.cgi?id=31838 5493c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (m_frame->document()->loadEventFinished()) 550d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->didStartLoading(NavigationWithinSameDocument); 551d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 552d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) HistoryCommitType historyCommitType = loadTypeToCommitType(type); 553d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!m_currentItem) 554d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) historyCommitType = HistoryInertCommit; 55502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 55609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setHistoryItemStateForCommit(historyCommitType, sameDocumentNavigationSource == SameDocumentNavigationHistoryApi, data); 557d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitType); 558d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidReceiveTitle(m_frame->document()->title()); 5593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (m_frame->document()->loadEventFinished()) 560d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->didStopLoading(); 5613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch} 56202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 563d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScriptValue> stateObject, FrameLoadType type, ClientRedirectPolicy clientRedirect) 5643c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch{ 5653c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch // If we have a state object, we cannot also be a new navigation. 566d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(!stateObject || type == FrameLoadTypeBackForward); 56709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 56809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // If we have a provisional request for a different document, a fragment scroll should cancel it. 56909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_provisionalDocumentLoader) { 57009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_provisionalDocumentLoader->stopLoading(); 57109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_provisionalDocumentLoader) 57209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_provisionalDocumentLoader->detachFromFrame(); 573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_provisionalDocumentLoader = nullptr; 574f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!m_frame->host()) 575f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return; 57609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 577197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_loadType = type; 578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) saveScrollState(); 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5803c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch KURL oldURL = m_frame->document()->url(); 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor 5823c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragmentIdentifier() != oldURL.fragmentIdentifier(); 5833c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (hashChange) { 58419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_frame->eventHandler().stopAutoscroll(); 585f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->domWindow()->enqueueHashchangeEvent(oldURL, url); 5863c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch } 58709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_documentLoader->setIsClientRedirect(clientRedirect == ClientRedirect); 588d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_documentLoader->setReplacesCurrentHistoryItem(m_loadType == FrameLoadTypeStandard); 589d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, nullptr, type); 590d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_frame->view()->setWasScrolledByUser(false); 59202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We need to scroll to the fragment whether or not a hash change occurred, since 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the user might have scrolled since the previous navigation. 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollToFragmentWithParentBoundary(url); 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkCompleted(); 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 598f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->domWindow()->statePopped(stateObject ? stateObject : SerializedScriptValue::nullValue()); 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::completed() 6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (Frame* descendant = m_frame->tree().traverseNext(m_frame); descendant; descendant = descendant->tree().traverseNext(m_frame)) { 6065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (descendant->isLocalFrame()) 6075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toLocalFrame(descendant)->navigationScheduler().startTimer(); 6085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) Frame* parent = m_frame->tree().parent(); 6115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (parent && parent->isLocalFrame()) 6125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) toLocalFrame(parent)->loader().checkCompleted(); 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->view()) 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frame->view()->maintainScrollPositionAtAnchor(0); 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 61809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSendReferrer shouldSendReferrer, Document* originDocument) 619e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{ 6207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (shouldSendReferrer == NeverSendReferrer) { 6217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch request.clearHTTPReferrer(); 6227757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return; 6237757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 624e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 62509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Always use the initiating document to generate the referrer. 62609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // We need to generateReferrerHeader(), because we might not have enforced ReferrerPolicy or https->http 62709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // referrer suppression yet. 6287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch String argsReferrer(request.httpReferrer()); 6297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (argsReferrer.isEmpty()) 63009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) argsReferrer = originDocument->outgoingReferrer(); 63109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) String referrer = SecurityPolicy::generateReferrerHeader(originDocument->referrerPolicy(), request.url(), argsReferrer); 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 63309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) request.setHTTPReferrer(Referrer(referrer, originDocument->referrerPolicy())); 6347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch RefPtr<SecurityOrigin> referrerOrigin = SecurityOrigin::createFromString(referrer); 635197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch request.addHTTPOriginIfNeeded(referrerOrigin->toAtomicString()); 6367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 6377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 638c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)bool FrameLoader::isScriptTriggeredFormSubmissionInChildFrame(const FrameLoadRequest& request) const 639c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){ 640c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) // If this is a child frame and the form submission was triggered by a script, lock the back/forward list 641c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) // to match IE and Opera. 642c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) // See https://bugs.webkit.org/show_bug.cgi?id=32383 for the original motivation for this. 643f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!m_frame->tree().parent() || UserGestureIndicator::processingUserGesture()) 644c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) return false; 645c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) return request.formState() && request.formState()->formSubmissionTrigger() == SubmittedByJavaScript; 646c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)} 647c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 6487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen MurdochFrameLoadType FrameLoader::determineFrameLoadType(const FrameLoadRequest& request) 6497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 650323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_frame->tree().parent() && !m_stateMachine.committedFirstRealDocumentLoad()) 6517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return FrameLoadTypeInitialInChildFrame; 65251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!m_frame->tree().parent() && !m_frame->page()->backForward().backForwardListCount()) 6531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return FrameLoadTypeStandard; 65409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_provisionalDocumentLoader && request.substituteData().failingURL() == m_provisionalDocumentLoader->url() && m_loadType == FrameLoadTypeBackForward) 65509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return FrameLoadTypeBackForward; 656d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData) 657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return FrameLoadTypeReload; 658f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (request.resourceRequest().cachePolicy() == ReloadBypassingCache) 659f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return FrameLoadTypeReloadFromOrigin; 660c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) if (request.lockBackForwardList() || isScriptTriggeredFormSubmissionInChildFrame(request)) 6617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return FrameLoadTypeRedirectWithLockedBackForwardList; 662d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!request.originDocument() && request.resourceRequest().url() == m_documentLoader->urlForHistory()) 6637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return FrameLoadTypeSame; 664d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (request.substituteData().failingURL() == m_documentLoader->urlForHistory() && m_loadType == FrameLoadTypeReload) 6657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return FrameLoadTypeReload; 6667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return FrameLoadTypeStandard; 6677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 6687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 6697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochbool FrameLoader::prepareRequestForThisFrame(FrameLoadRequest& request) 6707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 671197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch request.resourceRequest().setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); 672197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 673197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // If no origin Document* was specified, skip remaining security checks and assume the caller has fully initialized the FrameLoadRequest. 67409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!request.originDocument()) 6757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return true; 6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6777757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch KURL url = request.resourceRequest().url(); 678f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (m_frame->script().executeScriptIfJavaScriptURL(url)) 6797757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return false; 680e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 68109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!request.originDocument()->securityOrigin()->canDisplay(url)) { 682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) reportLocalLoadFailed(m_frame, url.elidedString()); 6837757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return false; 6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!request.formState() && request.frameName().isEmpty()) 687e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch request.setFrameName(m_frame->document()->baseTarget()); 6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setReferrerForFrameRequest(request.resourceRequest(), request.shouldSendReferrer(), request.originDocument()); 6907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return true; 6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static bool shouldOpenInNewWindow(LocalFrame* targetFrame, const FrameLoadRequest& request, const NavigationAction& action) 694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!targetFrame && !request.frameName().isEmpty()) 696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return true; 697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // FIXME: This case is a workaround for the fact that ctrl+clicking a form submission incorrectly 698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // sends as a GET rather than a POST if it creates a new window in a different process. 699d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return request.formState() && action.shouldOpenInNewWindow(); 700d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 701d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 702197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic WebURLRequest::RequestContext determineRequestContextFromNavigationType(const NavigationType navigationType) 703197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 704197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch switch (navigationType) { 705197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case NavigationTypeLinkClicked: 706197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return WebURLRequest::RequestContextHyperlink; 707197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 708197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case NavigationTypeOther: 709197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return WebURLRequest::RequestContextLocation; 710197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 711197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case NavigationTypeFormResubmitted: 712197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case NavigationTypeFormSubmitted: 713197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return WebURLRequest::RequestContextForm; 714197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 715197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case NavigationTypeBackForward: 716197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch case NavigationTypeReload: 717197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return WebURLRequest::RequestContextInternal; 718197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 719197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ASSERT_NOT_REACHED(); 720197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return WebURLRequest::RequestContextHyperlink; 721197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 722197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 7237757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid FrameLoader::load(const FrameLoadRequest& passedRequest) 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7257757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ASSERT(m_frame->document()); 7267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 7277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 7287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_inStopAllLoaders) 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch FrameLoadRequest request(passedRequest); 7337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (!prepareRequestForThisFrame(request)) 7347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return; 7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> targetFrame = request.formState() ? 0 : findFrameForNavigation(AtomicString(request.frameName()), request.formState() ? request.formState()->sourceDocument() : m_frame->document()); 7377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (targetFrame && targetFrame.get() != m_frame) { 7387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch request.setFrameName("_self"); 739f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) targetFrame->loader().load(request); 7408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (Page* page = targetFrame->page()) 7418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) page->chrome().focus(); 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch FrameLoadType newLoadType = determineFrameLoadType(request); 7467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch NavigationAction action(request.resourceRequest(), newLoadType, request.formState(), request.triggeringEvent()); 747197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (action.resourceRequest().requestContext() == WebURLRequest::RequestContextUnspecified) 748197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch action.mutableResourceRequest().setRequestContext(determineRequestContextFromNavigationType(action.type())); 749d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (shouldOpenInNewWindow(targetFrame.get(), request, action)) { 75051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (action.policy() == NavigationPolicyDownload) 751d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->loadURLExternally(action.resourceRequest(), NavigationPolicyDownload); 75251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) else 753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) createWindowForRequest(request, *m_frame, action.policy(), request.shouldSendReferrer()); 7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const KURL& url = request.resourceRequest().url(); 758d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!action.shouldOpenInNewWindow() && shouldPerformFragmentNavigation(request.formState(), request.resourceRequest().httpMethod(), newLoadType, url)) { 75909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_documentLoader->setTriggeringAction(action); 760d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (shouldTreatURLAsSameAsCurrent(url)) 761d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) newLoadType = FrameLoadTypeRedirectWithLockedBackForwardList; 762d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) loadInSameDocument(url, nullptr, newLoadType, request.clientRedirect()); 76383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch return; 76483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch } 765d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool sameURL = url == m_documentLoader->urlForHistory(); 766197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch loadWithNavigationAction(action, newLoadType, request.formState(), request.substituteData(), request.shouldCheckMainWorldContentSecurityPolicy(), request.clientRedirect()); 76753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Example of this case are sites that reload the same URL with a different cookie 76853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // driving the generated content, or a master frame with links that drive a target 76953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // frame, where the user has clicked on the same link repeatedly. 7707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (sameURL && newLoadType != FrameLoadTypeReload && newLoadType != FrameLoadTypeReloadFromOrigin && request.resourceRequest().httpMethod() != "POST") 77153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_loadType = FrameLoadTypeSame; 7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) 7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!shouldTreatURLAsSrcdocDocument(url)) 7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SubstituteData(); 778f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) String srcdoc = m_frame->deprecatedLocalOwner()->fastGetAttribute(srcdocAttr); 7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!srcdoc.isNull()); 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CString encodedSrcdoc = srcdoc.utf8(); 7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SubstituteData(SharedBuffer::create(encodedSrcdoc.data(), encodedSrcdoc.length()), "text/html", "UTF-8", KURL()); 7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 784d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FrameLoader::reportLocalLoadFailed(LocalFrame* frame, const String& url) 7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!url.isEmpty()); 7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!frame) 7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 790e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, "Not allowed to load local resource: " + url)); 7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 793197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// static 794197021e6b966cfb06891637935ef33fff06433d1Ben MurdochResourceRequest FrameLoader::requestFromHistoryItem(HistoryItem* item, ResourceRequestCachePolicy cachePolicy) 79509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 79609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<FormData> formData = item->formData(); 79709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ResourceRequest request(item->url(), item->referrer()); 79809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) request.setCachePolicy(cachePolicy); 79909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (formData) { 80009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) request.setHTTPMethod("POST"); 80109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) request.setHTTPBody(formData); 80209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) request.setHTTPContentType(item->formContentType()); 80309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString(item->referrer().referrer); 804197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch request.addHTTPOriginIfNeeded(securityOrigin->toAtomicString()); 80509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 80609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return request; 80709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 80809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 809c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, const AtomicString& overrideEncoding, ClientRedirectPolicy clientRedirectPolicy) 8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 81109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!m_currentItem) 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 814f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ResourceRequestCachePolicy cachePolicy = reloadPolicy == EndToEndReload ? ReloadBypassingCache : ReloadIgnoringCacheData; 815f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ResourceRequest request = requestFromHistoryItem(m_currentItem.get(), cachePolicy); 816197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch request.setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); 817197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch request.setRequestContext(WebURLRequest::RequestContextInternal); 818c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 819c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // ClientRedirectPolicy is an indication that this load was triggered by 820c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // some direct interaction with the page. If this reload is not a client 821c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // redirect, we should reuse the referrer from the original load of the 822c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // current document. If this reload is a client redirect (e.g., location.reload()), 823c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // it was initiated by something in the current document and should 824c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // therefore show the current document's url as the referrer. 825c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (clientRedirectPolicy == ClientRedirect) 826c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) request.setHTTPReferrer(Referrer(m_frame->document()->outgoingReferrer(), m_frame->document()->referrerPolicy())); 827c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 82809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!overrideURL.isEmpty()) { 82981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) request.setURL(overrideURL); 83009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) request.clearHTTPReferrer(); 83109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 8327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci request.setSkipServiceWorker(reloadPolicy == EndToEndReload); 8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch FrameLoadType type = reloadPolicy == EndToEndReload ? FrameLoadTypeReloadFromOrigin : FrameLoadTypeReload; 835c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) loadWithNavigationAction(NavigationAction(request, type), type, nullptr, SubstituteData(), CheckContentSecurityPolicy, clientRedirectPolicy, overrideEncoding); 8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 838bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void FrameLoader::stopAllLoaders() 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 840e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::NoDismissal) 8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. 8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_inStopAllLoaders) 8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 84602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calling stopLoading() on the provisional document loader can blow away 8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the frame from underneath. 8497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_inStopAllLoaders = true; 8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (RefPtrWillBeRawPtr<Frame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) { 854f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (child->isLocalFrame()) 855f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) toLocalFrame(child.get())->loader().stopAllLoaders(); 856f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_provisionalDocumentLoader) 8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_provisionalDocumentLoader->stopLoading(); 8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_documentLoader) 8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_documentLoader->stopLoading(); 8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch if (m_provisionalDocumentLoader) 86323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_provisionalDocumentLoader->detachFromFrame(); 864d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_provisionalDocumentLoader = nullptr; 8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_checkTimer.stop(); 8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 86802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_inStopAllLoaders = false; 86906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // detachFromParent() can be called multiple times on same LocalFrame, which 87109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // means we may no longer have a FrameLoaderClient to talk to. 872d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (client()) 873d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->didStopAllLoaders(); 8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameLoader::didAccessInitialDocument() 877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // We only need to notify the client once, and only for the main frame. 879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isLoadingMainFrame() && !m_didAccessInitialDocument) { 880926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_didAccessInitialDocument = true; 881926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Notify asynchronously, since this is called within a JavaScript security check. 882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_didAccessInitialDocumentTimer.startOneShot(0, FROM_HERE); 883926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 884926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 885926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void FrameLoader::didAccessInitialDocumentTimerFired(Timer<FrameLoader>*) 887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 8887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (client()) 8897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci client()->didAccessInitialDocument(); 890926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 891926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 8928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void FrameLoader::notifyIfInitialDocumentAccessed() 8938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 89451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_didAccessInitialDocumentTimer.isActive()) { 8958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_didAccessInitialDocumentTimer.stop(); 8968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) didAccessInitialDocumentTimerFired(0); 8978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } 8988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 8998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::commitProvisionalLoad() 9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 902d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(client()->hasWebView()); 903fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch ASSERT(m_state == FrameStateProvisional); 9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 9057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 907e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) // Check if the destination page is allowed to access the previous page's timing information. 908e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) if (m_frame->document()) { 9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(pdl->request().url()); 910e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles) pdl->timing()->setHasSameOriginAsPreviousDocument(securityOrigin->canRequest(m_frame->document()->url())); 9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The call to closeURL() invokes the unload event handler, which can execute arbitrary 9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // JavaScript. If the script initiates a new load, we need to abandon the current load, 9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // or the two will stomp each other. 9168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) // detachChildren will similarly trigger child frame unload event handlers. 91709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_documentLoader) { 918d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchWillClose(); 9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) closeURL(); 92009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 921c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_frame->detachChildren(); 9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pdl != m_provisionalDocumentLoader) 9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 92423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch if (m_documentLoader) 92523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_documentLoader->detachFromFrame(); 9268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_documentLoader = m_provisionalDocumentLoader.release(); 92723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_state = FrameStateCommittedPage; 9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isLoadingMainFrame()) 930e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_frame->page()->chrome().client().needTouchEvents(false); 9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 932d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->transitionToCommittedForNewPage(); 933f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->navigationScheduler().cancel(); 934c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_frame->editor().clearLastEditCommand(); 935fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch 936fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch // If we are still in the process of initializing an empty document then 937fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch // its frame is not in a consistent state for rendering, so avoid setJSStatusBarText 938fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch // since it may cause clients to attempt to render the frame. 939fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (!m_stateMachine.creatingInitialEmptyDocument()) { 94076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) LocalDOMWindow* window = m_frame->domWindow(); 941fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch window->setStatus(String()); 942fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch window->setDefaultStatus(String()); 943fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch } 9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::isLoadingMainFrame() const 9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 94851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_frame->isMainFrame(); 9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 951d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)FrameLoadType FrameLoader::loadType() const 9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 953d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return m_loadType; 9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 956d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// This function is an incomprehensible mess and is only used in checkLoadCompleteForThisFrame. 957d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// If you're thinking of using it elsewhere, stop right now and reconsider your life. 958d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static bool isDocumentDoneLoading(Document* document) 9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 960aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch if (!document->loader()) 961aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return true; 962d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (document->loader()->isLoadingMainResource()) 963d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 964d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!document->loadEventFinished()) { 965d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (document->loader()->isLoading() || document->isDelayingLoadEvent()) 966d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 967d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 968d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (document->fetcher()->requestCount()) 969d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 970d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (document->processingLoadEvent()) 971d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 972d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (document->hasActiveParser()) 973d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 974d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return true; 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 97602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 977d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool FrameLoader::checkLoadCompleteForThisFrame() 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 979d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(client()->hasWebView()); 9807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 9818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 982f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) bool allChildrenAreDoneLoading = true; 9837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (RefPtrWillBeRawPtr<Frame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) { 984f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (child->isLocalFrame()) 985f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) allChildrenAreDoneLoading &= toLocalFrame(child.get())->loader().checkLoadCompleteForThisFrame(); 986f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 987f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 9888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) { 9898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) const ResourceError& error = m_provisionalDocumentLoader->mainDocumentError(); 9908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (error.isNull()) 991d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 9928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) RefPtr<DocumentLoader> loader = m_provisionalDocumentLoader; 993d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidFailProvisionalLoad(error); 9948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (loader != m_provisionalDocumentLoader) 995d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 9968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_provisionalDocumentLoader->detachFromFrame(); 997d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_provisionalDocumentLoader = nullptr; 9988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_progressTracker->progressCompleted(); 9998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_state = FrameStateComplete; 10009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) checkCompleted(); 1001d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return true; 10028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) } 10038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 1004d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!allChildrenAreDoneLoading) 1005d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1007d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_state == FrameStateComplete) 1008d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return true; 1009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_provisionalDocumentLoader || !m_documentLoader) 1010d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 1011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!isDocumentDoneLoading(m_frame->document()) && !m_inStopAllLoaders) 1012d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return false; 101302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 101423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_state = FrameStateComplete; 10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch // FIXME: Is this subsequent work important if we already navigated away? 101723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch // Maybe there are bugs because of that, or extra work we can skip because 101823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch // the new page is ready. 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Retry restoring scroll offset since FrameStateComplete disables content 1021d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // size clamping. 102251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) restoreScrollPositionAndViewState(); 10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch if (!m_stateMachine.committedFirstRealDocumentLoad()) 1025d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return true; 102602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 102723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_progressTracker->progressCompleted(); 1028f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_frame->domWindow()->finishedLoading(); 10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 103023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch const ResourceError& error = m_documentLoader->mainDocumentError(); 1031323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!error.isNull()) { 1032d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidFailLoad(error); 1033323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } else { 1034323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Report mobile vs. desktop page statistics. This will only report on Android. 1035323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (m_frame->isMainFrame()) 1036323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_frame->document()->viewportDescription().reportMobilePageStats(m_frame); 1037323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 1038d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidFinishLoad(); 1039323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 104023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_loadType = FrameLoadTypeStandard; 1041d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return true; 10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1044d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FrameLoader::restoreScrollPositionAndViewState() 10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1046d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) FrameView* view = m_frame->view(); 1047d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!m_frame->page() || !view || !m_currentItem || !m_stateMachine.committedFirstRealDocumentLoad()) 1048d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 1049d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 1050d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!needsHistoryItemRestore(m_loadType)) 105151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 1052d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 1053d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // This tries to balance 1. restoring as soon as possible, 2. detecting 1054d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // clamping to avoid repeatedly popping the scroll position down as the 1055d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // page height increases, 3. ignore clamp detection after load completes 1056d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // because that may be because the page will never reach its previous 1057d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // height. 1058d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) float mainFrameScale = m_frame->settings()->pinchVirtualViewportEnabled() ? 1 : m_currentItem->pageScaleFactor(); 1059d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) bool canRestoreWithoutClamping = view->clampOffsetAtScale(m_currentItem->scrollPoint(), mainFrameScale) == m_currentItem->scrollPoint(); 1060d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool canRestoreWithoutAnnoyingUser = !view->wasScrolledByUser() && (canRestoreWithoutClamping || m_state == FrameStateComplete); 1061d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!canRestoreWithoutAnnoyingUser) 106219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return; 106319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 1064d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_frame->isMainFrame() && m_currentItem->pageScaleFactor()) { 1065d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) FloatPoint pinchViewportOffset(m_currentItem->pinchViewportScrollPoint()); 1066d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) IntPoint frameScrollOffset(m_currentItem->scrollPoint()); 1067d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 1068d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_frame->page()->setPageScaleFactor(m_currentItem->pageScaleFactor(), frameScrollOffset); 1069d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 10705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (m_frame->settings()->pinchVirtualViewportEnabled()) { 1071d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // If the pinch viewport's offset is (-1, -1) it means the history item 1072d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // is an old version of HistoryItem so distribute the scroll between 1073d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // the main frame and the pinch viewport as best as we can. 1074d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // FIXME(bokan): This legacy distribution can be removed once the virtual viewport 1075d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // pinch path is enabled on all platforms for at least one release. 1076d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (pinchViewportOffset.x() == -1 && pinchViewportOffset.y() == -1) 1077d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) pinchViewportOffset = FloatPoint(frameScrollOffset - view->scrollPosition()); 1078d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 1079d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_frame->host()->pinchViewport().setLocation(pinchViewportOffset); 1080d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 1081d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } else { 1082d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) view->setScrollPositionNonProgrammatically(m_currentItem->scrollPoint()); 1083d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) } 108451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_frame->isMainFrame()) { 1086d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (ScrollingCoordinator* scrollingCoordinator = m_frame->page()->scrollingCoordinator()) 1087d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scrollingCoordinator->frameViewRootLayerDidChange(view); 108851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 108951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 109051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Called every time a resource is completely loaded or an error is received. 10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::checkLoadComplete() 10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1094d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(client()->hasWebView()); 10955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (Page* page = m_frame->page()) { 10965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (page->mainFrame()->isLocalFrame()) 10975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) page->deprecatedLocalMainFrame()->loader().checkLoadCompleteForThisFrame(); 10985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String FrameLoader::userAgent(const KURL& url) const 11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) String userAgent = client()->userAgent(url); 11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorInstrumentation::applyUserAgentOverride(m_frame, &userAgent); 11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return userAgent; 11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::detachFromParent() 11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if !ENABLE(OILPAN) 1111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // The caller must protect a reference to m_frame. 1112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(m_frame->refCount() > 1); 11137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif 11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorInstrumentation::frameDetachedFromParent(m_frame); 11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 111723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch if (m_documentLoader) 111823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_documentLoader->detachFromFrame(); 1119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_documentLoader = nullptr; 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (!client()) 112209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: All this code belongs up in Page. 1125f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Frame* parent = m_frame->tree().parent(); 1126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (parent && parent->isLocalFrame()) { 1127d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_frame->setView(nullptr); 1128d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // FIXME: Shouldn't need to check if page() is null here. 1129f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_frame->owner() && m_frame->page()) 1130d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_frame->page()->decrementSubframeCount(); 1131d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_frame->willDetachFrameHost(); 1132d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) detachClient(); 1133f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) toLocalFrame(parent)->loader().scheduleCheckCompleted(); 11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 1135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_frame->setView(nullptr); 113609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_frame->willDetachFrameHost(); 113709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) detachClient(); 11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 113909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_frame->detachFromFrameHost(); 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 114209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameLoader::detachClient() 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1144d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(client()); 114502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 114609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Finish all cleanup work that might require talking to the embedder. 11477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_progressTracker->dispose(); 114809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_progressTracker.clear(); 114909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setOpener(0); 115009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Notify ScriptController that the frame is closing, since its cleanup ends up calling 1151e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // back to FrameLoaderClient via WindowProxy. 115209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_frame->script().clearForClose(); 11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1154d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) // client() should never be null because that means we somehow re-entered 1155323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // the frame detach code... but it is sometimes. 1156323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // FIXME: Understand why this is happening so we can document this insanity. 1157d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (client()) { 1158323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // After this, we must no longer talk to the client since this clears 1159323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // its owning reference back to our owning LocalFrame. 1160d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->detachedFromParent(); 1161d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_frame->clearClient(); 1162323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::receivedMainResourceError(const ResourceError& error) 11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Retain because the stop may release the last reference to it. 11687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1170e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (m_frame->document()->parser()) 1171e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_frame->document()->parser()->stopParsing(); 11727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 11737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch // FIXME: We really ought to be able to just check for isCancellation() here, but there are some 11747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch // ResourceErrors that setIsCancellation() but aren't created by ResourceError::cancelledError(). 11757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ResourceError c(ResourceError::cancelledError(KURL())); 1176f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->owner()) { 1177f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME: For now, fallback content doesn't work cross process. 1178f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) ASSERT(m_frame->owner()->isLocal()); 1179f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_frame->deprecatedLocalOwner()->renderFallbackContent(); 1180f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkCompleted(); 11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame->page()) 11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkLoadComplete(); 11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const String& httpMethod, FrameLoadType loadType, const KURL& url) 11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 118983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch ASSERT(loadType != FrameLoadTypeReloadFromOrigin); 11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We don't do this if we are submitting a form with method other than "GET", explicitly reloading, 11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // currently displaying a frameset, or if the URL does not have a fragment. 11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET")) 11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && loadType != FrameLoadTypeReload 11940019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch && loadType != FrameLoadTypeSame 119509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) && loadType != FrameLoadTypeBackForward 119683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch && url.hasFragmentIdentifier() 119783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch && equalIgnoringFragmentIdentifier(m_frame->document()->url(), url) 11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We don't want to just scroll if a link from within a 11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // frameset is trying to reload the frameset into _top. 12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && !m_frame->document()->isFrameSet(); 12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::scrollToFragmentWithParentBoundary(const KURL& url) 12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FrameView* view = m_frame->view(); 12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!view) 12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Leaking scroll position to a cross-origin ancestor would permit the so-called "framesniffing" attack. 12107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> boundaryFrame = url.hasFragmentIdentifier() ? m_frame->document()->findUnsafeParentScrollPropagationBoundary() : 0; 12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (boundaryFrame) 12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) boundaryFrame->view()->setSafeToPropagateScrollToParent(false); 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) view->scrollToFragment(url); 12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (boundaryFrame) 12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) boundaryFrame->view()->setSafeToPropagateScrollToParent(true); 12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::shouldClose() 12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Page* page = m_frame->page(); 122493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (!page || !page->chrome().canRunBeforeUnloadConfirmPanel()) 12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Store all references to each subframe in advance since beforeunload's event handler may modify frame 12287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WillBeHeapVector<RefPtrWillBeMember<LocalFrame> > targetFrames; 12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) targetFrames.append(m_frame); 1230f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree().traverseNext(m_frame)) { 1231f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME: There is not yet any way to dispatch events to out-of-process frames. 1232f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (child->isLocalFrame()) 1233f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) targetFrames.append(toLocalFrame(child)); 1234f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool shouldClose = false; 12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NavigationDisablerForBeforeUnload navigationDisabler; 12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t i; 12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1241f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) bool didAllowNavigation = false; 12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (i = 0; i < targetFrames.size(); i++) { 1243f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!targetFrames[i]->tree().isDescendantOf(m_frame)) 12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1245f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!targetFrames[i]->document()->dispatchBeforeUnloadEvent(page->chrome(), didAllowNavigation)) 12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (i == targetFrames.size()) 12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) shouldClose = true; 12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return shouldClose; 12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool FrameLoader::validateTransitionNavigationMode() 1256197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 1257197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (frame()->document()->inQuirksMode()) { 1258e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) frame()->document()->addConsoleMessage(ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, "Ignoring transition elements due to quirks mode.")); 1259197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return false; 1260197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 1261197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1262197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // FIXME(oysteine): Also check for width=device-width here, to avoid zoom/scaling issues. 1263197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return true; 1264197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 1265197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1266197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool FrameLoader::dispatchNavigationTransitionData() 1267197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 1268197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Vector<Document::TransitionElementData> elementData; 1269197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch frame()->document()->getTransitionElementData(elementData); 1270197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (elementData.isEmpty() || !validateTransitionNavigationMode()) 1271197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return false; 1272197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1273197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Vector<Document::TransitionElementData>::iterator iter = elementData.begin(); 1274197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch for (; iter != elementData.end(); ++iter) 1275197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch client()->dispatchAddNavigationTransitionData(iter->scope, iter->selector, iter->markup); 1276197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1277197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return true; 1278197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 1279197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1280197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid FrameLoader::loadWithNavigationAction(const NavigationAction& action, FrameLoadType type, PassRefPtrWillBeRawPtr<FormState> formState, const SubstituteData& substituteData, ContentSecurityPolicyCheck shouldCheckMainWorldContentSecurityPolicy, ClientRedirectPolicy clientRedirect, const AtomicString& overrideEncoding) 12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1282d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(client()->hasWebView()); 1283e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::NoDismissal) 12843c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch return; 12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 128651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) const ResourceRequest& request = action.resourceRequest(); 128709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 12881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // The current load should replace the history item if it is the first real 128951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // load of the frame. 12901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) bool replacesCurrentHistoryItem = false; 12911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (type == FrameLoadTypeRedirectWithLockedBackForwardList 12921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) || !m_stateMachine.committedFirstRealDocumentLoad()) { 12931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) replacesCurrentHistoryItem = true; 12941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 12951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 1296d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_policyDocumentLoader = client()->createDocumentLoader(m_frame, request, substituteData.isValid() ? substituteData : defaultSubstituteDataForURL(request.url())); 12973c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_policyDocumentLoader->setTriggeringAction(action); 12981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_policyDocumentLoader->setReplacesCurrentHistoryItem(replacesCurrentHistoryItem); 129919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) m_policyDocumentLoader->setIsClientRedirect(clientRedirect == ClientRedirect); 13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1301f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Frame* parent = m_frame->tree().parent(); 1302f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (parent && parent->isLocalFrame()) 1303f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_policyDocumentLoader->setOverrideEncoding(toLocalFrame(parent)->loader().documentLoader()->overrideEncoding()); 13043c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch else if (!overrideEncoding.isEmpty()) 13053c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_policyDocumentLoader->setOverrideEncoding(overrideEncoding); 13063c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch else if (m_documentLoader) 13073c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 13083c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 1309197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch bool isTransitionNavigation = false; 13119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (RuntimeEnabledFeatures::navigationTransitionsEnabled() && type != FrameLoadTypeReload && type != FrameLoadTypeReloadFromOrigin && type != FrameLoadTypeSame) 1312197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch isTransitionNavigation = dispatchNavigationTransitionData(); 1313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // stopAllLoaders can detach the LocalFrame, so protect it. 13157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 1316197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, shouldCheckMainWorldContentSecurityPolicy, isTransitionNavigation) || !shouldClose()) && m_policyDocumentLoader) { 131723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_policyDocumentLoader->detachFromFrame(); 1318d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_policyDocumentLoader = nullptr; 13199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) checkCompleted(); 13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1323f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_provisionalDocumentLoader) { 1324f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_provisionalDocumentLoader->stopLoading(); 1325f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_provisionalDocumentLoader) 1326f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_provisionalDocumentLoader->detachFromFrame(); 1327f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_provisionalDocumentLoader = nullptr; 1328f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 1329f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_checkTimer.stop(); 133002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // <rdar://problem/6250856> - In certain circumstances on pages with multiple frames, stopAllLoaders() 133202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // might detach the current FrameLoader, in which case we should bail on this newly defunct load. 1333e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (!m_frame->page() || !m_policyDocumentLoader) 13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch if (isLoadingMainFrame()) 1337e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) m_frame->page()->inspectorController().resume(); 1338f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_frame->navigationScheduler().cancel(); 13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 134023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_provisionalDocumentLoader = m_policyDocumentLoader.release(); 1341591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_loadType = type; 134223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch m_state = FrameStateProvisional; 13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 134453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (formState) 1345d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchWillSubmitForm(formState->form()); 134653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1347591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_progressTracker->progressStarted(); 13487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (m_provisionalDocumentLoader->isClientRedirect()) 1349e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url()); 1350e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->request().url()); 1351197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch client()->dispatchDidStartProvisionalLoad(isTransitionNavigation); 1352591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ASSERT(m_provisionalDocumentLoader); 135353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_provisionalDocumentLoader->startLoadingMainResource(); 13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::applyUserAgent(ResourceRequest& request) 13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String userAgent = this->userAgent(request.url()); 13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!userAgent.isNull()); 136009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) request.setHTTPUserAgent(AtomicString(userAgent)); 13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::shouldInterruptLoadForXFrameOptions(const String& content, const KURL& url, unsigned long requestIdentifier) 13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 136509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) UseCounter::count(m_frame->domWindow()->document(), UseCounter::XFrameOptions); 1366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1367f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Frame* topFrame = m_frame->tree().top(); 13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frame == topFrame) 13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 137153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) XFrameOptionsDisposition disposition = parseXFrameOptionsHeader(content); 137253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 137353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) switch (disposition) { 137453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) case XFrameOptionsSameOrigin: { 137509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) UseCounter::count(m_frame->domWindow()->document(), UseCounter::XFrameOptionsSameOrigin); 13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url); 1377f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // Out-of-process ancestors are always a different origin. 1378f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!topFrame->isLocalFrame() || !origin->isSameSchemeHostPort(toLocalFrame(topFrame)->document()->securityOrigin())) 13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1380f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) for (Frame* frame = m_frame->tree().parent(); frame; frame = frame->tree().parent()) { 1381f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!frame->isLocalFrame() || !origin->isSameSchemeHostPort(toLocalFrame(frame)->document()->securityOrigin())) { 138209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) UseCounter::count(m_frame->domWindow()->document(), UseCounter::XFrameOptionsSameOriginWithBadAncestorChain); 138351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) break; 1384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 138653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 138753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 138853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) case XFrameOptionsDeny: 138953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 139053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) case XFrameOptionsAllowAll: 139153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 1392e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) case XFrameOptionsConflict: { 1393e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, "Multiple 'X-Frame-Options' headers with conflicting values ('" + content + "') encountered when loading '" + url.elidedString() + "'. Falling back to 'DENY'."); 1394e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) consoleMessage->setRequestIdentifier(requestIdentifier); 13957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_frame->document()->addConsoleMessage(consoleMessage.release()); 139653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return true; 1397e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 1398e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) case XFrameOptionsInvalid: { 1399e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, "Invalid 'X-Frame-Options' header encountered when loading '" + url.elidedString() + "': '" + content + "' is not a recognized directive. The header will be ignored."); 1400e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) consoleMessage->setRequestIdentifier(requestIdentifier); 14017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_frame->document()->addConsoleMessage(consoleMessage.release()); 140253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 1403e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 140453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) default: 140553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT_NOT_REACHED(); 140653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return false; 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 141007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochbool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const 141107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{ 141207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return m_currentItem && url == m_currentItem->url(); 141307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch} 141407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const 14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!equalIgnoringCase(url.string(), "about:srcdoc")) 14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1419f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner(); 1420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!isHTMLIFrameElement(ownerElement)) 14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ownerElement->fastHasAttribute(srcdocAttr); 14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)LocalFrame* FrameLoader::findFrameForNavigation(const AtomicString& name, Document* activeDocument) 14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1427c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) ASSERT(activeDocument); 1428f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Frame* frame = m_frame->tree().find(name); 1429f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (!frame || !frame->isLocalFrame() || !activeDocument->canNavigate(toLocalFrame(*frame))) 1430c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) return 0; 1431f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return toLocalFrame(frame); 14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 143409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoadType, ResourceRequestCachePolicy cachePolicy) 14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 1437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_frame->page()->defersLoading()) { 1438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_deferredHistoryLoad = DeferredHistoryLoad(item, historyLoadType, cachePolicy); 1439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 1440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 1441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 144209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_provisionalItem = item; 144351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (historyLoadType == HistorySameDocumentLoad) { 1444d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) loadInSameDocument(item->url(), item->stateObject(), FrameLoadTypeBackForward, NotClientRedirect); 1445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) restoreScrollPositionAndViewState(); 1446e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return; 1447e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1448197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 1449197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ResourceRequest request = requestFromHistoryItem(item, cachePolicy); 1450197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch request.setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTypeTopLevel : WebURLRequest::FrameTypeNested); 1451197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch request.setRequestContext(WebURLRequest::RequestContextInternal); 1452197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch loadWithNavigationAction(NavigationAction(request, FrameLoadTypeBackForward), FrameLoadTypeBackForward, nullptr, SubstituteData(), CheckContentSecurityPolicy); 14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void FrameLoader::dispatchDocumentElementAvailable() 14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1457d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->documentElementAvailable(); 14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1460323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void FrameLoader::dispatchDidClearDocumentOfWindowObject() 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1462f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript)) 14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 146509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (Page* page = m_frame->page()) 1466323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) page->inspectorController().didClearDocumentOfWindowObject(m_frame); 1467323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) InspectorInstrumentation::didClearDocumentOfWindowObject(m_frame); 146809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1469323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // We just cleared the document, not the entire window object, but for the 1470323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // embedder that's close enough. 1471d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidClearWindowObjectInMainWorld(); 14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1474323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void FrameLoader::dispatchDidClearWindowObjectInMainWorld() 14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1476323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript)) 14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1479d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) client()->dispatchDidClearWindowObjectInMainWorld(); 14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SandboxFlags FrameLoader::effectiveSandboxFlags() const 14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SandboxFlags flags = m_forcedSandboxFlags; 1485f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME: We need a way to propagate sandbox flags to out-of-process frames. 1486f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Frame* parentFrame = m_frame->tree().parent(); 1487f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (parentFrame && parentFrame->isLocalFrame()) 1488f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) flags |= toLocalFrame(parentFrame)->document()->sandboxFlags(); 1489f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (FrameOwner* frameOwner = m_frame->owner()) 1490d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) flags |= frameOwner->sandboxFlags(); 14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return flags; 14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1494c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1495