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