18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 45f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 5cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Copyright (C) 2008 Alp Toker <alp@atoker.com> 6cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block * Copyright (C) Research In Motion Limited 2009. All rights reserved. 72bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ApplicationCacheHost.h" 3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "BackForwardController.h" 396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "BeforeUnloadEvent.h" 4028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "MemoryCache.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedPage.h" 4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "CachedResourceLoader.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Chrome.h" 442bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "ContentSecurityPolicy.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMImplementation.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMWindow.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "DocumentLoadTiming.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Editor.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditorClient.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FormState.h" 5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "FormSubmission.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoaderClient.h" 615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "FrameNetworkingContext.h" 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h" 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 64cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "HTMLAnchorElement.h" 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFormElement.h" 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLObjectElement.h" 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTTPParsers.h" 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HistoryItem.h" 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h" 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconLoader.h" 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "InspectorController.h" 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorInstrumentation.h" 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Logging.h" 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h" 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MainResourceLoader.h" 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageCache.h" 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageGroup.h" 80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "PageTransitionEvent.h" 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginData.h" 82cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "PluginDatabase.h" 83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PluginDocument.h" 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h" 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h" 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceRequest.h" 870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "SchemeRegistry.h" 882bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "ScrollAnimator.h" 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptController.h" 90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptSourceCode.h" 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SecurityOrigin.h" 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SegmentedString.h" 93dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SerializedScriptValue.h" 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextResourceDecoder.h" 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WindowFeatures.h" 97545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "XMLDocumentParser.h" 98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/CurrentTime.h> 99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h> 10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <wtf/text/CString.h> 101a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/text/StringConcatenate.h> 10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(SHARED_WORKERS) 10406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "SharedWorkerRepository.h" 10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGDocument.h" 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGLocatable.h" 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h" 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGPreserveAspectRatio.h" 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGSVGElement.h" 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewElement.h" 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewSpec.h" 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Archive.h" 1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ArchiveFactory.h" 120d73b16bdebb9d20b17be0a30e626dc9e66b6d868Steve Block#endif 121d73b16bdebb9d20b17be0a30e626dc9e66b6d868Steve Block 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace HTMLNames; 12506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace SVGNames; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(XHTMLMP) 1312bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic const char defaultAcceptHeader[] = "application/vnd.wap.xhtml+xml,application/xhtml+xml;profile='http://www.wapforum.org/xhtml',text/html,application/xml;q=0.9,*/*;q=0.8"; 1325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 1332bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic const char defaultAcceptHeader[] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 1345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 13506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic double storedTimeOfLastCompletedLoad; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool isBackForwardLoadType(FrameLoadType type) 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (type) { 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeStandard: 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReload: 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeReloadFromOrigin: 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeSame: 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeRedirectWithLockedBackForwardList: 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReplace: 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeBack: 1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case FrameLoadTypeBackWMLDeckNotAccessible: 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeForward: 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeIndexedBackForward: 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int numRequests(Document* document) 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!document) 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return document->cachedResourceLoader()->requestCount(); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 166e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// This is not in the FrameLoader class to emphasize that it does not depend on 167e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// private FrameLoader data, and to avoid increasing the number of public functions 168e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// with access to private data. Since only this .cpp file needs it, making it 169e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// non-member lets us exclude it from the header file, thus keeping FrameLoader.h's 170e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// API simpler. 171e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// 172e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// FIXME: isDocumentSandboxed should eventually replace isSandboxed. 173e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockstatic bool isDocumentSandboxed(Frame* frame, SandboxFlags mask) 174e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{ 175e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return frame->document() && frame->document()->securityOrigin()->isSandboxed(mask); 176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block} 177e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client) 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_frame(frame) 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_client(client) 181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_policyChecker(frame) 182cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_history(frame) 183cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_notifer(frame) 18406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_subframeLoader(frame) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_state(FrameStateCommittedPage) 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_loadType(FrameLoadTypeStandard) 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_delegateIsHandlingProvisionalLoadError(false) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_quickRedirectComing(false) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_sentRedirectNotification(false) 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_inStopAllLoaders(false) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isExecutingJavaScriptFormAction(false) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_didCallImplicitClose(false) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_wasUnloadEventEmitted(false) 1946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_pageDismissalEventBeingDispatched(false) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isComplete(false) 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isLoadingMainResource(false) 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsClear(false) 198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_checkTimer(this, &FrameLoader::checkTimerFired) 199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_shouldCallCheckCompleted(false) 200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_shouldCallCheckLoadComplete(false) 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_opener(0) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_didPerformFirstNavigation(false) 203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_loadingFromCachedPage(false) 204cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_suppressOpenerInNewFrame(false) 205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_sandboxFlags(SandboxAll) 206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_forcedSandboxFlags(SandboxNone) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoader::~FrameLoader() 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setOpener(0); 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashSet<Frame*>::iterator end = m_openedFrames.end(); 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (HashSet<Frame*>::iterator it = m_openedFrames.begin(); it != end; ++it) 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (*it)->loader()->m_opener = 0; 217cad810f21b803229eb11403f9209855525a25d57Steve Block 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->frameLoaderDestroyed(); 2195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (m_networkingContext) 2215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_networkingContext->invalidate(); 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::init() 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22621939df44de1705786c545cd1bf519d47250322dBen Murdoch // Propagate sandbox attributes to this Frameloader and its descendants. 22721939df44de1705786c545cd1bf519d47250322dBen Murdoch // This needs to be done early, so that an initial document gets correct sandbox flags in its SecurityOrigin. 22821939df44de1705786c545cd1bf519d47250322dBen Murdoch updateSandboxFlags(); 22921939df44de1705786c545cd1bf519d47250322dBen Murdoch 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this somewhat odd set of steps is needed to give the frame an initial empty document 23106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CreatingInitialEmptyDocument); 232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setPolicyDocumentLoader(m_client->createDocumentLoader(ResourceRequest(KURL(ParsedURLString, "")), SubstituteData()).get()); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(m_policyDocumentLoader.get()); 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setResponse(ResourceResponse(KURL(), "text/html", 0, String(), String())); 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->finishedLoading(); 2372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_documentLoader->writer()->begin(KURL(), false); 2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_documentLoader->writer()->end(); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->cancelParsing(); 24006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocument); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; 2425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_networkingContext = m_client->createNetworkingContext(); 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setDefersLoading(bool defers) 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->setDefersLoading(defers); 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setDefersLoading(defers); 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader) 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader->setDefersLoading(defers); 254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 255231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!defers) { 256a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->startTimer(); 257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 258231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::canHandleRequest(const ResourceRequest& request) 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->canHandleRequest(request); 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::changeLocation(PassRefPtr<SecurityOrigin> securityOrigin, const KURL& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool refresh) 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch urlSelected(FrameLoadRequest(securityOrigin, ResourceRequest(url, referrer, refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy), "_self"), 270f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 0, lockHistory, lockBackForwardList, SendReferrer, ReplaceDocumentIfJavaScriptURL); 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 273a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid FrameLoader::urlSelected(const KURL& url, const String& passedTarget, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, ReferrerPolicy referrerPolicy) 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch urlSelected(FrameLoadRequest(m_frame->document()->securityOrigin(), ResourceRequest(url), passedTarget), 276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch triggeringEvent, lockHistory, lockBackForwardList, referrerPolicy, DoNotReplaceDocumentIfJavaScriptURL); 2776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 279e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// The shouldReplaceDocumentIfJavaScriptURL parameter will go away when the FIXME to eliminate the 280e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// corresponding parameter from ScriptController::executeIfJavaScriptURL() is addressed. 281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::urlSelected(const FrameLoadRequest& passedRequest, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, ReferrerPolicy referrerPolicy, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL) 2826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 283cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(!m_suppressOpenerInNewFrame); 284cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 285f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FrameLoadRequest frameRequest(passedRequest); 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_frame->script()->executeIfJavaScriptURL(frameRequest.resourceRequest().url(), shouldReplaceDocumentIfJavaScriptURL)) 288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frameRequest.frameName().isEmpty()) 291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frameRequest.setFrameName(m_frame->document()->baseTarget()); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 293cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (referrerPolicy == NoReferrer) 294cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_suppressOpenerInNewFrame = true; 295f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frameRequest.resourceRequest().httpReferrer().isEmpty()) 2965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian frameRequest.resourceRequest().setHTTPReferrer(m_outgoingReferrer); 2975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian addHTTPOriginIfNeeded(frameRequest.resourceRequest(), outgoingOrigin()); 2985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 299cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block loadFrameRequest(frameRequest, lockHistory, lockBackForwardList, triggeringEvent, 0, referrerPolicy); 300cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 301cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_suppressOpenerInNewFrame = false; 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid FrameLoader::submitForm(PassRefPtr<FormSubmission> submission) 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->method() == FormSubmission::PostMethod || submission->method() == FormSubmission::GetMethod); 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: Find a good spot for these. 30906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->data()); 31006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->state()); 31106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->state()->sourceFrame() == m_frame); 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->page()) 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (submission->action().isEmpty()) 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 319e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (isDocumentSandboxed(m_frame, SandboxForms)) 320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 32206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (protocolIsJavaScript(submission->action())) { 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isExecutingJavaScriptFormAction = true; 324a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->script()->executeIfJavaScriptURL(submission->action(), DoNotReplaceDocumentIfJavaScriptURL); 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isExecutingJavaScriptFormAction = false; 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Frame* targetFrame = m_frame->tree()->find(submission->target()); 330692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!shouldAllowNavigation(targetFrame)) 331692e5dbf12901edacf14812a6fae25462920af42Steve Block return; 3325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame) { 333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!DOMWindow::allowPopUp(m_frame) && !isProcessingUserGesture()) 334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 3365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian targetFrame = m_frame; 33706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } else 33806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->clearTarget(); 33906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 3405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame->page()) 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: We'd like to remove this altogether and fix the multiple form submission issue another way. 3445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // We do not want to submit more than one form from the same page, nor do we want to submit a single 3465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // form more than once. This flag prevents these from happening; not sure how other browsers prevent this. 3475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The flag is reset in each time we start handle a new mouse or key down event, and 3485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // also in setView since this part may get reused for a page from the back/forward cache. 3495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The form multi-submit logic here is only needed when we are submitting a form that affects this frame. 3505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: Frame targeting is only one of the ways the submission could end up doing something other 3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // than replacing this frame's content, so this check is flawed. On the other hand, the check is hardly 3535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // needed any more now that we reset m_submittedFormURL on each mouse or key down event. 3545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame->tree()->isDescendantOf(targetFrame)) { 35606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_submittedFormURL == submission->action()) 3575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 35806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_submittedFormURL = submission->action(); 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 36106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->data()->generateFiles(m_frame->document()); 36206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->setReferrer(m_outgoingReferrer); 36306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->setOrigin(outgoingOrigin()); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 365a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch targetFrame->navigationScheduler()->scheduleFormSubmission(submission); 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 36881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid FrameLoader::stopLoading(UnloadEventPolicy unloadEventPolicy) 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 370545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (m_frame->document() && m_frame->document()->parser()) 371545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->parser()->stopParsing(); 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 373231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (unloadEventPolicy != UnloadEventPolicyNone) { 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) { 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_didCallImplicitClose && !m_wasUnloadEventEmitted) { 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* currentFocusedNode = m_frame->document()->focusedNode(); 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currentFocusedNode) 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentFocusedNode->aboutToUnload(); 379131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block// ANDROID 380131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // See http://b/issue?id=5264509 381131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block if (m_frame->domWindow() && !m_pageDismissalEventBeingDispatched) { 382131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block m_pageDismissalEventBeingDispatched = true; 383131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block// END ANDROID 384231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (unloadEventPolicy == UnloadEventPolicyUnloadAndPageHide) 38585893753155358c7010c212d5a5c651d240b7351Patrick Scott m_frame->domWindow()->dispatchEvent(PageTransitionEvent::create(eventNames().pagehideEvent, m_frame->document()->inPageCache()), m_frame->document()); 386967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!m_frame->document()->inPageCache()) { 3874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang RefPtr<Event> unloadEvent(Event::create(eventNames().unloadEvent, false, false)); 3884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // The DocumentLoader (and thus its DocumentLoadTiming) might get destroyed 3894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // while dispatching the event, so protect it to prevent writing the end 3904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // time into freed memory. 391cad810f21b803229eb11403f9209855525a25d57Steve Block RefPtr<DocumentLoader> documentLoader = m_provisionalDocumentLoader; 392cad810f21b803229eb11403f9209855525a25d57Steve Block if (documentLoader && !documentLoader->timing()->unloadEventStart && !documentLoader->timing()->unloadEventEnd) { 3934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DocumentLoadTiming* timing = documentLoader->timing(); 394967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT(timing->navigationStart); 3954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_frame->domWindow()->dispatchTimedEvent(unloadEvent, m_frame->domWindow()->document(), &timing->unloadEventStart, &timing->unloadEventEnd); 3964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else 3974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->domWindow()->document()); 398967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 399231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 4006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = false; 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) 4025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_frame->document()->updateStyleIfNeeded(); 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_wasUnloadEventEmitted = true; 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Dispatching the unload event could have made m_frame->document() null. 408cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (m_frame->document() && !m_frame->document()->inPageCache()) { 409cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // Don't remove event listeners from a transitional empty document (see bug 28716 for more information). 41006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool keepEventListeners = m_stateMachine.isDisplayingInitialEmptyDocument() && m_provisionalDocumentLoader 411cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block && m_frame->document()->securityOrigin()->isSecureTransitionTo(m_provisionalDocumentLoader->url()); 412cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 413cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!keepEventListeners) 414cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->document()->removeAllEventListeners(); 415cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_isComplete = true; // to avoid calling completed() in finishedParsing() 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = false; 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; // don't want that one either 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document() && m_frame->document()->parsing()) { 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finishedParsing(); 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->setParsing(false); 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = KURL(); 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Document* doc = m_frame->document()) { 4305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // FIXME: HTML5 doesn't tell us to set the state to complete when aborting, but we do anyway to match legacy behavior. 4315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10537 4325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick doc->setReadyState(Document::Complete); 4335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (CachedResourceLoader* cachedResourceLoader = doc->cachedResourceLoader()) 435f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch cachedResourceLoader->cancelRequests(); 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DATABASE) 43881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch doc->stopDatabases(0); 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 44206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: This will cancel redirection timer, which really needs to be restarted when restoring the frame from b/f cache. 443a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::stop() 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://bugs.webkit.org/show_bug.cgi?id=10854 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The frame's last ref may be removed and it will be deleted by checkCompleted(). 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protector(m_frame); 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 452545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (m_frame->document()->parser()) 453545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->parser()->stopParsing(); 4548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->finishParsing(); 4558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_iconLoader) 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_iconLoader->stopLoading(); 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::closeURL() 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 462cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->saveDocumentState(); 463231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 464231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Should only send the pagehide event here if the current document exists and has not been placed in the page cache. 465231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Document* currentDocument = m_frame->document(); 466231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block stopLoading(currentDocument && !currentDocument->inPageCache() ? UnloadEventPolicyUnloadAndPageHide : UnloadEventPolicyUnloadOnly); 467231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clearUndoRedoOperations(); 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::iconURL() 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this isn't a top level frame, return nothing 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->tree() && m_frame->tree()->parent()) 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return KURL(); 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we have an iconURL from a Link element, return that 4798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_frame->document()->iconURL().isEmpty()) 480231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return KURL(ParsedURLString, m_frame->document()->iconURL()); 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't return a favicon iconURL unless we're http or https 4832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block KURL documentURL = m_frame->document()->url(); 4842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!documentURL.protocolInHTTPFamily()) 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return KURL(); 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url; 4882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool couldSetProtocol = url.setProtocol(documentURL.protocol()); 489d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_UNUSED(couldSetProtocol, couldSetProtocol); 4902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block url.setHost(documentURL.host()); 4912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (documentURL.hasPort()) 4922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block url.setPort(documentURL.port()); 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.setPath("/favicon.ico"); 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return url; 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::didOpenURL(const KURL& url) 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 499a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (m_frame->navigationScheduler()->redirectScheduledDuringLoad()) { 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A redirect was scheduled before the document was created. 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This can happen when one frame changes another frame's location. 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 5035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 505a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clearLastEditCommand(); 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = true; 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we are still in the process of initializing an empty document then 5135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // its frame is not in a consistent state for rendering, so avoid setJSStatusBarText 5145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // since it may cause clients to attempt to render the frame. 51506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.creatingInitialEmptyDocument()) { 51606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (DOMWindow* window = m_frame->existingDOMWindow()) { 51706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setStatus(String()); 51806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setDefaultStatus(String()); 51906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 5205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 5212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_workingURL = url; 5222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_workingURL.protocolInHTTPFamily() && !m_workingURL.host().isEmpty() && m_workingURL.path().isEmpty()) 5232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_workingURL.setPath("/"); 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project started(); 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didExplicitOpen() 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Calling document.open counts as committing the first real document load. 53606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.committedFirstRealDocumentLoad()) 53706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit); 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from a subsequent window.document.open / window.document.write call. 541d0825bca7fe65beaee391d30da42e937db621564Steve Block // Canceling redirection here works for all cases because document.open 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // implicitly precedes document.write. 5432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->navigationScheduler()->cancel(); 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::cancelAndClear() 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 549a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_isComplete) 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clear(false); 555635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->script()->updatePlatformScriptObjects(); 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::clear(bool clearWindowProperties, bool clearScriptObjects, bool clearFrameView) 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clear(); 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_needsClear) 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = false; 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_frame->document()->inPageCache()) { 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->cancelParsing(); 568635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->document()->stopActiveDOMObjects(); 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()->attached()) { 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->willRemove(); 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->detach(); 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->removeFocusedNodeOfSubtree(m_frame->document()); 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do this after detaching the document so that the unload event works. 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (clearWindowProperties) { 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->clearDOMWindow(); 580e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block m_frame->script()->clearWindowShell(m_frame->document()->inPageCache()); 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->selection()->clear(); 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->eventHandler()->clear(); 585231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (clearFrameView && m_frame->view()) 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->clear(); 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do not drop the document before the ScriptController and view are cleared 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as some destructors might still try to access the document. 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setDocument(0); 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_subframeLoader.clear(); 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (clearScriptObjects) 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->script()->clearScriptObjects(); 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 597a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->clear(); 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 599231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_checkTimer.stop(); 600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = false; 601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = false; 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 60306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.isDisplayingInitialEmptyDocument() && m_stateMachine.committedFirstRealDocumentLoad()) 60406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::receivedFirstData() 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block activeDocumentLoader()->writer()->begin(m_workingURL, false); 6102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block activeDocumentLoader()->writer()->setDocumentWasLoadedAsPartOfNavigation(); 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dispatchDidCommitLoad(); 613643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectsInAllWorlds(); 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_documentLoader) { 6162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch StringWithDirection ptitle = m_documentLoader->title(); 6175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we have a title let the WebView know about it. 6185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!ptitle.isNull()) 6195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_client->dispatchDidReceiveTitle(ptitle); 6205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = KURL(); 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double delay; 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String url; 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 628cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (m_frame->inViewSourceMode()) 629cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parseHTTPRefresh(m_documentLoader->response().httpHeaderField("Refresh"), false, delay, url)) 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 6342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block url = m_frame->document()->url().string(); 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = m_frame->document()->completeURL(url).string(); 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->scheduleRedirect(delay, url); 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6412fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid FrameLoader::setOutgoingReferrer(const KURL& url) 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 64381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_outgoingReferrer = url.strippedForUseAsReferrer(); 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::didBeginDocument(bool dispatch) 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = true; 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = true; 652a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->document()->setReadyState(Document::Loading); 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 654d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_pendingStateObject) { 655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_frame->document()->statePopped(m_pendingStateObject.get()); 656d0825bca7fe65beaee391d30da42e937db621564Steve Block m_pendingStateObject.clear(); 657d0825bca7fe65beaee391d30da42e937db621564Steve Block } 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (dispatch) 660643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectsInAllWorlds(); 661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 6625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian updateFirstPartyForCookies(); 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Settings* settings = m_frame->document()->settings(); 66592451d3c3cebc17dfa2908de5836d2dae50d4a42Iain Merrick m_frame->document()->cachedResourceLoader()->setAutoLoadImages(settings && settings->loadsImagesAutomatically()); 666eebae91469b8f225fe78e97ce6dae26efcf6da43Steve Block#ifdef ANDROID_BLOCK_NETWORK_IMAGE 66792451d3c3cebc17dfa2908de5836d2dae50d4a42Iain Merrick m_frame->document()->cachedResourceLoader()->setBlockNetworkImage(settings && settings->blockNetworkImage()); 668eebae91469b8f225fe78e97ce6dae26efcf6da43Steve Block#endif 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) { 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String dnsPrefetchControl = m_documentLoader->response().httpHeaderField("X-DNS-Prefetch-Control"); 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dnsPrefetchControl.isEmpty()) 673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_frame->document()->parseDNSPrefetchControlHeader(dnsPrefetchControl); 6742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 6752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String contentSecurityPolicy = m_documentLoader->response().httpHeaderField("X-WebKit-CSP"); 6762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!contentSecurityPolicy.isEmpty()) 6772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->document()->contentSecurityPolicy()->didReceiveHeader(contentSecurityPolicy); 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 680cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->restoreDocumentState(); 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::didEndDocument() 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = false; 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6882bde8e466a4451c7319e3a072d118917957d6554Steve Block// Callback for the old-style synchronous IconDatabase interface. 6892bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid FrameLoader::iconLoadDecisionReceived(IconLoadDecision iconLoadDecision) 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_mayLoadIconLater) 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(IconDatabase, "FrameLoader %p was told a load decision is available for its icon", this); 6942bde8e466a4451c7319e3a072d118917957d6554Steve Block continueIconLoadWithDecision(iconLoadDecision); 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mayLoadIconLater = false; 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::startIconLoader() 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: We kick off the icon loader when the frame is done receiving its main resource. 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // But we should instead do it when we're done parsing the head element. 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isLoadingMainFrame()) 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 70581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!iconDatabase().isEnabled()) 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url(iconURL()); 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String urlString(url.string()); 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (urlString.isEmpty()) 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // People who want to avoid loading images generally want to avoid loading all images, unless an exception has been made for site icons. 7140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Now that we've accounted for URL mapping, avoid starting the network load if images aren't set to display automatically. 7150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Settings* settings = m_frame->settings(); 7162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (settings && !settings->loadsImagesAutomatically() && !settings->loadsSiteIconsIgnoringImageLoadingSetting()) 7170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 7180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 7192bde8e466a4451c7319e3a072d118917957d6554Steve Block // If we're reloading the page, always start the icon load now. 7202bde8e466a4451c7319e3a072d118917957d6554Steve Block if (loadType() == FrameLoadTypeReload && loadType() == FrameLoadTypeReloadFromOrigin) { 7212bde8e466a4451c7319e3a072d118917957d6554Steve Block continueIconLoadWithDecision(IconLoadYes); 7222bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 7232bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7242bde8e466a4451c7319e3a072d118917957d6554Steve Block 7252bde8e466a4451c7319e3a072d118917957d6554Steve Block if (iconDatabase().supportsAsynchronousMode()) { 7262bde8e466a4451c7319e3a072d118917957d6554Steve Block m_documentLoader->getIconLoadDecisionForIconURL(urlString); 7272bde8e466a4451c7319e3a072d118917957d6554Steve Block // Commit the icon url mapping to the database just in case we don't end up loading later. 7282bde8e466a4451c7319e3a072d118917957d6554Steve Block commitIconURLToIconDatabase(url); 7292bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 7302bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7312bde8e466a4451c7319e3a072d118917957d6554Steve Block 7322bde8e466a4451c7319e3a072d118917957d6554Steve Block IconLoadDecision decision = iconDatabase().synchronousLoadDecisionForIconURL(urlString, m_documentLoader.get()); 7332bde8e466a4451c7319e3a072d118917957d6554Steve Block 7342bde8e466a4451c7319e3a072d118917957d6554Steve Block if (decision == IconLoadUnknown) { 7352bde8e466a4451c7319e3a072d118917957d6554Steve Block // In this case, we may end up loading the icon later, but we still want to commit the icon url mapping to the database 7362bde8e466a4451c7319e3a072d118917957d6554Steve Block // just in case we don't end up loading later - if we commit the mapping a second time after the load, that's no big deal 7372bde8e466a4451c7319e3a072d118917957d6554Steve Block // We also tell the client to register for the notification that the icon is received now so it isn't missed in case the 7382bde8e466a4451c7319e3a072d118917957d6554Steve Block // icon is later read in from disk 7392bde8e466a4451c7319e3a072d118917957d6554Steve Block LOG(IconDatabase, "FrameLoader %p might load icon %s later", this, urlString.ascii().data()); 7402bde8e466a4451c7319e3a072d118917957d6554Steve Block m_mayLoadIconLater = true; 7412bde8e466a4451c7319e3a072d118917957d6554Steve Block m_client->registerForIconNotification(); 7422bde8e466a4451c7319e3a072d118917957d6554Steve Block commitIconURLToIconDatabase(url); 7432bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 7442bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7452bde8e466a4451c7319e3a072d118917957d6554Steve Block 7462bde8e466a4451c7319e3a072d118917957d6554Steve Block continueIconLoadWithDecision(decision); 7472bde8e466a4451c7319e3a072d118917957d6554Steve Block} 7482bde8e466a4451c7319e3a072d118917957d6554Steve Block 7492bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid FrameLoader::continueIconLoadWithDecision(IconLoadDecision iconLoadDecision) 7502bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 7512bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(iconLoadDecision != IconLoadUnknown); 7522bde8e466a4451c7319e3a072d118917957d6554Steve Block 7532bde8e466a4451c7319e3a072d118917957d6554Steve Block // FIXME (<rdar://problem/9168605>) - We should support in-memory-only private browsing icons in asynchronous icon database mode. 7542bde8e466a4451c7319e3a072d118917957d6554Steve Block if (iconDatabase().supportsAsynchronousMode() && m_frame->page()->settings()->privateBrowsingEnabled()) 7552bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 7562bde8e466a4451c7319e3a072d118917957d6554Steve Block 7572bde8e466a4451c7319e3a072d118917957d6554Steve Block if (iconLoadDecision == IconLoadNo) { 7582bde8e466a4451c7319e3a072d118917957d6554Steve Block KURL url(iconURL()); 7592bde8e466a4451c7319e3a072d118917957d6554Steve Block String urlString(url.string()); 7602bde8e466a4451c7319e3a072d118917957d6554Steve Block 7612bde8e466a4451c7319e3a072d118917957d6554Steve Block LOG(IconDatabase, "FrameLoader::startIconLoader() - Told not to load this icon, committing iconURL %s to database for pageURL mapping", urlString.ascii().data()); 7622bde8e466a4451c7319e3a072d118917957d6554Steve Block commitIconURLToIconDatabase(url); 7632bde8e466a4451c7319e3a072d118917957d6554Steve Block 7642bde8e466a4451c7319e3a072d118917957d6554Steve Block if (iconDatabase().supportsAsynchronousMode()) { 7652bde8e466a4451c7319e3a072d118917957d6554Steve Block m_documentLoader->getIconDataForIconURL(urlString); 7662bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 7672bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7682bde8e466a4451c7319e3a072d118917957d6554Steve Block 7692bde8e466a4451c7319e3a072d118917957d6554Steve Block // We were told not to load this icon - that means this icon is already known by the database 7702bde8e466a4451c7319e3a072d118917957d6554Steve Block // If the icon data hasn't been read in from disk yet, kick off the read of the icon from the database to make sure someone 7712bde8e466a4451c7319e3a072d118917957d6554Steve Block // has done it. This is after registering for the notification so the WebView can call the appropriate delegate method. 7722bde8e466a4451c7319e3a072d118917957d6554Steve Block // Otherwise if the icon data *is* available, notify the delegate 7732bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!iconDatabase().synchronousIconDataKnownForIconURL(urlString)) { 7742bde8e466a4451c7319e3a072d118917957d6554Steve Block LOG(IconDatabase, "Told not to load icon %s but icon data is not yet available - registering for notification and requesting load from disk", urlString.ascii().data()); 7752bde8e466a4451c7319e3a072d118917957d6554Steve Block m_client->registerForIconNotification(); 7762bde8e466a4451c7319e3a072d118917957d6554Steve Block iconDatabase().synchronousIconForPageURL(m_frame->document()->url().string(), IntSize(0, 0)); 7772bde8e466a4451c7319e3a072d118917957d6554Steve Block iconDatabase().synchronousIconForPageURL(originalRequestURL().string(), IntSize(0, 0)); 7782bde8e466a4451c7319e3a072d118917957d6554Steve Block } else 7792bde8e466a4451c7319e3a072d118917957d6554Steve Block m_client->dispatchDidReceiveIcon(); 7802bde8e466a4451c7319e3a072d118917957d6554Steve Block 7812bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 7822bde8e466a4451c7319e3a072d118917957d6554Steve Block } 7832bde8e466a4451c7319e3a072d118917957d6554Steve Block 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_iconLoader) 785e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_iconLoader = IconLoader::create(m_frame); 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_iconLoader->startLoading(); 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::commitIconURLToIconDatabase(const KURL& icon) 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block LOG(IconDatabase, "Committing iconURL %s to database for pageURLs %s and %s", icon.string().ascii().data(), m_frame->document()->url().string().ascii().data(), originalRequestURL().string().ascii().data()); 79381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch iconDatabase().setIconURLForPageURL(icon.string(), m_frame->document()->url().string()); 79481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch iconDatabase().setIconURLForPageURL(icon.string(), originalRequestURL().string()); 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedParsing() 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_frame->injectUserScripts(InjectAtDocumentEnd); 8002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 80106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This can be called from the Frame's destructor, in which case we shouldn't protect ourselves 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // because doing so will cause us to re-enter the destructor when protector goes out of scope. 8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Null-checking the FrameView indicates whether or not we're in the destructor. 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protector = m_frame->view() ? m_frame : 0; 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 809635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidFinishDocumentLoad(); 810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->view()) 8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // We are being destroyed by something checkCompleted called. 8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if the scrollbars are really needed for the content. 8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If not, remove them, relayout, and repaint. 8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->restoreScrollbar(); 8192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->view()->scrollToFragment(m_frame->document()->url()); 8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadDone() 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian checkCompleted(); 8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 827231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::allChildrenAreComplete() const 828231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 829231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { 830231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!child->loader()->m_isComplete) 831231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 832231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 833231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 834231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 835231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 836231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::allAncestorsAreComplete() const 837231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 838231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (Frame* ancestor = m_frame; ancestor; ancestor = ancestor->tree()->parent()) { 839231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!ancestor->loader()->m_isComplete) 840231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 841231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 842231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 843231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 844231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkCompleted() 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 847231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = false; 848231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 8498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->view()) 8508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->view()->checkStopDelayingDeferredRepaints(); 8518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Have we completed before? 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isComplete) 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Are we still parsing? 8578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->document()->parsing()) 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Still waiting for images/scripts? 8618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (numRequests(m_frame->document())) 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Still waiting for elements that don't go through a FrameLoader? 8655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_frame->document()->isDelayingLoadEvent()) 8665ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 8675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 86881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Any frame that hasn't completed yet? 86981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!allChildrenAreComplete()) 87081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 87181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // OK, completed. 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = true; 8745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_frame->document()->setReadyState(Document::Complete); 8758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 8778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCallImplicitClose(); // if we didn't do it before 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 879a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->startTimer(); 8808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project completed(); 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 8848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 886231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkTimerFired(Timer<FrameLoader>*) 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 888231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (Page* page = m_frame->page()) { 889231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (page->defersLoading()) 890231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 891231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_shouldCallCheckCompleted) 893231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block checkCompleted(); 894231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_shouldCallCheckLoadComplete) 895231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block checkLoadComplete(); 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::startCheckCompleteTimer() 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 900231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!(m_shouldCallCheckCompleted || m_shouldCallCheckLoadComplete)) 901231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_checkTimer.isActive()) 903231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 904231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_checkTimer.startOneShot(0); 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 907231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::scheduleCheckCompleted() 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 909231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = true; 910231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::scheduleCheckLoadComplete() 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = true; 916231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkCallImplicitClose() 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_didCallImplicitClose || m_frame->document()->parsing() || m_frame->document()->isDelayingLoadEvent()) 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 924231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!allChildrenAreComplete()) 925231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; // still got a frame running -> too early 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_wasUnloadEventEmitted = false; 9298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->implicitClose(); 9308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::baseURL() const 9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->document()); 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame->document()->baseURL(); 9368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::completeURL(const String& url) 9398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->document()); 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame->document()->completeURL(url); 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadURLIntoChildFrame(const KURL& url, const String& referer, Frame* childFrame) 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(childFrame); 9478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 9482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 949f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Archive> subframeArchive = activeDocumentLoader()->popArchiveForSubframe(childFrame->tree()->uniqueName()); 950f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (subframeArchive) { 951f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadArchive(subframeArchive.release()); 952f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 953f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 9542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEB_ARCHIVE) 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 956f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch HistoryItem* parentItem = history()->currentItem(); 9578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If we're moving in the back/forward list, we might want to replace the content 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // of this child frame with whatever was there at that point. 959f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (parentItem && parentItem->children().size() && isBackForwardLoadType(loadType())) { 96028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu HistoryItem* childItem = parentItem->childItemWithTarget(childFrame->tree()->uniqueName()); 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (childItem) { 962f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadDifferentDocumentItem(childItem, loadType()); 963f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 967f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadURL(url, referer, String(), false, FrameLoadTypeRedirectWithLockedBackForwardList, 0, 0); 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadArchive(PassRefPtr<Archive> prpArchive) 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Archive> archive = prpArchive; 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ArchiveResource* mainResource = archive->mainResource(); 9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(mainResource); 9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mainResource) 9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SubstituteData substituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL()); 9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request(mainResource->url()); 9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.applyWebArchiveHackForMail(); 9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> documentLoader = m_client->createDocumentLoader(request, substituteData); 9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader->addAllArchiveResources(archive.get()); 9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project load(documentLoader.get()); 9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEB_ARCHIVE) 9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9932bde8e466a4451c7319e3a072d118917957d6554Steve BlockObjectContentType FrameLoader::defaultObjectContentType(const KURL& url, const String& mimeTypeIn, bool shouldPreferPlugInsForImages) 994cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 995cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block String mimeType = mimeTypeIn; 996e48d279609693b4d164199748c93ad791547c649Steve Block String decodedPath = decodeURLEscapeSequences(url.path()); 997e48d279609693b4d164199748c93ad791547c649Steve Block String extension = decodedPath.substring(decodedPath.reverseFind('.') + 1); 99865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 999cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // We don't use MIMETypeRegistry::getMIMETypeForPath() because it returns "application/octet-stream" upon failure 1000cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (mimeType.isEmpty()) 100165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mimeType = MIMETypeRegistry::getMIMETypeForExtension(extension); 100265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 100365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !PLATFORM(MAC) && !PLATFORM(CHROMIUM) && !PLATFORM(EFL) // Mac has no PluginDatabase, nor does Chromium or EFL 100465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (mimeType.isEmpty()) 100565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mimeType = PluginDatabase::installedPlugins()->MIMETypeForExtension(extension); 100665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 1007cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1008cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (mimeType.isEmpty()) 1009cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return ObjectContentFrame; // Go ahead and hope that we can display the content. 1010cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 10112bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !PLATFORM(MAC) && !PLATFORM(CHROMIUM) && !PLATFORM(EFL) // Mac has no PluginDatabase, nor does Chromium or EFL 10122bde8e466a4451c7319e3a072d118917957d6554Steve Block bool plugInSupportsMIMEType = PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType); 10132bde8e466a4451c7319e3a072d118917957d6554Steve Block#else 10142bde8e466a4451c7319e3a072d118917957d6554Steve Block bool plugInSupportsMIMEType = false; 10152bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 10162bde8e466a4451c7319e3a072d118917957d6554Steve Block 1017cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType)) 10182bde8e466a4451c7319e3a072d118917957d6554Steve Block return shouldPreferPlugInsForImages && plugInSupportsMIMEType ? WebCore::ObjectContentNetscapePlugin : WebCore::ObjectContentImage; 1019cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 10202bde8e466a4451c7319e3a072d118917957d6554Steve Block if (plugInSupportsMIMEType) 1021cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentNetscapePlugin; 1022cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1023cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType)) 1024cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentFrame; 1025cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1026cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentNone; 1027cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 1028cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1029ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 1030ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid FrameLoader::hideMediaPlayerProxyPlugin(Widget* widget) 1031ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 1032ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch m_client->hideMediaPlayerProxyPlugin(widget); 1033ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 1034ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 1035ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid FrameLoader::showMediaPlayerProxyPlugin(Widget* widget) 1036ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 1037ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch m_client->showMediaPlayerProxyPlugin(widget); 1038ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 1039ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif // ENABLE(PLUGIN_PROXY_FOR_VIDEO) 1040ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::outgoingReferrer() const 10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_outgoingReferrer; 10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::outgoingOrigin() const 10478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_frame->document()->securityOrigin()->toString(); 10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1051231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::isMixedContent(SecurityOrigin* context, const KURL& url) 1052231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1053231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (context->protocol() != "https") 1054231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; // We only care about HTTPS security origins. 1055231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (!url.isValid() || SchemeRegistry::shouldTreatURLSchemeAsSecure(url.protocol())) 1057231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; // Loading these protocols is secure. 1058231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1059231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 1060231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1061231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1062231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkIfDisplayInsecureContent(SecurityOrigin* context, const KURL& url) 1063231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1064231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isMixedContent(context, url)) 1065231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1066231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String message = makeString("The page at ", m_frame->document()->url().string(), " displayed insecure content from ", url.string(), ".\n"); 1068cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String()); 1069cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1070231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->didDisplayInsecureContent(); 1071231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1072231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1073231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkIfRunInsecureContent(SecurityOrigin* context, const KURL& url) 1074231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1075231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isMixedContent(context, url)) 1076231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1077231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String message = makeString("The page at ", m_frame->document()->url().string(), " ran insecure content from ", url.string(), ".\n"); 1079cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String()); 1080cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 10812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_client->didRunInsecureContent(context, url); 1082231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1083231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoader::opener() 10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_opener; 10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setOpener(Frame* opener) 10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_opener) 10928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_opener->loader()->m_openedFrames.remove(m_frame); 10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (opener) 10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project opener->loader()->m_openedFrames.add(m_frame); 10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_opener = opener; 10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) { 10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->initSecurityContext(); 10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setSecurityOrigin(m_frame->document()->securityOrigin()); 11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// FIXME: This does not belong in FrameLoader! 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::handleFallbackContent() 11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* owner = m_frame->ownerElement(); 11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!owner || !owner->hasTagName(objectTag)) 11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static_cast<HTMLObjectElement*>(owner)->renderFallbackContent(); 11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::provisionalLoadStarted() 11135f000f6f06377295cba1d3246dbd601610cdbd16Kristian Monsen{ 111406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.firstLayoutDone()) 111506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 1116a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(true); 11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->provisionalLoadStarted(); 11188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool FrameLoader::isProcessingUserGesture() 11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Frame* frame = m_frame->tree()->top(); 1123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!frame->script()->canExecuteScripts(NotAboutToExecuteScript)) 1124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; // If JavaScript is disabled, a user gesture must have initiated the navigation. 1125f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return ScriptController::processingUserGesture(); // FIXME: Use pageIsProcessingUserGesture. 11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::resetMultipleFormSubmissionProtection() 11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_submittedFormURL = KURL(); 11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::willSetEncoding() 11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_workingURL.isEmpty()) 11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project receivedFirstData(); 11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(WML) 11400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic inline bool frameContainsWMLContent(Frame* frame) 11410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 11420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Document* document = frame ? frame->document() : 0; 11430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!document) 11440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 11450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return document->containsWMLContent() || document->isWMLDocument(); 11470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 11480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 11490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::updateFirstPartyForCookies() 11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->tree()->parent()) 11535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setFirstPartyForCookies(m_frame->tree()->parent()->document()->firstPartyForCookies()); 11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 11552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block setFirstPartyForCookies(m_frame->document()->url()); 11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::setFirstPartyForCookies(const KURL& url) 11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_frame->document()->setFirstPartyForCookies(url); 11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 11625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian child->loader()->setFirstPartyForCookies(url); 11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This does the same kind of work that didOpenURL does, except it relies on the fact 11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// that a higher level already checked that the URLs match and the scrolling is the right thing to do. 1167643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::loadInSameDocument(const KURL& url, SerializedScriptValue* stateObject, bool isNewNavigation) 1168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If we have a state object, we cannot also be a new navigation. 1170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!stateObject || (stateObject && !isNewNavigation)); 1171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Update the data source's request with the new URL to fake the URL change 11732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block KURL oldURL = m_frame->document()->url(); 1174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_frame->document()->setURL(url); 1175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block documentLoader()->replaceRequestURLForSameDocumentNavigation(url); 1176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (isNewNavigation && !shouldTreatURLAsSameAsCurrent(url) && !stateObject) { 1177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NB: must happen after replaceRequestURLForSameDocumentNavigation(), since we add 1178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // based on the current request. Must also happen before we openURL and displace the 1179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // scroll position, since adding the BF item will save away scroll state. 1180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NB2: If we were loading a long, slow doc, and the user anchor nav'ed before 1182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // it was done, currItem is now set the that slow doc, and prevItem is whatever was 1183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // before it. Adding the b/f item will bump the slow doc down to prevItem, even 1184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // though its load is not yet done. I think this all works out OK, for one because 1185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we have already saved away the scroll and doc state for the long slow load, 1186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // but it's not an obvious case. 1187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->updateBackForwardListForFragmentScroll(); 11890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 11900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragmentIdentifier() != oldURL.fragmentIdentifier(); 1192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->updateForSameDocumentNavigation(); 11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor 1196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (hashChange) 1197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_frame->eventHandler()->stopAutoscrollTimer(); 1198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 11998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's important to model this as a load that starts and immediately finishes. 12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise, the parent frame may think we never finished loading. 1201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block started(); 1202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // We need to scroll to the fragment whether or not a hash change occurred, since 1204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // the user might have scrolled since the previous navigation. 1205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (FrameView* view = m_frame->view()) 12062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block view->scrollToFragment(url); 1207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 1210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (isNewNavigation) { 1212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This will clear previousItem from the rest of the frame tree that didn't 1213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // doing any loading. We need to make a pass on this now, since for anchor nav 1214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we'll not go through a real load and reach Completed state. 1215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block checkLoadComplete(); 1216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_client->dispatchDidNavigateWithinPage(); 1219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 12205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_frame->document()->statePopped(stateObject ? stateObject : SerializedScriptValue::nullValue()); 12215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_client->dispatchDidPopStateWithinPage(); 1222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (hashChange) { 1224545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->enqueueHashchangeEvent(oldURL, url); 1225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->dispatchDidChangeLocationWithinPage(); 1226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FrameLoaderClient::didFinishLoad() tells the internal load delegate the load finished with no error 1229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->didFinishLoad(); 12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isComplete() const 12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_isComplete; 12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::completed() 12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 1240cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1241cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block for (Frame* descendant = m_frame->tree()->traverseNext(m_frame); descendant; descendant = descendant->tree()->traverseNext(m_frame)) 1242a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch descendant->navigationScheduler()->startTimer(); 1243cad810f21b803229eb11403f9209855525a25d57Steve Block 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->checkCompleted(); 1246cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 12475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame->view()) 12480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_frame->view()->maintainScrollPositionAtAnchor(0); 12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::started() 12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* frame = m_frame; frame; frame = frame->tree()->parent()) 12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame->loader()->m_isComplete = false; 12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::prepareForLoadStart() 12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressStarted(m_frame); 12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidStartProvisionalLoad(); 12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setupForReplace() 12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader = m_documentLoader; 12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader = 0; 12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setupForReplaceByMIMEType(const String& newMIMEType) 12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project activeDocumentLoader()->setupForReplaceByMIMEType(newMIMEType); 12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// This is a hack to allow keep navigation to http/https feeds working. To remove this 12785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// we need to introduce new API akin to registerURLSchemeAsLocal, that registers a 12795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// protocols navigation policy. 12805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic bool isFeedWithNestedProtocolInHTTPFamily(const KURL& url) 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const String& urlString = url.string(); 12835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!urlString.startsWith("feed", false)) 12845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 12855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 12865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return urlString.startsWith("feed://", false) 12875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feed:http:", false) || urlString.startsWith("feed:https:", false) 12885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feeds:http:", false) || urlString.startsWith("feeds:https:", false) 12895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feedsearch:http:", false) || urlString.startsWith("feedsearch:https:", false); 12905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 12915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 12925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHistory, bool lockBackForwardList, 1293cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block PassRefPtr<Event> event, PassRefPtr<FormState> formState, ReferrerPolicy referrerPolicy) 12945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url = request.resourceRequest().url(); 1296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ASSERT(m_frame->document()); 1298f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: Should we move the isFeedWithNestedProtocolInHTTPFamily logic inside SecurityOrigin::canDisplay? 1299f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!isFeedWithNestedProtocolInHTTPFamily(url) && !request.requester()->canDisplay(url)) { 1300f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch reportLocalLoadFailed(m_frame, url.string()); 1301f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1302f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1303f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String referrer; 13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String argsReferrer = request.resourceRequest().httpReferrer(); 13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!argsReferrer.isEmpty()) 13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = argsReferrer; 13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = m_outgoingReferrer; 1310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1311cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (SecurityOrigin::shouldHideReferrer(url, referrer) || referrerPolicy == NoReferrer) 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = String(); 13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FrameLoadType loadType; 1315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData) 1316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeReload; 1317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else if (lockBackForwardList) 1318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeRedirectWithLockedBackForwardList; 1319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 1320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeStandard; 13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (request.resourceRequest().httpMethod() == "POST") 13235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadPostRequest(request.resourceRequest(), referrer, request.frameName(), lockHistory, loadType, event, formState.get()); 1324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 13255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadURL(request.resourceRequest().url(), referrer, request.frameName(), lockHistory, loadType, event, formState.get()); 13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: It's possible this targetFrame will not be the same frame that was targeted by the actual 13285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // load if frame names have changed. 13295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* sourceFrame = formState ? formState->sourceFrame() : m_frame; 13305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* targetFrame = sourceFrame->loader()->findFrameForNavigation(request.frameName()); 13315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (targetFrame && targetFrame != sourceFrame) { 13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = targetFrame->page()) 13338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->chrome()->focus(); 13345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 13358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::loadURL(const KURL& newURL, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType newLoadType, 13385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian PassRefPtr<Event> event, PassRefPtr<FormState> prpFormState) 13398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 134081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (m_inStopAllLoaders) 134181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 134281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isFormSubmission = formState; 13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request(newURL); 13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) { 13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPReferrer(referrer); 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<SecurityOrigin> referrerOrigin = SecurityOrigin::createFromString(referrer); 13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(request, referrerOrigin->toString()); 13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, newLoadType, true, event || isFormSubmission); 1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (newLoadType == FrameLoadTypeReload || newLoadType == FrameLoadTypeReloadFromOrigin) 13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReloadIgnoringCacheData); 13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(newLoadType != FrameLoadTypeSame); 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The search for a target frame is done earlier in the case of form submission. 13595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* targetFrame = isFormSubmission ? 0 : findFrameForNavigation(frameName); 13605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (targetFrame && targetFrame != m_frame) { 13615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian targetFrame->loader()->loadURL(newURL, referrer, String(), lockHistory, newLoadType, event, formState.release()); 13625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 13635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 13645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 13656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 1366231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1367231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NavigationAction action(newURL, newLoadType, isFormSubmission, event); 13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame && !frameName.isEmpty()) { 1371231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy, 1372231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block request, formState.release(), frameName, this); 13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader; 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool sameURL = shouldTreatURLAsSameAsCurrent(newURL); 1379cad810f21b803229eb11403f9209855525a25d57Steve Block const String& httpMethod = request.httpMethod(); 13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure to do scroll to anchor processing even if the URL is 13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // exactly the same so pages with '#' links and DHTML side effects 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // work properly. 1384cad810f21b803229eb11403f9209855525a25d57Steve Block if (shouldScrollToAnchor(isFormSubmission, httpMethod, newLoadType, newURL)) { 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldDocumentLoader->setTriggeringAction(action); 1386231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 1387231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->setLoadType(newLoadType); 1388231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(request, oldDocumentLoader.get(), formState.release(), 13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueFragmentScrollAfterNavigationPolicy, this); 13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // must grab this now, since this load may stop the previous load and clear this flag 13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isRedirect = m_quickRedirectComing; 13935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadWithNavigationAction(request, action, lockHistory, newLoadType, formState.release()); 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRedirect) { 13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setIsClientRedirect(true); 13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (sameURL) 13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Example of this case are sites that reload the same URL with a different cookie 14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // driving the generated content, or a master frame with links that drive a target 14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frame, where the user has clicked on the same link repeatedly. 14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeSame; 14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, bool lockHistory) 14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1408635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(request, SubstituteData(), lockHistory); 14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, const SubstituteData& substituteData, bool lockHistory) 14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inStopAllLoaders) 14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: is this the right place to reset loadType? Perhaps this should be done after loading is finished or aborted. 14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeStandard; 1418635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, substituteData); 14198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (lockHistory && m_documentLoader) 14202bde8e466a4451c7319e3a072d118917957d6554Steve Block loader->setClientRedirectSourceForHistory(m_documentLoader->didCreateGlobalHistoryEntry() ? m_documentLoader->urlForHistory().string() : m_documentLoader->clientRedirectSourceForHistory()); 1421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(loader.get()); 14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, const String& frameName, bool lockHistory) 14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frameName.isEmpty()) { 1427635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(request, lockHistory); 14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = findFrameForNavigation(frameName); 14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frame) { 1433635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project frame->loader()->load(request, lockHistory); 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1437231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(NavigationAction(request.url(), NavigationTypeOther), FrameLoader::callContinueLoadAfterNewWindowPolicy, request, 0, frameName, this); 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const NavigationAction& action, bool lockHistory, FrameLoadType type, PassRefPtr<FormState> formState) 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, SubstituteData()); 14438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (lockHistory && m_documentLoader) 14442bde8e466a4451c7319e3a072d118917957d6554Steve Block loader->setClientRedirectSourceForHistory(m_documentLoader->didCreateGlobalHistoryEntry() ? m_documentLoader->urlForHistory().string() : m_documentLoader->clientRedirectSourceForHistory()); 14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setTriggeringAction(action); 14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadWithDocumentLoader(loader.get(), type, formState); 14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::load(DocumentLoader* newDocumentLoader) 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest& r = newDocumentLoader->request(); 1456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToMainResourceRequest(r); 14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoadType type; 14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldTreatURLAsSameAsCurrent(newDocumentLoader->originalRequest().url())) { 14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r.setCachePolicy(ReloadIgnoringCacheData); 14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeSame; 14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeStandard; 14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When we loading alternate content for an unreachable URL that we're 14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // visiting in the history list, we treat it as a reload so the history list 14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is appropriately maintained. 14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This seems like a dangerous overloading of the meaning of "FrameLoadTypeReload" ... 14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // shouldn't a more explicit type of reload be defined, that means roughly 14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // "load without affecting history" ? 14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldReloadToHandleUnreachableURL(newDocumentLoader)) { 14762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // shouldReloadToHandleUnreachableURL() returns true only when the original load type is back-forward. 14772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // In this case we should save the document state now. Otherwise the state can be lost because load type is 14782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // changed and updateForBackForwardNavigation() will not be called when loading is committed. 14792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch history()->saveDocumentAndScrollState(); 14802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(type == FrameLoadTypeStandard); 14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeReload; 14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadWithDocumentLoader(newDocumentLoader, type, 0); 14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType type, PassRefPtr<FormState> prpFormState) 14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1490e14391e94c850b8bd03680c23b38978db68687a8John Reck // Retain because dispatchBeforeLoadEvent may release the last reference to it. 1491e14391e94c850b8bd03680c23b38978db68687a8John Reck RefPtr<Frame> protect(m_frame); 1492e14391e94c850b8bd03680c23b38978db68687a8John Reck 14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Unfortunately the view must be non-nil, this is ultimately due 14968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to parser requiring a FrameView. We should fix this dependency. 14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->view()); 14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 1501231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1502231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1503cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_frame->document()) 1504cad810f21b803229eb11403f9209855525a25d57Steve Block m_previousUrl = m_frame->document()->url(); 1505cad810f21b803229eb11403f9209855525a25d57Steve Block 1506231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->setLoadType(type); 15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isFormSubmission = formState; 15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& newURL = loader->request().url(); 1511cad810f21b803229eb11403f9209855525a25d57Steve Block const String& httpMethod = loader->request().httpMethod(); 15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1513cad810f21b803229eb11403f9209855525a25d57Steve Block if (shouldScrollToAnchor(isFormSubmission, httpMethod, policyChecker()->loadType(), newURL)) { 15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader; 1515231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NavigationAction action(newURL, policyChecker()->loadType(), isFormSubmission); 15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldDocumentLoader->setTriggeringAction(action); 1518231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 1519231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(loader->request(), oldDocumentLoader.get(), formState, 15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueFragmentScrollAfterNavigationPolicy, this); 15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) 15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(parent->loader()->documentLoader()->overrideEncoding()); 15248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1525231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(loader); 15275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (loader->triggeringAction().isEmpty()) 1528231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block loader->setTriggeringAction(NavigationAction(newURL, policyChecker()->loadType(), isFormSubmission)); 15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 153081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (Element* ownerElement = m_frame->ownerElement()) { 1531cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!ownerElement->dispatchBeforeLoadEvent(loader->request().url().string())) { 1532cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block continueLoadAfterNavigationPolicy(loader->request(), formState, false); 1533cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 1534cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 1535cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 1536cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1537231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(loader->request(), loader, formState, 15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueLoadAfterNavigationPolicy, this); 15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::reportLocalLoadFailed(Frame* frame, const String& url) 15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!url.isEmpty()); 15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frame) 15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Not allowed to load local resource: " + url, 0, String()); 15498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst ResourceRequest& FrameLoader::initialRequest() const 15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequest(); 15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1556231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::willLoadMediaElementURL(KURL& url) 15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1558231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ResourceRequest request(url); 15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1560231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block unsigned long identifier; 1561231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ResourceError error; 1562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block requestFromDelegate(request, identifier, error); 15632bde8e466a4451c7319e3a072d118917957d6554Steve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, ResourceResponse(url, String(), -1, String(), String()), -1, -1, error); 15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1565231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block url = request.url(); 1566231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1567231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return error.isNull(); 15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldReloadToHandleUnreachableURL(DocumentLoader* docLoader) 15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = docLoader->unreachableURL(); 15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (unreachableURL.isEmpty()) 15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1577231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isBackForwardLoadType(policyChecker()->loadType())) 15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We only treat unreachableURLs specially during the delegate callbacks 15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for provisional load errors and navigation policy decisions. The former 15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // case handles well-formed URLs that can't be loaded, and the latter 15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // case handles malformed URLs and unknown schemes. Loading alternate content 15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // at other times behaves like a standard load. 15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* compareDocumentLoader = 0; 1586231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (policyChecker()->delegateIsDecidingNavigationPolicy() || policyChecker()->delegateIsHandlingUnimplementablePolicy()) 15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project compareDocumentLoader = m_policyDocumentLoader.get(); 15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (m_delegateIsHandlingProvisionalLoadError) 15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project compareDocumentLoader = m_provisionalDocumentLoader.get(); 15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return compareDocumentLoader && unreachableURL == compareDocumentLoader->request().url(); 15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::reloadWithOverrideEncoding(const String& encoding) 15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request = m_documentLoader->request(); 16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = m_documentLoader->unreachableURL(); 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty()) 16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setURL(unreachableURL); 16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReturnCacheDataElseLoad); 16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, SubstituteData()); 16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(loader.get()); 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(encoding); 16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1611635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithDocumentLoader(loader.get(), FrameLoadTypeReload, 0); 16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::reload(bool endToEndReload) 16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If a window is created by javascript, its main frame can have an empty but non-nil URL. 16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Reloading in this case will lose the current contents (see 4151001). 1621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_documentLoader->request().url().isEmpty()) 16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest initialRequest = m_documentLoader->request(); 1625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Replace error-page URL with the URL we were trying to reach. 16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = m_documentLoader->unreachableURL(); 16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty()) 1629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project initialRequest.setURL(unreachableURL); 16308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a new document loader for the reload, this will become m_documentLoader eventually, 16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // but first it has to be the "policy" document loader, and then the "provisional" document loader. 16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(initialRequest, SubstituteData()); 16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest& request = loader->request(); 16368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1637635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: We don't have a mechanism to revalidate the main resource without reloading at the moment. 16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReloadIgnoringCacheData); 16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we're about to re-post, set up action so the application can warn the user. 16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (request.httpMethod() == "POST") 16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setTriggeringAction(NavigationAction(request.url(), NavigationTypeFormResubmitted)); 16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithDocumentLoader(loader.get(), endToEndReload ? FrameLoadTypeReloadFromOrigin : FrameLoadTypeReload, 0); 16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool canAccessAncestor(const SecurityOrigin* activeSecurityOrigin, Frame* targetFrame) 16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // targetFrame can be NULL when we're trying to navigate a top-level frame 16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that has a NULL opener. 16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame) 16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke const bool isLocalActiveOrigin = activeSecurityOrigin->isLocal(); 16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* ancestorFrame = targetFrame; ancestorFrame; ancestorFrame = ancestorFrame->tree()->parent()) { 16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* ancestorDocument = ancestorFrame->document(); 16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ancestorDocument) 16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const SecurityOrigin* ancestorSecurityOrigin = ancestorDocument->securityOrigin(); 16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (activeSecurityOrigin->canAccess(ancestorSecurityOrigin)) 16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 16665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // Allow file URL descendant navigation even when allowFileAccessFromFileURLs is false. 16675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (isLocalActiveOrigin && ancestorSecurityOrigin->isLocal()) 16685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return true; 16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldAllowNavigation(Frame* targetFrame) const 16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The navigation change is safe if the active frame is: 16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - in the same security origin as the target or one of the target's 16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ancestors. 16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Or the target frame is: 16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - a top-level frame in the frame hierarchy and the active frame can 1682231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // navigate the target frame's opener per above or it is the opener of 1683231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // the target frame. 16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame) 16868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Performance optimization. 16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame == targetFrame) 16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Let a frame navigate the top-level window that contains it. This is 16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // important to allow because it lets a site "frame-bust" (escape from a 16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frame created by another web site). 1695e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (!isDocumentSandboxed(m_frame, SandboxTopNavigation) && targetFrame == m_frame->tree()->top()) 16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // A sandboxed frame can only navigate itself and its descendants. 1699e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (isDocumentSandboxed(m_frame, SandboxNavigation) && !targetFrame->tree()->isDescendantOf(m_frame)) 1700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 1701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1702231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Let a frame navigate its opener if the opener is a top-level window. 1703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!targetFrame->tree()->parent() && m_frame->loader()->opener() == targetFrame) 1704231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 1705231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 17068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* activeDocument = m_frame->document(); 17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(activeDocument); 17088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const SecurityOrigin* activeSecurityOrigin = activeDocument->securityOrigin(); 17098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For top-level windows, check the opener. 17118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame->tree()->parent() && canAccessAncestor(activeSecurityOrigin, targetFrame->loader()->opener())) 17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 17138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In general, check the frame's ancestors. 17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (canAccessAncestor(activeSecurityOrigin, targetFrame)) 17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 17178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Settings* settings = targetFrame->settings(); 17198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (settings && !settings->privateBrowsingEnabled()) { 17208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* targetDocument = targetFrame->document(); 17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: this error message should contain more specifics of why the navigation change is not allowed. 1722a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch String message = makeString("Unsafe JavaScript attempt to initiate a navigation change for frame with URL ", 1723a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch targetDocument->url().string(), " from frame with URL ", activeDocument->url().string(), ".\n"); 17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: should we print to the console of the activeFrame as well? 17260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch targetFrame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, message, 1, String()); 17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 173281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid FrameLoader::stopLoadingSubframes(ClearProvisionalItemPolicy clearProvisionalItemPolicy) 17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RefPtr<Frame> child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 173581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch child->loader()->stopAllLoaders(clearProvisionalItemPolicy); 17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 173881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid FrameLoader::stopAllLoaders(ClearProvisionalItemPolicy clearProvisionalItemPolicy) 17398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1740231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!m_frame->document() || !m_frame->document()->inPageCache()); 17416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 17425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 17435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. 17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inStopAllLoaders) 17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inStopAllLoaders = true; 17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1750231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1752ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // If no new load is in progress, we should clear the provisional item from history 1753ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // before we call stopLoading. 1754ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (clearProvisionalItemPolicy == ShouldClearProvisionalItem) 1755ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch history()->setProvisionalItem(0); 1756ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 175781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch stopLoadingSubframes(clearProvisionalItemPolicy); 17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 175981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_provisionalDocumentLoader->stopLoading(); 17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 176181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_documentLoader->stopLoading(); 17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->clearArchiveResources(); 17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1770d0825bca7fe65beaee391d30da42e937db621564Steve Block m_checkTimer.stop(); 1771d0825bca7fe65beaee391d30da42e937db621564Steve Block 17728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inStopAllLoaders = false; 17738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::stopForUserCancel(bool deferCheckLoadComplete) 17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopAllLoaders(); 17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deferCheckLoadComplete) 17808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project scheduleCheckLoadComplete(); 17818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (m_frame->page()) 17828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDocumentLoader* FrameLoader::activeDocumentLoader() const 17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state == FrameStateProvisional) 17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_provisionalDocumentLoader.get(); 17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_documentLoader.get(); 17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isLoading() const 17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* docLoader = activeDocumentLoader(); 17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!docLoader) 17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return docLoader->isLoadingMainResource() || docLoader->isLoadingSubresources() || docLoader->isLoadingPlugIns(); 17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::frameHasLoaded() const 18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 180206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return m_stateMachine.committedFirstRealDocumentLoad() || (m_provisionalDocumentLoader && !m_stateMachine.creatingInitialEmptyDocument()); 18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1805e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FrameLoader::transferLoadingResourcesFromPage(Page* oldPage) 1806e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 1807e14391e94c850b8bd03680c23b38978db68687a8John Reck ASSERT(oldPage != m_frame->page()); 18086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (isLoading()) { 1809e14391e94c850b8bd03680c23b38978db68687a8John Reck activeDocumentLoader()->transferLoadingResourcesFromPage(oldPage); 18106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner oldPage->progress()->progressCompleted(m_frame); 18116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (m_frame->page()) 18126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_frame->page()->progress()->progressStarted(m_frame); 18136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 18146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 18156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 18166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid FrameLoader::dispatchTransferLoadingResourceFromPage(unsigned long identifier, DocumentLoader* docLoader, const ResourceRequest& request, Page* oldPage) 18176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 18186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner notifier()->dispatchTransferLoadingResourceFromPage(identifier, docLoader, request, oldPage); 1819e14391e94c850b8bd03680c23b38978db68687a8John Reck} 1820e14391e94c850b8bd03680c23b38978db68687a8John Reck 18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setDocumentLoader(DocumentLoader* loader) 18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!loader && !m_documentLoader) 18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(loader != m_documentLoader); 18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || loader->frameLoader() == this); 18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->prepareForDataSourceReplacement(); 18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->detachFromFrame(); 18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader = loader; 1835131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block 1836131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // The following abomination is brought to you by the unload event. 1837131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // The detachChildren() call above may trigger a child frame's unload event, 1838131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // which could do something obnoxious like call document.write("") on 1839131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // the main frame, which results in detaching children while detaching children. 1840131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // This can cause the new m_documentLoader to be detached from its Frame*, but still 1841131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // be alive. To make matters worse, DocumentLoaders with a null Frame* aren't supposed 1842131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // to happen when they're still alive (and many places below us on the stack think the 1843131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // DocumentLoader is still usable). Ergo, we reattach loader to its Frame, and pretend 1844131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block // like nothing ever happened. 1845131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block if (m_documentLoader && !m_documentLoader->frame()) { 1846131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block ASSERT(!m_documentLoader->isLoading()); 1847131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block m_documentLoader->setFrame(m_frame); 1848131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block } 18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setPolicyDocumentLoader(DocumentLoader* loader) 18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader == loader) 18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (loader) 18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setFrame(m_frame); 18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader 18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && m_policyDocumentLoader != m_provisionalDocumentLoader 18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && m_policyDocumentLoader != m_documentLoader) 18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader->detachFromFrame(); 18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader = loader; 18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setProvisionalDocumentLoader(DocumentLoader* loader) 18688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || !m_provisionalDocumentLoader); 18708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || loader->frameLoader() == this); 18718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader && m_provisionalDocumentLoader != m_documentLoader) 18738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->detachFromFrame(); 18748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader = loader; 18768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdouble FrameLoader::timeOfLastCompletedLoad() 18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return storedTimeOfLastCompletedLoad; 18818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setState(FrameState newState) 18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_state = newState; 18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newState == FrameStateProvisional) 18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project provisionalLoadStarted(); 18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (newState == FrameStateComplete) { 18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frameLoadCompleted(); 18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project storedTimeOfLastCompletedLoad = currentTime(); 18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopRecordingResponses(); 18948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::clearProvisionalLoad() 18988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 19008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 19018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressCompleted(m_frame); 19028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateComplete); 19038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::markLoadComplete() 19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateComplete); 19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1910545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::commitProvisionalLoad() 19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1912545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch RefPtr<CachedPage> cachedPage = m_loadingFromCachedPage ? pageCache()->get(history()->provisionalItem()) : 0; 19138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 1914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block LOG(PageCache, "WebCoreLoading %s: About to commit provisional load from previous URL '%s' to new URL '%s'", m_frame->tree()->uniqueName().string().utf8().data(), 19162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->document() ? m_frame->document()->url().string().utf8().data() : "", 1917231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block pdl ? pdl->url().string().utf8().data() : "<no provisional DocumentLoader>"); 1918635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check to see if we need to cache the page we are navigating away from into the back/forward cache. 19208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are doing this here because we know for sure that a new page is about to be loaded. 1921545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch HistoryItem* item = history()->currentItem(); 192206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_frame->tree()->parent() && PageCache::canCache(m_frame->page()) && !item->isInPageCache()) 1923545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch pageCache()->add(item, m_frame->page()); 1924cad810f21b803229eb11403f9209855525a25d57Steve Block 19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_loadType != FrameLoadTypeReplace) 19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeOldDataSources(); 1927cad810f21b803229eb11403f9209855525a25d57Steve Block 192806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!cachedPage && !m_stateMachine.creatingInitialEmptyDocument()) 19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->makeRepresentation(pdl.get()); 1930cad810f21b803229eb11403f9209855525a25d57Steve Block 19318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project transitionToCommitted(cachedPage); 1932cad810f21b803229eb11403f9209855525a25d57Steve Block 1933cad810f21b803229eb11403f9209855525a25d57Steve Block if (pdl) { 1934cad810f21b803229eb11403f9209855525a25d57Steve Block // Check if the destination page is allowed to access the previous page's timing information. 1935cad810f21b803229eb11403f9209855525a25d57Steve Block RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(pdl->request().url()); 1936cad810f21b803229eb11403f9209855525a25d57Steve Block m_documentLoader->timing()->hasSameOriginAsPreviousDocument = securityOrigin->canRequest(m_previousUrl); 1937cad810f21b803229eb11403f9209855525a25d57Steve Block } 1938cad810f21b803229eb11403f9209855525a25d57Steve Block 19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Call clientRedirectCancelledOrFinished() here so that the frame load delegate is notified that the redirect's 19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // status has changed, if there was a redirect. The frame load delegate may have saved some state about 19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect in its -webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:. Since we are 19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // just about to commit a new page, there cannot possibly be a pending redirect at this point. 19438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_sentRedirectNotification) 19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1946545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (cachedPage && cachedPage->document()) { 1947545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch prepareForCachedPageRestore(); 1948545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch cachedPage->restore(m_frame->page()); 194968513a70bcd92384395513322f1b801e7bf9c729Steve Block 195068513a70bcd92384395513322f1b801e7bf9c729Steve Block dispatchDidCommitLoad(); 195168513a70bcd92384395513322f1b801e7bf9c729Steve Block 195268513a70bcd92384395513322f1b801e7bf9c729Steve Block // If we have a title let the WebView know about it. 19532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch StringWithDirection title = m_documentLoader->title(); 19542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!title.isNull()) 19552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_client->dispatchDidReceiveTitle(title); 195668513a70bcd92384395513322f1b801e7bf9c729Steve Block 1957545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch checkCompleted(); 1958545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch } else { 19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url = pdl->substituteData().responseURL(); 19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = pdl->url(); 19628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = pdl->responseURL(); 19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = blankURL(); 19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didOpenURL(url); 19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1969635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block LOG(Loading, "WebCoreLoading %s: Finished committing provisional load to URL %s", m_frame->tree()->uniqueName().string().utf8().data(), 19712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->document() ? m_frame->document()->url().string().utf8().data() : ""); 1972635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_loadType == FrameLoadTypeStandard && m_documentLoader->isClientRedirect()) 1974cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForClientRedirect(); 19758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1976231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_loadingFromCachedPage) { 19778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->documentDidBecomeActive(); 19788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Force a layout to update view size and thereby update scrollbars. 1980231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->view()->forceLayout(); 19818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const ResponseVector& responses = m_documentLoader->responses(); 19838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian size_t count = responses.size(); 19848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for (size_t i = 0; i < count; i++) { 19858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const ResourceResponse& response = responses[i]; 19868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: If the WebKit client changes or cancels the request, this is not respected. 19878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ResourceError error; 19888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian unsigned long identifier; 19898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ResourceRequest request(response.url()); 19908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian requestFromDelegate(request, identifier, error); 19918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing. 19928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // However, with today's computers and networking speeds, this won't happen in practice. 19938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Could be an issue with a giant local file. 19942bde8e466a4451c7319e3a072d118917957d6554Steve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, static_cast<int>(response.expectedContentLength()), 0, error); 19958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 19968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1997cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block pageCache()->remove(history()->currentItem()); 19988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_documentLoader->setPrimaryLoadComplete(true); 20008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 20018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Why only this frame and not parent frames? 20028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian checkLoadCompleteForThisFrame(); 20038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 20048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::transitionToCommitted(PassRefPtr<CachedPage> cachedPage) 20078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_state == FrameStateProvisional); 20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state != FrameStateProvisional) 20128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 20138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20142bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_frame->view()) 20152bde8e466a4451c7319e3a072d118917957d6554Steve Block m_frame->view()->scrollAnimator()->cancelAnimations(); 20162bde8e466a4451c7319e3a072d118917957d6554Steve Block 20178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setCopiesOnScroll(); 2018cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForCommit(); 20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The call to closeURL() invokes the unload event handler, which can execute arbitrary 20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // JavaScript. If the script initiates a new load, we need to abandon the current load, 20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or the two will stomp each other. 20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* pdl = m_provisionalDocumentLoader.get(); 20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pdl != m_provisionalDocumentLoader) 20278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Nothing else can interupt this commit - set the Provisional->Committed transition in stone 20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopLoadingSubresources(); 20328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 20338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopLoadingPlugIns(); 20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setDocumentLoader(m_provisionalDocumentLoader.get()); 20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateCommittedPage); 20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Handle adding the URL to the back/forward list. 20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* dl = m_documentLoader.get(); 20418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_loadType) { 20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeForward: 20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeBack: 20450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case FrameLoadTypeBackWMLDeckNotAccessible: 20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeIndexedBackForward: 204728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page()) { 204828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // If the first load within a frame is a navigation within a back/forward list that was attached 204928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // without any of the items being loaded then we need to update the history in a similar manner as 205028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // for a standard load with the exception of updating the back/forward list (<rdar://problem/8091103>). 205128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!m_stateMachine.committedFirstRealDocumentLoad()) 205228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->updateForStandardLoad(HistoryController::UpdateAllExceptBackForwardList); 205328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 205428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->updateForBackForwardNavigation(); 205528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 205628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // For cached pages, CachedFrame::restore will take care of firing the popstate event with the history item's state object 205728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (history()->currentItem() && !cachedPage) 205828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_pendingStateObject = history()->currentItem()->stateObject(); 205928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 206028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // Create a document view for this document, or used the cached view. 206128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (cachedPage) { 206228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu DocumentLoader* cachedDocumentLoader = cachedPage->documentLoader(); 206328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(cachedDocumentLoader); 206428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu cachedDocumentLoader->setFrame(m_frame); 206528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_client->transitionToCommittedFromCachedFrame(cachedPage->cachedMainFrame()); 206628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 206728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } else 206828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_client->transitionToCommittedForNewPage(); 2069d0825bca7fe65beaee391d30da42e937db621564Steve Block } 20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReload: 2073635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeReloadFromOrigin: 20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeSame: 20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReplace: 2076cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForReload(); 20778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeStandard: 2081cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForStandardLoad(); 20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER 20838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This code was originally added for a Leopard performance imporvement. We decided to 20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ifdef it to fix correctness issues on Tiger documented in <rdar://problem/5441823>. 20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->view()) 20868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->setScrollbarsSuppressed(true); 20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 20888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeRedirectWithLockedBackForwardList: 2092cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForRedirectWithLockedBackForwardList(); 20938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME Remove this check when dummy ds is removed (whatever "dummy ds" is). 20978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // An exception should be thrown if we're in the FrameLoadTypeUninitialized state. 20988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_documentLoader->writer()->setMIMEType(dl->responseMIMEType()); 21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Tell the client we've committed this URL. 21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->view()); 21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 210706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 21088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 210906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 211006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.committedFirstRealDocumentLoad()) 211106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit); 2112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 21130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_client->hasHTMLView()) 21140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch receivedFirstData(); 21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress) 21188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Note that -webView:didCancelClientRedirectForFrame: is called on the frame load delegate even if 21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect succeeded. We should either rename this API, or add a new method, like 21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -webView:didFinishClientRedirectForFrame: 21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidCancelClientRedirect(); 21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!cancelWithLoadInProgress) 21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_sentRedirectNotification = false; 21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::clientRedirected(const KURL& url, double seconds, double fireDate, bool lockBackForwardList) 21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchWillPerformClientRedirect(url, seconds, fireDate); 21338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Remember that we sent a redirect notification to the frame load delegate so that when we commit 21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the next provisional load, we can send a corresponding -webView:didCancelClientRedirectForFrame: 21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_sentRedirectNotification = true; 21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If a "quick" redirect comes in, we set a special mode so we treat the next 21395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // load as part of the original navigation. If we don't have a document loader, we have 21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // no "original" load on which to base a redirect, so we treat the redirect as a normal load. 21415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Loads triggered by JavaScript form submissions never count as quick redirects. 2142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_quickRedirectComing = (lockBackForwardList || history()->currentItemShouldBeReplaced()) && m_documentLoader && !m_isExecutingJavaScriptFormAction; 21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldReload(const KURL& currentURL, const KURL& destinationURL) 21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 21480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // All WML decks are supposed to be reloaded, even within the same URL fragment 21490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (frameContainsWMLContent(m_frame)) 2150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 2151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 2152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This function implements the rule: "Don't reload if navigating by fragment within 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the same URL, but do reload if going to a new URL or to the same URL with no 21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fragment identifier at all." 21560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!destinationURL.hasFragmentIdentifier()) 21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 21580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return !equalIgnoringFragmentIdentifier(currentURL, destinationURL); 21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::closeOldDataSources() 21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is it important for this traversal to be postorder instead of preorder? 21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If so, add helpers for postorder traversal, and use them. If not, then lets not 21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // use a recursive algorithm here. 21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child->loader()->closeOldDataSources(); 21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchWillClose(); 21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainFrameDocumentReady(false); // stop giving out the actual DOMDocument to observers 21738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2175545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::prepareForCachedPageRestore() 21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!m_frame->tree()->parent()); 21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->page()); 21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->page()->mainFrame() == m_frame); 21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2181a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We still have to close the previous part page. 21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Delete old status bar messages (if it _was_ activated on last URL). 2187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_frame->script()->canExecuteScripts(NotAboutToExecuteScript)) { 218806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (DOMWindow* window = m_frame->existingDOMWindow()) { 218906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setStatus(String()); 219006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setDefaultStatus(String()); 219106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 21948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2195231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::open(CachedFrameBase& cachedFrame) 21968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 21978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_isComplete = false; 21988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't re-emit the load event. 22008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_didCallImplicitClose = true; 22018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 22028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian KURL url = cachedFrame.url(); 22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (url.protocolInHTTPFamily() && !url.host().isEmpty() && url.path().isEmpty()) 22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.setPath("/"); 22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = url; 22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project started(); 2210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block clear(true, true, cachedFrame.isMainFrame()); 22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Document* document = cachedFrame.document(); 22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(document); 22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document->setInPageCache(false); 22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = true; 22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_outgoingReferrer = url.string(); 22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian FrameView* view = cachedFrame.view(); 22228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 22238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // When navigating to a CachedFrame its FrameView should never be null. If it is we'll crash in creative ways downstream. 22248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(view); 2225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block view->setWasScrolledByUser(false); 2226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Use the current ScrollView's frame rect. 22282bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_frame->view()) { 22292bde8e466a4451c7319e3a072d118917957d6554Steve Block IntRect rect = m_frame->view()->frameRect(); 22302bde8e466a4451c7319e3a072d118917957d6554Steve Block view->setFrameRect(rect); 22312bde8e466a4451c7319e3a072d118917957d6554Steve Block view->setBoundsSize(rect.size()); 22322bde8e466a4451c7319e3a072d118917957d6554Steve Block } 22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setView(view); 22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setDocument(document); 22368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->setDOMWindow(cachedFrame.domWindow()); 22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setURL(document->url()); 22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setSecurityOrigin(document->securityOrigin()); 22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian updateFirstPartyForCookies(); 22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian cachedFrame.restore(); 22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isStopping() const 22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->isStopping(); 22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedLoading() 22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Retain because the stop may release the last reference to it. 22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> dl = activeDocumentLoader(); 22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dl->finishedLoading(); 22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dl->mainDocumentError().isNull() || !dl->frameLoader()) 22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dl->setPrimaryLoadComplete(true); 22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidLoadMainResource(dl.get()); 22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isHostedByObjectElement() const 22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* owner = m_frame->ownerElement(); 22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return owner && owner->hasTagName(objectTag); 22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isLoadingMainFrame() const 22718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Page* page = m_frame->page(); 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return page && m_frame == page->mainFrame(); 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::canShowMIMEType(const String& MIMEType) const 22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->canShowMIMEType(MIMEType); 22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::representationExistsForURLScheme(const String& URLScheme) 22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->representationExistsForURLScheme(URLScheme); 22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::generatedMIMETypeForURLScheme(const String& URLScheme) 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->generatedMIMETypeForURLScheme(URLScheme); 22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didReceiveServerRedirectForProvisionalLoadForFrame() 22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveServerRedirectForProvisionalLoad(); 22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedLoadingDocument(DocumentLoader* loader) 22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Platforms shouldn't differ here! 22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(WIN) || PLATFORM(CHROMIUM) || defined(ANDROID) 230006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 23035f000f6f06377295cba1d3246dbd601610cdbd16Kristian Monsen 23042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !ENABLE(WEB_ARCHIVE) 23052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_client->finishedLoading(loader); 23062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#else 2307f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Give archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. 2308f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Archive> archive = ArchiveFactory::create(loader->mainResourceData().get(), loader->responseMIMEType()); 2309f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!archive) { 23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->finishedLoading(loader); 23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2314f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: The remainder of this function should be moved to DocumentLoader. 2315f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 231668513a70bcd92384395513322f1b801e7bf9c729Steve Block loader->addAllArchiveResources(archive.get()); 231768513a70bcd92384395513322f1b801e7bf9c729Steve Block 23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ArchiveResource* mainResource = archive->mainResource(); 23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setParsedArchiveData(mainResource->data()); 23205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 23212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block loader->writer()->setMIMEType(mainResource->mimeType()); 2322cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 2323cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block closeURL(); 23245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian didOpenURL(mainResource->url()); 23255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 232668513a70bcd92384395513322f1b801e7bf9c729Steve Block ASSERT(m_frame->document()); 23275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian String userChosenEncoding = documentLoader()->overrideEncoding(); 23285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool encodingIsUserChosen = !userChosenEncoding.isNull(); 23292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block loader->writer()->setEncoding(encodingIsUserChosen ? userChosenEncoding : mainResource->textEncoding(), encodingIsUserChosen); 23302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block loader->writer()->addData(mainResource->data()->data(), mainResource->data()->size()); 23312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEB_ARCHIVE) 23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isReplacing() const 23358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_loadType == FrameLoadTypeReplace; 23378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setReplacing() 23408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeReplace; 23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::revertToProvisional(DocumentLoader* loader) 23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->revertToProvisionalState(loader); 23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::subframeIsLoading() const 23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's most likely that the last added frame is the last to load so we walk backwards. 23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->lastChild(); child; child = child->tree()->previousSibling()) { 23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* childLoader = child->loader(); 23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* documentLoader = childLoader->documentLoader(); 23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader && documentLoader->isLoadingInAPISense()) 23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader = childLoader->provisionalDocumentLoader(); 23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader && documentLoader->isLoadingInAPISense()) 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2360967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch documentLoader = childLoader->policyDocumentLoader(); 2361967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (documentLoader) 2362967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return true; 23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::willChangeTitle(DocumentLoader* loader) 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->willChangeTitle(loader); 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoadType FrameLoader::loadType() const 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_loadType; 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 23775f1ab04193ad0130ca8204aadaceae083aca9881Feng QianCachePolicy FrameLoader::subresourceCachePolicy() const 2378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_isComplete) 2380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyVerify; 23815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 23825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_loadType == FrameLoadTypeReloadFromOrigin) 2383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyReload; 23845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Frame* parentFrame = m_frame->tree()->parent()) { 23865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CachePolicy parentCachePolicy = parentFrame->loader()->subresourceCachePolicy(); 2387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (parentCachePolicy != CachePolicyVerify) 2388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return parentCachePolicy; 2389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 2390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 23915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const ResourceRequest& request(documentLoader()->request()); 23922bde8e466a4451c7319e3a072d118917957d6554Steve Block Settings* settings = m_frame->settings(); 23932bde8e466a4451c7319e3a072d118917957d6554Steve Block if (settings && settings->useQuickLookResourceCachingQuirks() && request.cachePolicy() == ReloadIgnoringCacheData && !equalIgnoringCase(request.httpMethod(), "post")) 23945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return CachePolicyRevalidate; 23955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_loadType == FrameLoadTypeReload) 2397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyRevalidate; 2398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2399d0825bca7fe65beaee391d30da42e937db621564Steve Block if (request.cachePolicy() == ReturnCacheDataElseLoad) 24004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return CachePolicyHistoryBuffer; 2401d0825bca7fe65beaee391d30da42e937db621564Steve Block 2402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyVerify; 2403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkLoadCompleteForThisFrame() 24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_state) { 24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateProvisional: { 24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_delegateIsHandlingProvisionalLoadError) 24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pdl) 24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we've received any errors we may be stuck in the provisional state and actually complete. 24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceError& error = pdl->mainDocumentError(); 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.isNull()) 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check all children first. 24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<HistoryItem> item; 24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 242665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (isBackForwardLoadType(loadType())) 242765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Reset the back forward list to the last committed history item at the top level. 242865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch item = page->mainFrame()->loader()->history()->currentItem(); 24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2430ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // Only reset if we aren't already going to a new provisional item. 2431ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch bool shouldReset = !history()->provisionalItem(); 24322bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!pdl->isLoadingInAPISense() || pdl->isStopping()) { 24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_delegateIsHandlingProvisionalLoadError = true; 24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFailProvisionalLoad(error); 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_delegateIsHandlingProvisionalLoadError = false; 24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24372bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!pdl->isLoading()); 24382bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!pdl->isLoadingMainResource()); 24392bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!pdl->isLoadingSubresources()); 24402bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!pdl->isLoadingPlugIns()); 24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2442d0825bca7fe65beaee391d30da42e937db621564Steve Block // If we're in the middle of loading multipart data, we need to restore the document loader. 2443d0825bca7fe65beaee391d30da42e937db621564Steve Block if (isReplacing() && !m_documentLoader.get()) 2444d0825bca7fe65beaee391d30da42e937db621564Steve Block setDocumentLoader(m_provisionalDocumentLoader.get()); 2445d0825bca7fe65beaee391d30da42e937db621564Steve Block 24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Finish resetting the load state, but only if another load hasn't been started by the 24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // delegate callback. 24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pdl == m_provisionalDocumentLoader) 24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clearProvisionalLoad(); 2450643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else if (activeDocumentLoader()) { 2451643ca7872b450ea4efacab6188849e5aac2ba161Steve Block KURL unreachableURL = activeDocumentLoader()->unreachableURL(); 24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty() && unreachableURL == pdl->request().url()) 24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project shouldReset = false; 24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldReset && item) 2457635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Page* page = m_frame->page()) { 245828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->setCurrentItem(item.get()); 245981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_frame->loader()->client()->updateGlobalHistoryItemForPage(); 2460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 24618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateCommittedPage: { 24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* dl = m_documentLoader.get(); 24665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!dl || (dl->isLoadingInAPISense() && !dl->isStopping())) 24678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project markLoadComplete(); 24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is this subsequent work important if we already navigated away? 24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Maybe there are bugs because of that, or extra work we can skip because 24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the new page is ready. 24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->forceLayoutForNonHTML(); 24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the user had a scroll point, scroll to it, overriding the anchor point if any. 247828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page()) { 247928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload || m_loadType == FrameLoadTypeReloadFromOrigin) 2480cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->restoreScrollPositionAndViewState(); 248128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument() || !m_stateMachine.committedFirstRealDocumentLoad()) 24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceError& error = dl->mainDocumentError(); 24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!error.isNull()) 24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFailLoad(error); 24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFinishLoad(); 24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressCompleted(m_frame); 24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateComplete: 24988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian frameLoadCompleted(); 24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2505231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::continueLoadAfterWillSubmitForm() 25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader) 25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // DocumentLoader calls back to our prepareForLoadStart 25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->prepareForLoadStart(); 25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The load might be cancelled inside of prepareForLoadStart(), nulling out the m_provisionalDocumentLoader, 25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so we need to null check it again. 25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader) 25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* activeDocLoader = activeDocumentLoader(); 25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (activeDocLoader && activeDocLoader->isLoadingMainResource()) 25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2522231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_loadingFromCachedPage = false; 25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier = 0; 25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = page->progress()->createUniqueIdentifier(); 2528cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->assignIdentifierToInitialRequest(identifier, m_provisionalDocumentLoader.get(), m_provisionalDocumentLoader->originalRequest()); 25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2531967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT(!m_provisionalDocumentLoader->timing()->navigationStart); 2532967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch m_provisionalDocumentLoader->timing()->navigationStart = currentTime(); 2533967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader->startLoadingMainResource(identifier)) 25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->updateLoading(); 25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didFirstLayout() 25398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 254028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page() && isBackForwardLoadType(m_loadType)) 254128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->restoreScrollPositionAndViewState(); 25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 254306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.committedFirstRealDocumentLoad() && !m_stateMachine.isDisplayingInitialEmptyDocument() && !m_stateMachine.firstLayoutDone()) 254406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::FirstLayoutDone); 25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFirstLayout(); 25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::didFirstVisuallyNonEmptyLayout() 2549635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidFirstVisuallyNonEmptyLayout(); 2551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2552635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::frameLoadCompleted() 25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Note: Can be called multiple times. 25568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->frameLoadCompleted(); 25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2559cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForFrameLoadCompleted(); 25608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // After a canceled provisional load, firstLayoutDone is false. 25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Reset it to true if we're displaying a page. 256306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_documentLoader && m_stateMachine.committedFirstRealDocumentLoad() && !m_stateMachine.isDisplayingInitialEmptyDocument() && !m_stateMachine.firstLayoutDone()) 256406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::FirstLayoutDone); 25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::detachChildren() 25688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2569131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block typedef Vector<RefPtr<Frame> > FrameVector; 2570131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block FrameVector childrenToDetach; 2571131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block childrenToDetach.reserveCapacity(m_frame->tree()->childCount()); 2572131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block for (Frame* child = m_frame->tree()->lastChild(); child; child = child->tree()->previousSibling()) 2573131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block childrenToDetach.append(child); 2574131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block FrameVector::iterator end = childrenToDetach.end(); 2575131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block for (FrameVector::iterator it = childrenToDetach.begin(); it != end; it++) 2576131c31a2d968d23bd0a02c4f7a06a69900fa419dSteve Block (*it)->loader()->detachFromParent(); 25778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoader::closeAndRemoveChild(Frame* child) 25808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->tree()->detachFromParent(); 25828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->setView(0); 2584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (child->ownerElement() && child->page()) 25858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->page()->decrementFrameCount(); 25865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: The page isn't being destroyed, so it's not right to call a function named pageDestroyed(). 25878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->pageDestroyed(); 25888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->tree()->removeChild(child); 25908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::recursiveCheckLoadComplete() 25938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<RefPtr<Frame>, 10> frames; 25958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RefPtr<Frame> frame = m_frame->tree()->firstChild(); frame; frame = frame->tree()->nextSibling()) 25978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frames.append(frame); 25988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned size = frames.size(); 26008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < size; i++) 26018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frames[i]->loader()->recursiveCheckLoadComplete(); 26028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadCompleteForThisFrame(); 26048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called every time a resource is completely loaded, or an error is received. 26078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkLoadComplete() 26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 26108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2611231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = false; 2612231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Always traversing the entire frame tree is a bit inefficient, but 26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is currently needed in order to null out the previous history item for all frames. 26158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 26168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->mainFrame()->loader()->recursiveCheckLoadComplete(); 26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint FrameLoader::numPendingOrLoadingRequests(bool recurse) const 26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!recurse) 26228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return numRequests(m_frame->document()); 26238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int count = 0; 26258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* frame = m_frame; frame; frame = frame->tree()->traverseNext(m_frame)) 26268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project count += numRequests(frame->document()); 26278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return count; 26288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::userAgent(const KURL& url) const 26318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String userAgent = m_client->userAgent(url); 26332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block InspectorInstrumentation::applyUserAgentOverride(m_frame, &userAgent); 26342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return userAgent; 26358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::handledOnloadEvents() 26388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidHandleOnloadEvents(); 2640e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 2641f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (documentLoader()) { 2642f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick documentLoader()->handledOnloadEvents(); 2643d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS) 2644d0825bca7fe65beaee391d30da42e937db621564Steve Block documentLoader()->applicationCacheHost()->stopDeferringEvents(); 2645d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 2646f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 26478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::frameDetached() 26508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopAllLoaders(); 26528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->stopActiveDOMObjects(); 26538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachFromParent(); 26548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::detachFromParent() 26578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 26598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 2661cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->saveScrollPositionAndViewStateToItem(history()->currentItem()); 26628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 266328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // stopAllLoaders() needs to be called after detachChildren(), because detachedChildren() 266428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // will trigger the unload event handlers of any child frames, and those event 266528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // handlers might start a new subresource load in this frame. 266628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu stopAllLoaders(); 26678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 266865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::frameDetachedFromParent(m_frame); 2669231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2670231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block detachViewsAndDocumentLoader(); 26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) { 26738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parent->loader()->closeAndRemoveChild(m_frame); 26748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->scheduleCheckCompleted(); 26758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 26768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setView(0); 26775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: The page isn't being destroyed, so it's not right to call a function named pageDestroyed(). 26788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->pageDestroyed(); 26798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 26808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2681231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2682231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::detachViewsAndDocumentLoader() 2683231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 2684231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->detachedFromParent2(); 2685231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setDocumentLoader(0); 2686231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->detachedFromParent3(); 2687231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 2688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToSubresourceRequest(ResourceRequest& request) 2690635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2691635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, m_loadType, false, false); 2692635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 26938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToMainResourceRequest(ResourceRequest& request) 2695635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2696635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, m_loadType, true, false); 2697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2698635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2699635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadType loadType, bool mainResource, bool cookiePolicyURLFromRequest) 27008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't set the cookie policy URL if it's already been set. 27028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // But make sure to set it on all requests, as it has significance beyond the cookie policy for all protocols (<rdar://problem/6616664>). 27035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (request.firstPartyForCookies().isEmpty()) { 27048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (mainResource && (isLoadingMainFrame() || cookiePolicyURLFromRequest)) 27055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setFirstPartyForCookies(request.url()); 27065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian else if (Document* document = m_frame->document()) 27075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setFirstPartyForCookies(document->firstPartyForCookies()); 27088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 27095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 27108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // The remaining modifications are only necessary for HTTP and HTTPS. 27118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!request.url().isEmpty() && !request.url().protocolInHTTPFamily()) 27128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 27138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 27148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project applyUserAgent(request); 27158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2716e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // If we inherit cache policy from a main resource, we use the DocumentLoader's 2717e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // original request cache policy for two reasons: 2718e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // 1. For POST requests, we mutate the cache policy for the main resource, 2719e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // but we do not want this to apply to subresources 2720e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // 2. Delegates that modify the cache policy using willSendRequest: should 2721e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // not affect any other resources. Such changes need to be done 2722e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // per request. 2723967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!mainResource) { 2724967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (request.isConditional()) 2725967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(ReloadIgnoringCacheData); 2726967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else if (documentLoader()->isLoadingInAPISense()) 2727967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(documentLoader()->originalRequest().cachePolicy()); 2728967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else 2729967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(UseProtocolCachePolicy); 27305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } else if (loadType == FrameLoadTypeReload || loadType == FrameLoadTypeReloadFromOrigin || request.isConditional()) 2731e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke request.setCachePolicy(ReloadIgnoringCacheData); 27321e986ec96b7ff9d1ee56e1063ebd99ee22bb1ce2Steve Block else if (isBackForwardLoadType(loadType) && m_stateMachine.committedFirstRealDocumentLoad()) 2733d0825bca7fe65beaee391d30da42e937db621564Steve Block request.setCachePolicy(ReturnCacheDataElseLoad); 27345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 27355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (request.cachePolicy() == ReloadIgnoringCacheData) { 27365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (loadType == FrameLoadTypeReload) 27375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Cache-Control", "max-age=0"); 27385ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else if (loadType == FrameLoadTypeReloadFromOrigin) { 27395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Cache-Control", "no-cache"); 27405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Pragma", "no-cache"); 27415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 27425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mainResource) 27455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setHTTPAccept(defaultAcceptHeader); 27468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we send the Origin header. 27488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(request, String()); 2749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2750635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Always try UTF-8. If that fails, try frame encoding (if any) and then the default. 2751635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // For a newly opened frame with an empty URL, encoding() should not be used, because this methods asks decoder, which uses ISO-8859-1. 2752635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Settings* settings = m_frame->settings(); 27532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block request.setResponseContentDispositionEncodingFallbackArray("UTF-8", activeDocumentLoader()->writer()->deprecatedFrameEncoding(), settings ? settings->defaultTextEncodingName() : String()); 27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::addHTTPOriginIfNeeded(ResourceRequest& request, String origin) 27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!request.httpOrigin().isEmpty()) 27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Request already has an Origin header. 27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't send an Origin header for GET or HEAD to avoid privacy issues. 27628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For example, if an intranet page has a hyperlink to an external web 27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // site, we don't want to include the Origin of the request because it 27648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // will leak the internal host name. Similar privacy concerns have lead 27658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to the widespread suppression of the Referer header at the network 27668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // layer. 27678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (request.httpMethod() == "GET" || request.httpMethod() == "HEAD") 27688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 27698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For non-GET and non-HEAD methods, always send an Origin header so the 27718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // server knows we support this feature. 27728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (origin.isEmpty()) { 27748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we don't know what origin header to attach, we attach the value 27758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for an empty origin. 27768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin = SecurityOrigin::createEmpty()->toString(); 27778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 27788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPOrigin(origin); 27808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::loadPostRequest(const ResourceRequest& inRequest, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType loadType, PassRefPtr<Event> event, PassRefPtr<FormState> prpFormState) 27838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 27858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Previously when this method was reached, the original FrameLoadRequest had been deconstructed to build a 27878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // bunch of parameters that would come in here and then be built back up to a ResourceRequest. In case 27888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // any caller depends on the immutability of the original ResourceRequest, I'm rebuilding a ResourceRequest 27898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from scratch as it did all along. 27908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& url = inRequest.url(); 27918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormData> formData = inRequest.httpBody(); 27928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& contentType = inRequest.httpContentType(); 27938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String origin = inRequest.httpOrigin(); 27948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest workingResourceRequest(url); 27968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) 27988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPReferrer(referrer); 27998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPOrigin(origin); 28008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPMethod("POST"); 28018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPBody(formData); 28028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPContentType(contentType); 2803635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(workingResourceRequest, loadType, true, true); 28048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NavigationAction action(url, loadType, true, event); 28068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frameName.isEmpty()) { 28085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The search for a target frame is done earlier in the case of form submission. 28095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (Frame* targetFrame = formState ? 0 : findFrameForNavigation(frameName)) 2810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project targetFrame->loader()->loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release()); 28118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2812231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy, workingResourceRequest, formState.release(), frameName, this); 28138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 2814635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release()); 28158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianunsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& request, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data) 28188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String referrer = m_outgoingReferrer; 2820231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (SecurityOrigin::shouldHideReferrer(request.url(), referrer)) 28218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = String(); 28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest initialRequest = request; 28248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setTimeoutInterval(10); 28258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) 28278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setHTTPReferrer(referrer); 28288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(initialRequest, outgoingOrigin()); 28298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 28315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian initialRequest.setFirstPartyForCookies(page->mainFrame()->loader()->documentLoader()->request().url()); 28328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setHTTPUserAgent(client()->userAgent(request.url())); 2833e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 2834e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke addExtraFieldsToSubresourceRequest(initialRequest); 28358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier = 0; 28378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest newRequest(initialRequest); 28388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project requestFromDelegate(newRequest, identifier, error); 28398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.isNull()) { 28418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!newRequest.isNull()); 28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS) 28440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!documentLoader()->applicationCacheHost()->maybeLoadSynchronously(newRequest, error, response, data)) { 28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 284668513a70bcd92384395513322f1b801e7bf9c729Steve Block ResourceHandle::loadResourceSynchronously(networkingContext(), newRequest, storedCredentials, error, response, data); 2847635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS) 28480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch documentLoader()->applicationCacheHost()->maybeLoadFallbackSynchronously(newRequest, error, response, data); 2849635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 2850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 28518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 28522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch int encodedDataLength = response.resourceLoadInfo() ? static_cast<int>(response.resourceLoadInfo()->encodedDataLength) : -1; 28532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, data.size(), encodedDataLength, error); 2854cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return identifier; 28555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 28565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 28578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst ResourceRequest& FrameLoader::originalRequest() const 28588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequestCopy(); 28608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::receivedMainResourceError(const ResourceError& error, bool isComplete) 28638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Retain because the stop may release the last reference to it. 28658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 28668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = activeDocumentLoader(); 2868cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isComplete) { 28708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Don't want to do this if an entirely new load is going, so should check 28718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that both data sources on the frame are either this or nil. 28728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stop(); 28738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_client->shouldFallBack(error)) 28748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handleFallbackContent(); 28758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2876cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) { 28785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_submittedFormURL == m_provisionalDocumentLoader->originalRequestCopy().url()) 28795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_submittedFormURL = KURL(); 28808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We might have made a page cache item, but now we're bailing out due to an error before we ever 28828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // transitioned to the new page (before WebFrameState == commit). The goal here is to restore any state 28838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so that the existing view (that wenever got far enough to replace) can continue being used. 2884cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->invalidateCurrentItemCachedPage(); 28858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Call clientRedirectCancelledOrFinished here so that the frame load delegate is notified that the redirect's 28878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // status has changed, if there was a redirect. The frame load delegate may have saved some state about 28888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect in its -webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:. Since we are definitely 28898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // not going to use this provisional resource, as it was cancelled, notify the frame load delegate that the redirect 28908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // has ended. 28918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_sentRedirectNotification) 28928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 28938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2894cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->mainReceivedError(error, isComplete); 28968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueFragmentScrollAfterNavigationPolicy(void* argument, 28998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, PassRefPtr<FormState>, bool shouldContinue) 29008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 29028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->continueFragmentScrollAfterNavigationPolicy(request, shouldContinue); 29038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue) 29068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 29088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!shouldContinue) 29108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 29118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2912aad6f24e036b3740071bb995b955b18b572067b2Steve Block bool isRedirect = m_quickRedirectComing || policyChecker()->loadType() == FrameLoadTypeRedirectWithLockedBackForwardList; 2913643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadInSameDocument(request.url(), 0, !isRedirect); 29148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2916cad810f21b803229eb11403f9209855525a25d57Steve Blockbool FrameLoader::shouldScrollToAnchor(bool isFormSubmission, const String& httpMethod, FrameLoadType loadType, const KURL& url) 29178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Should we do anchor navigation within the existing content? 29198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2920cad810f21b803229eb11403f9209855525a25d57Steve Block // We don't do this if we are submitting a form with method other than "GET", explicitly reloading, 29218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // currently displaying a frameset, or if the URL does not have a fragment. 29228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These rules were originally based on what KHTML was doing in KHTMLPart::openURL. 29238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: What about load types other than Standard and Reload? 29258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2926cad810f21b803229eb11403f9209855525a25d57Steve Block return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET")) 29278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && loadType != FrameLoadTypeReload 2928635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project && loadType != FrameLoadTypeReloadFromOrigin 29298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && loadType != FrameLoadTypeSame 29302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block && !shouldReload(m_frame->document()->url(), url) 29318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't want to just scroll if a link from within a 29328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frameset is trying to reload the frameset into _top. 29338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian && !m_frame->document()->isFrameSet(); 29348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueLoadAfterNavigationPolicy(void* argument, 29378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, PassRefPtr<FormState> formState, bool shouldContinue) 29388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 29408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->continueLoadAfterNavigationPolicy(request, formState, shouldContinue); 29418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool FrameLoader::shouldClose() 29446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 29456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Page* page = m_frame->page(); 29466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Chrome* chrome = page ? page->chrome() : 0; 29476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!chrome || !chrome->canRunBeforeUnloadConfirmPanel()) 29486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2950cad810f21b803229eb11403f9209855525a25d57Steve Block // Store all references to each subframe in advance since beforeunload's event handler may modify frame 2951cad810f21b803229eb11403f9209855525a25d57Steve Block Vector<RefPtr<Frame> > targetFrames; 2952cad810f21b803229eb11403f9209855525a25d57Steve Block targetFrames.append(m_frame); 2953cad810f21b803229eb11403f9209855525a25d57Steve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->traverseNext(m_frame)) 2954cad810f21b803229eb11403f9209855525a25d57Steve Block targetFrames.append(child); 2955cad810f21b803229eb11403f9209855525a25d57Steve Block 2956cad810f21b803229eb11403f9209855525a25d57Steve Block bool shouldClose = false; 2957cad810f21b803229eb11403f9209855525a25d57Steve Block { 2958cad810f21b803229eb11403f9209855525a25d57Steve Block NavigationDisablerForBeforeUnload navigationDisabler; 2959cad810f21b803229eb11403f9209855525a25d57Steve Block size_t i; 2960cad810f21b803229eb11403f9209855525a25d57Steve Block 2961cad810f21b803229eb11403f9209855525a25d57Steve Block for (i = 0; i < targetFrames.size(); i++) { 2962cad810f21b803229eb11403f9209855525a25d57Steve Block if (!targetFrames[i]->tree()->isDescendantOf(m_frame)) 2963cad810f21b803229eb11403f9209855525a25d57Steve Block continue; 2964cad810f21b803229eb11403f9209855525a25d57Steve Block if (!targetFrames[i]->loader()->fireBeforeUnloadEvent(chrome)) 2965cad810f21b803229eb11403f9209855525a25d57Steve Block break; 2966cad810f21b803229eb11403f9209855525a25d57Steve Block } 2967cad810f21b803229eb11403f9209855525a25d57Steve Block 2968cad810f21b803229eb11403f9209855525a25d57Steve Block if (i == targetFrames.size()) 2969cad810f21b803229eb11403f9209855525a25d57Steve Block shouldClose = true; 2970cad810f21b803229eb11403f9209855525a25d57Steve Block } 2971cad810f21b803229eb11403f9209855525a25d57Steve Block 2972cad810f21b803229eb11403f9209855525a25d57Steve Block return shouldClose; 2973cad810f21b803229eb11403f9209855525a25d57Steve Block} 2974cad810f21b803229eb11403f9209855525a25d57Steve Block 2975cad810f21b803229eb11403f9209855525a25d57Steve Blockbool FrameLoader::fireBeforeUnloadEvent(Chrome* chrome) 2976cad810f21b803229eb11403f9209855525a25d57Steve Block{ 29776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen DOMWindow* domWindow = m_frame->existingDOMWindow(); 29786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!domWindow) 29796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RefPtr<Document> document = m_frame->document(); 2982cad810f21b803229eb11403f9209855525a25d57Steve Block if (!document->body()) 29836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RefPtr<BeforeUnloadEvent> beforeUnloadEvent = BeforeUnloadEvent::create(); 29866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = true; 29876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen domWindow->dispatchEvent(beforeUnloadEvent.get(), domWindow->document()); 29886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = false; 29896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!beforeUnloadEvent->defaultPrevented()) 29916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen document->defaultEventHandler(beforeUnloadEvent.get()); 29926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (beforeUnloadEvent->result().isNull()) 29936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen String text = document->displayStringModifiedByEncoding(beforeUnloadEvent->result()); 29966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return chrome->runBeforeUnloadConfirmPanel(text, m_frame); 29976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 29986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2999635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState> formState, bool shouldContinue) 30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we loaded an alternate page to replace an unreachableURL, we'll get in here with a 30028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // nil policyDataSource because loading the alternate page will have passed 30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // through this method already, nested; otherwise, policyDataSource should still be set. 30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_policyDocumentLoader || !m_provisionalDocumentLoader->unreachableURL().isEmpty()); 30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3006cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block bool isTargetItem = history()->provisionalItem() ? history()->provisionalItem()->isTargetItem() : false; 30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Two reasons we can't continue: 30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 1) Navigation policy delegate said we can't so request is nil. A primary case of this 30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is the user responding Cancel to the form repost nag sheet. 30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 2) User responded Cancel to an alert popped up by the before unload event handler. 3012cad810f21b803229eb11403f9209855525a25d57Steve Block bool canContinue = shouldContinue && shouldClose(); 30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!canContinue) { 30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we were waiting for a quick redirect, but the policy delegate decided to ignore it, then we 30168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // need to report that the client redirect was cancelled. 30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_quickRedirectComing) 30188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(0); 30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the navigation request came from the back/forward menu, and we punt on it, we have the 30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // problem that we have optimistically moved the b/f cursor already, so move it back. For sanity, 30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we only do this when punting a navigation for the target frame or top-level frame. 302581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if ((isTargetItem || isLoadingMainFrame()) && isBackForwardLoadType(policyChecker()->loadType())) { 30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* mainFrame = page->mainFrame(); 3028cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (HistoryItem* resetItem = mainFrame->loader()->history()->currentItem()) { 302928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->setCurrentItem(resetItem); 303081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_frame->loader()->client()->updateGlobalHistoryItemForPage(); 3031635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 30328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 303381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 30348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3037231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block FrameLoadType type = policyChecker()->loadType(); 3038ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // A new navigation is in progress, so don't clear the history's provisional item. 303981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch stopAllLoaders(ShouldNotClearProvisionalItem); 30408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // <rdar://problem/6250856> - In certain circumstances on pages with multiple frames, stopAllLoaders() 30428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // might detach the current FrameLoader, in which case we should bail on this newly defunct load. 30438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->page()) 30448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 30462bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(JAVASCRIPT_DEBUGGER) && USE(JSC) && ENABLE(INSPECTOR) 30475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (Page* page = m_frame->page()) { 30485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (page->mainFrame() == m_frame) 30492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->page()->inspectorController()->resume(); 30505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 30515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 30525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 30538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(m_policyDocumentLoader.get()); 30548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = type; 30558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 30568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(0); 30588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3059545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (isBackForwardLoadType(type) && history()->provisionalItem()->isInPageCache()) { 3060545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch loadProvisionalItemFromCachedPage(); 30618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3062545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch } 30638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (formState) 3065231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->dispatchWillSubmitForm(&PolicyChecker::continueLoadAfterWillSubmitForm, formState); 30668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 30678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continueLoadAfterWillSubmitForm(); 30688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueLoadAfterNewWindowPolicy(void* argument, 3071e14391e94c850b8bd03680c23b38978db68687a8John Reck const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName, const NavigationAction& action, bool shouldContinue) 30728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 3074e14391e94c850b8bd03680c23b38978db68687a8John Reck loader->continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue); 30758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& request, 3078e14391e94c850b8bd03680c23b38978db68687a8John Reck PassRefPtr<FormState> formState, const String& frameName, const NavigationAction& action, bool shouldContinue) 30798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!shouldContinue) 30818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> frame = m_frame; 3084e14391e94c850b8bd03680c23b38978db68687a8John Reck RefPtr<Frame> mainFrame = m_client->dispatchCreatePage(action); 30858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mainFrame) 30868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frameName != "_blank") 30898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainFrame->tree()->setName(frameName); 30908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3091231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block mainFrame->page()->setOpenedByDOM(); 30928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainFrame->loader()->m_client->dispatchShow(); 3093cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!m_suppressOpenerInNewFrame) 3094cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block mainFrame->loader()->setOpener(frame.get()); 3095635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project mainFrame->loader()->loadWithNavigationAction(request, NavigationAction(), false, FrameLoadTypeStandard, formState); 30968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::requestFromDelegate(ResourceRequest& request, unsigned long& identifier, ResourceError& error) 30998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!request.isNull()); 31018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = 0; 31038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 31048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = page->progress()->createUniqueIdentifier(); 3105cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->assignIdentifierToInitialRequest(identifier, m_documentLoader.get(), request); 31068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 31078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest newRequest(request); 3109cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->dispatchWillSendRequest(m_documentLoader.get(), identifier, newRequest, ResourceResponse()); 31108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newRequest.isNull()) 31128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = cancelledError(request); 31138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 31148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = ResourceError(); 31158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request = newRequest; 31178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadedResourceFromMemoryCache(const CachedResource* resource) 31208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Page* page = m_frame->page(); 3122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!page) 3123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 31248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!resource->sendResourceLoadCallbacks() || m_documentLoader->haveToldClientAboutLoad(resource->url())) 3126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 31278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!page->areMemoryCacheClientCallsEnabled()) { 312965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didLoadResourceFromMemoryCache(page, m_documentLoader.get(), resource); 3130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->recordMemoryCacheLoadForFutureClientNotification(resource->url()); 3131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->didTellClientAboutLoad(resource->url()); 31328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 31348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(resource->url()); 3136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize())) { 313765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didLoadResourceFromMemoryCache(page, m_documentLoader.get(), resource); 3138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->didTellClientAboutLoad(resource->url()); 31398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 31408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier; 31438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceError error; 3144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project requestFromDelegate(request, identifier, error); 314565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::markResourceAsCached(page, identifier); 31462bde8e466a4451c7319e3a072d118917957d6554Steve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, resource->response(), resource->encodedSize(), 0, error); 31478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::applyUserAgent(ResourceRequest& request) 31508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String userAgent = this->userAgent(request.url()); 31528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!userAgent.isNull()); 31538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPUserAgent(userAgent); 31548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool FrameLoader::shouldInterruptLoadForXFrameOptions(const String& content, const KURL& url) 31575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 31585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* topFrame = m_frame->tree()->top(); 31595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame == topFrame) 31605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 31615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (equalIgnoringCase(content, "deny")) 31635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 31645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (equalIgnoringCase(content, "sameorigin")) { 31665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url); 31675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!origin->isSameSchemeHostPort(topFrame->document()->securityOrigin())) 31685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 31695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 31705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 31725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 31735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3174545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::loadProvisionalItemFromCachedPage() 31758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3176545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch DocumentLoader* provisionalLoader = provisionalDocumentLoader(); 3177545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch LOG(PageCache, "WebCorePageCache: Loading provisional DocumentLoader %p with URL '%s' from CachedPage", provisionalDocumentLoader(), provisionalDocumentLoader()->url().string().utf8().data()); 3178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block provisionalLoader->prepareForLoadStart(); 3180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_loadingFromCachedPage = true; 3182dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 3183dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // Should have timing data from previous time(s) the page was shown. 3184dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch ASSERT(provisionalLoader->timing()->navigationStart); 3185dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch provisionalLoader->resetTiming(); 3186dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch provisionalLoader->timing()->navigationStart = currentTime(); 3187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block provisionalLoader->setCommitted(true); 3189545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch commitProvisionalLoad(); 31908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const 31938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3194cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!history()->currentItem()) 31958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3196cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return url == history()->currentItem()->url() || url == history()->currentItem()->originalURL(); 31978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3199cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid FrameLoader::checkDidPerformFirstNavigation() 32008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 32018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Page* page = m_frame->page(); 32028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!page) 32038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 32048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 320528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!m_didPerformFirstNavigation && page->backForward()->currentItem() && !page->backForward()->backItem() && !page->backForward()->forwardItem()) { 3206cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_didPerformFirstNavigation = true; 32078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->didPerformFirstNavigation(); 32088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 32098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 32108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoader::findFrameForNavigation(const AtomicString& name) 32128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 32138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = m_frame->tree()->find(name); 32145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!shouldAllowNavigation(frame)) 3215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 32165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return frame; 32178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 32188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::loadSameDocumentItem(HistoryItem* item) 3220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3221d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(item->documentSequenceNumber() == history()->currentItem()->documentSequenceNumber()); 3222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Save user view state to the current history item here since we don't do a normal load. 3224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Does form state need to be saved here too? 3225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->saveScrollPositionAndViewStateToItem(history()->currentItem()); 3226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (FrameView* view = m_frame->view()) 3227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block view->setWasScrolledByUser(false); 3228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->setCurrentItem(item); 3230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // loadInSameDocument() actually changes the URL and notifies load delegates of a "fake" load 3232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadInSameDocument(item->url(), item->stateObject(), false); 3233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Restore user view state from the current history item here since we don't do a normal load. 3235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->restoreScrollPositionAndViewState(); 3236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 3237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3238cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// FIXME: This function should really be split into a couple pieces, some of 3239cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// which should be methods of HistoryController and some of which should be 3240cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// methods of FrameLoader. 3241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loadType) 3242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Remember this item so we can traverse any child items as child frames load 3244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->setProvisionalItem(item); 3245545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 3246545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (CachedPage* cachedPage = pageCache()->get(item)) { 3247545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch loadWithDocumentLoader(cachedPage->documentLoader(), loadType, 0); 3248545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return; 3249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 32508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL itemURL = item->url(); 32528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL itemOriginalURL = item->originalURL(); 32538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL currentURL; 32548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader()) 32558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentURL = documentLoader()->url(); 32568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormData> formData = item->formData(); 32578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool addedExtraFields = false; 3259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceRequest request(itemURL); 32605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!item->referrer().isNull()) 3262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPReferrer(item->referrer()); 3263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If this was a repost that failed the page cache, we might try to repost the form. 3265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block NavigationAction action; 3266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (formData) { 326721939df44de1705786c545cd1bf519d47250322dBen Murdoch formData->generateFiles(m_frame->document()); 32688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPMethod("POST"); 3270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPBody(formData); 3271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPContentType(item->formContentType()); 3272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString(item->referrer()); 3273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addHTTPOriginIfNeeded(request, securityOrigin->toString()); 32748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Make sure to add extra fields to the request after the Origin header is added for the FormData case. 3276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // See https://bugs.webkit.org/show_bug.cgi?id=22194 for more discussion. 3277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addExtraFieldsToRequest(request, m_loadType, true, formData); 3278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addedExtraFields = true; 32798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Slight hack to test if the NSURL cache contains the page we're going to. 3281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // We want to know this before talking to the policy delegate, since it affects whether 3282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we show the DoYouReallyWantToRepost nag. 3283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // 3284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This trick has a small bug (3123893) where we might find a cache hit, but then 3285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // have the item vanish when we try to use it in the ensuing nav. This should be 3286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // extremely rare, but in that case the user will get an error on the navigation. 32878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (ResourceHandle::willLoadFromCache(request, m_frame)) 3289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemURL, loadType, false); 3290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 3291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReloadIgnoringCacheData); 3292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemURL, NavigationTypeFormResubmitted); 3293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 32948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block switch (loadType) { 3296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeReload: 3297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeReloadFromOrigin: 3298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReloadIgnoringCacheData); 3299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeBack: 3301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeBackWMLDeckNotAccessible: 3302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeForward: 3303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeIndexedBackForward: 3304967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // If the first load within a frame is a navigation within a back/forward list that was attached 3305967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // without any of the items being loaded then we should use the default caching policy (<rdar://problem/8131355>). 3306967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (m_stateMachine.committedFirstRealDocumentLoad() && !itemURL.protocolIs("https")) 3307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReturnCacheDataElseLoad); 3308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeStandard: 3310643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeRedirectWithLockedBackForwardList: 3311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3312643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeSame: 3313643ca7872b450ea4efacab6188849e5aac2ba161Steve Block default: 3314643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 33168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3317643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemOriginalURL, loadType, false); 3318643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 3319643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!addedExtraFields) 3321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addExtraFieldsToRequest(request, m_loadType, true, formData); 33228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadWithNavigationAction(request, action, false, loadType, 0); 3324643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 33258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Loads content into this frame, as specified by history item 3327643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType) 3328643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 33295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block HistoryItem* currentItem = history()->currentItem(); 3330a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool sameDocumentNavigation = currentItem && item->shouldDoSameDocumentNavigationTo(currentItem); 33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(WML) 3333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // All WML decks should go through the real load mechanism, not the scroll-to-anchor code 3334643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Why do WML decks have this different behavior? 3335643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Are WML decks incompatible with HTML5 pushState/replaceState which require inter-document history navigations? 3336643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Should this new API be disabled for WML pages, or does WML need to update their mechanism to act like normal loads? 3337643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If scroll-to-anchor navigations were broken for WML and required them to have different loading behavior, then 3338643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // state object loads are certainly also broken for them. 3339643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (frameContainsWMLContent(m_frame)) 3340643ca7872b450ea4efacab6188849e5aac2ba161Steve Block sameDocumentNavigation = false; 3341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 3342643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (sameDocumentNavigation) 3344f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loadSameDocumentItem(item); 3345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else 3346f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loadDifferentDocumentItem(item, loadType); 33478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setMainDocumentError(DocumentLoader* loader, const ResourceError& error) 33508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainDocumentError(loader, error); 33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::mainReceivedCompleteError(DocumentLoader* loader, const ResourceError&) 33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setPrimaryLoadComplete(true); 33578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidLoadMainResource(activeDocumentLoader()); 33588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 33598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 33608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 33618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::mainReceivedError(const ResourceError& error, bool isComplete) 33648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project activeDocumentLoader()->mainReceivedError(error, isComplete); 33668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::cancelledError(const ResourceRequest& request) const 33698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceError error = m_client->cancelledError(request); 33718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error.setIsCancellation(true); 33728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return error; 33738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::blockedError(const ResourceRequest& request) const 33768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->blockedError(request); 33788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::cannotShowURLError(const ResourceRequest& request) const 33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->cannotShowURLError(request); 33838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerResourceError FrameLoader::interruptionForPolicyChangeError(const ResourceRequest& request) const 33866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 33876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return m_client->interruptForPolicyChangeError(request); 33886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 33896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 33908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::fileDoesNotExistError(const ResourceResponse& response) const 33918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->fileDoesNotExistError(response); 33938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoader::shouldUseCredentialStorage(ResourceLoader* loader) 3396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_client->shouldUseCredentialStorage(loader->documentLoader(), loader->identifier()); 3398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 3399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 340021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(PROTECTION_SPACE_AUTH_CALLBACK) 340121939df44de1705786c545cd1bf519d47250322dBen Murdochbool FrameLoader::canAuthenticateAgainstProtectionSpace(ResourceLoader* loader, const ProtectionSpace& protectionSpace) 340221939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 340321939df44de1705786c545cd1bf519d47250322dBen Murdoch return m_client->canAuthenticateAgainstProtectionSpace(loader->documentLoader(), loader->identifier(), protectionSpace); 340421939df44de1705786c545cd1bf519d47250322dBen Murdoch} 340521939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 340621939df44de1705786c545cd1bf519d47250322dBen Murdoch 34072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid FrameLoader::setTitle(const StringWithDirection& title) 34088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader()->setTitle(title); 34108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 341221939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoader::setIconURL(const String& iconURL) 341321939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 341421939df44de1705786c545cd1bf519d47250322dBen Murdoch documentLoader()->setIconURL(iconURL); 341521939df44de1705786c545cd1bf519d47250322dBen Murdoch} 341621939df44de1705786c545cd1bf519d47250322dBen Murdoch 34178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::originalRequestURL() const 34188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequest().url(); 34208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::referrer() const 34238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3424ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return m_documentLoader ? m_documentLoader->request().httpReferrer() : ""; 34258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoader::dispatchDocumentElementAvailable() 34288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 3429231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->injectUserScripts(InjectAtDocumentStart); 34308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_client->documentElementAvailable(); 34318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 34328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3433643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() 34348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_frame->script()->canExecuteScripts(NotAboutToExecuteScript)) 34368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 34378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Vector<DOMWrapperWorld*> worlds; 3439643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ScriptController::getAllWorlds(worlds); 3440643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (size_t i = 0; i < worlds.size(); ++i) 3441643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectInWorld(worlds[i]); 3442643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 3443643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3444643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world) 3445643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_frame->script()->canExecuteScripts(NotAboutToExecuteScript) || !m_frame->script()->existingWindowShell(world)) 3447643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 3448643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3449643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->dispatchDidClearWindowObjectInWorld(world); 34508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(INSPECTOR) 34522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (Page* page = m_frame->page()) 34532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block page->inspectorController()->didClearWindowObjectInWorld(m_frame, world); 34542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 34552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 345665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didClearWindowObjectInWorld(m_frame, world); 34578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3459643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::updateSandboxFlags() 3460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block SandboxFlags flags = m_forcedSandboxFlags; 3462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (Frame* parentFrame = m_frame->tree()->parent()) 3463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block flags |= parentFrame->loader()->sandboxFlags(); 3464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement()) 3465643ca7872b450ea4efacab6188849e5aac2ba161Steve Block flags |= ownerElement->sandboxFlags(); 3466643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3467643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_sandboxFlags == flags) 3468643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 3469d0825bca7fe65beaee391d30da42e937db621564Steve Block 3470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_sandboxFlags = flags; 3471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 3473643ca7872b450ea4efacab6188849e5aac2ba161Steve Block child->loader()->updateSandboxFlags(); 3474d0825bca7fe65beaee391d30da42e937db621564Steve Block} 3475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didChangeTitle(DocumentLoader* loader) 34778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->didChangeTitle(loader); 34798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (loader == m_documentLoader) { 34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Must update the entries in the back-forward list too. 3482cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->setCurrentItemTitle(loader->title()); 34838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This must go through the WebFrame because it has the right notion of the current b/f item. 34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setTitle(loader->title(), loader->urlForHistory()); 34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainFrameDocumentReady(true); // update observers with new DOMDocument 34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveTitle(loader->title()); 34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 34888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 349021939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoader::didChangeIcons(DocumentLoader* loader) 349121939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 349221939df44de1705786c545cd1bf519d47250322dBen Murdoch if (loader == m_documentLoader) 349321939df44de1705786c545cd1bf519d47250322dBen Murdoch m_client->dispatchDidChangeIcons(); 349421939df44de1705786c545cd1bf519d47250322dBen Murdoch} 349521939df44de1705786c545cd1bf519d47250322dBen Murdoch 34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::dispatchDidCommitLoad() 34978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 349806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 35008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 35018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidCommitLoad(); 35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 350365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didCommitLoad(m_frame, m_documentLoader.get()); 35048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 35058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3506635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::tellClientAboutPastMemoryCacheLoads() 3507635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3508635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame->page()); 3509635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame->page()->areMemoryCacheClientCallsEnabled()); 3510635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_documentLoader) 3512635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 3513635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3514635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<String> pastLoads; 3515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->takeMemoryCacheLoadsForClientNotification(pastLoads); 3516635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3517635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t size = pastLoads.size(); 3518635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 0; i < size; ++i) { 351965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CachedResource* resource = memoryCache()->resourceForURL(KURL(ParsedURLString, pastLoads[i])); 3520635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3521635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: These loads, loaded from cache, but now gone from the cache by the time 3522635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Page::setMemoryCacheClientCallsEnabled(true) is called, will not be seen by the client. 3523635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Consider if there's some efficient way of remembering enough to deliver this client call. 3524635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // We have the URL, but not the rest of the response or the length. 3525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!resource) 3526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project continue; 3527635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(resource->url()); 3529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize()); 3530635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 3532635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 35335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickNetworkingContext* FrameLoader::networkingContext() const 35345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 35355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return m_networkingContext.get(); 35365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 35375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 35388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool FrameLoaderClient::hasHTMLView() const 35398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 35408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 35418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 35428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3543f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickFrame* createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadRequest& request, const WindowFeatures& features, bool& created) 3544f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 3545f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick ASSERT(!features.dialog || request.frameName().isEmpty()); 3546f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3547f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!request.frameName().isEmpty() && request.frameName() != "_blank") { 3548f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Frame* frame = lookupFrame->tree()->find(request.frameName()); 3549f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (frame && openerFrame->loader()->shouldAllowNavigation(frame)) { 3550f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (Page* page = frame->page()) 3551f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->focus(); 3552f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick created = false; 3553f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return frame; 3554f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 3555f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 3556f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3557f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Sandboxed frames cannot open new auxiliary browsing contexts. 3558f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (isDocumentSandboxed(openerFrame, SandboxNavigation)) 3559f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3560f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3561f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // FIXME: Setting the referrer should be the caller's responsibility. 3562f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FrameLoadRequest requestWithReferrer = request; 3563f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick requestWithReferrer.resourceRequest().setHTTPReferrer(openerFrame->loader()->outgoingReferrer()); 3564f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FrameLoader::addHTTPOriginIfNeeded(requestWithReferrer.resourceRequest(), openerFrame->loader()->outgoingOrigin()); 3565f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3566f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Page* oldPage = openerFrame->page(); 3567f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!oldPage) 3568f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3569f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3570e14391e94c850b8bd03680c23b38978db68687a8John Reck NavigationAction action; 3571e14391e94c850b8bd03680c23b38978db68687a8John Reck Page* page = oldPage->chrome()->createWindow(openerFrame, requestWithReferrer, features, action); 3572f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!page) 3573f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3574f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3575f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Frame* frame = page->mainFrame(); 3576f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (request.frameName() != "_blank") 3577f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick frame->tree()->setName(request.frameName()); 3578f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3579f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setToolbarsVisible(features.toolBarVisible || features.locationBarVisible); 3580f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setStatusbarVisible(features.statusBarVisible); 3581f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setScrollbarsVisible(features.scrollbarsVisible); 3582f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setMenubarVisible(features.menuBarVisible); 3583f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setResizable(features.resizable); 3584f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3585f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // 'x' and 'y' specify the location of the window, while 'width' and 'height' 3586f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // specify the size of the page. We can only resize the window, so 3587f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // adjust for the difference between the window size and the page size. 3588f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3589f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FloatRect windowRect = page->chrome()->windowRect(); 3590f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FloatSize pageSize = page->chrome()->pageRect().size(); 3591f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.xSet) 3592f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setX(features.x); 3593f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.ySet) 3594f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setY(features.y); 3595f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.widthSet) 3596f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setWidth(features.width + (windowRect.width() - pageSize.width())); 3597f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.heightSet) 3598f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setHeight(features.height + (windowRect.height() - pageSize.height())); 3599f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setWindowRect(windowRect); 3600f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3601f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->show(); 3602f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3603f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick created = true; 3604f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return frame; 3605f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 3606f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 3608