FrameLoader.cpp revision d73b16bdebb9d20b17be0a30e626dc9e66b6d868
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2006, 2007, 2008, 2009, 2010 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. 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ApplicationCacheHost.h" 3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "BackForwardController.h" 386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "BeforeUnloadEvent.h" 3928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "MemoryCache.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedPage.h" 4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "CachedResourceLoader.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Chrome.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMImplementation.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMWindow.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "DocumentLoadTiming.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Editor.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditorClient.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FormState.h" 5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "FormSubmission.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoaderClient.h" 595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "FrameNetworkingContext.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 62cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "HTMLAnchorElement.h" 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFormElement.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLObjectElement.h" 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTTPParsers.h" 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HistoryItem.h" 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h" 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconLoader.h" 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "InspectorController.h" 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorInstrumentation.h" 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Logging.h" 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h" 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MainResourceLoader.h" 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageCache.h" 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageGroup.h" 78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "PageTransitionEvent.h" 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginData.h" 80cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "PluginDatabase.h" 81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PluginDocument.h" 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h" 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h" 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceRequest.h" 850617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "SchemeRegistry.h" 86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptController.h" 87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptSourceCode.h" 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SecurityOrigin.h" 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SegmentedString.h" 90dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SerializedScriptValue.h" 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextResourceDecoder.h" 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WindowFeatures.h" 94545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "XMLDocumentParser.h" 95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/CurrentTime.h> 96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h> 9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <wtf/text/CString.h> 98a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/text/StringConcatenate.h> 9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(SHARED_WORKERS) 10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "SharedWorkerRepository.h" 10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGDocument.h" 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGLocatable.h" 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h" 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGPreserveAspectRatio.h" 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGSVGElement.h" 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewElement.h" 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewSpec.h" 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Archive.h" 1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ArchiveFactory.h" 117d73b16bdebb9d20b17be0a30e626dc9e66b6d868Steve Block#endif 118d73b16bdebb9d20b17be0a30e626dc9e66b6d868Steve Block 119d73b16bdebb9d20b17be0a30e626dc9e66b6d868Steve Block#ifdef ANDROID_INSTRUMENT 120d73b16bdebb9d20b17be0a30e626dc9e66b6d868Steve Block#include "TimeCounter.h" 121d73b16bdebb9d20b17be0a30e626dc9e66b6d868Steve Block#include "RenderArena.h" 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace HTMLNames; 12706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace SVGNames; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(XHTMLMP) 1335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const char defaultAcceptHeader[] = "application/xml,application/vnd.wap.xhtml+xml,application/xhtml+xml;profile='http://www.wapforum.org/xhtml',text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 1345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 1355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const char defaultAcceptHeader[] = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 1365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 13706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic double storedTimeOfLastCompletedLoad; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool isBackForwardLoadType(FrameLoadType type) 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (type) { 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeStandard: 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReload: 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeReloadFromOrigin: 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeSame: 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeRedirectWithLockedBackForwardList: 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReplace: 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeBack: 1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case FrameLoadTypeBackWMLDeckNotAccessible: 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeForward: 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeIndexedBackForward: 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int numRequests(Document* document) 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!document) 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return document->cachedResourceLoader()->requestCount(); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 168e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// This is not in the FrameLoader class to emphasize that it does not depend on 169e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// private FrameLoader data, and to avoid increasing the number of public functions 170e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// with access to private data. Since only this .cpp file needs it, making it 171e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// non-member lets us exclude it from the header file, thus keeping FrameLoader.h's 172e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// API simpler. 173e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// 174e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// FIXME: isDocumentSandboxed should eventually replace isSandboxed. 175e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockstatic bool isDocumentSandboxed(Frame* frame, SandboxFlags mask) 176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{ 177e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return frame->document() && frame->document()->securityOrigin()->isSandboxed(mask); 178e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block} 179e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_frame(frame) 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_client(client) 183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_policyChecker(frame) 184cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_history(frame) 185cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_notifer(frame) 18606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_subframeLoader(frame) 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_state(FrameStateCommittedPage) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_loadType(FrameLoadTypeStandard) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_delegateIsHandlingProvisionalLoadError(false) 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_quickRedirectComing(false) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_sentRedirectNotification(false) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_inStopAllLoaders(false) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isExecutingJavaScriptFormAction(false) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_didCallImplicitClose(false) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_wasUnloadEventEmitted(false) 1966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_pageDismissalEventBeingDispatched(false) 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isComplete(false) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isLoadingMainResource(false) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsClear(false) 200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_checkTimer(this, &FrameLoader::checkTimerFired) 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_shouldCallCheckCompleted(false) 202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_shouldCallCheckLoadComplete(false) 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_opener(0) 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_didPerformFirstNavigation(false) 205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_loadingFromCachedPage(false) 206cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_suppressOpenerInNewFrame(false) 207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_sandboxFlags(SandboxAll) 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_forcedSandboxFlags(SandboxNone) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoader::~FrameLoader() 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setOpener(0); 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashSet<Frame*>::iterator end = m_openedFrames.end(); 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (HashSet<Frame*>::iterator it = m_openedFrames.begin(); it != end; ++it) 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (*it)->loader()->m_opener = 0; 219cad810f21b803229eb11403f9209855525a25d57Steve Block 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->frameLoaderDestroyed(); 2215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (m_networkingContext) 2235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_networkingContext->invalidate(); 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::init() 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22821939df44de1705786c545cd1bf519d47250322dBen Murdoch // Propagate sandbox attributes to this Frameloader and its descendants. 22921939df44de1705786c545cd1bf519d47250322dBen Murdoch // This needs to be done early, so that an initial document gets correct sandbox flags in its SecurityOrigin. 23021939df44de1705786c545cd1bf519d47250322dBen Murdoch updateSandboxFlags(); 23121939df44de1705786c545cd1bf519d47250322dBen Murdoch 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this somewhat odd set of steps is needed to give the frame an initial empty document 23306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CreatingInitialEmptyDocument); 234231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setPolicyDocumentLoader(m_client->createDocumentLoader(ResourceRequest(KURL(ParsedURLString, "")), SubstituteData()).get()); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(m_policyDocumentLoader.get()); 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setResponse(ResourceResponse(KURL(), "text/html", 0, String(), String())); 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->finishedLoading(); 2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_documentLoader->writer()->begin(KURL(), false); 2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_documentLoader->writer()->end(); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->cancelParsing(); 24206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocument); 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; 2445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_networkingContext = m_client->createNetworkingContext(); 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setDefersLoading(bool defers) 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->setDefersLoading(defers); 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setDefersLoading(defers); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader) 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader->setDefersLoading(defers); 256231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!defers) { 258a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->startTimer(); 259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::canHandleRequest(const ResourceRequest& request) 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->canHandleRequest(request); 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::changeLocation(PassRefPtr<SecurityOrigin> securityOrigin, const KURL& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool refresh) 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch urlSelected(FrameLoadRequest(securityOrigin, ResourceRequest(url, referrer, refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy), "_self"), 272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 0, lockHistory, lockBackForwardList, SendReferrer, ReplaceDocumentIfJavaScriptURL); 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 275a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid FrameLoader::urlSelected(const KURL& url, const String& passedTarget, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, ReferrerPolicy referrerPolicy) 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 277f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch urlSelected(FrameLoadRequest(m_frame->document()->securityOrigin(), ResourceRequest(url), passedTarget), 278f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch triggeringEvent, lockHistory, lockBackForwardList, referrerPolicy, DoNotReplaceDocumentIfJavaScriptURL); 2796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 281e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// The shouldReplaceDocumentIfJavaScriptURL parameter will go away when the FIXME to eliminate the 282e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// corresponding parameter from ScriptController::executeIfJavaScriptURL() is addressed. 283f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::urlSelected(const FrameLoadRequest& passedRequest, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, ReferrerPolicy referrerPolicy, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL) 2846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 285cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(!m_suppressOpenerInNewFrame); 286cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FrameLoadRequest frameRequest(passedRequest); 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 289f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_frame->script()->executeIfJavaScriptURL(frameRequest.resourceRequest().url(), shouldReplaceDocumentIfJavaScriptURL)) 290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frameRequest.frameName().isEmpty()) 293f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frameRequest.setFrameName(m_frame->document()->baseTarget()); 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 295cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (referrerPolicy == NoReferrer) 296cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_suppressOpenerInNewFrame = true; 297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frameRequest.resourceRequest().httpReferrer().isEmpty()) 2985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian frameRequest.resourceRequest().setHTTPReferrer(m_outgoingReferrer); 2995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian addHTTPOriginIfNeeded(frameRequest.resourceRequest(), outgoingOrigin()); 3005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 301cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block loadFrameRequest(frameRequest, lockHistory, lockBackForwardList, triggeringEvent, 0, referrerPolicy); 302cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 303cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_suppressOpenerInNewFrame = false; 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid FrameLoader::submitForm(PassRefPtr<FormSubmission> submission) 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->method() == FormSubmission::PostMethod || submission->method() == FormSubmission::GetMethod); 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: Find a good spot for these. 31106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->data()); 31206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->state()); 31306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->state()->sourceFrame() == m_frame); 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->page()) 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (submission->action().isEmpty()) 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 321e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (isDocumentSandboxed(m_frame, SandboxForms)) 322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 32406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (protocolIsJavaScript(submission->action())) { 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isExecutingJavaScriptFormAction = true; 326a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->script()->executeIfJavaScriptURL(submission->action(), DoNotReplaceDocumentIfJavaScriptURL); 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isExecutingJavaScriptFormAction = false; 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Frame* targetFrame = m_frame->tree()->find(submission->target()); 332692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!shouldAllowNavigation(targetFrame)) 333692e5dbf12901edacf14812a6fae25462920af42Steve Block return; 3345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame) { 335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!DOMWindow::allowPopUp(m_frame) && !isProcessingUserGesture()) 336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 3385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian targetFrame = m_frame; 33906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } else 34006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->clearTarget(); 34106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 3425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame->page()) 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: We'd like to remove this altogether and fix the multiple form submission issue another way. 3465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // We do not want to submit more than one form from the same page, nor do we want to submit a single 3485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // form more than once. This flag prevents these from happening; not sure how other browsers prevent this. 3495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The flag is reset in each time we start handle a new mouse or key down event, and 3505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // also in setView since this part may get reused for a page from the back/forward cache. 3515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The form multi-submit logic here is only needed when we are submitting a form that affects this frame. 3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: Frame targeting is only one of the ways the submission could end up doing something other 3545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // than replacing this frame's content, so this check is flawed. On the other hand, the check is hardly 3555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // needed any more now that we reset m_submittedFormURL on each mouse or key down event. 3565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame->tree()->isDescendantOf(targetFrame)) { 35806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_submittedFormURL == submission->action()) 3595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 36006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_submittedFormURL = submission->action(); 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 36306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->data()->generateFiles(m_frame->document()); 36406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->setReferrer(m_outgoingReferrer); 36506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->setOrigin(outgoingOrigin()); 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 367a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch targetFrame->navigationScheduler()->scheduleFormSubmission(submission); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 370231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::stopLoading(UnloadEventPolicy unloadEventPolicy, DatabasePolicy databasePolicy) 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 372545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (m_frame->document() && m_frame->document()->parser()) 373545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->parser()->stopParsing(); 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 375231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (unloadEventPolicy != UnloadEventPolicyNone) { 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) { 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_didCallImplicitClose && !m_wasUnloadEventEmitted) { 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* currentFocusedNode = m_frame->document()->focusedNode(); 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currentFocusedNode) 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentFocusedNode->aboutToUnload(); 3816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = true; 382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_frame->domWindow()) { 383231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (unloadEventPolicy == UnloadEventPolicyUnloadAndPageHide) 38485893753155358c7010c212d5a5c651d240b7351Patrick Scott m_frame->domWindow()->dispatchEvent(PageTransitionEvent::create(eventNames().pagehideEvent, m_frame->document()->inPageCache()), m_frame->document()); 385967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!m_frame->document()->inPageCache()) { 3864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang RefPtr<Event> unloadEvent(Event::create(eventNames().unloadEvent, false, false)); 3874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // The DocumentLoader (and thus its DocumentLoadTiming) might get destroyed 3884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // while dispatching the event, so protect it to prevent writing the end 3894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // time into freed memory. 390cad810f21b803229eb11403f9209855525a25d57Steve Block RefPtr<DocumentLoader> documentLoader = m_provisionalDocumentLoader; 391cad810f21b803229eb11403f9209855525a25d57Steve Block if (documentLoader && !documentLoader->timing()->unloadEventStart && !documentLoader->timing()->unloadEventEnd) { 3924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DocumentLoadTiming* timing = documentLoader->timing(); 393967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT(timing->navigationStart); 3944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_frame->domWindow()->dispatchTimedEvent(unloadEvent, m_frame->domWindow()->document(), &timing->unloadEventStart, &timing->unloadEventEnd); 3954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else 3964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->domWindow()->document()); 397967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 398231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 3996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = false; 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) 4015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_frame->document()->updateStyleIfNeeded(); 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_wasUnloadEventEmitted = true; 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Dispatching the unload event could have made m_frame->document() null. 407cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (m_frame->document() && !m_frame->document()->inPageCache()) { 408cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // Don't remove event listeners from a transitional empty document (see bug 28716 for more information). 40906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool keepEventListeners = m_stateMachine.isDisplayingInitialEmptyDocument() && m_provisionalDocumentLoader 410cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block && m_frame->document()->securityOrigin()->isSecureTransitionTo(m_provisionalDocumentLoader->url()); 411cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 412cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!keepEventListeners) 413cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->document()->removeAllEventListeners(); 414cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 417231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_isComplete = true; // to avoid calling completed() in finishedParsing() 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = false; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; // don't want that one either 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document() && m_frame->document()->parsing()) { 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finishedParsing(); 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->setParsing(false); 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = KURL(); 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Document* doc = m_frame->document()) { 4295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // FIXME: HTML5 doesn't tell us to set the state to complete when aborting, but we do anyway to match legacy behavior. 4305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10537 4315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick doc->setReadyState(Document::Complete); 4325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (CachedResourceLoader* cachedResourceLoader = doc->cachedResourceLoader()) 434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch cachedResourceLoader->cancelRequests(); 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DATABASE) 437e1503159a6023b8eb39fbecadf6986c8ddd862e2Ben Murdoch if (databasePolicy == DatabasePolicyStop) 438d0825bca7fe65beaee391d30da42e937db621564Steve Block doc->stopDatabases(0); 439d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 440d0825bca7fe65beaee391d30da42e937db621564Steve Block UNUSED_PARAM(databasePolicy); 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 44406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: This will cancel redirection timer, which really needs to be restarted when restoring the frame from b/f cache. 445a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::stop() 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://bugs.webkit.org/show_bug.cgi?id=10854 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The frame's last ref may be removed and it will be deleted by checkCompleted(). 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protector(m_frame); 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 454545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (m_frame->document()->parser()) 455545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->parser()->stopParsing(); 4568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->finishParsing(); 4578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_iconLoader) 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_iconLoader->stopLoading(); 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::closeURL() 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 464cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->saveDocumentState(); 465231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 466231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Should only send the pagehide event here if the current document exists and has not been placed in the page cache. 467231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Document* currentDocument = m_frame->document(); 468231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block stopLoading(currentDocument && !currentDocument->inPageCache() ? UnloadEventPolicyUnloadAndPageHide : UnloadEventPolicyUnloadOnly); 469231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clearUndoRedoOperations(); 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::iconURL() 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this isn't a top level frame, return nothing 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->tree() && m_frame->tree()->parent()) 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return KURL(); 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we have an iconURL from a Link element, return that 4818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_frame->document()->iconURL().isEmpty()) 482231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return KURL(ParsedURLString, m_frame->document()->iconURL()); 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't return a favicon iconURL unless we're http or https 4852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block KURL documentURL = m_frame->document()->url(); 4862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!documentURL.protocolInHTTPFamily()) 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return KURL(); 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url; 4902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool couldSetProtocol = url.setProtocol(documentURL.protocol()); 491d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_UNUSED(couldSetProtocol, couldSetProtocol); 4922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block url.setHost(documentURL.host()); 4932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (documentURL.hasPort()) 4942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block url.setPort(documentURL.port()); 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.setPath("/favicon.ico"); 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return url; 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::didOpenURL(const KURL& url) 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 501a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (m_frame->navigationScheduler()->redirectScheduledDuringLoad()) { 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A redirect was scheduled before the document was created. 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This can happen when one frame changes another frame's location. 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 5055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 507a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clearLastEditCommand(); 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = true; 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we are still in the process of initializing an empty document then 5155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // its frame is not in a consistent state for rendering, so avoid setJSStatusBarText 5165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // since it may cause clients to attempt to render the frame. 51706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.creatingInitialEmptyDocument()) { 51806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (DOMWindow* window = m_frame->existingDOMWindow()) { 51906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setStatus(String()); 52006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setDefaultStatus(String()); 52106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 5225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 5232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_workingURL = url; 5242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_workingURL.protocolInHTTPFamily() && !m_workingURL.host().isEmpty() && m_workingURL.path().isEmpty()) 5252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_workingURL.setPath("/"); 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project started(); 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didExplicitOpen() 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Calling document.open counts as committing the first real document load. 53806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.committedFirstRealDocumentLoad()) 53906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit); 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from a subsequent window.document.open / window.document.write call. 543d0825bca7fe65beaee391d30da42e937db621564Steve Block // Canceling redirection here works for all cases because document.open 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // implicitly precedes document.write. 5452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->navigationScheduler()->cancel(); 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::cancelAndClear() 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 551a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_isComplete) 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clear(false); 557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->script()->updatePlatformScriptObjects(); 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 560231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::clear(bool clearWindowProperties, bool clearScriptObjects, bool clearFrameView) 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clear(); 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_needsClear) 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = false; 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_frame->document()->inPageCache()) { 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->cancelParsing(); 570635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->document()->stopActiveDOMObjects(); 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()->attached()) { 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->willRemove(); 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->detach(); 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->removeFocusedNodeOfSubtree(m_frame->document()); 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do this after detaching the document so that the unload event works. 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (clearWindowProperties) { 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->clearDOMWindow(); 582e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block m_frame->script()->clearWindowShell(m_frame->document()->inPageCache()); 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->selection()->clear(); 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->eventHandler()->clear(); 587231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (clearFrameView && m_frame->view()) 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->clear(); 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do not drop the document before the ScriptController and view are cleared 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as some destructors might still try to access the document. 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setDocument(0); 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_subframeLoader.clear(); 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (clearScriptObjects) 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->script()->clearScriptObjects(); 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 599a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->clear(); 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_checkTimer.stop(); 602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = false; 603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = false; 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 60506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.isDisplayingInitialEmptyDocument() && m_stateMachine.committedFirstRealDocumentLoad()) 60606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::receivedFirstData() 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block activeDocumentLoader()->writer()->begin(m_workingURL, false); 6122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block activeDocumentLoader()->writer()->setDocumentWasLoadedAsPartOfNavigation(); 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dispatchDidCommitLoad(); 615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectsInAllWorlds(); 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_documentLoader) { 6185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian String ptitle = m_documentLoader->title(); 6195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we have a title let the WebView know about it. 6205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!ptitle.isNull()) 6215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_client->dispatchDidReceiveTitle(ptitle); 6225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = KURL(); 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double delay; 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String url; 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 630cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (m_frame->inViewSourceMode()) 631cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parseHTTPRefresh(m_documentLoader->response().httpHeaderField("Refresh"), false, delay, url)) 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 6362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block url = m_frame->document()->url().string(); 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = m_frame->document()->completeURL(url).string(); 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 640a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->scheduleRedirect(delay, url); 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid FrameLoader::setOutgoingReferrer(const KURL& url) 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block KURL outgoingReferrer(url); 6462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block outgoingReferrer.setUser(String()); 6472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block outgoingReferrer.setPass(String()); 6482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block outgoingReferrer.removeFragmentIdentifier(); 6492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_outgoingReferrer = outgoingReferrer.string(); 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::didBeginDocument(bool dispatch) 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = true; 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = true; 658a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->document()->setReadyState(Document::Loading); 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 660d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_pendingStateObject) { 661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_frame->document()->statePopped(m_pendingStateObject.get()); 662d0825bca7fe65beaee391d30da42e937db621564Steve Block m_pendingStateObject.clear(); 663d0825bca7fe65beaee391d30da42e937db621564Steve Block } 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 665231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (dispatch) 666643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectsInAllWorlds(); 667dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 6685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian updateFirstPartyForCookies(); 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Settings* settings = m_frame->document()->settings(); 67192451d3c3cebc17dfa2908de5836d2dae50d4a42Iain Merrick m_frame->document()->cachedResourceLoader()->setAutoLoadImages(settings && settings->loadsImagesAutomatically()); 672eebae91469b8f225fe78e97ce6dae26efcf6da43Steve Block#ifdef ANDROID_BLOCK_NETWORK_IMAGE 67392451d3c3cebc17dfa2908de5836d2dae50d4a42Iain Merrick m_frame->document()->cachedResourceLoader()->setBlockNetworkImage(settings && settings->blockNetworkImage()); 674eebae91469b8f225fe78e97ce6dae26efcf6da43Steve Block#endif 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) { 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String dnsPrefetchControl = m_documentLoader->response().httpHeaderField("X-DNS-Prefetch-Control"); 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dnsPrefetchControl.isEmpty()) 679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_frame->document()->parseDNSPrefetchControlHeader(dnsPrefetchControl); 6802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 6812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String contentSecurityPolicy = m_documentLoader->response().httpHeaderField("X-WebKit-CSP"); 6822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!contentSecurityPolicy.isEmpty()) 6832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->document()->contentSecurityPolicy()->didReceiveHeader(contentSecurityPolicy); 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 686cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->restoreDocumentState(); 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::didEndDocument() 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = false; 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::iconLoadDecisionAvailable() 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_mayLoadIconLater) 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(IconDatabase, "FrameLoader %p was told a load decision is available for its icon", this); 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project startIconLoader(); 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mayLoadIconLater = false; 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::startIconLoader() 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: We kick off the icon loader when the frame is done receiving its main resource. 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // But we should instead do it when we're done parsing the head element. 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isLoadingMainFrame()) 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!iconDatabase() || !iconDatabase()->isEnabled()) 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url(iconURL()); 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String urlString(url.string()); 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (urlString.isEmpty()) 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we're not reloading and the icon database doesn't say to load now then bail before we actually start the load 719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (loadType() != FrameLoadTypeReload && loadType() != FrameLoadTypeReloadFromOrigin) { 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IconLoadDecision decision = iconDatabase()->loadDecisionForIconURL(urlString, m_documentLoader.get()); 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decision == IconLoadNo) { 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(IconDatabase, "FrameLoader::startIconLoader() - Told not to load this icon, committing iconURL %s to database for pageURL mapping", urlString.ascii().data()); 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project commitIconURLToIconDatabase(url); 7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We were told not to load this icon - that means this icon is already known by the database 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 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 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // has done it. This is after registering for the notification so the WebView can call the appropriate delegate method. 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise if the icon data *is* available, notify the delegate 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!iconDatabase()->iconDataKnownForIconURL(urlString)) { 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 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()); 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->registerForIconNotification(); 7322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block iconDatabase()->iconForPageURL(m_frame->document()->url().string(), IntSize(0, 0)); 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iconDatabase()->iconForPageURL(originalRequestURL().string(), IntSize(0, 0)); 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveIcon(); 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decision == IconLoadUnknown) { 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In this case, we may end up loading the icon later, but we still want to commit the icon url mapping to the database 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 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 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We also tell the client to register for the notification that the icon is received now so it isn't missed in case the 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // icon is later read in from disk 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(IconDatabase, "FrameLoader %p might load icon %s later", this, urlString.ascii().data()); 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mayLoadIconLater = true; 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->registerForIconNotification(); 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project commitIconURLToIconDatabase(url); 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // People who want to avoid loading images generally want to avoid loading all images. 7540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Now that we've accounted for URL mapping, avoid starting the network load if images aren't set to display automatically. 7550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Settings* settings = m_frame->settings(); 7560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (settings && !settings->loadsImagesAutomatically()) 7570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 7580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is either a reload or the icon database said "yes, load the icon", so kick off the load! 7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_iconLoader) 761e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_iconLoader = IconLoader::create(m_frame); 7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_iconLoader->startLoading(); 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::commitIconURLToIconDatabase(const KURL& icon) 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(iconDatabase()); 7692fc2651226baac27029e38c9d6ef883fa32084dbSteve 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()); 7702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block iconDatabase()->setIconURLForPageURL(icon.string(), m_frame->document()->url().string()); 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iconDatabase()->setIconURLForPageURL(icon.string(), originalRequestURL().string()); 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedParsing() 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 77606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 779231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->injectUserScripts(InjectAtDocumentEnd); 780231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This can be called from the Frame's destructor, in which case we shouldn't protect ourselves 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // because doing so will cause us to re-enter the destructor when protector goes out of scope. 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Null-checking the FrameView indicates whether or not we're in the destructor. 7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protector = m_frame->view() ? m_frame : 0; 7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 786635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidFinishDocumentLoad(); 787635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->view()) 7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // We are being destroyed by something checkCompleted called. 7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if the scrollbars are really needed for the content. 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If not, remove them, relayout, and repaint. 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->restoreScrollbar(); 7962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->view()->scrollToFragment(m_frame->document()->url()); 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadDone() 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian checkCompleted(); 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 804231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::allChildrenAreComplete() const 805231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 806231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { 807231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!child->loader()->m_isComplete) 808231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 809231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 810231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 811231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 812231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 813231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::allAncestorsAreComplete() const 814231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 815231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (Frame* ancestor = m_frame; ancestor; ancestor = ancestor->tree()->parent()) { 816231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!ancestor->loader()->m_isComplete) 817231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 818231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 819231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 820231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 821231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkCompleted() 8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 824231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = false; 825231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 8268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->view()) 8278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->view()->checkStopDelayingDeferredRepaints(); 8288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Any frame that hasn't completed yet? 830231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!allChildrenAreComplete()) 831231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Have we completed before? 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isComplete) 8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Are we still parsing? 8388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->document()->parsing()) 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Still waiting for images/scripts? 8428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (numRequests(m_frame->document())) 8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Still waiting for elements that don't go through a FrameLoader? 8465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_frame->document()->isDelayingLoadEvent()) 8475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 8485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // OK, completed. 8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = true; 8515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_frame->document()->setReadyState(Document::Complete); 8528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCallImplicitClose(); // if we didn't do it before 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 856a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->startTimer(); 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project completed(); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 8618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 863231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkTimerFired(Timer<FrameLoader>*) 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 865231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (Page* page = m_frame->page()) { 866231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (page->defersLoading()) 867231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 868231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 869231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_shouldCallCheckCompleted) 870231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block checkCompleted(); 871231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_shouldCallCheckLoadComplete) 872231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block checkLoadComplete(); 8738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 875231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::startCheckCompleteTimer() 8768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 877231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!(m_shouldCallCheckCompleted || m_shouldCallCheckLoadComplete)) 878231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 879231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_checkTimer.isActive()) 880231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 881231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_checkTimer.startOneShot(0); 8828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 884231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::scheduleCheckCompleted() 8858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 886231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = true; 887231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::scheduleCheckLoadComplete() 8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = true; 893231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkCallImplicitClose() 8978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_didCallImplicitClose || m_frame->document()->parsing() || m_frame->document()->isDelayingLoadEvent()) 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 901231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!allChildrenAreComplete()) 902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; // still got a frame running -> too early 9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_wasUnloadEventEmitted = false; 9068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->implicitClose(); 9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::baseURL() const 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->document()); 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame->document()->baseURL(); 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::completeURL(const String& url) 9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->document()); 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame->document()->completeURL(url); 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadURLIntoChildFrame(const KURL& url, const String& referer, Frame* childFrame) 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(childFrame); 9248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 9252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 926f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Archive> subframeArchive = activeDocumentLoader()->popArchiveForSubframe(childFrame->tree()->uniqueName()); 927f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (subframeArchive) { 928f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadArchive(subframeArchive.release()); 929f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 930f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 9312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEB_ARCHIVE) 9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 933f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch HistoryItem* parentItem = history()->currentItem(); 9348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If we're moving in the back/forward list, we might want to replace the content 9358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // of this child frame with whatever was there at that point. 936f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (parentItem && parentItem->children().size() && isBackForwardLoadType(loadType())) { 93728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu HistoryItem* childItem = parentItem->childItemWithTarget(childFrame->tree()->uniqueName()); 9388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (childItem) { 939f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadDifferentDocumentItem(childItem, loadType()); 940f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 944f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadURL(url, referer, String(), false, FrameLoadTypeRedirectWithLockedBackForwardList, 0, 0); 9458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadArchive(PassRefPtr<Archive> prpArchive) 9498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Archive> archive = prpArchive; 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ArchiveResource* mainResource = archive->mainResource(); 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(mainResource); 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mainResource) 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SubstituteData substituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL()); 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request(mainResource->url()); 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.applyWebArchiveHackForMail(); 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> documentLoader = m_client->createDocumentLoader(request, substituteData); 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader->addAllArchiveResources(archive.get()); 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project load(documentLoader.get()); 9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEB_ARCHIVE) 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 970cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockObjectContentType FrameLoader::defaultObjectContentType(const KURL& url, const String& mimeTypeIn) 971cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 972cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block String mimeType = mimeTypeIn; 97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String extension = url.path().substring(url.path().reverseFind('.') + 1); 97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 975cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // We don't use MIMETypeRegistry::getMIMETypeForPath() because it returns "application/octet-stream" upon failure 976cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (mimeType.isEmpty()) 97765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mimeType = MIMETypeRegistry::getMIMETypeForExtension(extension); 97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !PLATFORM(MAC) && !PLATFORM(CHROMIUM) && !PLATFORM(EFL) // Mac has no PluginDatabase, nor does Chromium or EFL 98065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (mimeType.isEmpty()) 98165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mimeType = PluginDatabase::installedPlugins()->MIMETypeForExtension(extension); 98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 983cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 984cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (mimeType.isEmpty()) 985cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return ObjectContentFrame; // Go ahead and hope that we can display the content. 986cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 987cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType)) 988cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentImage; 989cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 99021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if !PLATFORM(MAC) && !PLATFORM(CHROMIUM) && !PLATFORM(EFL) // Mac has no PluginDatabase, nor does Chromium or EFL 991cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType)) 992cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentNetscapePlugin; 993cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#endif 994cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 995cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType)) 996cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentFrame; 997cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 998cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentNone; 999cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 1000cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1001ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 1002ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid FrameLoader::hideMediaPlayerProxyPlugin(Widget* widget) 1003ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 1004ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch m_client->hideMediaPlayerProxyPlugin(widget); 1005ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 1006ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 1007ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid FrameLoader::showMediaPlayerProxyPlugin(Widget* widget) 1008ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 1009ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch m_client->showMediaPlayerProxyPlugin(widget); 1010ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 1011ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif // ENABLE(PLUGIN_PROXY_FOR_VIDEO) 1012ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::outgoingReferrer() const 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_outgoingReferrer; 10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::outgoingOrigin() const 10198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_frame->document()->securityOrigin()->toString(); 10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1023231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::isMixedContent(SecurityOrigin* context, const KURL& url) 1024231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1025231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (context->protocol() != "https") 1026231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; // We only care about HTTPS security origins. 1027231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (!url.isValid() || SchemeRegistry::shouldTreatURLSchemeAsSecure(url.protocol())) 1029231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; // Loading these protocols is secure. 1030231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1031231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 1032231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1033231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1034231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkIfDisplayInsecureContent(SecurityOrigin* context, const KURL& url) 1035231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1036231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isMixedContent(context, url)) 1037231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1038231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String message = makeString("The page at ", m_frame->document()->url().string(), " displayed insecure content from ", url.string(), ".\n"); 1040cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String()); 1041cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1042231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->didDisplayInsecureContent(); 1043231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1044231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1045231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkIfRunInsecureContent(SecurityOrigin* context, const KURL& url) 1046231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1047231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isMixedContent(context, url)) 1048231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1049231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String message = makeString("The page at ", m_frame->document()->url().string(), " ran insecure content from ", url.string(), ".\n"); 1051cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String()); 1052cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 10532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_client->didRunInsecureContent(context, url); 1054231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1055231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoader::opener() 10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_opener; 10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setOpener(Frame* opener) 10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_opener) 10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_opener->loader()->m_openedFrames.remove(m_frame); 10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (opener) 10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project opener->loader()->m_openedFrames.add(m_frame); 10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_opener = opener; 10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) { 10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->initSecurityContext(); 10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setSecurityOrigin(m_frame->document()->securityOrigin()); 10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// FIXME: This does not belong in FrameLoader! 10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::handleFallbackContent() 10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* owner = m_frame->ownerElement(); 10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!owner || !owner->hasTagName(objectTag)) 10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static_cast<HTMLObjectElement*>(owner)->renderFallbackContent(); 10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::provisionalLoadStarted() 10855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) 10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project android::TimeCounter::reset(); 10898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 109006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.firstLayoutDone()) 109106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 1092a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(true); 10938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->provisionalLoadStarted(); 10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool FrameLoader::isProcessingUserGesture() 10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1098635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Frame* frame = m_frame->tree()->top(); 1099dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!frame->script()->canExecuteScripts(NotAboutToExecuteScript)) 1100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; // If JavaScript is disabled, a user gesture must have initiated the navigation. 1101f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return ScriptController::processingUserGesture(); // FIXME: Use pageIsProcessingUserGesture. 11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::resetMultipleFormSubmissionProtection() 11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_submittedFormURL = KURL(); 11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::willSetEncoding() 11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_workingURL.isEmpty()) 11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project receivedFirstData(); 11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(WML) 11160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic inline bool frameContainsWMLContent(Frame* frame) 11170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 11180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Document* document = frame ? frame->document() : 0; 11190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!document) 11200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 11210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return document->containsWMLContent() || document->isWMLDocument(); 11230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 11240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 11250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::updateFirstPartyForCookies() 11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->tree()->parent()) 11295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setFirstPartyForCookies(m_frame->tree()->parent()->document()->firstPartyForCookies()); 11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 11312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block setFirstPartyForCookies(m_frame->document()->url()); 11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::setFirstPartyForCookies(const KURL& url) 11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_frame->document()->setFirstPartyForCookies(url); 11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 11385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian child->loader()->setFirstPartyForCookies(url); 11398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This does the same kind of work that didOpenURL does, except it relies on the fact 11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// that a higher level already checked that the URLs match and the scrolling is the right thing to do. 1143643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::loadInSameDocument(const KURL& url, SerializedScriptValue* stateObject, bool isNewNavigation) 1144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If we have a state object, we cannot also be a new navigation. 1146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!stateObject || (stateObject && !isNewNavigation)); 1147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Update the data source's request with the new URL to fake the URL change 11492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block KURL oldURL = m_frame->document()->url(); 1150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_frame->document()->setURL(url); 1151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block documentLoader()->replaceRequestURLForSameDocumentNavigation(url); 1152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (isNewNavigation && !shouldTreatURLAsSameAsCurrent(url) && !stateObject) { 1153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NB: must happen after replaceRequestURLForSameDocumentNavigation(), since we add 1154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // based on the current request. Must also happen before we openURL and displace the 1155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // scroll position, since adding the BF item will save away scroll state. 1156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NB2: If we were loading a long, slow doc, and the user anchor nav'ed before 1158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // it was done, currItem is now set the that slow doc, and prevItem is whatever was 1159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // before it. Adding the b/f item will bump the slow doc down to prevItem, even 1160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // though its load is not yet done. I think this all works out OK, for one because 1161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we have already saved away the scroll and doc state for the long slow load, 1162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // but it's not an obvious case. 1163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->updateBackForwardListForFragmentScroll(); 11650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 11660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragmentIdentifier() != oldURL.fragmentIdentifier(); 1168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->updateForSameDocumentNavigation(); 11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor 1172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (hashChange) 1173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_frame->eventHandler()->stopAutoscrollTimer(); 1174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's important to model this as a load that starts and immediately finishes. 11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise, the parent frame may think we never finished loading. 1177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block started(); 1178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // We need to scroll to the fragment whether or not a hash change occurred, since 1180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // the user might have scrolled since the previous navigation. 1181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (FrameView* view = m_frame->view()) 11822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block view->scrollToFragment(url); 1183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 1186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (isNewNavigation) { 1188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This will clear previousItem from the rest of the frame tree that didn't 1189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // doing any loading. We need to make a pass on this now, since for anchor nav 1190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we'll not go through a real load and reach Completed state. 1191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block checkLoadComplete(); 1192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_client->dispatchDidNavigateWithinPage(); 1195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 11965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_frame->document()->statePopped(stateObject ? stateObject : SerializedScriptValue::nullValue()); 11975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_client->dispatchDidPopStateWithinPage(); 1198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (hashChange) { 1200545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->enqueueHashchangeEvent(oldURL, url); 1201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->dispatchDidChangeLocationWithinPage(); 1202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FrameLoaderClient::didFinishLoad() tells the internal load delegate the load finished with no error 1205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->didFinishLoad(); 12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isComplete() const 12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_isComplete; 12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::completed() 12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 1216cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1217cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block for (Frame* descendant = m_frame->tree()->traverseNext(m_frame); descendant; descendant = descendant->tree()->traverseNext(m_frame)) 1218a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch descendant->navigationScheduler()->startTimer(); 1219cad810f21b803229eb11403f9209855525a25d57Steve Block 12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) 12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->checkCompleted(); 1222cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 12235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame->view()) 12240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_frame->view()->maintainScrollPositionAtAnchor(0); 12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::started() 12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* frame = m_frame; frame; frame = frame->tree()->parent()) 12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame->loader()->m_isComplete = false; 12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::prepareForLoadStart() 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressStarted(m_frame); 12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidStartProvisionalLoad(); 12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setupForReplace() 12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader = m_documentLoader; 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader = 0; 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setupForReplaceByMIMEType(const String& newMIMEType) 12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project activeDocumentLoader()->setupForReplaceByMIMEType(newMIMEType); 12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// This is a hack to allow keep navigation to http/https feeds working. To remove this 12545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// we need to introduce new API akin to registerURLSchemeAsLocal, that registers a 12555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// protocols navigation policy. 12565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic bool isFeedWithNestedProtocolInHTTPFamily(const KURL& url) 12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const String& urlString = url.string(); 12595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!urlString.startsWith("feed", false)) 12605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 12615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 12625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return urlString.startsWith("feed://", false) 12635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feed:http:", false) || urlString.startsWith("feed:https:", false) 12645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feeds:http:", false) || urlString.startsWith("feeds:https:", false) 12655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feedsearch:http:", false) || urlString.startsWith("feedsearch:https:", false); 12665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 12675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 12685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHistory, bool lockBackForwardList, 1269cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block PassRefPtr<Event> event, PassRefPtr<FormState> formState, ReferrerPolicy referrerPolicy) 12705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url = request.resourceRequest().url(); 1272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ASSERT(m_frame->document()); 1274f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: Should we move the isFeedWithNestedProtocolInHTTPFamily logic inside SecurityOrigin::canDisplay? 1275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!isFeedWithNestedProtocolInHTTPFamily(url) && !request.requester()->canDisplay(url)) { 1276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch reportLocalLoadFailed(m_frame, url.string()); 1277f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1278f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1279f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String referrer; 12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String argsReferrer = request.resourceRequest().httpReferrer(); 12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!argsReferrer.isEmpty()) 12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = argsReferrer; 12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = m_outgoingReferrer; 1286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1287cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (SecurityOrigin::shouldHideReferrer(url, referrer) || referrerPolicy == NoReferrer) 12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = String(); 12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FrameLoadType loadType; 1291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData) 1292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeReload; 1293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else if (lockBackForwardList) 1294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeRedirectWithLockedBackForwardList; 1295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 1296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeStandard; 12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (request.resourceRequest().httpMethod() == "POST") 12995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadPostRequest(request.resourceRequest(), referrer, request.frameName(), lockHistory, loadType, event, formState.get()); 1300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 13015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadURL(request.resourceRequest().url(), referrer, request.frameName(), lockHistory, loadType, event, formState.get()); 13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: It's possible this targetFrame will not be the same frame that was targeted by the actual 13045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // load if frame names have changed. 13055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* sourceFrame = formState ? formState->sourceFrame() : m_frame; 13065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* targetFrame = sourceFrame->loader()->findFrameForNavigation(request.frameName()); 13075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (targetFrame && targetFrame != sourceFrame) { 13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = targetFrame->page()) 13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->chrome()->focus(); 13105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::loadURL(const KURL& newURL, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType newLoadType, 13145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian PassRefPtr<Event> event, PassRefPtr<FormState> prpFormState) 13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isFormSubmission = formState; 13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request(newURL); 13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) { 13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPReferrer(referrer); 13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<SecurityOrigin> referrerOrigin = SecurityOrigin::createFromString(referrer); 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(request, referrerOrigin->toString()); 13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, newLoadType, true, event || isFormSubmission); 1326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (newLoadType == FrameLoadTypeReload || newLoadType == FrameLoadTypeReloadFromOrigin) 13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReloadIgnoringCacheData); 13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(newLoadType != FrameLoadTypeSame); 13308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The search for a target frame is done earlier in the case of form submission. 13325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* targetFrame = isFormSubmission ? 0 : findFrameForNavigation(frameName); 13335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (targetFrame && targetFrame != m_frame) { 13345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian targetFrame->loader()->loadURL(newURL, referrer, String(), lockHistory, newLoadType, event, formState.release()); 13355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 13365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 13375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 13386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 1339231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1340231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NavigationAction action(newURL, newLoadType, isFormSubmission, event); 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame && !frameName.isEmpty()) { 1344231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy, 1345231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block request, formState.release(), frameName, this); 13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader; 13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool sameURL = shouldTreatURLAsSameAsCurrent(newURL); 1352cad810f21b803229eb11403f9209855525a25d57Steve Block const String& httpMethod = request.httpMethod(); 13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure to do scroll to anchor processing even if the URL is 13558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // exactly the same so pages with '#' links and DHTML side effects 13568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // work properly. 1357cad810f21b803229eb11403f9209855525a25d57Steve Block if (shouldScrollToAnchor(isFormSubmission, httpMethod, newLoadType, newURL)) { 13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldDocumentLoader->setTriggeringAction(action); 1359231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 1360231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->setLoadType(newLoadType); 1361231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(request, oldDocumentLoader.get(), formState.release(), 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueFragmentScrollAfterNavigationPolicy, this); 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // must grab this now, since this load may stop the previous load and clear this flag 13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isRedirect = m_quickRedirectComing; 13665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadWithNavigationAction(request, action, lockHistory, newLoadType, formState.release()); 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRedirect) { 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setIsClientRedirect(true); 13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (sameURL) 13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Example of this case are sites that reload the same URL with a different cookie 13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // driving the generated content, or a master frame with links that drive a target 13748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frame, where the user has clicked on the same link repeatedly. 13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeSame; 13768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, bool lockHistory) 13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(request, SubstituteData(), lockHistory); 13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, const SubstituteData& substituteData, bool lockHistory) 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inStopAllLoaders) 13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: is this the right place to reset loadType? Perhaps this should be done after loading is finished or aborted. 13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeStandard; 1391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, substituteData); 13928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (lockHistory && m_documentLoader) 13938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian loader->setClientRedirectSourceForHistory(m_documentLoader->didCreateGlobalHistoryEntry() ? m_documentLoader->urlForHistory() : m_documentLoader->clientRedirectSourceForHistory()); 1394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(loader.get()); 13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, const String& frameName, bool lockHistory) 13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frameName.isEmpty()) { 1400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(request, lockHistory); 14018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = findFrameForNavigation(frameName); 14058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frame) { 1406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project frame->loader()->load(request, lockHistory); 14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1410231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(NavigationAction(request.url(), NavigationTypeOther), FrameLoader::callContinueLoadAfterNewWindowPolicy, request, 0, frameName, this); 14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const NavigationAction& action, bool lockHistory, FrameLoadType type, PassRefPtr<FormState> formState) 14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, SubstituteData()); 14168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (lockHistory && m_documentLoader) 14178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian loader->setClientRedirectSourceForHistory(m_documentLoader->didCreateGlobalHistoryEntry() ? m_documentLoader->urlForHistory() : m_documentLoader->clientRedirectSourceForHistory()); 14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setTriggeringAction(action); 14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadWithDocumentLoader(loader.get(), type, formState); 14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::load(DocumentLoader* newDocumentLoader) 14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest& r = newDocumentLoader->request(); 1429635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToMainResourceRequest(r); 14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoadType type; 14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldTreatURLAsSameAsCurrent(newDocumentLoader->originalRequest().url())) { 14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r.setCachePolicy(ReloadIgnoringCacheData); 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeSame; 14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeStandard; 14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When we loading alternate content for an unreachable URL that we're 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // visiting in the history list, we treat it as a reload so the history list 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is appropriately maintained. 14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This seems like a dangerous overloading of the meaning of "FrameLoadTypeReload" ... 14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // shouldn't a more explicit type of reload be defined, that means roughly 14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // "load without affecting history" ? 14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldReloadToHandleUnreachableURL(newDocumentLoader)) { 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(type == FrameLoadTypeStandard); 14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeReload; 14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadWithDocumentLoader(newDocumentLoader, type, 0); 14548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType type, PassRefPtr<FormState> prpFormState) 14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1458e14391e94c850b8bd03680c23b38978db68687a8John Reck // Retain because dispatchBeforeLoadEvent may release the last reference to it. 1459e14391e94c850b8bd03680c23b38978db68687a8John Reck RefPtr<Frame> protect(m_frame); 1460e14391e94c850b8bd03680c23b38978db68687a8John Reck 14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Unfortunately the view must be non-nil, this is ultimately due 14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to parser requiring a FrameView. We should fix this dependency. 14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->view()); 14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 1469231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1470231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1471cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_frame->document()) 1472cad810f21b803229eb11403f9209855525a25d57Steve Block m_previousUrl = m_frame->document()->url(); 1473cad810f21b803229eb11403f9209855525a25d57Steve Block 1474231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->setLoadType(type); 14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isFormSubmission = formState; 14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& newURL = loader->request().url(); 1479cad810f21b803229eb11403f9209855525a25d57Steve Block const String& httpMethod = loader->request().httpMethod(); 14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1481cad810f21b803229eb11403f9209855525a25d57Steve Block if (shouldScrollToAnchor(isFormSubmission, httpMethod, policyChecker()->loadType(), newURL)) { 14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader; 1483231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NavigationAction action(newURL, policyChecker()->loadType(), isFormSubmission); 14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldDocumentLoader->setTriggeringAction(action); 1486231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 1487231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(loader->request(), oldDocumentLoader.get(), formState, 14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueFragmentScrollAfterNavigationPolicy, this); 14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) 14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(parent->loader()->documentLoader()->overrideEncoding()); 14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1493231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(loader); 14955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (loader->triggeringAction().isEmpty()) 1496231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block loader->setTriggeringAction(NavigationAction(newURL, policyChecker()->loadType(), isFormSubmission)); 14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1498cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (Element* ownerElement = m_frame->document()->ownerElement()) { 1499cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!ownerElement->dispatchBeforeLoadEvent(loader->request().url().string())) { 1500cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block continueLoadAfterNavigationPolicy(loader->request(), formState, false); 1501cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 1502cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 1503cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 1504cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1505231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(loader->request(), loader, formState, 15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueLoadAfterNavigationPolicy, this); 15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::reportLocalLoadFailed(Frame* frame, const String& url) 15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!url.isEmpty()); 15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frame) 15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Not allowed to load local resource: " + url, 0, String()); 15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst ResourceRequest& FrameLoader::initialRequest() const 15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequest(); 15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1524231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::willLoadMediaElementURL(KURL& url) 15258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1526231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ResourceRequest request(url); 15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1528231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block unsigned long identifier; 1529231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ResourceError error; 1530231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block requestFromDelegate(request, identifier, error); 1531cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, ResourceResponse(url, String(), -1, String(), String()), -1, error); 15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1533231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block url = request.url(); 1534231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1535231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return error.isNull(); 15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldReloadToHandleUnreachableURL(DocumentLoader* docLoader) 15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = docLoader->unreachableURL(); 15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (unreachableURL.isEmpty()) 15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1545231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isBackForwardLoadType(policyChecker()->loadType())) 15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We only treat unreachableURLs specially during the delegate callbacks 15498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for provisional load errors and navigation policy decisions. The former 15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // case handles well-formed URLs that can't be loaded, and the latter 15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // case handles malformed URLs and unknown schemes. Loading alternate content 15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // at other times behaves like a standard load. 15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* compareDocumentLoader = 0; 1554231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (policyChecker()->delegateIsDecidingNavigationPolicy() || policyChecker()->delegateIsHandlingUnimplementablePolicy()) 15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project compareDocumentLoader = m_policyDocumentLoader.get(); 15568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (m_delegateIsHandlingProvisionalLoadError) 15578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project compareDocumentLoader = m_provisionalDocumentLoader.get(); 15588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return compareDocumentLoader && unreachableURL == compareDocumentLoader->request().url(); 15608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::reloadWithOverrideEncoding(const String& encoding) 15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request = m_documentLoader->request(); 15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = m_documentLoader->unreachableURL(); 15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty()) 15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setURL(unreachableURL); 15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReturnCacheDataElseLoad); 15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, SubstituteData()); 15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(loader.get()); 15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(encoding); 15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithDocumentLoader(loader.get(), FrameLoadTypeReload, 0); 15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::reload(bool endToEndReload) 15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If a window is created by javascript, its main frame can have an empty but non-nil URL. 15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Reloading in this case will lose the current contents (see 4151001). 1589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_documentLoader->request().url().isEmpty()) 15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1592635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest initialRequest = m_documentLoader->request(); 1593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Replace error-page URL with the URL we were trying to reach. 15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = m_documentLoader->unreachableURL(); 15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty()) 1597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project initialRequest.setURL(unreachableURL); 15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a new document loader for the reload, this will become m_documentLoader eventually, 16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // but first it has to be the "policy" document loader, and then the "provisional" document loader. 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(initialRequest, SubstituteData()); 16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest& request = loader->request(); 16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: We don't have a mechanism to revalidate the main resource without reloading at the moment. 16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReloadIgnoringCacheData); 16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we're about to re-post, set up action so the application can warn the user. 16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (request.httpMethod() == "POST") 16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setTriggeringAction(NavigationAction(request.url(), NavigationTypeFormResubmitted)); 16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithDocumentLoader(loader.get(), endToEndReload ? FrameLoadTypeReloadFromOrigin : FrameLoadTypeReload, 0); 16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool canAccessAncestor(const SecurityOrigin* activeSecurityOrigin, Frame* targetFrame) 16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // targetFrame can be NULL when we're trying to navigate a top-level frame 16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that has a NULL opener. 16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame) 16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke const bool isLocalActiveOrigin = activeSecurityOrigin->isLocal(); 16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* ancestorFrame = targetFrame; ancestorFrame; ancestorFrame = ancestorFrame->tree()->parent()) { 16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* ancestorDocument = ancestorFrame->document(); 16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ancestorDocument) 16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const SecurityOrigin* ancestorSecurityOrigin = ancestorDocument->securityOrigin(); 16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (activeSecurityOrigin->canAccess(ancestorSecurityOrigin)) 16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 16345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // Allow file URL descendant navigation even when allowFileAccessFromFileURLs is false. 16355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (isLocalActiveOrigin && ancestorSecurityOrigin->isLocal()) 16365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return true; 16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldAllowNavigation(Frame* targetFrame) const 16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The navigation change is safe if the active frame is: 16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - in the same security origin as the target or one of the target's 16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ancestors. 16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Or the target frame is: 16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - a top-level frame in the frame hierarchy and the active frame can 1650231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // navigate the target frame's opener per above or it is the opener of 1651231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // the target frame. 16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame) 16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Performance optimization. 16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame == targetFrame) 16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Let a frame navigate the top-level window that contains it. This is 16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // important to allow because it lets a site "frame-bust" (escape from a 16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frame created by another web site). 1663e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (!isDocumentSandboxed(m_frame, SandboxTopNavigation) && targetFrame == m_frame->tree()->top()) 16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // A sandboxed frame can only navigate itself and its descendants. 1667e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (isDocumentSandboxed(m_frame, SandboxNavigation) && !targetFrame->tree()->isDescendantOf(m_frame)) 1668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 1669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1670231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Let a frame navigate its opener if the opener is a top-level window. 1671231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!targetFrame->tree()->parent() && m_frame->loader()->opener() == targetFrame) 1672231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 1673231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* activeDocument = m_frame->document(); 16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(activeDocument); 16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const SecurityOrigin* activeSecurityOrigin = activeDocument->securityOrigin(); 16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For top-level windows, check the opener. 16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame->tree()->parent() && canAccessAncestor(activeSecurityOrigin, targetFrame->loader()->opener())) 16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In general, check the frame's ancestors. 16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (canAccessAncestor(activeSecurityOrigin, targetFrame)) 16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Settings* settings = targetFrame->settings(); 16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (settings && !settings->privateBrowsingEnabled()) { 16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* targetDocument = targetFrame->document(); 16898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: this error message should contain more specifics of why the navigation change is not allowed. 1690a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch String message = makeString("Unsafe JavaScript attempt to initiate a navigation change for frame with URL ", 1691a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch targetDocument->url().string(), " from frame with URL ", activeDocument->url().string(), ".\n"); 16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: should we print to the console of the activeFrame as well? 16940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch targetFrame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, message, 1, String()); 16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1700ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid FrameLoader::stopLoadingSubframes(DatabasePolicy databasePolicy, ClearProvisionalItemPolicy clearProvisionalItemPolicy) 17018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RefPtr<Frame> child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 1703ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch child->loader()->stopAllLoaders(databasePolicy, clearProvisionalItemPolicy); 17048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1706ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid FrameLoader::stopAllLoaders(DatabasePolicy databasePolicy, ClearProvisionalItemPolicy clearProvisionalItemPolicy) 17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1708231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!m_frame->document() || !m_frame->document()->inPageCache()); 17096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 17105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 17115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. 17138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inStopAllLoaders) 17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inStopAllLoaders = true; 17178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 17198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1720ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // If no new load is in progress, we should clear the provisional item from history 1721ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // before we call stopLoading. 1722ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (clearProvisionalItemPolicy == ShouldClearProvisionalItem) 1723ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch history()->setProvisionalItem(0); 1724ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 1725ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch stopLoadingSubframes(databasePolicy, clearProvisionalItemPolicy); 17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 1727e1503159a6023b8eb39fbecadf6986c8ddd862e2Ben Murdoch m_provisionalDocumentLoader->stopLoading(databasePolicy); 17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 1729e1503159a6023b8eb39fbecadf6986c8ddd862e2Ben Murdoch m_documentLoader->stopLoading(databasePolicy); 17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEB_ARCHIVE) 17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->clearArchiveResources(); 17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738d0825bca7fe65beaee391d30da42e937db621564Steve Block m_checkTimer.stop(); 1739d0825bca7fe65beaee391d30da42e937db621564Steve Block 17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inStopAllLoaders = false; 17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::stopForUserCancel(bool deferCheckLoadComplete) 17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopAllLoaders(); 17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deferCheckLoadComplete) 17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project scheduleCheckLoadComplete(); 17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (m_frame->page()) 17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDocumentLoader* FrameLoader::activeDocumentLoader() const 17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state == FrameStateProvisional) 17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_provisionalDocumentLoader.get(); 17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_documentLoader.get(); 17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isLoading() const 17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* docLoader = activeDocumentLoader(); 17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!docLoader) 17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return docLoader->isLoadingMainResource() || docLoader->isLoadingSubresources() || docLoader->isLoadingPlugIns(); 17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::frameHasLoaded() const 17698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 177006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return m_stateMachine.committedFirstRealDocumentLoad() || (m_provisionalDocumentLoader && !m_stateMachine.creatingInitialEmptyDocument()); 17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1773e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FrameLoader::transferLoadingResourcesFromPage(Page* oldPage) 1774e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 1775e14391e94c850b8bd03680c23b38978db68687a8John Reck ASSERT(oldPage != m_frame->page()); 17766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (isLoading()) { 1777e14391e94c850b8bd03680c23b38978db68687a8John Reck activeDocumentLoader()->transferLoadingResourcesFromPage(oldPage); 17786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner oldPage->progress()->progressCompleted(m_frame); 17796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (m_frame->page()) 17806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_frame->page()->progress()->progressStarted(m_frame); 17816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 17826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 17836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 17846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid FrameLoader::dispatchTransferLoadingResourceFromPage(unsigned long identifier, DocumentLoader* docLoader, const ResourceRequest& request, Page* oldPage) 17856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 17866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner notifier()->dispatchTransferLoadingResourceFromPage(identifier, docLoader, request, oldPage); 1787e14391e94c850b8bd03680c23b38978db68687a8John Reck} 1788e14391e94c850b8bd03680c23b38978db68687a8John Reck 17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setDocumentLoader(DocumentLoader* loader) 17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!loader && !m_documentLoader) 17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(loader != m_documentLoader); 17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || loader->frameLoader() == this); 17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->prepareForDataSourceReplacement(); 17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->detachFromFrame(); 18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader = loader; 18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setPolicyDocumentLoader(DocumentLoader* loader) 18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader == loader) 18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (loader) 18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setFrame(m_frame); 18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader 18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && m_policyDocumentLoader != m_provisionalDocumentLoader 18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && m_policyDocumentLoader != m_documentLoader) 18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader->detachFromFrame(); 18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader = loader; 18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setProvisionalDocumentLoader(DocumentLoader* loader) 18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || !m_provisionalDocumentLoader); 18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || loader->frameLoader() == this); 18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader && m_provisionalDocumentLoader != m_documentLoader) 18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->detachFromFrame(); 18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader = loader; 18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdouble FrameLoader::timeOfLastCompletedLoad() 18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return storedTimeOfLastCompletedLoad; 18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setState(FrameState newState) 18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_state = newState; 18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newState == FrameStateProvisional) 18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project provisionalLoadStarted(); 18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (newState == FrameStateComplete) { 18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frameLoadCompleted(); 18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project storedTimeOfLastCompletedLoad = currentTime(); 18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopRecordingResponses(); 18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::clearProvisionalLoad() 18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressCompleted(m_frame); 18568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateComplete); 18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::markLoadComplete() 18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateComplete); 18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1864545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::commitProvisionalLoad() 18658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1866545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch RefPtr<CachedPage> cachedPage = m_loadingFromCachedPage ? pageCache()->get(history()->provisionalItem()) : 0; 18678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 1868635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 18692fc2651226baac27029e38c9d6ef883fa32084dbSteve 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(), 18702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->document() ? m_frame->document()->url().string().utf8().data() : "", 1871231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block pdl ? pdl->url().string().utf8().data() : "<no provisional DocumentLoader>"); 1872635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 18738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check to see if we need to cache the page we are navigating away from into the back/forward cache. 18748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are doing this here because we know for sure that a new page is about to be loaded. 1875545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch HistoryItem* item = history()->currentItem(); 187606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_frame->tree()->parent() && PageCache::canCache(m_frame->page()) && !item->isInPageCache()) 1877545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch pageCache()->add(item, m_frame->page()); 1878cad810f21b803229eb11403f9209855525a25d57Steve Block 18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_loadType != FrameLoadTypeReplace) 18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeOldDataSources(); 1881cad810f21b803229eb11403f9209855525a25d57Steve Block 188206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!cachedPage && !m_stateMachine.creatingInitialEmptyDocument()) 18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->makeRepresentation(pdl.get()); 1884cad810f21b803229eb11403f9209855525a25d57Steve Block 18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project transitionToCommitted(cachedPage); 1886cad810f21b803229eb11403f9209855525a25d57Steve Block 1887cad810f21b803229eb11403f9209855525a25d57Steve Block if (pdl) { 1888cad810f21b803229eb11403f9209855525a25d57Steve Block // Check if the destination page is allowed to access the previous page's timing information. 1889cad810f21b803229eb11403f9209855525a25d57Steve Block RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(pdl->request().url()); 1890cad810f21b803229eb11403f9209855525a25d57Steve Block m_documentLoader->timing()->hasSameOriginAsPreviousDocument = securityOrigin->canRequest(m_previousUrl); 1891cad810f21b803229eb11403f9209855525a25d57Steve Block } 1892cad810f21b803229eb11403f9209855525a25d57Steve Block 18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Call clientRedirectCancelledOrFinished() here so that the frame load delegate is notified that the redirect's 18948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // status has changed, if there was a redirect. The frame load delegate may have saved some state about 18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect in its -webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:. Since we are 18968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // just about to commit a new page, there cannot possibly be a pending redirect at this point. 18978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_sentRedirectNotification) 18988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 18998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1900545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (cachedPage && cachedPage->document()) { 1901545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch prepareForCachedPageRestore(); 1902545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch cachedPage->restore(m_frame->page()); 190368513a70bcd92384395513322f1b801e7bf9c729Steve Block 190468513a70bcd92384395513322f1b801e7bf9c729Steve Block dispatchDidCommitLoad(); 190568513a70bcd92384395513322f1b801e7bf9c729Steve Block 190668513a70bcd92384395513322f1b801e7bf9c729Steve Block // If we have a title let the WebView know about it. 190768513a70bcd92384395513322f1b801e7bf9c729Steve Block String title = m_documentLoader->title(); 190868513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!title.isNull()) 190968513a70bcd92384395513322f1b801e7bf9c729Steve Block m_client->dispatchDidReceiveTitle(title); 191068513a70bcd92384395513322f1b801e7bf9c729Steve Block 1911545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch checkCompleted(); 1912545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch } else { 19138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url = pdl->substituteData().responseURL(); 19148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = pdl->url(); 19168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = pdl->responseURL(); 19188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = blankURL(); 19208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didOpenURL(url); 19228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1923635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block LOG(Loading, "WebCoreLoading %s: Finished committing provisional load to URL %s", m_frame->tree()->uniqueName().string().utf8().data(), 19252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->document() ? m_frame->document()->url().string().utf8().data() : ""); 1926635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_loadType == FrameLoadTypeStandard && m_documentLoader->isClientRedirect()) 1928cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForClientRedirect(); 19298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1930231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_loadingFromCachedPage) { 19318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->documentDidBecomeActive(); 19328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Force a layout to update view size and thereby update scrollbars. 1934231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->view()->forceLayout(); 19358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const ResponseVector& responses = m_documentLoader->responses(); 19378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian size_t count = responses.size(); 19388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for (size_t i = 0; i < count; i++) { 19398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const ResourceResponse& response = responses[i]; 19408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: If the WebKit client changes or cancels the request, this is not respected. 19418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ResourceError error; 19428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian unsigned long identifier; 19438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ResourceRequest request(response.url()); 19448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian requestFromDelegate(request, identifier, error); 19458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing. 19468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // However, with today's computers and networking speeds, this won't happen in practice. 19478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Could be an issue with a giant local file. 1948cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, static_cast<int>(response.expectedContentLength()), error); 19498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 19508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1951cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block pageCache()->remove(history()->currentItem()); 19528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_documentLoader->setPrimaryLoadComplete(true); 19548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Why only this frame and not parent frames? 19568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian checkLoadCompleteForThisFrame(); 19578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::transitionToCommitted(PassRefPtr<CachedPage> cachedPage) 19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_state == FrameStateProvisional); 19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state != FrameStateProvisional) 19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setCopiesOnScroll(); 1969cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForCommit(); 19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The call to closeURL() invokes the unload event handler, which can execute arbitrary 19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // JavaScript. If the script initiates a new load, we need to abandon the current load, 19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or the two will stomp each other. 19748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* pdl = m_provisionalDocumentLoader.get(); 19758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pdl != m_provisionalDocumentLoader) 19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Nothing else can interupt this commit - set the Provisional->Committed transition in stone 19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopLoadingSubresources(); 19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 19848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopLoadingPlugIns(); 19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setDocumentLoader(m_provisionalDocumentLoader.get()); 19878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateCommittedPage); 19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Handle adding the URL to the back/forward list. 19918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* dl = m_documentLoader.get(); 19928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_loadType) { 19948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeForward: 19958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeBack: 19960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case FrameLoadTypeBackWMLDeckNotAccessible: 19978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeIndexedBackForward: 199828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page()) { 199928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // If the first load within a frame is a navigation within a back/forward list that was attached 200028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // without any of the items being loaded then we need to update the history in a similar manner as 200128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // for a standard load with the exception of updating the back/forward list (<rdar://problem/8091103>). 200228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!m_stateMachine.committedFirstRealDocumentLoad()) 200328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->updateForStandardLoad(HistoryController::UpdateAllExceptBackForwardList); 200428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 200528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->updateForBackForwardNavigation(); 200628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 200728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // For cached pages, CachedFrame::restore will take care of firing the popstate event with the history item's state object 200828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (history()->currentItem() && !cachedPage) 200928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_pendingStateObject = history()->currentItem()->stateObject(); 201028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 201128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // Create a document view for this document, or used the cached view. 201228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (cachedPage) { 201328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu DocumentLoader* cachedDocumentLoader = cachedPage->documentLoader(); 201428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(cachedDocumentLoader); 201528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu cachedDocumentLoader->setFrame(m_frame); 201628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_client->transitionToCommittedFromCachedFrame(cachedPage->cachedMainFrame()); 201728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 201828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } else 201928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_client->transitionToCommittedForNewPage(); 2020d0825bca7fe65beaee391d30da42e937db621564Steve Block } 20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReload: 2024635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeReloadFromOrigin: 20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeSame: 20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReplace: 2027cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForReload(); 20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeStandard: 2032cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForStandardLoad(); 20338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER 20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This code was originally added for a Leopard performance imporvement. We decided to 20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ifdef it to fix correctness issues on Tiger documented in <rdar://problem/5441823>. 20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->view()) 20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->setScrollbarsSuppressed(true); 20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2042635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeRedirectWithLockedBackForwardList: 2043cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForRedirectWithLockedBackForwardList(); 20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME Remove this check when dummy ds is removed (whatever "dummy ds" is). 20488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // An exception should be thrown if we're in the FrameLoadTypeUninitialized state. 20498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 20508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 20518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_documentLoader->writer()->setMIMEType(dl->responseMIMEType()); 20548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Tell the client we've committed this URL. 20568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->view()); 20578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 205806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 20598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 206006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 206106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.committedFirstRealDocumentLoad()) 206206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit); 2063635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 20640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_client->hasHTMLView()) 20650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch receivedFirstData(); 20668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress) 20698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Note that -webView:didCancelClientRedirectForFrame: is called on the frame load delegate even if 20718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect succeeded. We should either rename this API, or add a new method, like 20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -webView:didFinishClientRedirectForFrame: 20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidCancelClientRedirect(); 20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!cancelWithLoadInProgress) 20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 20778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_sentRedirectNotification = false; 20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::clientRedirected(const KURL& url, double seconds, double fireDate, bool lockBackForwardList) 20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchWillPerformClientRedirect(url, seconds, fireDate); 20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Remember that we sent a redirect notification to the frame load delegate so that when we commit 20868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the next provisional load, we can send a corresponding -webView:didCancelClientRedirectForFrame: 20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_sentRedirectNotification = true; 20888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If a "quick" redirect comes in, we set a special mode so we treat the next 20905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // load as part of the original navigation. If we don't have a document loader, we have 20918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // no "original" load on which to base a redirect, so we treat the redirect as a normal load. 20925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Loads triggered by JavaScript form submissions never count as quick redirects. 2093dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_quickRedirectComing = (lockBackForwardList || history()->currentItemShouldBeReplaced()) && m_documentLoader && !m_isExecutingJavaScriptFormAction; 20948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldReload(const KURL& currentURL, const KURL& destinationURL) 20978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2098635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 20990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // All WML decks are supposed to be reloaded, even within the same URL fragment 21000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (frameContainsWMLContent(m_frame)) 2101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 2102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 2103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This function implements the rule: "Don't reload if navigating by fragment within 21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the same URL, but do reload if going to a new URL or to the same URL with no 21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fragment identifier at all." 21070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!destinationURL.hasFragmentIdentifier()) 21088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 21090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return !equalIgnoringFragmentIdentifier(currentURL, destinationURL); 21108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::closeOldDataSources() 21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is it important for this traversal to be postorder instead of preorder? 21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If so, add helpers for postorder traversal, and use them. If not, then lets not 21168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // use a recursive algorithm here. 21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 21188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child->loader()->closeOldDataSources(); 21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchWillClose(); 21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainFrameDocumentReady(false); // stop giving out the actual DOMDocument to observers 21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2126545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::prepareForCachedPageRestore() 21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!m_frame->tree()->parent()); 21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->page()); 21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->page()->mainFrame() == m_frame); 21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 21338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We still have to close the previous part page. 21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Delete old status bar messages (if it _was_ activated on last URL). 2138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_frame->script()->canExecuteScripts(NotAboutToExecuteScript)) { 213906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (DOMWindow* window = m_frame->existingDOMWindow()) { 214006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setStatus(String()); 214106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setDefaultStatus(String()); 214206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 21458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::open(CachedFrameBase& cachedFrame) 21478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 21488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_isComplete = false; 21498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't re-emit the load event. 21518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_didCallImplicitClose = true; 21528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian KURL url = cachedFrame.url(); 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (url.protocolInHTTPFamily() && !url.host().isEmpty() && url.path().isEmpty()) 21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.setPath("/"); 21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = url; 21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project started(); 2161231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block clear(true, true, cachedFrame.isMainFrame()); 21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Document* document = cachedFrame.document(); 21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(document); 21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document->setInPageCache(false); 21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = true; 21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_outgoingReferrer = url.string(); 21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian FrameView* view = cachedFrame.view(); 21738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // When navigating to a CachedFrame its FrameView should never be null. If it is we'll crash in creative ways downstream. 21758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(view); 2176231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block view->setWasScrolledByUser(false); 2177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Use the current ScrollView's frame rect. 2179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_frame->view()) 2180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block view->setFrameRect(m_frame->view()->frameRect()); 21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setView(view); 21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setDocument(document); 21848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->setDOMWindow(cachedFrame.domWindow()); 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setURL(document->url()); 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setSecurityOrigin(document->securityOrigin()); 21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian updateFirstPartyForCookies(); 21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian cachedFrame.restore(); 21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isStopping() const 21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->isStopping(); 21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedLoading() 21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Retain because the stop may release the last reference to it. 22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> dl = activeDocumentLoader(); 22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dl->finishedLoading(); 22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dl->mainDocumentError().isNull() || !dl->frameLoader()) 22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dl->setPrimaryLoadComplete(true); 22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidLoadMainResource(dl.get()); 22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isHostedByObjectElement() const 22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* owner = m_frame->ownerElement(); 22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return owner && owner->hasTagName(objectTag); 22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isLoadingMainFrame() const 22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Page* page = m_frame->page(); 22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return page && m_frame == page->mainFrame(); 22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::canShowMIMEType(const String& MIMEType) const 22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->canShowMIMEType(MIMEType); 22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::representationExistsForURLScheme(const String& URLScheme) 22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->representationExistsForURLScheme(URLScheme); 22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::generatedMIMETypeForURLScheme(const String& URLScheme) 22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->generatedMIMETypeForURLScheme(URLScheme); 22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didReceiveServerRedirectForProvisionalLoadForFrame() 22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveServerRedirectForProvisionalLoad(); 22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedLoadingDocument(DocumentLoader* loader) 22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Platforms shouldn't differ here! 22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(WIN) || PLATFORM(CHROMIUM) || defined(ANDROID) 224806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !ENABLE(WEB_ARCHIVE) 22532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_client->finishedLoading(loader); 22542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#else 2255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Give archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. 2256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Archive> archive = ArchiveFactory::create(loader->mainResourceData().get(), loader->responseMIMEType()); 2257f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!archive) { 22588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->finishedLoading(loader); 22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: The remainder of this function should be moved to DocumentLoader. 2263f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 226468513a70bcd92384395513322f1b801e7bf9c729Steve Block loader->addAllArchiveResources(archive.get()); 226568513a70bcd92384395513322f1b801e7bf9c729Steve Block 22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ArchiveResource* mainResource = archive->mainResource(); 22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setParsedArchiveData(mainResource->data()); 22685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 22692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block loader->writer()->setMIMEType(mainResource->mimeType()); 2270cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 2271cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block closeURL(); 22725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian didOpenURL(mainResource->url()); 22735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 227468513a70bcd92384395513322f1b801e7bf9c729Steve Block ASSERT(m_frame->document()); 22755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian String userChosenEncoding = documentLoader()->overrideEncoding(); 22765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool encodingIsUserChosen = !userChosenEncoding.isNull(); 22772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block loader->writer()->setEncoding(encodingIsUserChosen ? userChosenEncoding : mainResource->textEncoding(), encodingIsUserChosen); 22782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block loader->writer()->addData(mainResource->data()->data(), mainResource->data()->size()); 22792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEB_ARCHIVE) 22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isReplacing() const 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_loadType == FrameLoadTypeReplace; 22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setReplacing() 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeReplace; 22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::revertToProvisional(DocumentLoader* loader) 22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->revertToProvisionalState(loader); 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::subframeIsLoading() const 22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's most likely that the last added frame is the last to load so we walk backwards. 23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->lastChild(); child; child = child->tree()->previousSibling()) { 23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* childLoader = child->loader(); 23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* documentLoader = childLoader->documentLoader(); 23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader && documentLoader->isLoadingInAPISense()) 23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader = childLoader->provisionalDocumentLoader(); 23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader && documentLoader->isLoadingInAPISense()) 23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2308967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch documentLoader = childLoader->policyDocumentLoader(); 2309967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (documentLoader) 2310967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return true; 23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::willChangeTitle(DocumentLoader* loader) 23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->willChangeTitle(loader); 23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoadType FrameLoader::loadType() const 23218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_loadType; 23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 23255f1ab04193ad0130ca8204aadaceae083aca9881Feng QianCachePolicy FrameLoader::subresourceCachePolicy() const 2326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_isComplete) 2328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyVerify; 23295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 23305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_loadType == FrameLoadTypeReloadFromOrigin) 2331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyReload; 23325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Frame* parentFrame = m_frame->tree()->parent()) { 23345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CachePolicy parentCachePolicy = parentFrame->loader()->subresourceCachePolicy(); 2335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (parentCachePolicy != CachePolicyVerify) 2336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return parentCachePolicy; 2337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 2338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 23395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: POST documents are always Reloads, but their subresources should still be Revalidate. 23405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we bring the CachePolicy.h and ResourceRequest cache policy enums in sync with each other and 23415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // remember "Revalidate" in ResourceRequests, we can remove this "POST" check and return either "Reload" 23425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // or "Revalidate" if the DocumentLoader was requested with either. 23435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const ResourceRequest& request(documentLoader()->request()); 23445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (request.cachePolicy() == ReloadIgnoringCacheData && !equalIgnoringCase(request.httpMethod(), "post")) 23455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return CachePolicyRevalidate; 23465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_loadType == FrameLoadTypeReload) 2348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyRevalidate; 2349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2350d0825bca7fe65beaee391d30da42e937db621564Steve Block if (request.cachePolicy() == ReturnCacheDataElseLoad) 23514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return CachePolicyHistoryBuffer; 2352d0825bca7fe65beaee391d30da42e937db621564Steve Block 2353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyVerify; 2354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkLoadCompleteForThisFrame() 23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_state) { 23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateProvisional: { 23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_delegateIsHandlingProvisionalLoadError) 23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pdl) 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we've received any errors we may be stuck in the provisional state and actually complete. 23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceError& error = pdl->mainDocumentError(); 23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.isNull()) 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check all children first. 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<HistoryItem> item; 23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 237765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (isBackForwardLoadType(loadType())) 237865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Reset the back forward list to the last committed history item at the top level. 237965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch item = page->mainFrame()->loader()->history()->currentItem(); 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2381ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // Only reset if we aren't already going to a new provisional item. 2382ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch bool shouldReset = !history()->provisionalItem(); 23835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!(pdl->isLoadingInAPISense() && !pdl->isStopping())) { 23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_delegateIsHandlingProvisionalLoadError = true; 23858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFailProvisionalLoad(error); 23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_delegateIsHandlingProvisionalLoadError = false; 23878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: can stopping loading here possibly have any effect, if isLoading is false, 23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // which it must be to be in this branch of the if? And is it OK to just do a full-on 23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // stopAllLoaders instead of stopLoadingSubframes? 2391ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch stopLoadingSubframes(DatabasePolicyStop, ShouldNotClearProvisionalItem); 23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pdl->stopLoading(); 23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2394d0825bca7fe65beaee391d30da42e937db621564Steve Block // If we're in the middle of loading multipart data, we need to restore the document loader. 2395d0825bca7fe65beaee391d30da42e937db621564Steve Block if (isReplacing() && !m_documentLoader.get()) 2396d0825bca7fe65beaee391d30da42e937db621564Steve Block setDocumentLoader(m_provisionalDocumentLoader.get()); 2397d0825bca7fe65beaee391d30da42e937db621564Steve Block 23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Finish resetting the load state, but only if another load hasn't been started by the 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // delegate callback. 24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pdl == m_provisionalDocumentLoader) 24018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clearProvisionalLoad(); 2402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else if (activeDocumentLoader()) { 2403643ca7872b450ea4efacab6188849e5aac2ba161Steve Block KURL unreachableURL = activeDocumentLoader()->unreachableURL(); 24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty() && unreachableURL == pdl->request().url()) 24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project shouldReset = false; 24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldReset && item) 2409635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Page* page = m_frame->page()) { 241028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->setCurrentItem(item.get()); 2411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Settings* settings = m_frame->settings(); 2412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project page->setGlobalHistoryItem((!settings || settings->privateBrowsingEnabled()) ? 0 : item.get()); 2413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateCommittedPage: { 24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* dl = m_documentLoader.get(); 24195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!dl || (dl->isLoadingInAPISense() && !dl->isStopping())) 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project markLoadComplete(); 24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is this subsequent work important if we already navigated away? 24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Maybe there are bugs because of that, or extra work we can skip because 24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the new page is ready. 24278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->forceLayoutForNonHTML(); 24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the user had a scroll point, scroll to it, overriding the anchor point if any. 243128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page()) { 243228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload || m_loadType == FrameLoadTypeReloadFromOrigin) 2433cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->restoreScrollPositionAndViewState(); 243428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 243606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument() || !m_stateMachine.committedFirstRealDocumentLoad()) 24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceError& error = dl->mainDocumentError(); 24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!error.isNull()) 24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFailLoad(error); 24428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFinishLoad(); 24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressCompleted(m_frame); 2447bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block 24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 2449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_frame->tree()->parent() && m_frame->document()->renderArena()) 2450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project android::TimeCounter::report(m_URL, cache()->getLiveSize(), cache()->getDeadSize(), 2451635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->document()->renderArena()->reportPoolSize()); 24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateComplete: 24578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian frameLoadCompleted(); 24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2464231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::continueLoadAfterWillSubmitForm() 24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader) 24678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // DocumentLoader calls back to our prepareForLoadStart 24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->prepareForLoadStart(); 24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The load might be cancelled inside of prepareForLoadStart(), nulling out the m_provisionalDocumentLoader, 24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so we need to null check it again. 24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader) 24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* activeDocLoader = activeDocumentLoader(); 24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (activeDocLoader && activeDocLoader->isLoadingMainResource()) 24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2481231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_loadingFromCachedPage = false; 24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier = 0; 24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = page->progress()->createUniqueIdentifier(); 2487cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->assignIdentifierToInitialRequest(identifier, m_provisionalDocumentLoader.get(), m_provisionalDocumentLoader->originalRequest()); 24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2490967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT(!m_provisionalDocumentLoader->timing()->navigationStart); 2491967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch m_provisionalDocumentLoader->timing()->navigationStart = currentTime(); 2492967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader->startLoadingMainResource(identifier)) 24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->updateLoading(); 24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didFirstLayout() 24988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 249928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page() && isBackForwardLoadType(m_loadType)) 250028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->restoreScrollPositionAndViewState(); 25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 250206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.committedFirstRealDocumentLoad() && !m_stateMachine.isDisplayingInitialEmptyDocument() && !m_stateMachine.firstLayoutDone()) 250306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::FirstLayoutDone); 25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFirstLayout(); 25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2507635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::didFirstVisuallyNonEmptyLayout() 2508635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2509635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidFirstVisuallyNonEmptyLayout(); 2510635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::frameLoadCompleted() 25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Note: Can be called multiple times. 25158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->frameLoadCompleted(); 25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForFrameLoadCompleted(); 25198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // After a canceled provisional load, firstLayoutDone is false. 25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Reset it to true if we're displaying a page. 252206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_documentLoader && m_stateMachine.committedFirstRealDocumentLoad() && !m_stateMachine.isDisplayingInitialEmptyDocument() && !m_stateMachine.firstLayoutDone()) 252306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::FirstLayoutDone); 25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::detachChildren() 25278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is it really necessary to do this in reverse order? 25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* previous; 25308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->lastChild(); child; child = previous) { 25318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project previous = child->tree()->previousSibling(); 25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child->loader()->detachFromParent(); 25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoader::closeAndRemoveChild(Frame* child) 25378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->tree()->detachFromParent(); 25398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->setView(0); 2541231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (child->ownerElement() && child->page()) 25428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->page()->decrementFrameCount(); 25435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: The page isn't being destroyed, so it's not right to call a function named pageDestroyed(). 25448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->pageDestroyed(); 25458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->tree()->removeChild(child); 25478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::recursiveCheckLoadComplete() 25508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<RefPtr<Frame>, 10> frames; 25528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RefPtr<Frame> frame = m_frame->tree()->firstChild(); frame; frame = frame->tree()->nextSibling()) 25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frames.append(frame); 25558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned size = frames.size(); 25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < size; i++) 25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frames[i]->loader()->recursiveCheckLoadComplete(); 25598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadCompleteForThisFrame(); 25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called every time a resource is completely loaded, or an error is received. 25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkLoadComplete() 25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = false; 2569231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 25708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Always traversing the entire frame tree is a bit inefficient, but 25718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is currently needed in order to null out the previous history item for all frames. 25728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 25738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->mainFrame()->loader()->recursiveCheckLoadComplete(); 25748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint FrameLoader::numPendingOrLoadingRequests(bool recurse) const 25778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!recurse) 25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return numRequests(m_frame->document()); 25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int count = 0; 25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* frame = m_frame; frame; frame = frame->tree()->traverseNext(m_frame)) 25838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project count += numRequests(frame->document()); 25848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return count; 25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::userAgent(const KURL& url) const 25888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String userAgent = m_client->userAgent(url); 25902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block InspectorInstrumentation::applyUserAgentOverride(m_frame, &userAgent); 25912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return userAgent; 25928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::handledOnloadEvents() 25958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidHandleOnloadEvents(); 2597e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 2598f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (documentLoader()) { 2599f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick documentLoader()->handledOnloadEvents(); 2600d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS) 2601d0825bca7fe65beaee391d30da42e937db621564Steve Block documentLoader()->applicationCacheHost()->stopDeferringEvents(); 2602d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 2603f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 26048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::frameDetached() 26078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopAllLoaders(); 26098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->stopActiveDOMObjects(); 26108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachFromParent(); 26118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::detachFromParent() 26148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 26168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 2618cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->saveScrollPositionAndViewStateToItem(history()->currentItem()); 26198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 262028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // stopAllLoaders() needs to be called after detachChildren(), because detachedChildren() 262128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // will trigger the unload event handlers of any child frames, and those event 262228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // handlers might start a new subresource load in this frame. 262328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu stopAllLoaders(); 26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 262565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::frameDetachedFromParent(m_frame); 2626231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2627231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block detachViewsAndDocumentLoader(); 26288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) { 26308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parent->loader()->closeAndRemoveChild(m_frame); 26318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->scheduleCheckCompleted(); 26328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 26338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setView(0); 26345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: The page isn't being destroyed, so it's not right to call a function named pageDestroyed(). 26358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->pageDestroyed(); 26368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 26378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::detachViewsAndDocumentLoader() 2640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 2641231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->detachedFromParent2(); 2642231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setDocumentLoader(0); 2643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->detachedFromParent3(); 2644231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 2645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToSubresourceRequest(ResourceRequest& request) 2647635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, m_loadType, false, false); 2649635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 26508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2651635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToMainResourceRequest(ResourceRequest& request) 2652635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2653635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, m_loadType, true, false); 2654635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2655635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2656635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadType loadType, bool mainResource, bool cookiePolicyURLFromRequest) 26578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't set the cookie policy URL if it's already been set. 26598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // But make sure to set it on all requests, as it has significance beyond the cookie policy for all protocols (<rdar://problem/6616664>). 26605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (request.firstPartyForCookies().isEmpty()) { 26618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (mainResource && (isLoadingMainFrame() || cookiePolicyURLFromRequest)) 26625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setFirstPartyForCookies(request.url()); 26635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian else if (Document* document = m_frame->document()) 26645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setFirstPartyForCookies(document->firstPartyForCookies()); 26658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 26678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // The remaining modifications are only necessary for HTTP and HTTPS. 26688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!request.url().isEmpty() && !request.url().protocolInHTTPFamily()) 26698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 26708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project applyUserAgent(request); 26728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2673e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // If we inherit cache policy from a main resource, we use the DocumentLoader's 2674e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // original request cache policy for two reasons: 2675e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // 1. For POST requests, we mutate the cache policy for the main resource, 2676e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // but we do not want this to apply to subresources 2677e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // 2. Delegates that modify the cache policy using willSendRequest: should 2678e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // not affect any other resources. Such changes need to be done 2679e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // per request. 2680967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!mainResource) { 2681967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (request.isConditional()) 2682967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(ReloadIgnoringCacheData); 2683967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else if (documentLoader()->isLoadingInAPISense()) 2684967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(documentLoader()->originalRequest().cachePolicy()); 2685967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else 2686967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(UseProtocolCachePolicy); 26875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } else if (loadType == FrameLoadTypeReload || loadType == FrameLoadTypeReloadFromOrigin || request.isConditional()) 2688e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke request.setCachePolicy(ReloadIgnoringCacheData); 2689967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else if (isBackForwardLoadType(loadType) && m_stateMachine.committedFirstRealDocumentLoad() && !request.url().protocolIs("https")) 2690d0825bca7fe65beaee391d30da42e937db621564Steve Block request.setCachePolicy(ReturnCacheDataElseLoad); 26915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 26925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (request.cachePolicy() == ReloadIgnoringCacheData) { 26935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (loadType == FrameLoadTypeReload) 26945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Cache-Control", "max-age=0"); 26955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else if (loadType == FrameLoadTypeReloadFromOrigin) { 26965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Cache-Control", "no-cache"); 26975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Pragma", "no-cache"); 26985ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 26995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 27008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mainResource) 27025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setHTTPAccept(defaultAcceptHeader); 27038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we send the Origin header. 27058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(request, String()); 2706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Always try UTF-8. If that fails, try frame encoding (if any) and then the default. 2708635860845790a19bf50bbc51ba8fb66a96dde068The 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. 2709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Settings* settings = m_frame->settings(); 27102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block request.setResponseContentDispositionEncodingFallbackArray("UTF-8", activeDocumentLoader()->writer()->deprecatedFrameEncoding(), settings ? settings->defaultTextEncodingName() : String()); 27118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::addHTTPOriginIfNeeded(ResourceRequest& request, String origin) 27148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!request.httpOrigin().isEmpty()) 27168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Request already has an Origin header. 27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't send an Origin header for GET or HEAD to avoid privacy issues. 27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For example, if an intranet page has a hyperlink to an external web 27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // site, we don't want to include the Origin of the request because it 27218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // will leak the internal host name. Similar privacy concerns have lead 27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to the widespread suppression of the Referer header at the network 27238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // layer. 27248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (request.httpMethod() == "GET" || request.httpMethod() == "HEAD") 27258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 27268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For non-GET and non-HEAD methods, always send an Origin header so the 27288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // server knows we support this feature. 27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (origin.isEmpty()) { 27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we don't know what origin header to attach, we attach the value 27328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for an empty origin. 27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin = SecurityOrigin::createEmpty()->toString(); 27348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 27358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPOrigin(origin); 27378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::loadPostRequest(const ResourceRequest& inRequest, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType loadType, PassRefPtr<Event> event, PassRefPtr<FormState> prpFormState) 27408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 27428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When posting, use the NSURLRequestReloadIgnoringCacheData load flag. 27448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This prevents a potential bug which may cause a page with a form that uses itself 27458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as an action to be returned from the cache without submitting. 27468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Where's the code that implements what the comment above says? 27488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Previously when this method was reached, the original FrameLoadRequest had been deconstructed to build a 27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // bunch of parameters that would come in here and then be built back up to a ResourceRequest. In case 27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // any caller depends on the immutability of the original ResourceRequest, I'm rebuilding a ResourceRequest 27528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from scratch as it did all along. 27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& url = inRequest.url(); 27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormData> formData = inRequest.httpBody(); 27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& contentType = inRequest.httpContentType(); 27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String origin = inRequest.httpOrigin(); 27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest workingResourceRequest(url); 27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) 27618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPReferrer(referrer); 27628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPOrigin(origin); 27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPMethod("POST"); 27648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPBody(formData); 27658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPContentType(contentType); 2766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(workingResourceRequest, loadType, true, true); 27678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NavigationAction action(url, loadType, true, event); 27698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frameName.isEmpty()) { 27715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The search for a target frame is done earlier in the case of form submission. 27725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (Frame* targetFrame = formState ? 0 : findFrameForNavigation(frameName)) 2773635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project targetFrame->loader()->loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release()); 27748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2775231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy, workingResourceRequest, formState.release(), frameName, this); 27768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 2777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release()); 27788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianunsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& request, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data) 27818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String referrer = m_outgoingReferrer; 2783231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (SecurityOrigin::shouldHideReferrer(request.url(), referrer)) 27848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = String(); 27858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest initialRequest = request; 27878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setTimeoutInterval(10); 27888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) 27908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setHTTPReferrer(referrer); 27918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(initialRequest, outgoingOrigin()); 27928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 27945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian initialRequest.setFirstPartyForCookies(page->mainFrame()->loader()->documentLoader()->request().url()); 27958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setHTTPUserAgent(client()->userAgent(request.url())); 2796e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 2797e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke addExtraFieldsToSubresourceRequest(initialRequest); 27988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier = 0; 28008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest newRequest(initialRequest); 28018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project requestFromDelegate(newRequest, identifier, error); 28028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.isNull()) { 28048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!newRequest.isNull()); 28058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS) 28070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!documentLoader()->applicationCacheHost()->maybeLoadSynchronously(newRequest, error, response, data)) { 28088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 280968513a70bcd92384395513322f1b801e7bf9c729Steve Block ResourceHandle::loadResourceSynchronously(networkingContext(), newRequest, storedCredentials, error, response, data); 2810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS) 28110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch documentLoader()->applicationCacheHost()->maybeLoadFallbackSynchronously(newRequest, error, response, data); 2812635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 2813635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 28148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 28158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2816cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, data.size(), error); 2817cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return identifier; 28185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 28195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 28208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst ResourceRequest& FrameLoader::originalRequest() const 28218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequestCopy(); 28238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::receivedMainResourceError(const ResourceError& error, bool isComplete) 28268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Retain because the stop may release the last reference to it. 28288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 28298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = activeDocumentLoader(); 2831cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isComplete) { 28338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Don't want to do this if an entirely new load is going, so should check 28348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that both data sources on the frame are either this or nil. 28358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stop(); 28368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_client->shouldFallBack(error)) 28378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handleFallbackContent(); 28388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2839cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) { 28415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_submittedFormURL == m_provisionalDocumentLoader->originalRequestCopy().url()) 28425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_submittedFormURL = KURL(); 28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // transitioned to the new page (before WebFrameState == commit). The goal here is to restore any state 28468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so that the existing view (that wenever got far enough to replace) can continue being used. 2847cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->invalidateCurrentItemCachedPage(); 28488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Call clientRedirectCancelledOrFinished here so that the frame load delegate is notified that the redirect's 28508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // status has changed, if there was a redirect. The frame load delegate may have saved some state about 28518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect in its -webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:. Since we are definitely 28528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // not going to use this provisional resource, as it was cancelled, notify the frame load delegate that the redirect 28538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // has ended. 28548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_sentRedirectNotification) 28558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 28568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2857cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->mainReceivedError(error, isComplete); 28598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueFragmentScrollAfterNavigationPolicy(void* argument, 28628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, PassRefPtr<FormState>, bool shouldContinue) 28638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 28658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->continueFragmentScrollAfterNavigationPolicy(request, shouldContinue); 28668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue) 28698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 28718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!shouldContinue) 28738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 28748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2875aad6f24e036b3740071bb995b955b18b572067b2Steve Block bool isRedirect = m_quickRedirectComing || policyChecker()->loadType() == FrameLoadTypeRedirectWithLockedBackForwardList; 2876643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadInSameDocument(request.url(), 0, !isRedirect); 28778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2879cad810f21b803229eb11403f9209855525a25d57Steve Blockbool FrameLoader::shouldScrollToAnchor(bool isFormSubmission, const String& httpMethod, FrameLoadType loadType, const KURL& url) 28808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Should we do anchor navigation within the existing content? 28828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2883cad810f21b803229eb11403f9209855525a25d57Steve Block // We don't do this if we are submitting a form with method other than "GET", explicitly reloading, 28848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // currently displaying a frameset, or if the URL does not have a fragment. 28858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These rules were originally based on what KHTML was doing in KHTMLPart::openURL. 28868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: What about load types other than Standard and Reload? 28888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2889cad810f21b803229eb11403f9209855525a25d57Steve Block return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET")) 28908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && loadType != FrameLoadTypeReload 2891635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project && loadType != FrameLoadTypeReloadFromOrigin 28928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && loadType != FrameLoadTypeSame 28932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block && !shouldReload(m_frame->document()->url(), url) 28948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't want to just scroll if a link from within a 28958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frameset is trying to reload the frameset into _top. 28968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian && !m_frame->document()->isFrameSet(); 28978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueLoadAfterNavigationPolicy(void* argument, 29008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, PassRefPtr<FormState> formState, bool shouldContinue) 29018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 29038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->continueLoadAfterNavigationPolicy(request, formState, shouldContinue); 29048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 29058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool FrameLoader::shouldClose() 29076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 29086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Page* page = m_frame->page(); 29096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Chrome* chrome = page ? page->chrome() : 0; 29106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!chrome || !chrome->canRunBeforeUnloadConfirmPanel()) 29116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2913cad810f21b803229eb11403f9209855525a25d57Steve Block // Store all references to each subframe in advance since beforeunload's event handler may modify frame 2914cad810f21b803229eb11403f9209855525a25d57Steve Block Vector<RefPtr<Frame> > targetFrames; 2915cad810f21b803229eb11403f9209855525a25d57Steve Block targetFrames.append(m_frame); 2916cad810f21b803229eb11403f9209855525a25d57Steve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->traverseNext(m_frame)) 2917cad810f21b803229eb11403f9209855525a25d57Steve Block targetFrames.append(child); 2918cad810f21b803229eb11403f9209855525a25d57Steve Block 2919cad810f21b803229eb11403f9209855525a25d57Steve Block bool shouldClose = false; 2920cad810f21b803229eb11403f9209855525a25d57Steve Block { 2921cad810f21b803229eb11403f9209855525a25d57Steve Block NavigationDisablerForBeforeUnload navigationDisabler; 2922cad810f21b803229eb11403f9209855525a25d57Steve Block size_t i; 2923cad810f21b803229eb11403f9209855525a25d57Steve Block 2924cad810f21b803229eb11403f9209855525a25d57Steve Block for (i = 0; i < targetFrames.size(); i++) { 2925cad810f21b803229eb11403f9209855525a25d57Steve Block if (!targetFrames[i]->tree()->isDescendantOf(m_frame)) 2926cad810f21b803229eb11403f9209855525a25d57Steve Block continue; 2927cad810f21b803229eb11403f9209855525a25d57Steve Block if (!targetFrames[i]->loader()->fireBeforeUnloadEvent(chrome)) 2928cad810f21b803229eb11403f9209855525a25d57Steve Block break; 2929cad810f21b803229eb11403f9209855525a25d57Steve Block } 2930cad810f21b803229eb11403f9209855525a25d57Steve Block 2931cad810f21b803229eb11403f9209855525a25d57Steve Block if (i == targetFrames.size()) 2932cad810f21b803229eb11403f9209855525a25d57Steve Block shouldClose = true; 2933cad810f21b803229eb11403f9209855525a25d57Steve Block } 2934cad810f21b803229eb11403f9209855525a25d57Steve Block 2935cad810f21b803229eb11403f9209855525a25d57Steve Block return shouldClose; 2936cad810f21b803229eb11403f9209855525a25d57Steve Block} 2937cad810f21b803229eb11403f9209855525a25d57Steve Block 2938cad810f21b803229eb11403f9209855525a25d57Steve Blockbool FrameLoader::fireBeforeUnloadEvent(Chrome* chrome) 2939cad810f21b803229eb11403f9209855525a25d57Steve Block{ 29406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen DOMWindow* domWindow = m_frame->existingDOMWindow(); 29416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!domWindow) 29426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RefPtr<Document> document = m_frame->document(); 2945cad810f21b803229eb11403f9209855525a25d57Steve Block if (!document->body()) 29466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RefPtr<BeforeUnloadEvent> beforeUnloadEvent = BeforeUnloadEvent::create(); 29496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = true; 29506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen domWindow->dispatchEvent(beforeUnloadEvent.get(), domWindow->document()); 29516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = false; 29526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!beforeUnloadEvent->defaultPrevented()) 29546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen document->defaultEventHandler(beforeUnloadEvent.get()); 29556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (beforeUnloadEvent->result().isNull()) 29566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen String text = document->displayStringModifiedByEncoding(beforeUnloadEvent->result()); 29596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return chrome->runBeforeUnloadConfirmPanel(text, m_frame); 29606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 29616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2962635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState> formState, bool shouldContinue) 29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we loaded an alternate page to replace an unreachableURL, we'll get in here with a 29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // nil policyDataSource because loading the alternate page will have passed 29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // through this method already, nested; otherwise, policyDataSource should still be set. 29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_policyDocumentLoader || !m_provisionalDocumentLoader->unreachableURL().isEmpty()); 29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2969cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block bool isTargetItem = history()->provisionalItem() ? history()->provisionalItem()->isTargetItem() : false; 29708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Two reasons we can't continue: 29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 1) Navigation policy delegate said we can't so request is nil. A primary case of this 29738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is the user responding Cancel to the form repost nag sheet. 29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 2) User responded Cancel to an alert popped up by the before unload event handler. 2975cad810f21b803229eb11403f9209855525a25d57Steve Block bool canContinue = shouldContinue && shouldClose(); 29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!canContinue) { 29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we were waiting for a quick redirect, but the policy delegate decided to ignore it, then we 29798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // need to report that the client redirect was cancelled. 29808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_quickRedirectComing) 29818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 29828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(0); 29848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the navigation request came from the back/forward menu, and we punt on it, we have the 29868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // problem that we have optimistically moved the b/f cursor already, so move it back. For sanity, 29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we only do this when punting a navigation for the target frame or top-level frame. 2988231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if ((isTargetItem || isLoadingMainFrame()) && isBackForwardLoadType(policyChecker()->loadType())) 29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* mainFrame = page->mainFrame(); 2991cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (HistoryItem* resetItem = mainFrame->loader()->history()->currentItem()) { 299228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->setCurrentItem(resetItem); 2993635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Settings* settings = m_frame->settings(); 2994635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project page->setGlobalHistoryItem((!settings || settings->privateBrowsingEnabled()) ? 0 : resetItem); 2995635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 29978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 29988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3000231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block FrameLoadType type = policyChecker()->loadType(); 3001ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // A new navigation is in progress, so don't clear the history's provisional item. 3002ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch stopAllLoaders(DatabasePolicyStop, ShouldNotClearProvisionalItem); 30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // <rdar://problem/6250856> - In certain circumstances on pages with multiple frames, stopAllLoaders() 30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // might detach the current FrameLoader, in which case we should bail on this newly defunct load. 30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->page()) 30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 30092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER) && USE(JSC) 30105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (Page* page = m_frame->page()) { 30115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (page->mainFrame() == m_frame) 30122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_frame->page()->inspectorController()->resume(); 30135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 30145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 30155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 30168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(m_policyDocumentLoader.get()); 30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = type; 30188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(0); 30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3022545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (isBackForwardLoadType(type) && history()->provisionalItem()->isInPageCache()) { 3023545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch loadProvisionalItemFromCachedPage(); 30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3025545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch } 30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (formState) 3028231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->dispatchWillSubmitForm(&PolicyChecker::continueLoadAfterWillSubmitForm, formState); 30298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continueLoadAfterWillSubmitForm(); 30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueLoadAfterNewWindowPolicy(void* argument, 3034e14391e94c850b8bd03680c23b38978db68687a8John Reck const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName, const NavigationAction& action, bool shouldContinue) 30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 3037e14391e94c850b8bd03680c23b38978db68687a8John Reck loader->continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue); 30388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& request, 3041e14391e94c850b8bd03680c23b38978db68687a8John Reck PassRefPtr<FormState> formState, const String& frameName, const NavigationAction& action, bool shouldContinue) 30428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!shouldContinue) 30448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> frame = m_frame; 3047e14391e94c850b8bd03680c23b38978db68687a8John Reck RefPtr<Frame> mainFrame = m_client->dispatchCreatePage(action); 30488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mainFrame) 30498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frameName != "_blank") 30528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainFrame->tree()->setName(frameName); 30538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3054231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block mainFrame->page()->setOpenedByDOM(); 30558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainFrame->loader()->m_client->dispatchShow(); 3056cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!m_suppressOpenerInNewFrame) 3057cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block mainFrame->loader()->setOpener(frame.get()); 3058635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project mainFrame->loader()->loadWithNavigationAction(request, NavigationAction(), false, FrameLoadTypeStandard, formState); 30598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::requestFromDelegate(ResourceRequest& request, unsigned long& identifier, ResourceError& error) 30628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!request.isNull()); 30648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = 0; 30668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 30678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = page->progress()->createUniqueIdentifier(); 3068cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->assignIdentifierToInitialRequest(identifier, m_documentLoader.get(), request); 30698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 30708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest newRequest(request); 3072cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->dispatchWillSendRequest(m_documentLoader.get(), identifier, newRequest, ResourceResponse()); 30738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newRequest.isNull()) 30758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = cancelledError(request); 30768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 30778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = ResourceError(); 30788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request = newRequest; 30808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadedResourceFromMemoryCache(const CachedResource* resource) 30838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3084635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Page* page = m_frame->page(); 3085635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!page) 3086635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 30878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3088635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!resource->sendResourceLoadCallbacks() || m_documentLoader->haveToldClientAboutLoad(resource->url())) 3089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 30908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!page->areMemoryCacheClientCallsEnabled()) { 309265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didLoadResourceFromMemoryCache(page, m_documentLoader.get(), resource); 3093635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->recordMemoryCacheLoadForFutureClientNotification(resource->url()); 3094635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->didTellClientAboutLoad(resource->url()); 30958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3096635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 30978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3098635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(resource->url()); 3099635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize())) { 310065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didLoadResourceFromMemoryCache(page, m_documentLoader.get(), resource); 3101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->didTellClientAboutLoad(resource->url()); 31028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 31038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 31048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier; 31068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceError error; 3107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project requestFromDelegate(request, identifier, error); 310865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::markResourceAsCached(page, identifier); 3109cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, resource->response(), resource->encodedSize(), error); 31108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::applyUserAgent(ResourceRequest& request) 31138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block String userAgent = this->userAgent(request.url()); 31158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!userAgent.isNull()); 31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPUserAgent(userAgent); 31178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool FrameLoader::shouldInterruptLoadForXFrameOptions(const String& content, const KURL& url) 31205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 31215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* topFrame = m_frame->tree()->top(); 31225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame == topFrame) 31235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 31245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (equalIgnoringCase(content, "deny")) 31265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 31275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (equalIgnoringCase(content, "sameorigin")) { 31295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url); 31305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!origin->isSameSchemeHostPort(topFrame->document()->securityOrigin())) 31315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 31325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 31335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 31355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 31365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3137545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::loadProvisionalItemFromCachedPage() 31388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3139545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch DocumentLoader* provisionalLoader = provisionalDocumentLoader(); 3140545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch LOG(PageCache, "WebCorePageCache: Loading provisional DocumentLoader %p with URL '%s' from CachedPage", provisionalDocumentLoader(), provisionalDocumentLoader()->url().string().utf8().data()); 3141231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block provisionalLoader->prepareForLoadStart(); 3143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_loadingFromCachedPage = true; 3145dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 3146dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // Should have timing data from previous time(s) the page was shown. 3147dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch ASSERT(provisionalLoader->timing()->navigationStart); 3148dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch provisionalLoader->resetTiming(); 3149dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch provisionalLoader->timing()->navigationStart = currentTime(); 3150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block provisionalLoader->setCommitted(true); 3152545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch commitProvisionalLoad(); 31538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const 31568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3157cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!history()->currentItem()) 31588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3159cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return url == history()->currentItem()->url() || url == history()->currentItem()->originalURL(); 31608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3162cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid FrameLoader::checkDidPerformFirstNavigation() 31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Page* page = m_frame->page(); 31658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!page) 31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 31678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 316828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!m_didPerformFirstNavigation && page->backForward()->currentItem() && !page->backForward()->backItem() && !page->backForward()->forwardItem()) { 3169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_didPerformFirstNavigation = true; 31708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->didPerformFirstNavigation(); 31718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 31728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoader::findFrameForNavigation(const AtomicString& name) 31758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = m_frame->tree()->find(name); 31775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!shouldAllowNavigation(frame)) 3178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 31795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return frame; 31808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::loadSameDocumentItem(HistoryItem* item) 3183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3184d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(item->documentSequenceNumber() == history()->currentItem()->documentSequenceNumber()); 3185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Save user view state to the current history item here since we don't do a normal load. 3187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Does form state need to be saved here too? 3188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->saveScrollPositionAndViewStateToItem(history()->currentItem()); 3189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (FrameView* view = m_frame->view()) 3190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block view->setWasScrolledByUser(false); 3191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->setCurrentItem(item); 3193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // loadInSameDocument() actually changes the URL and notifies load delegates of a "fake" load 3195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadInSameDocument(item->url(), item->stateObject(), false); 3196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Restore user view state from the current history item here since we don't do a normal load. 3198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->restoreScrollPositionAndViewState(); 3199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 3200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3201cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// FIXME: This function should really be split into a couple pieces, some of 3202cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// which should be methods of HistoryController and some of which should be 3203cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// methods of FrameLoader. 3204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loadType) 3205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Remember this item so we can traverse any child items as child frames load 3207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->setProvisionalItem(item); 3208545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 3209545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (CachedPage* cachedPage = pageCache()->get(item)) { 3210545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch loadWithDocumentLoader(cachedPage->documentLoader(), loadType, 0); 3211545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return; 3212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 32138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL itemURL = item->url(); 32158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL itemOriginalURL = item->originalURL(); 32168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL currentURL; 32178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader()) 32188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentURL = documentLoader()->url(); 32198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormData> formData = item->formData(); 32208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool addedExtraFields = false; 3222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceRequest request(itemURL); 32235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!item->referrer().isNull()) 3225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPReferrer(item->referrer()); 3226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If this was a repost that failed the page cache, we might try to repost the form. 3228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block NavigationAction action; 3229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (formData) { 323021939df44de1705786c545cd1bf519d47250322dBen Murdoch formData->generateFiles(m_frame->document()); 32318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPMethod("POST"); 3233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPBody(formData); 3234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPContentType(item->formContentType()); 3235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString(item->referrer()); 3236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addHTTPOriginIfNeeded(request, securityOrigin->toString()); 32378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Make sure to add extra fields to the request after the Origin header is added for the FormData case. 3239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // See https://bugs.webkit.org/show_bug.cgi?id=22194 for more discussion. 3240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addExtraFieldsToRequest(request, m_loadType, true, formData); 3241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addedExtraFields = true; 32428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Slight hack to test if the NSURL cache contains the page we're going to. 3244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // We want to know this before talking to the policy delegate, since it affects whether 3245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we show the DoYouReallyWantToRepost nag. 3246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // 3247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This trick has a small bug (3123893) where we might find a cache hit, but then 3248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // have the item vanish when we try to use it in the ensuing nav. This should be 3249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // extremely rare, but in that case the user will get an error on the navigation. 32508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (ResourceHandle::willLoadFromCache(request, m_frame)) 3252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemURL, loadType, false); 3253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 3254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReloadIgnoringCacheData); 3255643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemURL, NavigationTypeFormResubmitted); 3256643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 32578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block switch (loadType) { 3259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeReload: 3260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeReloadFromOrigin: 3261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReloadIgnoringCacheData); 3262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeBack: 3264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeBackWMLDeckNotAccessible: 3265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeForward: 3266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeIndexedBackForward: 3267967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // If the first load within a frame is a navigation within a back/forward list that was attached 3268967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // without any of the items being loaded then we should use the default caching policy (<rdar://problem/8131355>). 3269967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (m_stateMachine.committedFirstRealDocumentLoad() && !itemURL.protocolIs("https")) 3270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReturnCacheDataElseLoad); 3271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeStandard: 3273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeRedirectWithLockedBackForwardList: 3274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeSame: 3276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block default: 3277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 32788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 32798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemOriginalURL, loadType, false); 3281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 3282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!addedExtraFields) 3284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addExtraFieldsToRequest(request, m_loadType, true, formData); 32858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadWithNavigationAction(request, action, false, loadType, 0); 3287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 32888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Loads content into this frame, as specified by history item 3290643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType) 3291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 32925e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block HistoryItem* currentItem = history()->currentItem(); 3293a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool sameDocumentNavigation = currentItem && item->shouldDoSameDocumentNavigationTo(currentItem); 32948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(WML) 3296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // All WML decks should go through the real load mechanism, not the scroll-to-anchor code 3297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Why do WML decks have this different behavior? 3298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Are WML decks incompatible with HTML5 pushState/replaceState which require inter-document history navigations? 3299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Should this new API be disabled for WML pages, or does WML need to update their mechanism to act like normal loads? 3300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If scroll-to-anchor navigations were broken for WML and required them to have different loading behavior, then 3301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // state object loads are certainly also broken for them. 3302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (frameContainsWMLContent(m_frame)) 3303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block sameDocumentNavigation = false; 3304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 3305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (sameDocumentNavigation) 3307f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loadSameDocumentItem(item); 3308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else 3309f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loadDifferentDocumentItem(item, loadType); 33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setMainDocumentError(DocumentLoader* loader, const ResourceError& error) 33138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainDocumentError(loader, error); 33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::mainReceivedCompleteError(DocumentLoader* loader, const ResourceError&) 33188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setPrimaryLoadComplete(true); 33208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidLoadMainResource(activeDocumentLoader()); 33218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 33228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 33238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 33248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::mainReceivedError(const ResourceError& error, bool isComplete) 33278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project activeDocumentLoader()->mainReceivedError(error, isComplete); 33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::cancelledError(const ResourceRequest& request) const 33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceError error = m_client->cancelledError(request); 33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error.setIsCancellation(true); 33358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return error; 33368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::blockedError(const ResourceRequest& request) const 33398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->blockedError(request); 33418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::cannotShowURLError(const ResourceRequest& request) const 33448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->cannotShowURLError(request); 33468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerResourceError FrameLoader::interruptionForPolicyChangeError(const ResourceRequest& request) const 33496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 33506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return m_client->interruptForPolicyChangeError(request); 33516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 33526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 33538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::fileDoesNotExistError(const ResourceResponse& response) const 33548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->fileDoesNotExistError(response); 33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoader::shouldUseCredentialStorage(ResourceLoader* loader) 3359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_client->shouldUseCredentialStorage(loader->documentLoader(), loader->identifier()); 3361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 3362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 336321939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(PROTECTION_SPACE_AUTH_CALLBACK) 336421939df44de1705786c545cd1bf519d47250322dBen Murdochbool FrameLoader::canAuthenticateAgainstProtectionSpace(ResourceLoader* loader, const ProtectionSpace& protectionSpace) 336521939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 336621939df44de1705786c545cd1bf519d47250322dBen Murdoch return m_client->canAuthenticateAgainstProtectionSpace(loader->documentLoader(), loader->identifier(), protectionSpace); 336721939df44de1705786c545cd1bf519d47250322dBen Murdoch} 336821939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 336921939df44de1705786c545cd1bf519d47250322dBen Murdoch 33708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setTitle(const String& title) 33718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader()->setTitle(title); 33738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 337521939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoader::setIconURL(const String& iconURL) 337621939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 337721939df44de1705786c545cd1bf519d47250322dBen Murdoch documentLoader()->setIconURL(iconURL); 337821939df44de1705786c545cd1bf519d47250322dBen Murdoch} 337921939df44de1705786c545cd1bf519d47250322dBen Murdoch 33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::originalRequestURL() const 33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequest().url(); 33838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::referrer() const 33868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3387ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return m_documentLoader ? m_documentLoader->request().httpReferrer() : ""; 33888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoader::dispatchDocumentElementAvailable() 33918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 3392231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->injectUserScripts(InjectAtDocumentStart); 33938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_client->documentElementAvailable(); 33948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 33958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3396643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() 33978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_frame->script()->canExecuteScripts(NotAboutToExecuteScript)) 33998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 34008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3401643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Vector<DOMWrapperWorld*> worlds; 3402643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ScriptController::getAllWorlds(worlds); 3403643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (size_t i = 0; i < worlds.size(); ++i) 3404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectInWorld(worlds[i]); 3405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 3406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3407643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world) 3408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_frame->script()->canExecuteScripts(NotAboutToExecuteScript) || !m_frame->script()->existingWindowShell(world)) 3410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 3411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->dispatchDidClearWindowObjectInWorld(world); 34138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(INSPECTOR) 34152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (Page* page = m_frame->page()) 34162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block page->inspectorController()->didClearWindowObjectInWorld(m_frame, world); 34172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 34182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 341965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didClearWindowObjectInWorld(m_frame, world); 34208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3422643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::updateSandboxFlags() 3423643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block SandboxFlags flags = m_forcedSandboxFlags; 3425643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (Frame* parentFrame = m_frame->tree()->parent()) 3426643ca7872b450ea4efacab6188849e5aac2ba161Steve Block flags |= parentFrame->loader()->sandboxFlags(); 3427643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement()) 3428643ca7872b450ea4efacab6188849e5aac2ba161Steve Block flags |= ownerElement->sandboxFlags(); 3429643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3430643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_sandboxFlags == flags) 3431643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 3432d0825bca7fe65beaee391d30da42e937db621564Steve Block 3433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_sandboxFlags = flags; 3434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 3436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block child->loader()->updateSandboxFlags(); 3437d0825bca7fe65beaee391d30da42e937db621564Steve Block} 3438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didChangeTitle(DocumentLoader* loader) 34408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->didChangeTitle(loader); 34428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (loader == m_documentLoader) { 34448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Must update the entries in the back-forward list too. 3445cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->setCurrentItemTitle(loader->title()); 34468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This must go through the WebFrame because it has the right notion of the current b/f item. 34478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setTitle(loader->title(), loader->urlForHistory()); 34488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainFrameDocumentReady(true); // update observers with new DOMDocument 34498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveTitle(loader->title()); 34508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 34518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 345321939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoader::didChangeIcons(DocumentLoader* loader) 345421939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 345521939df44de1705786c545cd1bf519d47250322dBen Murdoch if (loader == m_documentLoader) 345621939df44de1705786c545cd1bf519d47250322dBen Murdoch m_client->dispatchDidChangeIcons(); 345721939df44de1705786c545cd1bf519d47250322dBen Murdoch} 345821939df44de1705786c545cd1bf519d47250322dBen Murdoch 34598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::dispatchDidCommitLoad() 34608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 346106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 34628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 34638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidCommitLoad(); 34658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 346665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didCommitLoad(m_frame, m_documentLoader.get()); 34678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::tellClientAboutPastMemoryCacheLoads() 3470635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame->page()); 3472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame->page()->areMemoryCacheClientCallsEnabled()); 3473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_documentLoader) 3475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 3476635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3477635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<String> pastLoads; 3478635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->takeMemoryCacheLoadsForClientNotification(pastLoads); 3479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3480635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t size = pastLoads.size(); 3481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 0; i < size; ++i) { 348265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CachedResource* resource = memoryCache()->resourceForURL(KURL(ParsedURLString, pastLoads[i])); 3483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: These loads, loaded from cache, but now gone from the cache by the time 3485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Page::setMemoryCacheClientCallsEnabled(true) is called, will not be seen by the client. 3486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Consider if there's some efficient way of remembering enough to deliver this client call. 3487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // We have the URL, but not the rest of the response or the length. 3488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!resource) 3489635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project continue; 3490635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3491635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(resource->url()); 3492635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize()); 3493635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3494635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 3495635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 34965abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickNetworkingContext* FrameLoader::networkingContext() const 34975abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 34985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return m_networkingContext.get(); 34995abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 35005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 35018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool FrameLoaderClient::hasHTMLView() const 35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 35038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 35048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 35058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3506f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickFrame* createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadRequest& request, const WindowFeatures& features, bool& created) 3507f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 3508f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick ASSERT(!features.dialog || request.frameName().isEmpty()); 3509f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3510f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!request.frameName().isEmpty() && request.frameName() != "_blank") { 3511f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Frame* frame = lookupFrame->tree()->find(request.frameName()); 3512f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (frame && openerFrame->loader()->shouldAllowNavigation(frame)) { 3513f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (Page* page = frame->page()) 3514f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->focus(); 3515f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick created = false; 3516f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return frame; 3517f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 3518f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 3519f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3520f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Sandboxed frames cannot open new auxiliary browsing contexts. 3521f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (isDocumentSandboxed(openerFrame, SandboxNavigation)) 3522f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3523f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3524f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // FIXME: Setting the referrer should be the caller's responsibility. 3525f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FrameLoadRequest requestWithReferrer = request; 3526f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick requestWithReferrer.resourceRequest().setHTTPReferrer(openerFrame->loader()->outgoingReferrer()); 3527f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FrameLoader::addHTTPOriginIfNeeded(requestWithReferrer.resourceRequest(), openerFrame->loader()->outgoingOrigin()); 3528f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3529f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Page* oldPage = openerFrame->page(); 3530f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!oldPage) 3531f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3532f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3533e14391e94c850b8bd03680c23b38978db68687a8John Reck NavigationAction action; 3534e14391e94c850b8bd03680c23b38978db68687a8John Reck Page* page = oldPage->chrome()->createWindow(openerFrame, requestWithReferrer, features, action); 3535f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!page) 3536f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3537f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3538f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Frame* frame = page->mainFrame(); 3539f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (request.frameName() != "_blank") 3540f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick frame->tree()->setName(request.frameName()); 3541f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3542f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setToolbarsVisible(features.toolBarVisible || features.locationBarVisible); 3543f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setStatusbarVisible(features.statusBarVisible); 3544f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setScrollbarsVisible(features.scrollbarsVisible); 3545f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setMenubarVisible(features.menuBarVisible); 3546f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setResizable(features.resizable); 3547f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3548f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // 'x' and 'y' specify the location of the window, while 'width' and 'height' 3549f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // specify the size of the page. We can only resize the window, so 3550f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // adjust for the difference between the window size and the page size. 3551f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3552f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FloatRect windowRect = page->chrome()->windowRect(); 3553f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FloatSize pageSize = page->chrome()->pageRect().size(); 3554f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.xSet) 3555f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setX(features.x); 3556f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.ySet) 3557f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setY(features.y); 3558f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.widthSet) 3559f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setWidth(features.width + (windowRect.width() - pageSize.width())); 3560f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.heightSet) 3561f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setHeight(features.height + (windowRect.height() - pageSize.height())); 3562f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setWindowRect(windowRect); 3563f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3564f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->show(); 3565f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3566f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick created = true; 3567f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return frame; 3568f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 3569f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 35708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 3571