FrameLoader.cpp revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
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" 37fd3864ec9aa8cde804c27b9381b4e8a73ccf6583Andrei Popescu#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Archive.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ArchiveFactory.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "BackForwardController.h" 426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "BeforeUnloadEvent.h" 4328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "MemoryCache.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedPage.h" 4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "CachedResourceLoader.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Chrome.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMImplementation.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DOMWindow.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h" 500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "DocumentLoadTiming.h" 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DocumentLoader.h" 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Editor.h" 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EditorClient.h" 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h" 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h" 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FloatRect.h" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FormState.h" 5906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "FormSubmission.h" 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h" 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoadRequest.h" 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoaderClient.h" 635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "FrameNetworkingContext.h" 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameTree.h" 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameView.h" 66cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "HTMLAnchorElement.h" 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFormElement.h" 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h" 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLObjectElement.h" 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTTPParsers.h" 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HistoryItem.h" 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconDatabase.h" 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "IconLoader.h" 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "InspectorController.h" 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorInstrumentation.h" 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Logging.h" 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h" 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MainResourceLoader.h" 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Page.h" 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageCache.h" 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PageGroup.h" 82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "PageTransitionEvent.h" 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PluginData.h" 84cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "PluginDatabase.h" 85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "PluginDocument.h" 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProgressTracker.h" 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceHandle.h" 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ResourceRequest.h" 890617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "SchemeRegistry.h" 90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptController.h" 91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ScriptSourceCode.h" 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SecurityOrigin.h" 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SegmentedString.h" 94dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SerializedScriptValue.h" 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h" 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextResourceDecoder.h" 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "WindowFeatures.h" 98545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "XMLDocumentParser.h" 99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/CurrentTime.h> 100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h> 10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include <wtf/text/CString.h> 102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include <wtf/text/StringConcatenate.h> 10306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 10428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 10528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "HTMLMediaElement.h" 10628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif 10728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 10806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(SHARED_WORKERS) 10906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "SharedWorkerRepository.h" 11006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGDocument.h" 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGLocatable.h" 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGNames.h" 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGPreserveAspectRatio.h" 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGSVGElement.h" 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewElement.h" 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGViewSpec.h" 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TimeCounter.h" 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RenderArena.h" 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace HTMLNames; 13006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG) 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace SVGNames; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(XHTMLMP) 1365f1ab04193ad0130ca8204aadaceae083aca9881Feng 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"; 1375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 1385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const char defaultAcceptHeader[] = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 1395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 14006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic double storedTimeOfLastCompletedLoad; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool isBackForwardLoadType(FrameLoadType type) 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (type) { 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeStandard: 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReload: 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeReloadFromOrigin: 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeSame: 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeRedirectWithLockedBackForwardList: 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReplace: 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeBack: 1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case FrameLoadTypeBackWMLDeckNotAccessible: 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeForward: 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeIndexedBackForward: 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int numRequests(Document* document) 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!document) 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return document->cachedResourceLoader()->requestCount(); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 171e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// This is not in the FrameLoader class to emphasize that it does not depend on 172e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// private FrameLoader data, and to avoid increasing the number of public functions 173e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// with access to private data. Since only this .cpp file needs it, making it 174e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// non-member lets us exclude it from the header file, thus keeping FrameLoader.h's 175e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// API simpler. 176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// 177e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// FIXME: isDocumentSandboxed should eventually replace isSandboxed. 178e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockstatic bool isDocumentSandboxed(Frame* frame, SandboxFlags mask) 179e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{ 180e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return frame->document() && frame->document()->securityOrigin()->isSandboxed(mask); 181e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block} 182e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client) 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_frame(frame) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_client(client) 186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_policyChecker(frame) 187cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_history(frame) 188cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_notifer(frame) 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_writer(frame) 19006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen , m_subframeLoader(frame) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_state(FrameStateCommittedPage) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_loadType(FrameLoadTypeStandard) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_delegateIsHandlingProvisionalLoadError(false) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_quickRedirectComing(false) 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_sentRedirectNotification(false) 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_inStopAllLoaders(false) 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isExecutingJavaScriptFormAction(false) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_didCallImplicitClose(false) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_wasUnloadEventEmitted(false) 2006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_pageDismissalEventBeingDispatched(false) 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isComplete(false) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_isLoadingMainResource(false) 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_needsClear(false) 204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_checkTimer(this, &FrameLoader::checkTimerFired) 205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_shouldCallCheckCompleted(false) 206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_shouldCallCheckLoadComplete(false) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_opener(0) 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_didPerformFirstNavigation(false) 209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_loadingFromCachedPage(false) 210cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_suppressOpenerInNewFrame(false) 211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_sandboxFlags(SandboxAll) 212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_forcedSandboxFlags(SandboxNone) 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoader::~FrameLoader() 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setOpener(0); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashSet<Frame*>::iterator end = m_openedFrames.end(); 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (HashSet<Frame*>::iterator it = m_openedFrames.begin(); it != end; ++it) 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (*it)->loader()->m_opener = 0; 223cad810f21b803229eb11403f9209855525a25d57Steve Block 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->frameLoaderDestroyed(); 2255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (m_networkingContext) 2275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_networkingContext->invalidate(); 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::init() 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23221939df44de1705786c545cd1bf519d47250322dBen Murdoch // Propagate sandbox attributes to this Frameloader and its descendants. 23321939df44de1705786c545cd1bf519d47250322dBen Murdoch // This needs to be done early, so that an initial document gets correct sandbox flags in its SecurityOrigin. 23421939df44de1705786c545cd1bf519d47250322dBen Murdoch updateSandboxFlags(); 23521939df44de1705786c545cd1bf519d47250322dBen Murdoch 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // this somewhat odd set of steps is needed to give the frame an initial empty document 23706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CreatingInitialEmptyDocument); 238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setPolicyDocumentLoader(m_client->createDocumentLoader(ResourceRequest(KURL(ParsedURLString, "")), SubstituteData()).get()); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(m_policyDocumentLoader.get()); 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setResponse(ResourceResponse(KURL(), "text/html", 0, String(), String())); 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->finishedLoading(); 243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->begin(KURL(), false); 244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->end(); 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->cancelParsing(); 24606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocument); 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; 2485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_networkingContext = m_client->createNetworkingContext(); 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setDefersLoading(bool defers) 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->setDefersLoading(defers); 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setDefersLoading(defers); 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader) 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader->setDefersLoading(defers); 260231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!defers) { 262a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->startTimer(); 263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::canHandleRequest(const ResourceRequest& request) 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->canHandleRequest(request); 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::changeLocation(PassRefPtr<SecurityOrigin> securityOrigin, const KURL& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool refresh) 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch urlSelected(FrameLoadRequest(securityOrigin, ResourceRequest(url, referrer, refresh ? ReloadIgnoringCacheData : UseProtocolCachePolicy), "_self"), 276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 0, lockHistory, lockBackForwardList, SendReferrer, ReplaceDocumentIfJavaScriptURL); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 279a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid FrameLoader::urlSelected(const KURL& url, const String& passedTarget, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, ReferrerPolicy referrerPolicy) 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch urlSelected(FrameLoadRequest(m_frame->document()->securityOrigin(), ResourceRequest(url), passedTarget), 282f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch triggeringEvent, lockHistory, lockBackForwardList, referrerPolicy, DoNotReplaceDocumentIfJavaScriptURL); 2836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 285e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// The shouldReplaceDocumentIfJavaScriptURL parameter will go away when the FIXME to eliminate the 286e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block// corresponding parameter from ScriptController::executeIfJavaScriptURL() is addressed. 287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::urlSelected(const FrameLoadRequest& passedRequest, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, ReferrerPolicy referrerPolicy, ShouldReplaceDocumentIfJavaScriptURL shouldReplaceDocumentIfJavaScriptURL) 2886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 289cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(!m_suppressOpenerInNewFrame); 290cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FrameLoadRequest frameRequest(passedRequest); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 293f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (m_frame->script()->executeIfJavaScriptURL(frameRequest.resourceRequest().url(), shouldReplaceDocumentIfJavaScriptURL)) 294f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 296f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frameRequest.frameName().isEmpty()) 297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch frameRequest.setFrameName(m_frame->document()->baseTarget()); 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 299cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (referrerPolicy == NoReferrer) 300cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_suppressOpenerInNewFrame = true; 301f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (frameRequest.resourceRequest().httpReferrer().isEmpty()) 3025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian frameRequest.resourceRequest().setHTTPReferrer(m_outgoingReferrer); 3035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian addHTTPOriginIfNeeded(frameRequest.resourceRequest(), outgoingOrigin()); 3045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 305cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block loadFrameRequest(frameRequest, lockHistory, lockBackForwardList, triggeringEvent, 0, referrerPolicy); 306cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 307cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_suppressOpenerInNewFrame = false; 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid FrameLoader::submitForm(PassRefPtr<FormSubmission> submission) 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->method() == FormSubmission::PostMethod || submission->method() == FormSubmission::GetMethod); 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: Find a good spot for these. 31506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->data()); 31606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->state()); 31706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(submission->state()->sourceFrame() == m_frame); 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->page()) 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (submission->action().isEmpty()) 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 325e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (isDocumentSandboxed(m_frame, SandboxForms)) 326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 327643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 32806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (protocolIsJavaScript(submission->action())) { 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isExecutingJavaScriptFormAction = true; 330a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->script()->executeIfJavaScriptURL(submission->action(), DoNotReplaceDocumentIfJavaScriptURL); 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isExecutingJavaScriptFormAction = false; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen Frame* targetFrame = m_frame->tree()->find(submission->target()); 336692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!shouldAllowNavigation(targetFrame)) 337692e5dbf12901edacf14812a6fae25462920af42Steve Block return; 3385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame) { 339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!DOMWindow::allowPopUp(m_frame) && !isProcessingUserGesture()) 340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 3425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian targetFrame = m_frame; 34306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } else 34406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->clearTarget(); 34506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 3465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame->page()) 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: We'd like to remove this altogether and fix the multiple form submission issue another way. 3505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // We do not want to submit more than one form from the same page, nor do we want to submit a single 3525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // form more than once. This flag prevents these from happening; not sure how other browsers prevent this. 3535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The flag is reset in each time we start handle a new mouse or key down event, and 3545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // also in setView since this part may get reused for a page from the back/forward cache. 3555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The form multi-submit logic here is only needed when we are submitting a form that affects this frame. 3565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: Frame targeting is only one of the ways the submission could end up doing something other 3585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // than replacing this frame's content, so this check is flawed. On the other hand, the check is hardly 3595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // needed any more now that we reset m_submittedFormURL on each mouse or key down event. 3605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame->tree()->isDescendantOf(targetFrame)) { 36206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_submittedFormURL == submission->action()) 3635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 36406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_submittedFormURL = submission->action(); 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 36706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->data()->generateFiles(m_frame->document()); 36806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->setReferrer(m_outgoingReferrer); 36906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen submission->setOrigin(outgoingOrigin()); 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 371a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch targetFrame->navigationScheduler()->scheduleFormSubmission(submission); 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 374231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::stopLoading(UnloadEventPolicy unloadEventPolicy, DatabasePolicy databasePolicy) 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 376545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (m_frame->document() && m_frame->document()->parser()) 377545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->parser()->stopParsing(); 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 379231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (unloadEventPolicy != UnloadEventPolicyNone) { 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) { 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_didCallImplicitClose && !m_wasUnloadEventEmitted) { 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Node* currentFocusedNode = m_frame->document()->focusedNode(); 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (currentFocusedNode) 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentFocusedNode->aboutToUnload(); 3856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = true; 386231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_frame->domWindow()) { 387231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (unloadEventPolicy == UnloadEventPolicyUnloadAndPageHide) 38885893753155358c7010c212d5a5c651d240b7351Patrick Scott m_frame->domWindow()->dispatchEvent(PageTransitionEvent::create(eventNames().pagehideEvent, m_frame->document()->inPageCache()), m_frame->document()); 389967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!m_frame->document()->inPageCache()) { 3904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang RefPtr<Event> unloadEvent(Event::create(eventNames().unloadEvent, false, false)); 3914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // The DocumentLoader (and thus its DocumentLoadTiming) might get destroyed 3924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // while dispatching the event, so protect it to prevent writing the end 3934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // time into freed memory. 394cad810f21b803229eb11403f9209855525a25d57Steve Block RefPtr<DocumentLoader> documentLoader = m_provisionalDocumentLoader; 395cad810f21b803229eb11403f9209855525a25d57Steve Block if (documentLoader && !documentLoader->timing()->unloadEventStart && !documentLoader->timing()->unloadEventEnd) { 3964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DocumentLoadTiming* timing = documentLoader->timing(); 397967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT(timing->navigationStart); 3984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_frame->domWindow()->dispatchTimedEvent(unloadEvent, m_frame->domWindow()->document(), &timing->unloadEventStart, &timing->unloadEventEnd); 3994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(timing->unloadEventStart >= timing->navigationStart); 4004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else 4014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->domWindow()->document()); 402967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch } 403231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 4046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = false; 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) 4065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_frame->document()->updateStyleIfNeeded(); 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_wasUnloadEventEmitted = true; 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Dispatching the unload event could have made m_frame->document() null. 412cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (m_frame->document() && !m_frame->document()->inPageCache()) { 413cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // Don't remove event listeners from a transitional empty document (see bug 28716 for more information). 41406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen bool keepEventListeners = m_stateMachine.isDisplayingInitialEmptyDocument() && m_provisionalDocumentLoader 415cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block && m_frame->document()->securityOrigin()->isSecureTransitionTo(m_provisionalDocumentLoader->url()); 416cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 417cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!keepEventListeners) 418cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->document()->removeAllEventListeners(); 419cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 422231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_isComplete = true; // to avoid calling completed() in finishedParsing() 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = false; 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; // don't want that one either 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document() && m_frame->document()->parsing()) { 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finishedParsing(); 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->setParsing(false); 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = KURL(); 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Document* doc = m_frame->document()) { 4345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // FIXME: HTML5 doesn't tell us to set the state to complete when aborting, but we do anyway to match legacy behavior. 4355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10537 4365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick doc->setReadyState(Document::Complete); 4375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (CachedResourceLoader* cachedResourceLoader = doc->cachedResourceLoader()) 439f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch cachedResourceLoader->cancelRequests(); 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DATABASE) 442e1503159a6023b8eb39fbecadf6986c8ddd862e2Ben Murdoch if (databasePolicy == DatabasePolicyStop) 443d0825bca7fe65beaee391d30da42e937db621564Steve Block doc->stopDatabases(0); 444d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 445d0825bca7fe65beaee391d30da42e937db621564Steve Block UNUSED_PARAM(databasePolicy); 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 44906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: This will cancel redirection timer, which really needs to be restarted when restoring the frame from b/f cache. 450a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::stop() 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // http://bugs.webkit.org/show_bug.cgi?id=10854 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The frame's last ref may be removed and it will be deleted by checkCompleted(). 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protector(m_frame); 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 459545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (m_frame->document()->parser()) 460545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->parser()->stopParsing(); 4618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->finishParsing(); 4628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_iconLoader) 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_iconLoader->stopLoading(); 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::closeURL() 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 469cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->saveDocumentState(); 470231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 471231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Should only send the pagehide event here if the current document exists and has not been placed in the page cache. 472231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Document* currentDocument = m_frame->document(); 473231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block stopLoading(currentDocument && !currentDocument->inPageCache() ? UnloadEventPolicyUnloadAndPageHide : UnloadEventPolicyUnloadOnly); 474231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clearUndoRedoOperations(); 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::iconURL() 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this isn't a top level frame, return nothing 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->tree() && m_frame->tree()->parent()) 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return KURL(); 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we have an iconURL from a Link element, return that 4868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_frame->document()->iconURL().isEmpty()) 487231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return KURL(ParsedURLString, m_frame->document()->iconURL()); 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't return a favicon iconURL unless we're http or https 4905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!m_URL.protocolInHTTPFamily()) 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return KURL(); 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url; 494d0825bca7fe65beaee391d30da42e937db621564Steve Block bool couldSetProtocol = url.setProtocol(m_URL.protocol()); 495d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT_UNUSED(couldSetProtocol, couldSetProtocol); 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.setHost(m_URL.host()); 497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_URL.hasPort()) 498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block url.setPort(m_URL.port()); 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.setPath("/favicon.ico"); 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return url; 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::didOpenURL(const KURL& url) 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 505a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (m_frame->navigationScheduler()->redirectScheduledDuringLoad()) { 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // A redirect was scheduled before the document was created. 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This can happen when one frame changes another frame's location. 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 5095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 511a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clearLastEditCommand(); 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = true; 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we are still in the process of initializing an empty document then 5195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // its frame is not in a consistent state for rendering, so avoid setJSStatusBarText 5205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // since it may cause clients to attempt to render the frame. 52106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.creatingInitialEmptyDocument()) { 52206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (DOMWindow* window = m_frame->existingDOMWindow()) { 52306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setStatus(String()); 52406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setDefaultStatus(String()); 52506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 5265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_URL = url; 5285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_URL.protocolInHTTPFamily() && !m_URL.host().isEmpty() && m_URL.path().isEmpty()) 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_URL.setPath("/"); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = m_URL; 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project started(); 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didExplicitOpen() 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Calling document.open counts as committing the first real document load. 54306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.committedFirstRealDocumentLoad()) 54406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit); 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from a subsequent window.document.open / window.document.write call. 548d0825bca7fe65beaee391d30da42e937db621564Steve Block // Canceling redirection here works for all cases because document.open 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // implicitly precedes document.write. 550a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()->url() != blankURL()) 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_URL = m_frame->document()->url(); 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::cancelAndClear() 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 558a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_isComplete) 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clear(false); 564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->script()->updatePlatformScriptObjects(); 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 567231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::clear(bool clearWindowProperties, bool clearScriptObjects, bool clearFrameView) 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->editor()->clear(); 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_needsClear) 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = false; 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!m_frame->document()->inPageCache()) { 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->cancelParsing(); 577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->document()->stopActiveDOMObjects(); 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()->attached()) { 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->willRemove(); 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->detach(); 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->removeFocusedNodeOfSubtree(m_frame->document()); 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do this after detaching the document so that the unload event works. 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (clearWindowProperties) { 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->clearDOMWindow(); 589e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block m_frame->script()->clearWindowShell(m_frame->document()->inPageCache()); 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->selection()->clear(); 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->eventHandler()->clear(); 594231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (clearFrameView && m_frame->view()) 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->clear(); 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do not drop the document before the ScriptController and view are cleared 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as some destructors might still try to access the document. 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setDocument(0); 600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->clear(); 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 60206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_subframeLoader.clear(); 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (clearScriptObjects) 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->script()->clearScriptObjects(); 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 607a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->clear(); 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 609231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_checkTimer.stop(); 610231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = false; 611231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = false; 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 61306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.isDisplayingInitialEmptyDocument() && m_stateMachine.committedFirstRealDocumentLoad()) 61406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::receivedFirstData() 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 619dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->begin(m_workingURL, false); 620a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch writer()->setDocumentWasLoadedAsPartOfNavigation(); 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dispatchDidCommitLoad(); 623643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectsInAllWorlds(); 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_documentLoader) { 6265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian String ptitle = m_documentLoader->title(); 6275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we have a title let the WebView know about it. 6285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!ptitle.isNull()) 6295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_client->dispatchDidReceiveTitle(ptitle); 6305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = KURL(); 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double delay; 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String url; 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 638cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (m_frame->inViewSourceMode()) 639cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!parseHTTPRefresh(m_documentLoader->response().httpHeaderField("Refresh"), false, delay, url)) 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = m_URL.string(); 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = m_frame->document()->completeURL(url).string(); 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->scheduleRedirect(delay, url); 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::setURL(const KURL& url) 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block KURL ref(url); 654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ref.setUser(String()); 655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ref.setPass(String()); 656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ref.removeFragmentIdentifier(); 657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_outgoingReferrer = ref.string(); 658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_URL = url; 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::didBeginDocument(bool dispatch) 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = true; 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = true; 667a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->document()->setReadyState(Document::Loading); 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 669d0825bca7fe65beaee391d30da42e937db621564Steve Block if (m_pendingStateObject) { 670dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_frame->document()->statePopped(m_pendingStateObject.get()); 671d0825bca7fe65beaee391d30da42e937db621564Steve Block m_pendingStateObject.clear(); 672d0825bca7fe65beaee391d30da42e937db621564Steve Block } 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 674231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (dispatch) 675643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectsInAllWorlds(); 676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 6775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian updateFirstPartyForCookies(); 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Settings* settings = m_frame->document()->settings(); 68092451d3c3cebc17dfa2908de5836d2dae50d4a42Iain Merrick m_frame->document()->cachedResourceLoader()->setAutoLoadImages(settings && settings->loadsImagesAutomatically()); 681eebae91469b8f225fe78e97ce6dae26efcf6da43Steve Block#ifdef ANDROID_BLOCK_NETWORK_IMAGE 68292451d3c3cebc17dfa2908de5836d2dae50d4a42Iain Merrick m_frame->document()->cachedResourceLoader()->setBlockNetworkImage(settings && settings->blockNetworkImage()); 683eebae91469b8f225fe78e97ce6dae26efcf6da43Steve Block#endif 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) { 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String dnsPrefetchControl = m_documentLoader->response().httpHeaderField("X-DNS-Prefetch-Control"); 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dnsPrefetchControl.isEmpty()) 688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_frame->document()->parseDNSPrefetchControlHeader(dnsPrefetchControl); 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 691cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->restoreDocumentState(); 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::didEndDocument() 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isLoadingMainResource = false; 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::iconLoadDecisionAvailable() 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_mayLoadIconLater) 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(IconDatabase, "FrameLoader %p was told a load decision is available for its icon", this); 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project startIconLoader(); 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mayLoadIconLater = false; 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::startIconLoader() 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: We kick off the icon loader when the frame is done receiving its main resource. 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // But we should instead do it when we're done parsing the head element. 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!isLoadingMainFrame()) 7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!iconDatabase() || !iconDatabase()->isEnabled()) 7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url(iconURL()); 7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String urlString(url.string()); 7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (urlString.isEmpty()) 7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 724635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (loadType() != FrameLoadTypeReload && loadType() != FrameLoadTypeReloadFromOrigin) { 7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project IconLoadDecision decision = iconDatabase()->loadDecisionForIconURL(urlString, m_documentLoader.get()); 7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decision == IconLoadNo) { 7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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()); 7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project commitIconURLToIconDatabase(url); 7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We were told not to load this icon - that means this icon is already known by the database 7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // has done it. This is after registering for the notification so the WebView can call the appropriate delegate method. 7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise if the icon data *is* available, notify the delegate 7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!iconDatabase()->iconDataKnownForIconURL(urlString)) { 7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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()); 7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->registerForIconNotification(); 7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iconDatabase()->iconForPageURL(m_URL.string(), IntSize(0, 0)); 7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iconDatabase()->iconForPageURL(originalRequestURL().string(), IntSize(0, 0)); 7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveIcon(); 7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (decision == IconLoadUnknown) { 7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // icon is later read in from disk 7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(IconDatabase, "FrameLoader %p might load icon %s later", this, urlString.ascii().data()); 7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mayLoadIconLater = true; 7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->registerForIconNotification(); 7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project commitIconURLToIconDatabase(url); 7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // People who want to avoid loading images generally want to avoid loading all images. 7590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Now that we've accounted for URL mapping, avoid starting the network load if images aren't set to display automatically. 7600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Settings* settings = m_frame->settings(); 7610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (settings && !settings->loadsImagesAutomatically()) 7620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 7630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is either a reload or the icon database said "yes, load the icon", so kick off the load! 7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_iconLoader) 766e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_iconLoader = IconLoader::create(m_frame); 7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_iconLoader->startLoading(); 7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::commitIconURLToIconDatabase(const KURL& icon) 7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(iconDatabase()); 7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(IconDatabase, "Committing iconURL %s to database for pageURLs %s and %s", icon.string().ascii().data(), m_URL.string().ascii().data(), originalRequestURL().string().ascii().data()); 7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iconDatabase()->setIconURLForPageURL(icon.string(), m_URL.string()); 7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project iconDatabase()->setIconURLForPageURL(icon.string(), originalRequestURL().string()); 7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedParsing() 7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 78106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 784231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->injectUserScripts(InjectAtDocumentEnd); 785231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This can be called from the Frame's destructor, in which case we shouldn't protect ourselves 7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // because doing so will cause us to re-enter the destructor when protector goes out of scope. 7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Null-checking the FrameView indicates whether or not we're in the destructor. 7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protector = m_frame->view() ? m_frame : 0; 7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 791635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidFinishDocumentLoad(); 792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->view()) 7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // We are being destroyed by something checkCompleted called. 7978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if the scrollbars are really needed for the content. 7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If not, remove them, relayout, and repaint. 8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->restoreScrollbar(); 801cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->view()->scrollToFragment(m_URL); 8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadDone() 8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 8068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian checkCompleted(); 8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 809231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::allChildrenAreComplete() const 810231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 811231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) { 812231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!child->loader()->m_isComplete) 813231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 814231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 815231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 816231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 817231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 818231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::allAncestorsAreComplete() const 819231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 820231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (Frame* ancestor = m_frame; ancestor; ancestor = ancestor->tree()->parent()) { 821231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!ancestor->loader()->m_isComplete) 822231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; 823231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 824231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 825231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 826231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkCompleted() 8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 829231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = false; 830231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 8318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->view()) 8328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->view()->checkStopDelayingDeferredRepaints(); 8338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Any frame that hasn't completed yet? 835231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!allChildrenAreComplete()) 836231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Have we completed before? 8398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_isComplete) 8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Are we still parsing? 8438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->document()->parsing()) 8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Still waiting for images/scripts? 8478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (numRequests(m_frame->document())) 8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 8498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Still waiting for elements that don't go through a FrameLoader? 8515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_frame->document()->isDelayingLoadEvent()) 8525ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 8535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // OK, completed. 8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = true; 8565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick m_frame->document()->setReadyState(Document::Complete); 8578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCallImplicitClose(); // if we didn't do it before 8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 861a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->startTimer(); 8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project completed(); 8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkTimerFired(Timer<FrameLoader>*) 8698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 870231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (Page* page = m_frame->page()) { 871231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (page->defersLoading()) 872231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 873231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 874231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_shouldCallCheckCompleted) 875231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block checkCompleted(); 876231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_shouldCallCheckLoadComplete) 877231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block checkLoadComplete(); 8788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 880231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::startCheckCompleteTimer() 8818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 882231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!(m_shouldCallCheckCompleted || m_shouldCallCheckLoadComplete)) 883231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 884231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_checkTimer.isActive()) 885231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 886231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_checkTimer.startOneShot(0); 8878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 889231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::scheduleCheckCompleted() 8908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 891231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckCompleted = true; 892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::scheduleCheckLoadComplete() 8968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 897231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = true; 898231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block startCheckCompleteTimer(); 8998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkCallImplicitClose() 9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (m_didCallImplicitClose || m_frame->document()->parsing() || m_frame->document()->isDelayingLoadEvent()) 9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 906231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!allChildrenAreComplete()) 907231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; // still got a frame running -> too early 9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = true; 9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_wasUnloadEventEmitted = false; 9118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->implicitClose(); 9128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::baseURL() const 9158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->document()); 9178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame->document()->baseURL(); 9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::completeURL(const String& url) 9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->document()); 9238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_frame->document()->completeURL(url); 9248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadURLIntoChildFrame(const KURL& url, const String& referer, Frame* childFrame) 9278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(childFrame); 9298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 930e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size 931f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Archive> subframeArchive = activeDocumentLoader()->popArchiveForSubframe(childFrame->tree()->uniqueName()); 932f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (subframeArchive) { 933f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadArchive(subframeArchive.release()); 934f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 935f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 936e7bbc0900fd93114f04d2690ce8eab67b784b8c8Ben Murdoch#endif 9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch HistoryItem* parentItem = history()->currentItem(); 9398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // If we're moving in the back/forward list, we might want to replace the content 9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // of this child frame with whatever was there at that point. 941f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (parentItem && parentItem->children().size() && isBackForwardLoadType(loadType())) { 94228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu HistoryItem* childItem = parentItem->childItemWithTarget(childFrame->tree()->uniqueName()); 9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (childItem) { 944f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadDifferentDocumentItem(childItem, loadType()); 945f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 9468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 9488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 949f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch childFrame->loader()->loadURL(url, referer, String(), false, FrameLoadTypeRedirectWithLockedBackForwardList, 0, 0); 9508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size 9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadArchive(PassRefPtr<Archive> prpArchive) 9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Archive> archive = prpArchive; 9568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ArchiveResource* mainResource = archive->mainResource(); 9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(mainResource); 9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mainResource) 9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SubstituteData substituteData(mainResource->data(), mainResource->mimeType(), mainResource->textEncoding(), KURL()); 9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request(mainResource->url()); 9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.applyWebArchiveHackForMail(); 9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 9688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> documentLoader = m_client->createDocumentLoader(request, substituteData); 9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader->addAllArchiveResources(archive.get()); 9718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project load(documentLoader.get()); 9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 975cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve BlockObjectContentType FrameLoader::defaultObjectContentType(const KURL& url, const String& mimeTypeIn) 976cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 977cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block String mimeType = mimeTypeIn; 97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String extension = url.path().substring(url.path().reverseFind('.') + 1); 97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 980cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // We don't use MIMETypeRegistry::getMIMETypeForPath() because it returns "application/octet-stream" upon failure 981cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (mimeType.isEmpty()) 98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mimeType = MIMETypeRegistry::getMIMETypeForExtension(extension); 98365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 98465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !PLATFORM(MAC) && !PLATFORM(CHROMIUM) && !PLATFORM(EFL) // Mac has no PluginDatabase, nor does Chromium or EFL 98565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (mimeType.isEmpty()) 98665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mimeType = PluginDatabase::installedPlugins()->MIMETypeForExtension(extension); 98765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 988cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 989cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (mimeType.isEmpty()) 990cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return ObjectContentFrame; // Go ahead and hope that we can display the content. 991cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 992cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType)) 993cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentImage; 994cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 99521939df44de1705786c545cd1bf519d47250322dBen Murdoch#if !PLATFORM(MAC) && !PLATFORM(CHROMIUM) && !PLATFORM(EFL) // Mac has no PluginDatabase, nor does Chromium or EFL 996cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType)) 997cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentNetscapePlugin; 998cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#endif 999cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1000cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType)) 1001cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentFrame; 1002cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1003cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return WebCore::ObjectContentNone; 1004cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 1005cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::outgoingReferrer() const 10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_outgoingReferrer; 10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::outgoingOrigin() const 10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_frame->document()->securityOrigin()->toString(); 10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1016231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::isMixedContent(SecurityOrigin* context, const KURL& url) 1017231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1018231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (context->protocol() != "https") 1019231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; // We only care about HTTPS security origins. 1020231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen if (!url.isValid() || SchemeRegistry::shouldTreatURLSchemeAsSecure(url.protocol())) 1022231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return false; // Loading these protocols is secure. 1023231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1024231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 1025231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1026231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1027231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkIfDisplayInsecureContent(SecurityOrigin* context, const KURL& url) 1028231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1029231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isMixedContent(context, url)) 1030231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1031231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1032a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch String message = makeString("The page at ", m_URL.string(), " displayed insecure content from ", url.string(), ".\n"); 1033cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String()); 1034cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1035231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->didDisplayInsecureContent(); 1036231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1037231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1038231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::checkIfRunInsecureContent(SecurityOrigin* context, const KURL& url) 1039231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 1040231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isMixedContent(context, url)) 1041231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1042231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1043a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch String message = makeString("The page at ", m_URL.string(), " ran insecure content from ", url.string(), ".\n"); 1044cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, WarningMessageLevel, message, 1, String()); 1045cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1046231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->didRunInsecureContent(context); 1047231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 1048231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoader::opener() 10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_opener; 10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setOpener(Frame* opener) 10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_opener) 10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_opener->loader()->m_openedFrames.remove(m_frame); 10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (opener) 10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project opener->loader()->m_openedFrames.add(m_frame); 10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_opener = opener; 10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->document()) { 10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->document()->initSecurityContext(); 10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setSecurityOrigin(m_frame->document()->securityOrigin()); 10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// FIXME: This does not belong in FrameLoader! 10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::handleFallbackContent() 10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* owner = m_frame->ownerElement(); 10728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!owner || !owner->hasTagName(objectTag)) 10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 10748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static_cast<HTMLObjectElement*>(owner)->renderFallbackContent(); 10758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::provisionalLoadStarted() 10785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->tree()->parent()) 10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project android::TimeCounter::reset(); 10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 108306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.firstLayoutDone()) 108406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); 1085a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(true); 10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->provisionalLoadStarted(); 10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool FrameLoader::isProcessingUserGesture() 10908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Frame* frame = m_frame->tree()->top(); 1092dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!frame->script()->canExecuteScripts(NotAboutToExecuteScript)) 1093635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; // If JavaScript is disabled, a user gesture must have initiated the navigation. 1094f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return ScriptController::processingUserGesture(); // FIXME: Use pageIsProcessingUserGesture. 10958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 10968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::resetMultipleFormSubmissionProtection() 10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_submittedFormURL = KURL(); 11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid FrameLoader::willSetEncoding() 11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_workingURL.isEmpty()) 11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project receivedFirstData(); 11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(WML) 11090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic inline bool frameContainsWMLContent(Frame* frame) 11100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 11110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Document* document = frame ? frame->document() : 0; 11120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!document) 11130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return false; 11140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return document->containsWMLContent() || document->isWMLDocument(); 11160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 11170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 11180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 11195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::updateFirstPartyForCookies() 11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_frame->tree()->parent()) 11225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setFirstPartyForCookies(m_frame->tree()->parent()->document()->firstPartyForCookies()); 11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 11245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian setFirstPartyForCookies(m_URL); 11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::setFirstPartyForCookies(const KURL& url) 11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 11295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_frame->document()->setFirstPartyForCookies(url); 11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 11315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian child->loader()->setFirstPartyForCookies(url); 11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 11338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This does the same kind of work that didOpenURL does, except it relies on the fact 11358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// that a higher level already checked that the URLs match and the scrolling is the right thing to do. 1136643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::loadInSameDocument(const KURL& url, SerializedScriptValue* stateObject, bool isNewNavigation) 1137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 1138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If we have a state object, we cannot also be a new navigation. 1139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!stateObject || (stateObject && !isNewNavigation)); 1140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Update the data source's request with the new URL to fake the URL change 1142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_frame->document()->setURL(url); 1143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block documentLoader()->replaceRequestURLForSameDocumentNavigation(url); 1144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (isNewNavigation && !shouldTreatURLAsSameAsCurrent(url) && !stateObject) { 1145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NB: must happen after replaceRequestURLForSameDocumentNavigation(), since we add 1146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // based on the current request. Must also happen before we openURL and displace the 1147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // scroll position, since adding the BF item will save away scroll state. 1148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // NB2: If we were loading a long, slow doc, and the user anchor nav'ed before 1150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // it was done, currItem is now set the that slow doc, and prevItem is whatever was 1151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // before it. Adding the b/f item will bump the slow doc down to prevItem, even 1152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // though its load is not yet done. I think this all works out OK, for one because 1153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we have already saved away the scroll and doc state for the long slow load, 1154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // but it's not an obvious case. 1155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->updateBackForwardListForFragmentScroll(); 11570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 11580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block String oldURL; 1160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool hashChange = equalIgnoringFragmentIdentifier(url, m_URL) && url.fragmentIdentifier() != m_URL.fragmentIdentifier(); 1161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block oldURL = m_URL; 1162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_URL = url; 1164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->updateForSameDocumentNavigation(); 11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor 1167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (hashChange) 1168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_frame->eventHandler()->stopAutoscrollTimer(); 1169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's important to model this as a load that starts and immediately finishes. 11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Otherwise, the parent frame may think we never finished loading. 1172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block started(); 1173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // We need to scroll to the fragment whether or not a hash change occurred, since 1175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // the user might have scrolled since the previous navigation. 1176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (FrameView* view = m_frame->view()) 1177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block view->scrollToFragment(m_URL); 1178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 1181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (isNewNavigation) { 1183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This will clear previousItem from the rest of the frame tree that didn't 1184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // doing any loading. We need to make a pass on this now, since for anchor nav 1185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we'll not go through a real load and reach Completed state. 1186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block checkLoadComplete(); 1187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_client->dispatchDidNavigateWithinPage(); 1190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 11915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_frame->document()->statePopped(stateObject ? stateObject : SerializedScriptValue::nullValue()); 11925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen m_client->dispatchDidPopStateWithinPage(); 1193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (hashChange) { 1195545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_frame->document()->enqueueHashchangeEvent(oldURL, url); 1196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->dispatchDidChangeLocationWithinPage(); 1197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FrameLoaderClient::didFinishLoad() tells the internal load delegate the load finished with no error 1200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->didFinishLoad(); 12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isComplete() const 12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_isComplete; 12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::completed() 12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 1211cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1212cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block for (Frame* descendant = m_frame->tree()->traverseNext(m_frame); descendant; descendant = descendant->tree()->traverseNext(m_frame)) 1213a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch descendant->navigationScheduler()->startTimer(); 1214cad810f21b803229eb11403f9209855525a25d57Steve Block 12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) 12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->checkCompleted(); 1217cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 12185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame->view()) 12190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_frame->view()->maintainScrollPositionAtAnchor(0); 12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::started() 12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* frame = m_frame; frame; frame = frame->tree()->parent()) 12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frame->loader()->m_isComplete = false; 12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::prepareForLoadStart() 12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressStarted(m_frame); 12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidStartProvisionalLoad(); 12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setupForReplace() 12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader = m_documentLoader; 12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader = 0; 12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setupForReplaceByMIMEType(const String& newMIMEType) 12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project activeDocumentLoader()->setupForReplaceByMIMEType(newMIMEType); 12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// This is a hack to allow keep navigation to http/https feeds working. To remove this 12495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// we need to introduce new API akin to registerURLSchemeAsLocal, that registers a 12505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// protocols navigation policy. 12515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic bool isFeedWithNestedProtocolInHTTPFamily(const KURL& url) 12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 12535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const String& urlString = url.string(); 12545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!urlString.startsWith("feed", false)) 12555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 12565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 12575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return urlString.startsWith("feed://", false) 12585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feed:http:", false) || urlString.startsWith("feed:https:", false) 12595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feeds:http:", false) || urlString.startsWith("feeds:https:", false) 12605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian || urlString.startsWith("feedsearch:http:", false) || urlString.startsWith("feedsearch:https:", false); 12615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 12625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 12635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHistory, bool lockBackForwardList, 1264cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block PassRefPtr<Event> event, PassRefPtr<FormState> formState, ReferrerPolicy referrerPolicy) 12655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url = request.resourceRequest().url(); 1267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1268f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ASSERT(m_frame->document()); 1269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: Should we move the isFeedWithNestedProtocolInHTTPFamily logic inside SecurityOrigin::canDisplay? 1270f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!isFeedWithNestedProtocolInHTTPFamily(url) && !request.requester()->canDisplay(url)) { 1271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch reportLocalLoadFailed(m_frame, url.string()); 1272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 1273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 1274f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String referrer; 12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String argsReferrer = request.resourceRequest().httpReferrer(); 12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!argsReferrer.isEmpty()) 12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = argsReferrer; 12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = m_outgoingReferrer; 1281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1282cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (SecurityOrigin::shouldHideReferrer(url, referrer) || referrerPolicy == NoReferrer) 12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = String(); 12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FrameLoadType loadType; 1286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData) 1287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeReload; 1288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else if (lockBackForwardList) 1289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeRedirectWithLockedBackForwardList; 1290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 1291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadType = FrameLoadTypeStandard; 12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (request.resourceRequest().httpMethod() == "POST") 12945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadPostRequest(request.resourceRequest(), referrer, request.frameName(), lockHistory, loadType, event, formState.get()); 1295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 12965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadURL(request.resourceRequest().url(), referrer, request.frameName(), lockHistory, loadType, event, formState.get()); 12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: It's possible this targetFrame will not be the same frame that was targeted by the actual 12995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // load if frame names have changed. 13005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* sourceFrame = formState ? formState->sourceFrame() : m_frame; 13015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* targetFrame = sourceFrame->loader()->findFrameForNavigation(request.frameName()); 13025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (targetFrame && targetFrame != sourceFrame) { 13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = targetFrame->page()) 13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->chrome()->focus(); 13055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::loadURL(const KURL& newURL, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType newLoadType, 13095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian PassRefPtr<Event> event, PassRefPtr<FormState> prpFormState) 13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isFormSubmission = formState; 13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request(newURL); 13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) { 13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPReferrer(referrer); 13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<SecurityOrigin> referrerOrigin = SecurityOrigin::createFromString(referrer); 13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(request, referrerOrigin->toString()); 13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, newLoadType, true, event || isFormSubmission); 1321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (newLoadType == FrameLoadTypeReload || newLoadType == FrameLoadTypeReloadFromOrigin) 13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReloadIgnoringCacheData); 13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(newLoadType != FrameLoadTypeSame); 13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The search for a target frame is done earlier in the case of form submission. 13275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* targetFrame = isFormSubmission ? 0 : findFrameForNavigation(frameName); 13285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (targetFrame && targetFrame != m_frame) { 13295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian targetFrame->loader()->loadURL(newURL, referrer, String(), lockHistory, newLoadType, event, formState.release()); 13305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 13315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 13325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 13336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 1334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1335231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 13368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NavigationAction action(newURL, newLoadType, isFormSubmission, event); 13378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!targetFrame && !frameName.isEmpty()) { 1339231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy, 1340231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block request, formState.release(), frameName, this); 13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader; 13458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool sameURL = shouldTreatURLAsSameAsCurrent(newURL); 1347cad810f21b803229eb11403f9209855525a25d57Steve Block const String& httpMethod = request.httpMethod(); 13488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure to do scroll to anchor processing even if the URL is 13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // exactly the same so pages with '#' links and DHTML side effects 13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // work properly. 1352cad810f21b803229eb11403f9209855525a25d57Steve Block if (shouldScrollToAnchor(isFormSubmission, httpMethod, newLoadType, newURL)) { 13538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldDocumentLoader->setTriggeringAction(action); 1354231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 1355231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->setLoadType(newLoadType); 1356231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(request, oldDocumentLoader.get(), formState.release(), 13578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueFragmentScrollAfterNavigationPolicy, this); 13588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // must grab this now, since this load may stop the previous load and clear this flag 13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isRedirect = m_quickRedirectComing; 13615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian loadWithNavigationAction(request, action, lockHistory, newLoadType, formState.release()); 13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isRedirect) { 13638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 13648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 13658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->setIsClientRedirect(true); 13668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (sameURL) 13678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Example of this case are sites that reload the same URL with a different cookie 13688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // driving the generated content, or a master frame with links that drive a target 13698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frame, where the user has clicked on the same link repeatedly. 13708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeSame; 13718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, bool lockHistory) 13758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(request, SubstituteData(), lockHistory); 13778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, const SubstituteData& substituteData, bool lockHistory) 13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inStopAllLoaders) 13828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 13838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: is this the right place to reset loadType? Perhaps this should be done after loading is finished or aborted. 13858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeStandard; 1386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, substituteData); 13878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (lockHistory && m_documentLoader) 13888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian loader->setClientRedirectSourceForHistory(m_documentLoader->didCreateGlobalHistoryEntry() ? m_documentLoader->urlForHistory() : m_documentLoader->clientRedirectSourceForHistory()); 1389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(loader.get()); 13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::load(const ResourceRequest& request, const String& frameName, bool lockHistory) 13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frameName.isEmpty()) { 1395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project load(request, lockHistory); 13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 13998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = findFrameForNavigation(frameName); 14008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frame) { 1401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project frame->loader()->load(request, lockHistory); 14028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 14038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1405231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(NavigationAction(request.url(), NavigationTypeOther), FrameLoader::callContinueLoadAfterNewWindowPolicy, request, 0, frameName, this); 14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const NavigationAction& action, bool lockHistory, FrameLoadType type, PassRefPtr<FormState> formState) 14098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, SubstituteData()); 14118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (lockHistory && m_documentLoader) 14128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian loader->setClientRedirectSourceForHistory(m_documentLoader->didCreateGlobalHistoryEntry() ? m_documentLoader->urlForHistory() : m_documentLoader->clientRedirectSourceForHistory()); 14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setTriggeringAction(action); 14158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadWithDocumentLoader(loader.get(), type, formState); 14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::load(DocumentLoader* newDocumentLoader) 14228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest& r = newDocumentLoader->request(); 1424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToMainResourceRequest(r); 14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoadType type; 14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldTreatURLAsSameAsCurrent(newDocumentLoader->originalRequest().url())) { 14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project r.setCachePolicy(ReloadIgnoringCacheData); 14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeSame; 14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeStandard; 14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When we loading alternate content for an unreachable URL that we're 14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // visiting in the history list, we treat it as a reload so the history list 14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is appropriately maintained. 14398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 14408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This seems like a dangerous overloading of the meaning of "FrameLoadTypeReload" ... 14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // shouldn't a more explicit type of reload be defined, that means roughly 14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // "load without affecting history" ? 14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldReloadToHandleUnreachableURL(newDocumentLoader)) { 14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(type == FrameLoadTypeStandard); 14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project type = FrameLoadTypeReload; 14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 14478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loadWithDocumentLoader(newDocumentLoader, type, 0); 14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType type, PassRefPtr<FormState> prpFormState) 14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1453e14391e94c850b8bd03680c23b38978db68687a8John Reck // Retain because dispatchBeforeLoadEvent may release the last reference to it. 1454e14391e94c850b8bd03680c23b38978db68687a8John Reck RefPtr<Frame> protect(m_frame); 1455e14391e94c850b8bd03680c23b38978db68687a8John Reck 14568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Unfortunately the view must be non-nil, this is ultimately due 14598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to parser requiring a FrameView. We should fix this dependency. 14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->view()); 14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 1464231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return; 1465231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1466cad810f21b803229eb11403f9209855525a25d57Steve Block if (m_frame->document()) 1467cad810f21b803229eb11403f9209855525a25d57Steve Block m_previousUrl = m_frame->document()->url(); 1468cad810f21b803229eb11403f9209855525a25d57Steve Block 1469231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->setLoadType(type); 14708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 14718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isFormSubmission = formState; 14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& newURL = loader->request().url(); 1474cad810f21b803229eb11403f9209855525a25d57Steve Block const String& httpMethod = loader->request().httpMethod(); 14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1476cad810f21b803229eb11403f9209855525a25d57Steve Block if (shouldScrollToAnchor(isFormSubmission, httpMethod, policyChecker()->loadType(), newURL)) { 14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader; 1478231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NavigationAction action(newURL, policyChecker()->loadType(), isFormSubmission); 14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oldDocumentLoader->setTriggeringAction(action); 1481231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 1482231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(loader->request(), oldDocumentLoader.get(), formState, 14838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueFragmentScrollAfterNavigationPolicy, this); 14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) 14868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(parent->loader()->documentLoader()->overrideEncoding()); 14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(loader); 14905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (loader->triggeringAction().isEmpty()) 1491231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block loader->setTriggeringAction(NavigationAction(newURL, policyChecker()->loadType(), isFormSubmission)); 14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1493cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (Element* ownerElement = m_frame->document()->ownerElement()) { 1494cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!ownerElement->dispatchBeforeLoadEvent(loader->request().url().string())) { 1495cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block continueLoadAfterNavigationPolicy(loader->request(), formState, false); 1496cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return; 1497cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 1498cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 1499cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1500231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNavigationPolicy(loader->request(), loader, formState, 15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callContinueLoadAfterNavigationPolicy, this); 15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::reportLocalLoadFailed(Frame* frame, const String& url) 15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!url.isEmpty()); 15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frame) 15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch frame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "Not allowed to load local resource: " + url, 0, String()); 15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst ResourceRequest& FrameLoader::initialRequest() const 15158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequest(); 15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1519231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool FrameLoader::willLoadMediaElementURL(KURL& url) 15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1521231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ResourceRequest request(url); 15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1523231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block unsigned long identifier; 1524231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ResourceError error; 1525231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block requestFromDelegate(request, identifier, error); 1526cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, ResourceResponse(url, String(), -1, String(), String()), -1, error); 15278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1528231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block url = request.url(); 1529231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 1530231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return error.isNull(); 15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldReloadToHandleUnreachableURL(DocumentLoader* docLoader) 15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = docLoader->unreachableURL(); 15368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (unreachableURL.isEmpty()) 15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 15398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1540231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!isBackForwardLoadType(policyChecker()->loadType())) 15418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 15428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We only treat unreachableURLs specially during the delegate callbacks 15448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for provisional load errors and navigation policy decisions. The former 15458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // case handles well-formed URLs that can't be loaded, and the latter 15468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // case handles malformed URLs and unknown schemes. Loading alternate content 15478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // at other times behaves like a standard load. 15488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* compareDocumentLoader = 0; 1549231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (policyChecker()->delegateIsDecidingNavigationPolicy() || policyChecker()->delegateIsHandlingUnimplementablePolicy()) 15508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project compareDocumentLoader = m_policyDocumentLoader.get(); 15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (m_delegateIsHandlingProvisionalLoadError) 15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project compareDocumentLoader = m_provisionalDocumentLoader.get(); 15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return compareDocumentLoader && unreachableURL == compareDocumentLoader->request().url(); 15558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::reloadWithOverrideEncoding(const String& encoding) 15588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 15608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest request = m_documentLoader->request(); 15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = m_documentLoader->unreachableURL(); 15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty()) 15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setURL(unreachableURL); 15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReturnCacheDataElseLoad); 15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, SubstituteData()); 15708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(loader.get()); 15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(encoding); 15738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithDocumentLoader(loader.get(), FrameLoadTypeReload, 0); 15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::reload(bool endToEndReload) 15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_documentLoader) 15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If a window is created by javascript, its main frame can have an empty but non-nil URL. 15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Reloading in this case will lose the current contents (see 4151001). 1584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_documentLoader->request().url().isEmpty()) 15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1587635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest initialRequest = m_documentLoader->request(); 1588635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Replace error-page URL with the URL we were trying to reach. 15908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL unreachableURL = m_documentLoader->unreachableURL(); 15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty()) 1592635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project initialRequest.setURL(unreachableURL); 15938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Create a new document loader for the reload, this will become m_documentLoader eventually, 15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // but first it has to be the "policy" document loader, and then the "provisional" document loader. 15968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(initialRequest, SubstituteData()); 15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest& request = loader->request(); 15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1600635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: We don't have a mechanism to revalidate the main resource without reloading at the moment. 16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setCachePolicy(ReloadIgnoringCacheData); 16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we're about to re-post, set up action so the application can warn the user. 16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (request.httpMethod() == "POST") 16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setTriggeringAction(NavigationAction(request.url(), NavigationTypeFormResubmitted)); 16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setOverrideEncoding(m_documentLoader->overrideEncoding()); 16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1609635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithDocumentLoader(loader.get(), endToEndReload ? FrameLoadTypeReloadFromOrigin : FrameLoadTypeReload, 0); 16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool canAccessAncestor(const SecurityOrigin* activeSecurityOrigin, Frame* targetFrame) 16138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // targetFrame can be NULL when we're trying to navigate a top-level frame 16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that has a NULL opener. 16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame) 16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke const bool isLocalActiveOrigin = activeSecurityOrigin->isLocal(); 16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* ancestorFrame = targetFrame; ancestorFrame; ancestorFrame = ancestorFrame->tree()->parent()) { 16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* ancestorDocument = ancestorFrame->document(); 16228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!ancestorDocument) 16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const SecurityOrigin* ancestorSecurityOrigin = ancestorDocument->securityOrigin(); 16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (activeSecurityOrigin->canAccess(ancestorSecurityOrigin)) 16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 16295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke // Allow file URL descendant navigation even when allowFileAccessFromFileURLs is false. 16305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (isLocalActiveOrigin && ancestorSecurityOrigin->isLocal()) 16315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return true; 16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldAllowNavigation(Frame* targetFrame) const 16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The navigation change is safe if the active frame is: 16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - in the same security origin as the target or one of the target's 16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ancestors. 16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 16438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Or the target frame is: 16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // - a top-level frame in the frame hierarchy and the active frame can 1645231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // navigate the target frame's opener per above or it is the opener of 1646231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // the target frame. 16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame) 16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Performance optimization. 16528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame == targetFrame) 16538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Let a frame navigate the top-level window that contains it. This is 16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // important to allow because it lets a site "frame-bust" (escape from a 16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frame created by another web site). 1658e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (!isDocumentSandboxed(m_frame, SandboxTopNavigation) && targetFrame == m_frame->tree()->top()) 16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1661dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // A sandboxed frame can only navigate itself and its descendants. 1662e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (isDocumentSandboxed(m_frame, SandboxNavigation) && !targetFrame->tree()->isDescendantOf(m_frame)) 1663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 1664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1665231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Let a frame navigate its opener if the opener is a top-level window. 1666231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (!targetFrame->tree()->parent() && m_frame->loader()->opener() == targetFrame) 1667231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return true; 1668231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 16698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* activeDocument = m_frame->document(); 16708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(activeDocument); 16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const SecurityOrigin* activeSecurityOrigin = activeDocument->securityOrigin(); 16728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For top-level windows, check the opener. 16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!targetFrame->tree()->parent() && canAccessAncestor(activeSecurityOrigin, targetFrame->loader()->opener())) 16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // In general, check the frame's ancestors. 16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (canAccessAncestor(activeSecurityOrigin, targetFrame)) 16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Settings* settings = targetFrame->settings(); 16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (settings && !settings->privateBrowsingEnabled()) { 16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* targetDocument = targetFrame->document(); 16848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: this error message should contain more specifics of why the navigation change is not allowed. 1685a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch String message = makeString("Unsafe JavaScript attempt to initiate a navigation change for frame with URL ", 1686a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch targetDocument->url().string(), " from frame with URL ", activeDocument->url().string(), ".\n"); 16878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: should we print to the console of the activeFrame as well? 16890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch targetFrame->domWindow()->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, message, 1, String()); 16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::stopLoadingSubframes() 16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RefPtr<Frame> child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child->loader()->stopAllLoaders(); 16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1701e1503159a6023b8eb39fbecadf6986c8ddd862e2Ben Murdochvoid FrameLoader::stopAllLoaders(DatabasePolicy databasePolicy) 17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!m_frame->document() || !m_frame->document()->inPageCache()); 17046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_pageDismissalEventBeingDispatched) 17055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 17065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. 17088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_inStopAllLoaders) 17098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 17108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inStopAllLoaders = true; 17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1713231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->stopCheck(); 17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopLoadingSubframes(); 17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader) 1717e1503159a6023b8eb39fbecadf6986c8ddd862e2Ben Murdoch m_provisionalDocumentLoader->stopLoading(databasePolicy); 17188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 1719e1503159a6023b8eb39fbecadf6986c8ddd862e2Ben Murdoch m_documentLoader->stopLoading(databasePolicy); 17208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 17228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size 17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->clearArchiveResources(); 17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1728d0825bca7fe65beaee391d30da42e937db621564Steve Block m_checkTimer.stop(); 1729d0825bca7fe65beaee391d30da42e937db621564Steve Block 17308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_inStopAllLoaders = false; 17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::stopForUserCancel(bool deferCheckLoadComplete) 17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopAllLoaders(); 17368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (deferCheckLoadComplete) 17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project scheduleCheckLoadComplete(); 17398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (m_frame->page()) 17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDocumentLoader* FrameLoader::activeDocumentLoader() const 17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state == FrameStateProvisional) 17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_provisionalDocumentLoader.get(); 17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_documentLoader.get(); 17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isLoading() const 17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* docLoader = activeDocumentLoader(); 17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!docLoader) 17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return docLoader->isLoadingMainResource() || docLoader->isLoadingSubresources() || docLoader->isLoadingPlugIns(); 17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::frameHasLoaded() const 17598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 176006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return m_stateMachine.committedFirstRealDocumentLoad() || (m_provisionalDocumentLoader && !m_stateMachine.creatingInitialEmptyDocument()); 17618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1763e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid FrameLoader::transferLoadingResourcesFromPage(Page* oldPage) 1764e14391e94c850b8bd03680c23b38978db68687a8John Reck{ 1765e14391e94c850b8bd03680c23b38978db68687a8John Reck ASSERT(oldPage != m_frame->page()); 17666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (isLoading()) { 1767e14391e94c850b8bd03680c23b38978db68687a8John Reck activeDocumentLoader()->transferLoadingResourcesFromPage(oldPage); 17686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner oldPage->progress()->progressCompleted(m_frame); 17696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (m_frame->page()) 17706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner m_frame->page()->progress()->progressStarted(m_frame); 17716b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 17726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 17736b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 17746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid FrameLoader::dispatchTransferLoadingResourceFromPage(unsigned long identifier, DocumentLoader* docLoader, const ResourceRequest& request, Page* oldPage) 17756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 17766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner notifier()->dispatchTransferLoadingResourceFromPage(identifier, docLoader, request, oldPage); 1777e14391e94c850b8bd03680c23b38978db68687a8John Reck} 1778e14391e94c850b8bd03680c23b38978db68687a8John Reck 17798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setDocumentLoader(DocumentLoader* loader) 17808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!loader && !m_documentLoader) 17828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(loader != m_documentLoader); 17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || loader->frameLoader() == this); 17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->prepareForDataSourceReplacement(); 17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->detachFromFrame(); 17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader = loader; 17938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setPolicyDocumentLoader(DocumentLoader* loader) 17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader == loader) 17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame); 18018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (loader) 18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setFrame(m_frame); 18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_policyDocumentLoader 18048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && m_policyDocumentLoader != m_provisionalDocumentLoader 18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && m_policyDocumentLoader != m_documentLoader) 18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader->detachFromFrame(); 18078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_policyDocumentLoader = loader; 18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setProvisionalDocumentLoader(DocumentLoader* loader) 18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || !m_provisionalDocumentLoader); 18148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!loader || loader->frameLoader() == this); 18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_provisionalDocumentLoader && m_provisionalDocumentLoader != m_documentLoader) 18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->detachFromFrame(); 18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader = loader; 18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectdouble FrameLoader::timeOfLastCompletedLoad() 18238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return storedTimeOfLastCompletedLoad; 18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setState(FrameState newState) 18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_state = newState; 18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newState == FrameStateProvisional) 18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project provisionalLoadStarted(); 18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (newState == FrameStateComplete) { 18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frameLoadCompleted(); 18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project storedTimeOfLastCompletedLoad = currentTime(); 18368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopRecordingResponses(); 18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::clearProvisionalLoad() 18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 18458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressCompleted(m_frame); 18468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateComplete); 18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::markLoadComplete() 18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateComplete); 18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1854545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::commitProvisionalLoad() 18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1856545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch RefPtr<CachedPage> cachedPage = m_loadingFromCachedPage ? pageCache()->get(history()->provisionalItem()) : 0; 18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 1858635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 185928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu LOG(PageCache, "WebCoreLoading %s: About to commit provisional load from previous URL '%s' to new URL '%s'", m_frame->tree()->uniqueName().string().utf8().data(), m_URL.string().utf8().data(), 1860231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block pdl ? pdl->url().string().utf8().data() : "<no provisional DocumentLoader>"); 1861635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 18628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check to see if we need to cache the page we are navigating away from into the back/forward cache. 18638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are doing this here because we know for sure that a new page is about to be loaded. 1864545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch HistoryItem* item = history()->currentItem(); 186506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_frame->tree()->parent() && PageCache::canCache(m_frame->page()) && !item->isInPageCache()) 1866545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch pageCache()->add(item, m_frame->page()); 1867cad810f21b803229eb11403f9209855525a25d57Steve Block 18688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_loadType != FrameLoadTypeReplace) 18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeOldDataSources(); 1870cad810f21b803229eb11403f9209855525a25d57Steve Block 187106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!cachedPage && !m_stateMachine.creatingInitialEmptyDocument()) 18728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->makeRepresentation(pdl.get()); 1873cad810f21b803229eb11403f9209855525a25d57Steve Block 18748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project transitionToCommitted(cachedPage); 1875cad810f21b803229eb11403f9209855525a25d57Steve Block 1876cad810f21b803229eb11403f9209855525a25d57Steve Block if (pdl) { 1877cad810f21b803229eb11403f9209855525a25d57Steve Block // Check if the destination page is allowed to access the previous page's timing information. 1878cad810f21b803229eb11403f9209855525a25d57Steve Block RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(pdl->request().url()); 1879cad810f21b803229eb11403f9209855525a25d57Steve Block m_documentLoader->timing()->hasSameOriginAsPreviousDocument = securityOrigin->canRequest(m_previousUrl); 1880cad810f21b803229eb11403f9209855525a25d57Steve Block } 1881cad810f21b803229eb11403f9209855525a25d57Steve Block 18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Call clientRedirectCancelledOrFinished() here so that the frame load delegate is notified that the redirect's 18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // status has changed, if there was a redirect. The frame load delegate may have saved some state about 18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect in its -webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:. Since we are 18858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // just about to commit a new page, there cannot possibly be a pending redirect at this point. 18868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_sentRedirectNotification) 18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 18888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1889545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (cachedPage && cachedPage->document()) { 1890545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch prepareForCachedPageRestore(); 1891545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch cachedPage->restore(m_frame->page()); 189268513a70bcd92384395513322f1b801e7bf9c729Steve Block 189368513a70bcd92384395513322f1b801e7bf9c729Steve Block dispatchDidCommitLoad(); 189468513a70bcd92384395513322f1b801e7bf9c729Steve Block 189568513a70bcd92384395513322f1b801e7bf9c729Steve Block // If we have a title let the WebView know about it. 189668513a70bcd92384395513322f1b801e7bf9c729Steve Block String title = m_documentLoader->title(); 189768513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!title.isNull()) 189868513a70bcd92384395513322f1b801e7bf9c729Steve Block m_client->dispatchDidReceiveTitle(title); 189968513a70bcd92384395513322f1b801e7bf9c729Steve Block 1900545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch checkCompleted(); 1901545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch } else { 19028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL url = pdl->substituteData().responseURL(); 19038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = pdl->url(); 19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = pdl->responseURL(); 19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url = blankURL(); 19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project didOpenURL(url); 19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1912635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 191328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu LOG(Loading, "WebCoreLoading %s: Finished committing provisional load to URL %s", m_frame->tree()->uniqueName().string().utf8().data(), m_URL.string().utf8().data()); 1914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 19158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (m_loadType == FrameLoadTypeStandard && m_documentLoader->isClientRedirect()) 1916cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForClientRedirect(); 19178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1918231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_loadingFromCachedPage) { 19198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->documentDidBecomeActive(); 19208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Force a layout to update view size and thereby update scrollbars. 1922231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->view()->forceLayout(); 19238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const ResponseVector& responses = m_documentLoader->responses(); 19258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian size_t count = responses.size(); 19268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian for (size_t i = 0; i < count; i++) { 19278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian const ResourceResponse& response = responses[i]; 19288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: If the WebKit client changes or cancels the request, this is not respected. 19298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ResourceError error; 19308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian unsigned long identifier; 19318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ResourceRequest request(response.url()); 19328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian requestFromDelegate(request, identifier, error); 19338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing. 19348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // However, with today's computers and networking speeds, this won't happen in practice. 19358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Could be an issue with a giant local file. 1936cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, static_cast<int>(response.expectedContentLength()), error); 19378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 19388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1939cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block pageCache()->remove(history()->currentItem()); 19408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_documentLoader->setPrimaryLoadComplete(true); 19428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 19438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // FIXME: Why only this frame and not parent frames? 19448f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian checkLoadCompleteForThisFrame(); 19458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::transitionToCommitted(PassRefPtr<CachedPage> cachedPage) 19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 19508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_state == FrameStateProvisional); 19528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state != FrameStateProvisional) 19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 19558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setCopiesOnScroll(); 1957cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForCommit(); 19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The call to closeURL() invokes the unload event handler, which can execute arbitrary 19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // JavaScript. If the script initiates a new load, we need to abandon the current load, 19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or the two will stomp each other. 19628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* pdl = m_provisionalDocumentLoader.get(); 19638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 19658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pdl != m_provisionalDocumentLoader) 19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Nothing else can interupt this commit - set the Provisional->Committed transition in stone 19698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopLoadingSubresources(); 19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_documentLoader->stopLoadingPlugIns(); 19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setDocumentLoader(m_provisionalDocumentLoader.get()); 19758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(0); 19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateCommittedPage); 19778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Handle adding the URL to the back/forward list. 19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* dl = m_documentLoader.get(); 19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_loadType) { 19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeForward: 19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeBack: 19840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case FrameLoadTypeBackWMLDeckNotAccessible: 19858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeIndexedBackForward: 198628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page()) { 198728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // If the first load within a frame is a navigation within a back/forward list that was attached 198828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // without any of the items being loaded then we need to update the history in a similar manner as 198928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // for a standard load with the exception of updating the back/forward list (<rdar://problem/8091103>). 199028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!m_stateMachine.committedFirstRealDocumentLoad()) 199128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->updateForStandardLoad(HistoryController::UpdateAllExceptBackForwardList); 199228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 199328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->updateForBackForwardNavigation(); 199428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 199528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // For cached pages, CachedFrame::restore will take care of firing the popstate event with the history item's state object 199628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (history()->currentItem() && !cachedPage) 199728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_pendingStateObject = history()->currentItem()->stateObject(); 199828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 199928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // Create a document view for this document, or used the cached view. 200028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (cachedPage) { 200128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu DocumentLoader* cachedDocumentLoader = cachedPage->documentLoader(); 200228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(cachedDocumentLoader); 200328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu cachedDocumentLoader->setFrame(m_frame); 200428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_client->transitionToCommittedFromCachedFrame(cachedPage->cachedMainFrame()); 200528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 200628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } else 200728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_client->transitionToCommittedForNewPage(); 2008d0825bca7fe65beaee391d30da42e937db621564Steve Block } 20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReload: 2012635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeReloadFromOrigin: 20138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeSame: 20148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeReplace: 2015cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForReload(); 20168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameLoadTypeStandard: 2020cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForStandardLoad(); 20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef BUILDING_ON_TIGER 20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This code was originally added for a Leopard performance imporvement. We decided to 20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // ifdef it to fix correctness issues on Tiger documented in <rdar://problem/5441823>. 20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->view()) 20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->view()->setScrollbarsSuppressed(true); 20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 20278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2030635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FrameLoadTypeRedirectWithLockedBackForwardList: 2031cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForRedirectWithLockedBackForwardList(); 20328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->transitionToCommittedForNewPage(); 20338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME Remove this check when dummy ds is removed (whatever "dummy ds" is). 20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // An exception should be thrown if we're in the FrameLoadTypeUninitialized state. 20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 20388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 20398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->setMIMEType(dl->responseMIMEType()); 20428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Tell the client we've committed this URL. 20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->view()); 20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 204606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 20478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 204806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 204906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!m_stateMachine.committedFirstRealDocumentLoad()) 205006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit); 2051635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 20520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!m_client->hasHTMLView()) 20530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch receivedFirstData(); 20548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::clientRedirectCancelledOrFinished(bool cancelWithLoadInProgress) 20578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Note that -webView:didCancelClientRedirectForFrame: is called on the frame load delegate even if 20598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect succeeded. We should either rename this API, or add a new method, like 20608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // -webView:didFinishClientRedirectForFrame: 20618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidCancelClientRedirect(); 20628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!cancelWithLoadInProgress) 20648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 20658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_sentRedirectNotification = false; 20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::clientRedirected(const KURL& url, double seconds, double fireDate, bool lockBackForwardList) 20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchWillPerformClientRedirect(url, seconds, fireDate); 20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Remember that we sent a redirect notification to the frame load delegate so that when we commit 20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the next provisional load, we can send a corresponding -webView:didCancelClientRedirectForFrame: 20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_sentRedirectNotification = true; 20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If a "quick" redirect comes in, we set a special mode so we treat the next 20785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // load as part of the original navigation. If we don't have a document loader, we have 20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // no "original" load on which to base a redirect, so we treat the redirect as a normal load. 20805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Loads triggered by JavaScript form submissions never count as quick redirects. 2081dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_quickRedirectComing = (lockBackForwardList || history()->currentItemShouldBeReplaced()) && m_documentLoader && !m_isExecutingJavaScriptFormAction; 20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldReload(const KURL& currentURL, const KURL& destinationURL) 20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2086635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 20870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // All WML decks are supposed to be reloaded, even within the same URL fragment 20880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (frameContainsWMLContent(m_frame)) 2089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 2090635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 2091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 20928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This function implements the rule: "Don't reload if navigating by fragment within 20938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the same URL, but do reload if going to a new URL or to the same URL with no 20948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // fragment identifier at all." 20950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!destinationURL.hasFragmentIdentifier()) 20968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 20970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return !equalIgnoringFragmentIdentifier(currentURL, destinationURL); 20988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 20998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::closeOldDataSources() 21018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is it important for this traversal to be postorder instead of preorder? 21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If so, add helpers for postorder traversal, and use them. If not, then lets not 21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // use a recursive algorithm here. 21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child->loader()->closeOldDataSources(); 21078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_documentLoader) 21098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchWillClose(); 21108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainFrameDocumentReady(false); // stop giving out the actual DOMDocument to observers 21128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2114545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::prepareForCachedPageRestore() 21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(!m_frame->tree()->parent()); 21178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->page()); 21188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_frame->page()->mainFrame() == m_frame); 21198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2120a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_frame->navigationScheduler()->cancel(); 21218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We still have to close the previous part page. 21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Delete old status bar messages (if it _was_ activated on last URL). 2126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_frame->script()->canExecuteScripts(NotAboutToExecuteScript)) { 212706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (DOMWindow* window = m_frame->existingDOMWindow()) { 212806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setStatus(String()); 212906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen window->setDefaultStatus(String()); 213006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 21328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 21338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 2134231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::open(CachedFrameBase& cachedFrame) 21358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 21368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_isComplete = false; 21378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't re-emit the load event. 21398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_didCallImplicitClose = true; 21408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian KURL url = cachedFrame.url(); 21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (url.protocolInHTTPFamily() && !url.host().isEmpty() && url.path().isEmpty()) 21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project url.setPath("/"); 21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_URL = url; 21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_workingURL = url; 21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project started(); 2150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block clear(true, true, cachedFrame.isMainFrame()); 21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian Document* document = cachedFrame.document(); 21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(document); 21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project document->setInPageCache(false); 21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_needsClear = true; 21578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_isComplete = false; 21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_didCallImplicitClose = false; 21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_outgoingReferrer = url.string(); 21608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian FrameView* view = cachedFrame.view(); 21628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 21638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // When navigating to a CachedFrame its FrameView should never be null. If it is we'll crash in creative ways downstream. 21648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian ASSERT(view); 2165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block view->setWasScrolledByUser(false); 2166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Use the current ScrollView's frame rect. 2168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (m_frame->view()) 2169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block view->setFrameRect(m_frame->view()->frameRect()); 21708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setView(view); 21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setDocument(document); 21738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->setDOMWindow(cachedFrame.domWindow()); 21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setURL(document->url()); 21758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->domWindow()->setSecurityOrigin(document->securityOrigin()); 21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->setDecoder(document->decoder()); 21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian updateFirstPartyForCookies(); 21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian cachedFrame.restore(); 21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isStopping() const 21858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->isStopping(); 21878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedLoading() 21908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Retain because the stop may release the last reference to it. 21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> dl = activeDocumentLoader(); 21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dl->finishedLoading(); 21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!dl->mainDocumentError().isNull() || !dl->frameLoader()) 21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project dl->setPrimaryLoadComplete(true); 21998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidLoadMainResource(dl.get()); 22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 22018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isHostedByObjectElement() const 22048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFrameOwnerElement* owner = m_frame->ownerElement(); 22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return owner && owner->hasTagName(objectTag); 22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isLoadingMainFrame() const 22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Page* page = m_frame->page(); 22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return page && m_frame == page->mainFrame(); 22138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::canShowMIMEType(const String& MIMEType) const 22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->canShowMIMEType(MIMEType); 22188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::representationExistsForURLScheme(const String& URLScheme) 22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->representationExistsForURLScheme(URLScheme); 22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::generatedMIMETypeForURLScheme(const String& URLScheme) 22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->generatedMIMETypeForURLScheme(URLScheme); 22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didReceiveServerRedirectForProvisionalLoadForFrame() 22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveServerRedirectForProvisionalLoad(); 22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::finishedLoadingDocument(DocumentLoader* loader) 22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Platforms shouldn't differ here! 22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(WIN) || PLATFORM(CHROMIUM) || defined(ANDROID) 223906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(ARCHIVE) // ANDROID extension: disabled to reduce code size 22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2245f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // Give archive machinery a crack at this document. If the MIME type is not an archive type, it will return 0. 2246f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch RefPtr<Archive> archive = ArchiveFactory::create(loader->mainResourceData().get(), loader->responseMIMEType()); 2247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!archive) { 22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->finishedLoading(loader); 22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch // FIXME: The remainder of this function should be moved to DocumentLoader. 2253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 225468513a70bcd92384395513322f1b801e7bf9c729Steve Block loader->addAllArchiveResources(archive.get()); 225568513a70bcd92384395513322f1b801e7bf9c729Steve Block 22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ArchiveResource* mainResource = archive->mainResource(); 22578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setParsedArchiveData(mainResource->data()); 22585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->setMIMEType(mainResource->mimeType()); 2260cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 2261cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block closeURL(); 22625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian didOpenURL(mainResource->url()); 22635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 226468513a70bcd92384395513322f1b801e7bf9c729Steve Block ASSERT(m_frame->document()); 22655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian String userChosenEncoding = documentLoader()->overrideEncoding(); 22665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian bool encodingIsUserChosen = !userChosenEncoding.isNull(); 2267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block writer()->setEncoding(encodingIsUserChosen ? userChosenEncoding : mainResource->textEncoding(), encodingIsUserChosen); 22688de7ac488df2f39f82e56811541f4847b3f2e952Steve Block writer()->addData(mainResource->data()->data(), mainResource->data()->size()); 22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 22708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->finishedLoading(loader); 22715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif // ARCHIVE 22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::isReplacing() const 22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_loadType == FrameLoadTypeReplace; 22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setReplacing() 22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = FrameLoadTypeReplace; 22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::revertToProvisional(DocumentLoader* loader) 22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->revertToProvisionalState(loader); 22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::subframeIsLoading() const 22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 22918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's most likely that the last added frame is the last to load so we walk backwards. 22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->lastChild(); child; child = child->tree()->previousSibling()) { 22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* childLoader = child->loader(); 22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* documentLoader = childLoader->documentLoader(); 22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader && documentLoader->isLoadingInAPISense()) 22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader = childLoader->provisionalDocumentLoader(); 22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader && documentLoader->isLoadingInAPISense()) 22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2300967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch documentLoader = childLoader->policyDocumentLoader(); 2301967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (documentLoader) 2302967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch return true; 23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::willChangeTitle(DocumentLoader* loader) 23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->willChangeTitle(loader); 23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrameLoadType FrameLoader::loadType() const 23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_loadType; 23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 23175f1ab04193ad0130ca8204aadaceae083aca9881Feng QianCachePolicy FrameLoader::subresourceCachePolicy() const 2318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_isComplete) 2320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyVerify; 23215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 23225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_loadType == FrameLoadTypeReloadFromOrigin) 2323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyReload; 23245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Frame* parentFrame = m_frame->tree()->parent()) { 23265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian CachePolicy parentCachePolicy = parentFrame->loader()->subresourceCachePolicy(); 2327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (parentCachePolicy != CachePolicyVerify) 2328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return parentCachePolicy; 2329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 2330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 23315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: POST documents are always Reloads, but their subresources should still be Revalidate. 23325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we bring the CachePolicy.h and ResourceRequest cache policy enums in sync with each other and 23335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // remember "Revalidate" in ResourceRequests, we can remove this "POST" check and return either "Reload" 23345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // or "Revalidate" if the DocumentLoader was requested with either. 23355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian const ResourceRequest& request(documentLoader()->request()); 23365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (request.cachePolicy() == ReloadIgnoringCacheData && !equalIgnoringCase(request.httpMethod(), "post")) 23375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return CachePolicyRevalidate; 23385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_loadType == FrameLoadTypeReload) 2340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyRevalidate; 2341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2342d0825bca7fe65beaee391d30da42e937db621564Steve Block if (request.cachePolicy() == ReturnCacheDataElseLoad) 23434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return CachePolicyHistoryBuffer; 2344d0825bca7fe65beaee391d30da42e937db621564Steve Block 2345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return CachePolicyVerify; 2346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 23478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkLoadCompleteForThisFrame() 23498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 23518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch (m_state) { 23538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateProvisional: { 23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_delegateIsHandlingProvisionalLoadError) 23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pdl) 23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we've received any errors we may be stuck in the provisional state and actually complete. 23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceError& error = pdl->mainDocumentError(); 23638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.isNull()) 23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 23658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check all children first. 23678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<HistoryItem> item; 23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 236965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (isBackForwardLoadType(loadType())) 237065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Reset the back forward list to the last committed history item at the top level. 237165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch item = page->mainFrame()->loader()->history()->currentItem(); 23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool shouldReset = true; 23745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!(pdl->isLoadingInAPISense() && !pdl->isStopping())) { 23758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_delegateIsHandlingProvisionalLoadError = true; 23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFailProvisionalLoad(error); 23778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_delegateIsHandlingProvisionalLoadError = false; 23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: can stopping loading here possibly have any effect, if isLoading is false, 23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // stopAllLoaders instead of stopLoadingSubframes? 23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopLoadingSubframes(); 23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pdl->stopLoading(); 23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2385d0825bca7fe65beaee391d30da42e937db621564Steve Block // If we're in the middle of loading multipart data, we need to restore the document loader. 2386d0825bca7fe65beaee391d30da42e937db621564Steve Block if (isReplacing() && !m_documentLoader.get()) 2387d0825bca7fe65beaee391d30da42e937db621564Steve Block setDocumentLoader(m_provisionalDocumentLoader.get()); 2388d0825bca7fe65beaee391d30da42e937db621564Steve Block 23898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Finish resetting the load state, but only if another load hasn't been started by the 23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // delegate callback. 23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pdl == m_provisionalDocumentLoader) 23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clearProvisionalLoad(); 2393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else if (activeDocumentLoader()) { 2394643ca7872b450ea4efacab6188849e5aac2ba161Steve Block KURL unreachableURL = activeDocumentLoader()->unreachableURL(); 23958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!unreachableURL.isEmpty() && unreachableURL == pdl->request().url()) 23968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project shouldReset = false; 23978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 23998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (shouldReset && item) 2400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (Page* page = m_frame->page()) { 240128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->setCurrentItem(item.get()); 2402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Settings* settings = m_frame->settings(); 2403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project page->setGlobalHistoryItem((!settings || settings->privateBrowsingEnabled()) ? 0 : item.get()); 2404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateCommittedPage: { 24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* dl = m_documentLoader.get(); 24105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!dl || (dl->isLoadingInAPISense() && !dl->isStopping())) 24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project markLoadComplete(); 24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is this subsequent work important if we already navigated away? 24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Maybe there are bugs because of that, or extra work we can skip because 24178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the new page is ready. 24188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->forceLayoutForNonHTML(); 24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the user had a scroll point, scroll to it, overriding the anchor point if any. 242228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page()) { 242328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload || m_loadType == FrameLoadTypeReloadFromOrigin) 2424cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->restoreScrollPositionAndViewState(); 242528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 24268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 242706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument() || !m_stateMachine.committedFirstRealDocumentLoad()) 24288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceError& error = dl->mainDocumentError(); 24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!error.isNull()) 24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFailLoad(error); 24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFinishLoad(); 24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->progress()->progressCompleted(m_frame); 2438bc7b84de3fd863c500a8169fd00dca3811cadbb3Steve Block 24398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef ANDROID_INSTRUMENT 2440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_frame->tree()->parent() && m_frame->document()->renderArena()) 2441635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project android::TimeCounter::report(m_URL, cache()->getLiveSize(), cache()->getDeadSize(), 2442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_frame->document()->renderArena()->reportPoolSize()); 24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 24448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case FrameStateComplete: 24488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian frameLoadCompleted(); 24498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_NOT_REACHED(); 24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2455231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::continueLoadAfterWillSubmitForm() 24568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 24578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader) 24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // DocumentLoader calls back to our prepareForLoadStart 24618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->prepareForLoadStart(); 24628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The load might be cancelled inside of prepareForLoadStart(), nulling out the m_provisionalDocumentLoader, 24648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so we need to null check it again. 24658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader) 24668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* activeDocLoader = activeDocumentLoader(); 24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (activeDocLoader && activeDocLoader->isLoadingMainResource()) 24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2472231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_loadingFromCachedPage = false; 24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier = 0; 24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = page->progress()->createUniqueIdentifier(); 2478cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->assignIdentifierToInitialRequest(identifier, m_provisionalDocumentLoader.get(), m_provisionalDocumentLoader->originalRequest()); 24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2481967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch ASSERT(!m_provisionalDocumentLoader->timing()->navigationStart); 2482967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch m_provisionalDocumentLoader->timing()->navigationStart = currentTime(); 2483967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_provisionalDocumentLoader->startLoadingMainResource(identifier)) 24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_provisionalDocumentLoader->updateLoading(); 24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didFirstLayout() 24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 249028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_frame->page() && isBackForwardLoadType(m_loadType)) 249128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu history()->restoreScrollPositionAndViewState(); 24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 249306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.committedFirstRealDocumentLoad() && !m_stateMachine.isDisplayingInitialEmptyDocument() && !m_stateMachine.firstLayoutDone()) 249406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::FirstLayoutDone); 24958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidFirstLayout(); 24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::didFirstVisuallyNonEmptyLayout() 2499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2500635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidFirstVisuallyNonEmptyLayout(); 2501635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2502635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::frameLoadCompleted() 25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Note: Can be called multiple times. 25068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->frameLoadCompleted(); 25088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2509cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->updateForFrameLoadCompleted(); 25108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // After a canceled provisional load, firstLayoutDone is false. 25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Reset it to true if we're displaying a page. 251306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_documentLoader && m_stateMachine.committedFirstRealDocumentLoad() && !m_stateMachine.isDisplayingInitialEmptyDocument() && !m_stateMachine.firstLayoutDone()) 251406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen m_stateMachine.advanceTo(FrameLoaderStateMachine::FirstLayoutDone); 25158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::detachChildren() 25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Is it really necessary to do this in reverse order? 25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* previous; 25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* child = m_frame->tree()->lastChild(); child; child = previous) { 25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project previous = child->tree()->previousSibling(); 25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project child->loader()->detachFromParent(); 25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoader::closeAndRemoveChild(Frame* child) 25288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 25298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->tree()->detachFromParent(); 25308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->setView(0); 2532231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (child->ownerElement() && child->page()) 25338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->page()->decrementFrameCount(); 25345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: The page isn't being destroyed, so it's not right to call a function named pageDestroyed(). 25358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian child->pageDestroyed(); 25368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->tree()->removeChild(child); 25388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 25398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::recursiveCheckLoadComplete() 25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<RefPtr<Frame>, 10> frames; 25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (RefPtr<Frame> frame = m_frame->tree()->firstChild(); frame; frame = frame->tree()->nextSibling()) 25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frames.append(frame); 25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned size = frames.size(); 25488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < size; i++) 25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project frames[i]->loader()->recursiveCheckLoadComplete(); 25508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadCompleteForThisFrame(); 25528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Called every time a resource is completely loaded, or an error is received. 25558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::checkLoadComplete() 25568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_client->hasWebView()); 25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2559231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_shouldCallCheckLoadComplete = false; 2560231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 25618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Always traversing the entire frame tree is a bit inefficient, but 25628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is currently needed in order to null out the previous history item for all frames. 25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project page->mainFrame()->loader()->recursiveCheckLoadComplete(); 25658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint FrameLoader::numPendingOrLoadingRequests(bool recurse) const 25688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!recurse) 25708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return numRequests(m_frame->document()); 25718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int count = 0; 25738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (Frame* frame = m_frame; frame; frame = frame->tree()->traverseNext(m_frame)) 25748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project count += numRequests(frame->document()); 25758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return count; 25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::userAgent(const KURL& url) const 25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->userAgent(url); 25818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::handledOnloadEvents() 25848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidHandleOnloadEvents(); 2586e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 2587f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (documentLoader()) { 2588f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick documentLoader()->handledOnloadEvents(); 2589d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS) 2590d0825bca7fe65beaee391d30da42e937db621564Steve Block documentLoader()->applicationCacheHost()->stopDeferringEvents(); 2591d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 2592f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 25938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 25948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 25958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::frameDetached() 25968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 25978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopAllLoaders(); 25988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_frame->document()->stopActiveDOMObjects(); 25998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachFromParent(); 26008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 26018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::detachFromParent() 26038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 26058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project closeURL(); 2607cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->saveScrollPositionAndViewStateToItem(history()->currentItem()); 26088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project detachChildren(); 260928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // stopAllLoaders() needs to be called after detachChildren(), because detachedChildren() 261028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // will trigger the unload event handlers of any child frames, and those event 261128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // handlers might start a new subresource load in this frame. 261228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu stopAllLoaders(); 26138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 261465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::frameDetachedFromParent(m_frame); 2615231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2616231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block detachViewsAndDocumentLoader(); 26178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Frame* parent = m_frame->tree()->parent()) { 26198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parent->loader()->closeAndRemoveChild(m_frame); 26208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project parent->loader()->scheduleCheckCompleted(); 26218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 26228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->setView(0); 26235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // FIXME: The page isn't being destroyed, so it's not right to call a function named pageDestroyed(). 26248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_frame->pageDestroyed(); 26258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 26268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2627231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 2628231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid FrameLoader::detachViewsAndDocumentLoader() 2629231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 2630231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->detachedFromParent2(); 2631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setDocumentLoader(0); 2632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->detachedFromParent3(); 2633231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 2634635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2635635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToSubresourceRequest(ResourceRequest& request) 2636635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2637635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, m_loadType, false, false); 2638635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 26398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToMainResourceRequest(ResourceRequest& request) 2641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2642635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(request, m_loadType, true, false); 2643635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 2644635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::addExtraFieldsToRequest(ResourceRequest& request, FrameLoadType loadType, bool mainResource, bool cookiePolicyURLFromRequest) 26468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Don't set the cookie policy URL if it's already been set. 26488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // But make sure to set it on all requests, as it has significance beyond the cookie policy for all protocols (<rdar://problem/6616664>). 26495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (request.firstPartyForCookies().isEmpty()) { 26508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (mainResource && (isLoadingMainFrame() || cookiePolicyURLFromRequest)) 26515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setFirstPartyForCookies(request.url()); 26525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian else if (Document* document = m_frame->document()) 26535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setFirstPartyForCookies(document->firstPartyForCookies()); 26548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 26555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 26568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // The remaining modifications are only necessary for HTTP and HTTPS. 26578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (!request.url().isEmpty() && !request.url().protocolInHTTPFamily()) 26588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return; 26598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 26608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project applyUserAgent(request); 26618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2662e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // If we inherit cache policy from a main resource, we use the DocumentLoader's 2663e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // original request cache policy for two reasons: 2664e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // 1. For POST requests, we mutate the cache policy for the main resource, 2665e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // but we do not want this to apply to subresources 2666e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // 2. Delegates that modify the cache policy using willSendRequest: should 2667e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // not affect any other resources. Such changes need to be done 2668e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke // per request. 2669967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (!mainResource) { 2670967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (request.isConditional()) 2671967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(ReloadIgnoringCacheData); 2672967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else if (documentLoader()->isLoadingInAPISense()) 2673967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(documentLoader()->originalRequest().cachePolicy()); 2674967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else 2675967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch request.setCachePolicy(UseProtocolCachePolicy); 26765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } else if (loadType == FrameLoadTypeReload || loadType == FrameLoadTypeReloadFromOrigin || request.isConditional()) 2677e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke request.setCachePolicy(ReloadIgnoringCacheData); 2678967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch else if (isBackForwardLoadType(loadType) && m_stateMachine.committedFirstRealDocumentLoad() && !request.url().protocolIs("https")) 2679d0825bca7fe65beaee391d30da42e937db621564Steve Block request.setCachePolicy(ReturnCacheDataElseLoad); 26805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 26815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (request.cachePolicy() == ReloadIgnoringCacheData) { 26825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (loadType == FrameLoadTypeReload) 26835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Cache-Control", "max-age=0"); 26845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen else if (loadType == FrameLoadTypeReloadFromOrigin) { 26855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Cache-Control", "no-cache"); 26865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen request.setHTTPHeaderField("Pragma", "no-cache"); 26875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 26885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 26898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mainResource) 26915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian request.setHTTPAccept(defaultAcceptHeader); 26928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 26938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we send the Origin header. 26948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(request, String()); 2695635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2696635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Always try UTF-8. If that fails, try frame encoding (if any) and then the default. 2697635860845790a19bf50bbc51ba8fb66a96dde068The 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. 2698635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Settings* settings = m_frame->settings(); 2699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block request.setResponseContentDispositionEncodingFallbackArray("UTF-8", writer()->deprecatedFrameEncoding(), settings ? settings->defaultTextEncodingName() : String()); 27008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::addHTTPOriginIfNeeded(ResourceRequest& request, String origin) 27038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!request.httpOrigin().isEmpty()) 27058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; // Request already has an Origin header. 27068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't send an Origin header for GET or HEAD to avoid privacy issues. 27088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For example, if an intranet page has a hyperlink to an external web 27098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // site, we don't want to include the Origin of the request because it 27108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // will leak the internal host name. Similar privacy concerns have lead 27118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // to the widespread suppression of the Referer header at the network 27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // layer. 27138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (request.httpMethod() == "GET" || request.httpMethod() == "HEAD") 27148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 27158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // For non-GET and non-HEAD methods, always send an Origin header so the 27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // server knows we support this feature. 27188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (origin.isEmpty()) { 27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we don't know what origin header to attach, we attach the value 27218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for an empty origin. 27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project origin = SecurityOrigin::createEmpty()->toString(); 27238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 27248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPOrigin(origin); 27268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid FrameLoader::loadPostRequest(const ResourceRequest& inRequest, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType loadType, PassRefPtr<Event> event, PassRefPtr<FormState> prpFormState) 27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormState> formState = prpFormState; 27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // When posting, use the NSURLRequestReloadIgnoringCacheData load flag. 27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This prevents a potential bug which may cause a page with a form that uses itself 27348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as an action to be returned from the cache without submitting. 27358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Where's the code that implements what the comment above says? 27378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Previously when this method was reached, the original FrameLoadRequest had been deconstructed to build a 27398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // bunch of parameters that would come in here and then be built back up to a ResourceRequest. In case 27408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // any caller depends on the immutability of the original ResourceRequest, I'm rebuilding a ResourceRequest 27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // from scratch as it did all along. 27428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& url = inRequest.url(); 27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormData> formData = inRequest.httpBody(); 27448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const String& contentType = inRequest.httpContentType(); 27458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String origin = inRequest.httpOrigin(); 27468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest workingResourceRequest(url); 27488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) 27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPReferrer(referrer); 27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPOrigin(origin); 27528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPMethod("POST"); 27538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPBody(formData); 27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project workingResourceRequest.setHTTPContentType(contentType); 2755635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project addExtraFieldsToRequest(workingResourceRequest, loadType, true, true); 27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2757635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NavigationAction action(url, loadType, true, event); 27588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frameName.isEmpty()) { 27605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The search for a target frame is done earlier in the case of form submission. 27615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (Frame* targetFrame = formState ? 0 : findFrameForNavigation(frameName)) 2762635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project targetFrame->loader()->loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release()); 27638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2764231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block policyChecker()->checkNewWindowPolicy(action, FrameLoader::callContinueLoadAfterNewWindowPolicy, workingResourceRequest, formState.release(), frameName, this); 27658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 2766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release()); 27678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 27688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianunsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& request, StoredCredentials storedCredentials, ResourceError& error, ResourceResponse& response, Vector<char>& data) 27708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 27718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String referrer = m_outgoingReferrer; 2772231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (SecurityOrigin::shouldHideReferrer(request.url(), referrer)) 27738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project referrer = String(); 27748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest initialRequest = request; 27768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setTimeoutInterval(10); 27778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!referrer.isEmpty()) 27798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setHTTPReferrer(referrer); 27808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addHTTPOriginIfNeeded(initialRequest, outgoingOrigin()); 27818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) 27835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian initialRequest.setFirstPartyForCookies(page->mainFrame()->loader()->documentLoader()->request().url()); 27848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initialRequest.setHTTPUserAgent(client()->userAgent(request.url())); 2785e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 2786e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke addExtraFieldsToSubresourceRequest(initialRequest); 27878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier = 0; 27898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest newRequest(initialRequest); 27908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project requestFromDelegate(newRequest, identifier, error); 27918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error.isNull()) { 27938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!newRequest.isNull()); 27948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 27958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS) 27960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!documentLoader()->applicationCacheHost()->maybeLoadSynchronously(newRequest, error, response, data)) { 27978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 279868513a70bcd92384395513322f1b801e7bf9c729Steve Block ResourceHandle::loadResourceSynchronously(networkingContext(), newRequest, storedCredentials, error, response, data); 2799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS) 28000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch documentLoader()->applicationCacheHost()->maybeLoadFallbackSynchronously(newRequest, error, response, data); 2801635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 2802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 28038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 28048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2805cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, response, data.size(), error); 2806cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return identifier; 28075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 28085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 28098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst ResourceRequest& FrameLoader::originalRequest() const 28108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequestCopy(); 28128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::receivedMainResourceError(const ResourceError& error, bool isComplete) 28158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Retain because the stop may release the last reference to it. 28178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> protect(m_frame); 28188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<DocumentLoader> loader = activeDocumentLoader(); 2820cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (isComplete) { 28228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Don't want to do this if an entirely new load is going, so should check 28238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // that both data sources on the frame are either this or nil. 28248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stop(); 28258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_client->shouldFallBack(error)) 28268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project handleFallbackContent(); 28278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2828cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) { 28305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_submittedFormURL == m_provisionalDocumentLoader->originalRequestCopy().url()) 28315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_submittedFormURL = KURL(); 28328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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 28348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // transitioned to the new page (before WebFrameState == commit). The goal here is to restore any state 28358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // so that the existing view (that wenever got far enough to replace) can continue being used. 2836cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->invalidateCurrentItemCachedPage(); 28378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Call clientRedirectCancelledOrFinished here so that the frame load delegate is notified that the redirect's 28398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // status has changed, if there was a redirect. The frame load delegate may have saved some state about 28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the redirect in its -webView:willPerformClientRedirectToURL:delay:fireDate:forFrame:. Since we are definitely 28418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // not going to use this provisional resource, as it was cancelled, notify the frame load delegate that the redirect 28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // has ended. 28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_sentRedirectNotification) 28448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2846cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 28478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->mainReceivedError(error, isComplete); 28488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueFragmentScrollAfterNavigationPolicy(void* argument, 28518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, PassRefPtr<FormState>, bool shouldContinue) 28528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 28548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->continueFragmentScrollAfterNavigationPolicy(request, shouldContinue); 28558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue) 28588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_quickRedirectComing = false; 28608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!shouldContinue) 28628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 28638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2864aad6f24e036b3740071bb995b955b18b572067b2Steve Block bool isRedirect = m_quickRedirectComing || policyChecker()->loadType() == FrameLoadTypeRedirectWithLockedBackForwardList; 2865643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadInSameDocument(request.url(), 0, !isRedirect); 28668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2868cad810f21b803229eb11403f9209855525a25d57Steve Blockbool FrameLoader::shouldScrollToAnchor(bool isFormSubmission, const String& httpMethod, FrameLoadType loadType, const KURL& url) 28698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Should we do anchor navigation within the existing content? 28718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2872cad810f21b803229eb11403f9209855525a25d57Steve Block // We don't do this if we are submitting a form with method other than "GET", explicitly reloading, 28738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // currently displaying a frameset, or if the URL does not have a fragment. 28748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // These rules were originally based on what KHTML was doing in KHTMLPart::openURL. 28758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: What about load types other than Standard and Reload? 28778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2878cad810f21b803229eb11403f9209855525a25d57Steve Block return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET")) 28798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && loadType != FrameLoadTypeReload 2880635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project && loadType != FrameLoadTypeReloadFromOrigin 28818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && loadType != FrameLoadTypeSame 28828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && !shouldReload(this->url(), url) 28838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't want to just scroll if a link from within a 28848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // frameset is trying to reload the frameset into _top. 28858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian && !m_frame->document()->isFrameSet(); 28868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueLoadAfterNavigationPolicy(void* argument, 28898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const ResourceRequest& request, PassRefPtr<FormState> formState, bool shouldContinue) 28908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 28918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 28928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->continueLoadAfterNavigationPolicy(request, formState, shouldContinue); 28938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 28948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 28956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool FrameLoader::shouldClose() 28966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 28976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Page* page = m_frame->page(); 28986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Chrome* chrome = page ? page->chrome() : 0; 28996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!chrome || !chrome->canRunBeforeUnloadConfirmPanel()) 29006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2902cad810f21b803229eb11403f9209855525a25d57Steve Block // Store all references to each subframe in advance since beforeunload's event handler may modify frame 2903cad810f21b803229eb11403f9209855525a25d57Steve Block Vector<RefPtr<Frame> > targetFrames; 2904cad810f21b803229eb11403f9209855525a25d57Steve Block targetFrames.append(m_frame); 2905cad810f21b803229eb11403f9209855525a25d57Steve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->traverseNext(m_frame)) 2906cad810f21b803229eb11403f9209855525a25d57Steve Block targetFrames.append(child); 2907cad810f21b803229eb11403f9209855525a25d57Steve Block 2908cad810f21b803229eb11403f9209855525a25d57Steve Block bool shouldClose = false; 2909cad810f21b803229eb11403f9209855525a25d57Steve Block { 2910cad810f21b803229eb11403f9209855525a25d57Steve Block NavigationDisablerForBeforeUnload navigationDisabler; 2911cad810f21b803229eb11403f9209855525a25d57Steve Block size_t i; 2912cad810f21b803229eb11403f9209855525a25d57Steve Block 2913cad810f21b803229eb11403f9209855525a25d57Steve Block for (i = 0; i < targetFrames.size(); i++) { 2914cad810f21b803229eb11403f9209855525a25d57Steve Block if (!targetFrames[i]->tree()->isDescendantOf(m_frame)) 2915cad810f21b803229eb11403f9209855525a25d57Steve Block continue; 2916cad810f21b803229eb11403f9209855525a25d57Steve Block if (!targetFrames[i]->loader()->fireBeforeUnloadEvent(chrome)) 2917cad810f21b803229eb11403f9209855525a25d57Steve Block break; 2918cad810f21b803229eb11403f9209855525a25d57Steve Block } 2919cad810f21b803229eb11403f9209855525a25d57Steve Block 2920cad810f21b803229eb11403f9209855525a25d57Steve Block if (i == targetFrames.size()) 2921cad810f21b803229eb11403f9209855525a25d57Steve Block shouldClose = true; 2922cad810f21b803229eb11403f9209855525a25d57Steve Block } 2923cad810f21b803229eb11403f9209855525a25d57Steve Block 2924cad810f21b803229eb11403f9209855525a25d57Steve Block return shouldClose; 2925cad810f21b803229eb11403f9209855525a25d57Steve Block} 2926cad810f21b803229eb11403f9209855525a25d57Steve Block 2927cad810f21b803229eb11403f9209855525a25d57Steve Blockbool FrameLoader::fireBeforeUnloadEvent(Chrome* chrome) 2928cad810f21b803229eb11403f9209855525a25d57Steve Block{ 29296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen DOMWindow* domWindow = m_frame->existingDOMWindow(); 29306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!domWindow) 29316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RefPtr<Document> document = m_frame->document(); 2934cad810f21b803229eb11403f9209855525a25d57Steve Block if (!document->body()) 29356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RefPtr<BeforeUnloadEvent> beforeUnloadEvent = BeforeUnloadEvent::create(); 29386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = true; 29396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen domWindow->dispatchEvent(beforeUnloadEvent.get(), domWindow->document()); 29406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_pageDismissalEventBeingDispatched = false; 29416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!beforeUnloadEvent->defaultPrevented()) 29436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen document->defaultEventHandler(beforeUnloadEvent.get()); 29446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (beforeUnloadEvent->result().isNull()) 29456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return true; 29466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 29476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen String text = document->displayStringModifiedByEncoding(beforeUnloadEvent->result()); 29486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return chrome->runBeforeUnloadConfirmPanel(text, m_frame); 29496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 29506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2951635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest&, PassRefPtr<FormState> formState, bool shouldContinue) 29528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we loaded an alternate page to replace an unreachableURL, we'll get in here with a 29548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // nil policyDataSource because loading the alternate page will have passed 29558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // through this method already, nested; otherwise, policyDataSource should still be set. 29568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(m_policyDocumentLoader || !m_provisionalDocumentLoader->unreachableURL().isEmpty()); 29578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2958cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block bool isTargetItem = history()->provisionalItem() ? history()->provisionalItem()->isTargetItem() : false; 29598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Two reasons we can't continue: 29618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 1) Navigation policy delegate said we can't so request is nil. A primary case of this 29628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // is the user responding Cancel to the form repost nag sheet. 29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 2) User responded Cancel to an alert popped up by the before unload event handler. 2964cad810f21b803229eb11403f9209855525a25d57Steve Block bool canContinue = shouldContinue && shouldClose(); 29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!canContinue) { 29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If we were waiting for a quick redirect, but the policy delegate decided to ignore it, then we 29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // need to report that the client redirect was cancelled. 29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_quickRedirectComing) 29708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clientRedirectCancelledOrFinished(false); 29718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(0); 29738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the navigation request came from the back/forward menu, and we punt on it, we have the 29758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // problem that we have optimistically moved the b/f cursor already, so move it back. For sanity, 29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // we only do this when punting a navigation for the target frame or top-level frame. 2977231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if ((isTargetItem || isLoadingMainFrame()) && isBackForwardLoadType(policyChecker()->loadType())) 29788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 29798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* mainFrame = page->mainFrame(); 2980cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (HistoryItem* resetItem = mainFrame->loader()->history()->currentItem()) { 298128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu page->backForward()->setCurrentItem(resetItem); 2982635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Settings* settings = m_frame->settings(); 2983635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project page->setGlobalHistoryItem((!settings || settings->privateBrowsingEnabled()) ? 0 : resetItem); 2984635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 29858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 29868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 29888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2989231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block FrameLoadType type = policyChecker()->loadType(); 29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopAllLoaders(); 29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // <rdar://problem/6250856> - In certain circumstances on pages with multiple frames, stopAllLoaders() 29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // might detach the current FrameLoader, in which case we should bail on this newly defunct load. 29948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_frame->page()) 29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 29965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 29975e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR) && USE(JSC) 29985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (Page* page = m_frame->page()) { 29995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (page->mainFrame() == m_frame) 3000967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch page->inspectorController()->resume(); 30015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 30025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 30035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setProvisionalDocumentLoader(m_policyDocumentLoader.get()); 30058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadType = type; 30068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setState(FrameStateProvisional); 30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setPolicyDocumentLoader(0); 30098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3010545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (isBackForwardLoadType(type) && history()->provisionalItem()->isInPageCache()) { 3011545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch loadProvisionalItemFromCachedPage(); 30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3013545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch } 30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (formState) 3016231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_client->dispatchWillSubmitForm(&PolicyChecker::continueLoadAfterWillSubmitForm, formState); 30178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 30188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project continueLoadAfterWillSubmitForm(); 30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::callContinueLoadAfterNewWindowPolicy(void* argument, 3022e14391e94c850b8bd03680c23b38978db68687a8John Reck const ResourceRequest& request, PassRefPtr<FormState> formState, const String& frameName, const NavigationAction& action, bool shouldContinue) 30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* loader = static_cast<FrameLoader*>(argument); 3025e14391e94c850b8bd03680c23b38978db68687a8John Reck loader->continueLoadAfterNewWindowPolicy(request, formState, frameName, action, shouldContinue); 30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& request, 3029e14391e94c850b8bd03680c23b38978db68687a8John Reck PassRefPtr<FormState> formState, const String& frameName, const NavigationAction& action, bool shouldContinue) 30308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!shouldContinue) 30328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<Frame> frame = m_frame; 3035e14391e94c850b8bd03680c23b38978db68687a8John Reck RefPtr<Frame> mainFrame = m_client->dispatchCreatePage(action); 30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mainFrame) 30378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (frameName != "_blank") 30408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainFrame->tree()->setName(frameName); 30418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3042231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block mainFrame->page()->setOpenedByDOM(); 30438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mainFrame->loader()->m_client->dispatchShow(); 3044cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!m_suppressOpenerInNewFrame) 3045cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block mainFrame->loader()->setOpener(frame.get()); 3046635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project mainFrame->loader()->loadWithNavigationAction(request, NavigationAction(), false, FrameLoadTypeStandard, formState); 30478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::requestFromDelegate(ResourceRequest& request, unsigned long& identifier, ResourceError& error) 30508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!request.isNull()); 30528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = 0; 30548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (Page* page = m_frame->page()) { 30558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifier = page->progress()->createUniqueIdentifier(); 3056cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->assignIdentifierToInitialRequest(identifier, m_documentLoader.get(), request); 30578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 30588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceRequest newRequest(request); 3060cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->dispatchWillSendRequest(m_documentLoader.get(), identifier, newRequest, ResourceResponse()); 30618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (newRequest.isNull()) 30638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = cancelledError(request); 30648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 30658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = ResourceError(); 30668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request = newRequest; 30688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::loadedResourceFromMemoryCache(const CachedResource* resource) 30718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3072635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Page* page = m_frame->page(); 3073635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!page) 3074635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 30758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3076635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!resource->sendResourceLoadCallbacks() || m_documentLoader->haveToldClientAboutLoad(resource->url())) 3077635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 30788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3079635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!page->areMemoryCacheClientCallsEnabled()) { 308065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didLoadResourceFromMemoryCache(page, m_documentLoader.get(), resource); 3081635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->recordMemoryCacheLoadForFutureClientNotification(resource->url()); 3082635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->didTellClientAboutLoad(resource->url()); 30838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3084635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 30858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3086635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(resource->url()); 3087635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize())) { 308865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didLoadResourceFromMemoryCache(page, m_documentLoader.get(), resource); 3089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->didTellClientAboutLoad(resource->url()); 30908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 30918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 30928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned long identifier; 30948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceError error; 3095635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project requestFromDelegate(request, identifier, error); 309665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::markResourceAsCached(page, identifier); 3097cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block notifier()->sendRemainingDelegateMessages(m_documentLoader.get(), identifier, resource->response(), resource->encodedSize(), error); 30988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 30998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::applyUserAgent(ResourceRequest& request) 31018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project String userAgent = client()->userAgent(request.url()); 31038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!userAgent.isNull()); 31048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request.setHTTPUserAgent(userAgent); 31058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool FrameLoader::shouldInterruptLoadForXFrameOptions(const String& content, const KURL& url) 31085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 31095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Frame* topFrame = m_frame->tree()->top(); 31105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_frame == topFrame) 31115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 31125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (equalIgnoringCase(content, "deny")) 31145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 31155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (equalIgnoringCase(content, "sameorigin")) { 31175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url); 31185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!origin->isSameSchemeHostPort(topFrame->document()->securityOrigin())) 31195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 31205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 31215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 31225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return false; 31235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 31245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3125545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid FrameLoader::loadProvisionalItemFromCachedPage() 31268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3127545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch DocumentLoader* provisionalLoader = provisionalDocumentLoader(); 3128545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch LOG(PageCache, "WebCorePageCache: Loading provisional DocumentLoader %p with URL '%s' from CachedPage", provisionalDocumentLoader(), provisionalDocumentLoader()->url().string().utf8().data()); 3129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block provisionalLoader->prepareForLoadStart(); 3131231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_loadingFromCachedPage = true; 3133dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 3134dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // Should have timing data from previous time(s) the page was shown. 3135dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch ASSERT(provisionalLoader->timing()->navigationStart); 3136dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch provisionalLoader->resetTiming(); 3137dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch provisionalLoader->timing()->navigationStart = currentTime(); 3138231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 3139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block provisionalLoader->setCommitted(true); 3140545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch commitProvisionalLoad(); 31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const 31448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3145cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (!history()->currentItem()) 31468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 3147cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return url == history()->currentItem()->url() || url == history()->currentItem()->originalURL(); 31488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3150cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid FrameLoader::checkDidPerformFirstNavigation() 31518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Page* page = m_frame->page(); 31538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!page) 31548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 31558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 315628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!m_didPerformFirstNavigation && page->backForward()->currentItem() && !page->backForward()->backItem() && !page->backForward()->forwardItem()) { 3157cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block m_didPerformFirstNavigation = true; 31588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->didPerformFirstNavigation(); 31598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 31608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFrame* FrameLoader::findFrameForNavigation(const AtomicString& name) 31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* frame = m_frame->tree()->find(name); 31655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!shouldAllowNavigation(frame)) 3166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 31675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return frame; 31688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 31698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::loadSameDocumentItem(HistoryItem* item) 3171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3172d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(item->documentSequenceNumber() == history()->currentItem()->documentSequenceNumber()); 3173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Save user view state to the current history item here since we don't do a normal load. 3175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Does form state need to be saved here too? 3176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->saveScrollPositionAndViewStateToItem(history()->currentItem()); 3177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (FrameView* view = m_frame->view()) 3178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block view->setWasScrolledByUser(false); 3179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->setCurrentItem(item); 3181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // loadInSameDocument() actually changes the URL and notifies load delegates of a "fake" load 3183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadInSameDocument(item->url(), item->stateObject(), false); 3184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Restore user view state from the current history item here since we don't do a normal load. 3186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->restoreScrollPositionAndViewState(); 3187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 3188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3189cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// FIXME: This function should really be split into a couple pieces, some of 3190cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// which should be methods of HistoryController and some of which should be 3191cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block// methods of FrameLoader. 3192f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid FrameLoader::loadDifferentDocumentItem(HistoryItem* item, FrameLoadType loadType) 3193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Remember this item so we can traverse any child items as child frames load 3195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block history()->setProvisionalItem(item); 3196545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 3197545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (CachedPage* cachedPage = pageCache()->get(item)) { 3198545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch loadWithDocumentLoader(cachedPage->documentLoader(), loadType, 0); 3199545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return; 3200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 32018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL itemURL = item->url(); 32038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL itemOriginalURL = item->originalURL(); 32048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project KURL currentURL; 32058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (documentLoader()) 32068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project currentURL = documentLoader()->url(); 32078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<FormData> formData = item->formData(); 32088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool addedExtraFields = false; 3210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ResourceRequest request(itemURL); 32115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!item->referrer().isNull()) 3213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPReferrer(item->referrer()); 3214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If this was a repost that failed the page cache, we might try to repost the form. 3216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block NavigationAction action; 3217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (formData) { 321821939df44de1705786c545cd1bf519d47250322dBen Murdoch formData->generateFiles(m_frame->document()); 32198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPMethod("POST"); 3221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPBody(formData); 3222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setHTTPContentType(item->formContentType()); 3223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString(item->referrer()); 3224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addHTTPOriginIfNeeded(request, securityOrigin->toString()); 32258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Make sure to add extra fields to the request after the Origin header is added for the FormData case. 3227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // See https://bugs.webkit.org/show_bug.cgi?id=22194 for more discussion. 3228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addExtraFieldsToRequest(request, m_loadType, true, formData); 3229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addedExtraFields = true; 32308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Slight hack to test if the NSURL cache contains the page we're going to. 3232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // We want to know this before talking to the policy delegate, since it affects whether 3233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // we show the DoYouReallyWantToRepost nag. 3234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // 3235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // This trick has a small bug (3123893) where we might find a cache hit, but then 3236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // have the item vanish when we try to use it in the ensuing nav. This should be 3237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // extremely rare, but in that case the user will get an error on the navigation. 32388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (ResourceHandle::willLoadFromCache(request, m_frame)) 3240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemURL, loadType, false); 3241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else { 3242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReloadIgnoringCacheData); 3243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemURL, NavigationTypeFormResubmitted); 3244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 32458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block switch (loadType) { 3247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeReload: 3248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeReloadFromOrigin: 3249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReloadIgnoringCacheData); 3250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeBack: 3252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeBackWMLDeckNotAccessible: 3253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeForward: 3254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeIndexedBackForward: 3255967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // If the first load within a frame is a navigation within a back/forward list that was attached 3256967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // without any of the items being loaded then we should use the default caching policy (<rdar://problem/8131355>). 3257967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch if (m_stateMachine.committedFirstRealDocumentLoad() && !itemURL.protocolIs("https")) 3258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block request.setCachePolicy(ReturnCacheDataElseLoad); 3259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeStandard: 3261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeRedirectWithLockedBackForwardList: 3262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 3263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case FrameLoadTypeSame: 3264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block default: 3265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_NOT_REACHED(); 32668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 32678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block action = NavigationAction(itemOriginalURL, loadType, false); 3269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 3270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!addedExtraFields) 3272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block addExtraFieldsToRequest(request, m_loadType, true, formData); 32738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block loadWithNavigationAction(request, action, false, loadType, 0); 3275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 32768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Loads content into this frame, as specified by history item 3278643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::loadItem(HistoryItem* item, FrameLoadType loadType) 3279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 32805e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block HistoryItem* currentItem = history()->currentItem(); 3281a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool sameDocumentNavigation = currentItem && item->shouldDoSameDocumentNavigationTo(currentItem); 32828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(WML) 3284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // All WML decks should go through the real load mechanism, not the scroll-to-anchor code 3285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // FIXME: Why do WML decks have this different behavior? 3286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Are WML decks incompatible with HTML5 pushState/replaceState which require inter-document history navigations? 3287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Should this new API be disabled for WML pages, or does WML need to update their mechanism to act like normal loads? 3288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // If scroll-to-anchor navigations were broken for WML and required them to have different loading behavior, then 3289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // state object loads are certainly also broken for them. 3290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (frameContainsWMLContent(m_frame)) 3291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block sameDocumentNavigation = false; 3292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 3293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3294643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (sameDocumentNavigation) 3295f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loadSameDocumentItem(item); 3296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block else 3297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch loadDifferentDocumentItem(item, loadType); 32988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 32998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setMainDocumentError(DocumentLoader* loader, const ResourceError& error) 33018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainDocumentError(loader, error); 33038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::mainReceivedCompleteError(DocumentLoader* loader, const ResourceError&) 33068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->setPrimaryLoadComplete(true); 33088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidLoadMainResource(activeDocumentLoader()); 33098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkCompleted(); 33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_frame->page()) 33118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkLoadComplete(); 33128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::mainReceivedError(const ResourceError& error, bool isComplete) 33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project activeDocumentLoader()->mainReceivedError(error, isComplete); 33178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::cancelledError(const ResourceRequest& request) const 33208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResourceError error = m_client->cancelledError(request); 33228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error.setIsCancellation(true); 33238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return error; 33248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::blockedError(const ResourceRequest& request) const 33278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->blockedError(request); 33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::cannotShowURLError(const ResourceRequest& request) const 33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->cannotShowURLError(request); 33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerResourceError FrameLoader::interruptionForPolicyChangeError(const ResourceRequest& request) const 33376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 33386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return m_client->interruptForPolicyChangeError(request); 33396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 33406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 33418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectResourceError FrameLoader::fileDoesNotExistError(const ResourceResponse& response) const 33428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_client->fileDoesNotExistError(response); 33448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool FrameLoader::shouldUseCredentialStorage(ResourceLoader* loader) 3347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_client->shouldUseCredentialStorage(loader->documentLoader(), loader->identifier()); 3349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 3350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 335121939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(PROTECTION_SPACE_AUTH_CALLBACK) 335221939df44de1705786c545cd1bf519d47250322dBen Murdochbool FrameLoader::canAuthenticateAgainstProtectionSpace(ResourceLoader* loader, const ProtectionSpace& protectionSpace) 335321939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 335421939df44de1705786c545cd1bf519d47250322dBen Murdoch return m_client->canAuthenticateAgainstProtectionSpace(loader->documentLoader(), loader->identifier(), protectionSpace); 335521939df44de1705786c545cd1bf519d47250322dBen Murdoch} 335621939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif 335721939df44de1705786c545cd1bf519d47250322dBen Murdoch 33588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::setTitle(const String& title) 33598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project documentLoader()->setTitle(title); 33618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 336321939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoader::setIconURL(const String& iconURL) 336421939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 336521939df44de1705786c545cd1bf519d47250322dBen Murdoch documentLoader()->setIconURL(iconURL); 336621939df44de1705786c545cd1bf519d47250322dBen Murdoch} 336721939df44de1705786c545cd1bf519d47250322dBen Murdoch 33688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectKURL FrameLoader::originalRequestURL() const 33698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return activeDocumentLoader()->originalRequest().url(); 33718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString FrameLoader::referrer() const 33748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3375ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return m_documentLoader ? m_documentLoader->request().httpReferrer() : ""; 33768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 33778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianvoid FrameLoader::dispatchDocumentElementAvailable() 33798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 3380231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_frame->injectUserScripts(InjectAtDocumentStart); 33818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_client->documentElementAvailable(); 33828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 33838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 3384643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() 33858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_frame->script()->canExecuteScripts(NotAboutToExecuteScript)) 33878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 33888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3389643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Vector<DOMWrapperWorld*> worlds; 3390643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ScriptController::getAllWorlds(worlds); 3391643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (size_t i = 0; i < worlds.size(); ++i) 3392643ca7872b450ea4efacab6188849e5aac2ba161Steve Block dispatchDidClearWindowObjectInWorld(worlds[i]); 3393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 3394643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3395643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world) 3396643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_frame->script()->canExecuteScripts(NotAboutToExecuteScript) || !m_frame->script()->existingWindowShell(world)) 3398643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 3399643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3400643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_client->dispatchDidClearWindowObjectInWorld(world); 34018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 340265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didClearWindowObjectInWorld(m_frame, world); 34038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3405643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid FrameLoader::updateSandboxFlags() 3406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 3407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block SandboxFlags flags = m_forcedSandboxFlags; 3408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (Frame* parentFrame = m_frame->tree()->parent()) 3409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block flags |= parentFrame->loader()->sandboxFlags(); 3410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement()) 3411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block flags |= ownerElement->sandboxFlags(); 3412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3413643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_sandboxFlags == flags) 3414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 3415d0825bca7fe65beaee391d30da42e937db621564Steve Block 3416643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_sandboxFlags = flags; 3417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3418643ca7872b450ea4efacab6188849e5aac2ba161Steve Block for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) 3419643ca7872b450ea4efacab6188849e5aac2ba161Steve Block child->loader()->updateSandboxFlags(); 3420d0825bca7fe65beaee391d30da42e937db621564Steve Block} 3421643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::didChangeTitle(DocumentLoader* loader) 34238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->didChangeTitle(loader); 34258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (loader == m_documentLoader) { 34278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Must update the entries in the back-forward list too. 3428cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block history()->setCurrentItemTitle(loader->title()); 34298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This must go through the WebFrame because it has the right notion of the current b/f item. 34308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setTitle(loader->title(), loader->urlForHistory()); 34318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->setMainFrameDocumentReady(true); // update observers with new DOMDocument 34328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidReceiveTitle(loader->title()); 34338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 34348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 343621939df44de1705786c545cd1bf519d47250322dBen Murdochvoid FrameLoader::didChangeIcons(DocumentLoader* loader) 343721939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 343821939df44de1705786c545cd1bf519d47250322dBen Murdoch if (loader == m_documentLoader) 343921939df44de1705786c545cd1bf519d47250322dBen Murdoch m_client->dispatchDidChangeIcons(); 344021939df44de1705786c545cd1bf519d47250322dBen Murdoch} 344121939df44de1705786c545cd1bf519d47250322dBen Murdoch 34428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FrameLoader::dispatchDidCommitLoad() 34438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 344406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (m_stateMachine.creatingInitialEmptyDocument()) 34458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 34468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_client->dispatchDidCommitLoad(); 34488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 344965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InspectorInstrumentation::didCommitLoad(m_frame, m_documentLoader.get()); 34508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3452635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid FrameLoader::tellClientAboutPastMemoryCacheLoads() 3453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 3454635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame->page()); 3455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_frame->page()->areMemoryCacheClientCallsEnabled()); 3456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3457635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_documentLoader) 3458635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 3459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<String> pastLoads; 3461635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_documentLoader->takeMemoryCacheLoadsForClientNotification(pastLoads); 3462635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3463635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t size = pastLoads.size(); 3464635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 0; i < size; ++i) { 346565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CachedResource* resource = memoryCache()->resourceForURL(KURL(ParsedURLString, pastLoads[i])); 3466635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3467635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // FIXME: These loads, loaded from cache, but now gone from the cache by the time 3468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Page::setMemoryCacheClientCallsEnabled(true) is called, will not be seen by the client. 3469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Consider if there's some efficient way of remembering enough to deliver this client call. 3470635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // We have the URL, but not the rest of the response or the length. 3471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!resource) 3472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project continue; 3473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ResourceRequest request(resource->url()); 3475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize()); 3476635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3477635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 3478635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 34795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickNetworkingContext* FrameLoader::networkingContext() const 34805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 34815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return m_networkingContext.get(); 34825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 34835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 34848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool FrameLoaderClient::hasHTMLView() const 34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 34888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3489f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickFrame* createWindow(Frame* openerFrame, Frame* lookupFrame, const FrameLoadRequest& request, const WindowFeatures& features, bool& created) 3490f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{ 3491f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick ASSERT(!features.dialog || request.frameName().isEmpty()); 3492f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3493f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!request.frameName().isEmpty() && request.frameName() != "_blank") { 3494f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Frame* frame = lookupFrame->tree()->find(request.frameName()); 3495f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (frame && openerFrame->loader()->shouldAllowNavigation(frame)) { 3496f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (Page* page = frame->page()) 3497f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->focus(); 3498f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick created = false; 3499f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return frame; 3500f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 3501f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick } 3502f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3503f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // Sandboxed frames cannot open new auxiliary browsing contexts. 3504f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (isDocumentSandboxed(openerFrame, SandboxNavigation)) 3505f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3506f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3507f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // FIXME: Setting the referrer should be the caller's responsibility. 3508f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FrameLoadRequest requestWithReferrer = request; 3509f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick requestWithReferrer.resourceRequest().setHTTPReferrer(openerFrame->loader()->outgoingReferrer()); 3510f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FrameLoader::addHTTPOriginIfNeeded(requestWithReferrer.resourceRequest(), openerFrame->loader()->outgoingOrigin()); 3511f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3512f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Page* oldPage = openerFrame->page(); 3513f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!oldPage) 3514f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3515f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3516e14391e94c850b8bd03680c23b38978db68687a8John Reck NavigationAction action; 3517e14391e94c850b8bd03680c23b38978db68687a8John Reck Page* page = oldPage->chrome()->createWindow(openerFrame, requestWithReferrer, features, action); 3518f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!page) 3519f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return 0; 3520f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3521f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Frame* frame = page->mainFrame(); 3522f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (request.frameName() != "_blank") 3523f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick frame->tree()->setName(request.frameName()); 3524f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3525f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setToolbarsVisible(features.toolBarVisible || features.locationBarVisible); 3526f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setStatusbarVisible(features.statusBarVisible); 3527f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setScrollbarsVisible(features.scrollbarsVisible); 3528f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setMenubarVisible(features.menuBarVisible); 3529f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setResizable(features.resizable); 3530f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3531f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // 'x' and 'y' specify the location of the window, while 'width' and 'height' 3532f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // specify the size of the page. We can only resize the window, so 3533f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // adjust for the difference between the window size and the page size. 3534f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3535f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FloatRect windowRect = page->chrome()->windowRect(); 3536f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick FloatSize pageSize = page->chrome()->pageRect().size(); 3537f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.xSet) 3538f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setX(features.x); 3539f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.ySet) 3540f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setY(features.y); 3541f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.widthSet) 3542f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setWidth(features.width + (windowRect.width() - pageSize.width())); 3543f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (features.heightSet) 3544f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick windowRect.setHeight(features.height + (windowRect.height() - pageSize.height())); 3545f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->setWindowRect(windowRect); 3546f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3547f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick page->chrome()->show(); 3548f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 3549f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick created = true; 3550f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return frame; 3551f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick} 3552f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 3554